# TCGplayer Listings Scraper (`phantom_coder/tcgplayer-listings-scraper`) Actor

Scrape every seller listing for any TCGplayer card - price, shipping, condition, printing, language, and seller, compared with market price. Pokémon, Magic: The Gathering, Yu-Gi-Oh!, One Piece, Lorcana, and more. Filter, batch up to 100 cards, and add Fair Value Analysis.

- **URL**: https://apify.com/phantom_coder/tcgplayer-listings-scraper.md
- **Developed by:** [Phantom Coder](https://apify.com/phantom_coder) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.20 / 1,000 card listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## TCGplayer listings scraper

Scrape **every individual seller listing** for any card on [TCGplayer](https://www.tcgplayer.com) - one row per offer, with seller, condition, printing, language, quantity, price, shipping, and how the price compares to TCGplayer's market price.

Works for Pokémon, Magic: The Gathering, Yu-Gi-Oh!, One Piece, Lorcana, Flesh and Blood, Digimon, Star Wars: Unlimited, and more. Scrape one card, or a whole watchlist of up to 100 cards in a single run.

Looking for the European market? Try the sister Actor, [Cardmarket Listings Scraper](https://apify.com/phantom_coder/cardmarket-listings-scraper).

***

### Who is this for

- **Buyers and investors** hunting the cheapest Near Mint copy - sort by `discountVsMarketPct` to see listings priced furthest below market
- **Resellers** monitoring a watchlist daily for underpriced listings, without refreshing TCGplayer by hand
- **Store owners** checking what competing sellers ask for the cards they stock, by condition and printing
- **Collectors** setting price alerts in Make, Zapier, or n8n when a card drops below a target price

No TCGplayer account required.

***

### Why it's different

Product-level price data gives you one number per card - the market price or the lowest listing. This Actor returns the **individual seller listings** behind that number: who is selling, in what condition, which printing, how many copies, and what shipping costs.

A card with a $108 market price might have a Lightly Played copy at $95 from a Gold Star seller with free shipping - that listing is what this Actor surfaces.

Every listing also gets a deal score, `discountVsMarketPct`, against the market price for that **exact condition, printing, and language** - so a Lightly Played foil is compared with other Lightly Played foils, not with Near Mint copies.

***

### What you get

**Every listing row includes:**

- Product name, set, set code, card number, rarity, game, image, and product URL
- Seller name, rating, sales volume, Gold Star and verified status, location, and whether they ship through TCGplayer Direct
- Condition, printing, language, and quantity available
- Item price, shipping, and total price in USD
- TCGplayer market price for the listing's condition, printing, and language, the listed median price, and the discount vs market
- Whether the seller uploaded photos of the actual card

**With the recent sales add-on:**

- The latest completed sales for the product (up to 5): date, condition, printing, language, quantity, price, and shipping

**With the Fair Value Analysis add-on:**

- An AI-powered fair value estimate for the card, and how far each listing's price sits below or above it
- Raw (ungraded) market price, and the discount vs that price
- PSA (Professional Sports Authenticator) 9 and PSA 10 graded market prices
- Gem rate (the share of graded copies that come back PSA 10) and the PSA population behind it
- 1-day price change and 7-day vs 30-day price change

Pokémon only, covering mainly Scarlet & Violet and Mega Evolution sets (especially Illustration Rare and Special Illustration Rare cards). See [Understanding the data](#understanding-the-data) below.

***

### How to scrape TCGplayer listings

<ol>
  <li>Open the TCGplayer page of a card, for example <code>tcgplayer.com/product/487805/...</code>, and copy the URL. You can also paste just the product ID.</li>
  <li>Paste one or more URLs into <strong>TCGplayer product URLs</strong>, or type card names into <strong>Search terms</strong> and pick a <strong>Game</strong>.</li>
  <li>Set filters: minimum condition, printings, languages, price range, and seller type.</li>
  <li>Run the Actor. It returns the cheapest matching listings for each product, up to <strong>Max listings per product</strong>.</li>
  <li>Download the results as JSON, CSV, Excel, or HTML, or connect them to Google Sheets, Make, Zapier, or your own code through the Apify API.</li>
</ol>

> **Getting 0 results is normal for strict filters.** It means no listing matched your filters at the time of the run - not that the Actor failed. Runs with no matching listings aren't charged per listing.

***

### Input

| Field                   | Type    | Default                  | Description                                                                                                                |
| ----------------------- | ------- | ------------------------ | -------------------------------------------------------------------------------------------------------------------------- |
| `productUrls`           | Array   | -                        | TCGplayer product URLs or product IDs. Up to 100 products per run.                                                         |
| `searchQueries`         | Array   | -                        | Card names to search for. Each search adds its top results to the run.                                                     |
| `game`                  | Select  | Any game                 | Limit search results to one game. Applies to search terms only.                                                            |
| `maxProductsPerQuery`   | Integer | 5                        | How many top search results to scrape per search term.                                                                     |
| `maxListingsPerProduct` | Integer | 10                       | Maximum listings per product, cheapest first. Up to 5,000.                                                                 |
| `minCondition`          | Select  | Any condition            | Near Mint, Lightly Played, Moderately Played, Heavily Played, or Damaged - returns that condition and better.              |
| `printings`             | Array   | All                      | For example Normal, Foil, Holofoil, Reverse Holofoil, 1st Edition, or Unlimited. Names depend on the game.                 |
| `languages`             | Array   | All                      | English, Japanese, Chinese (Simplified and Traditional), Korean, French, German, Italian, Portuguese, Russian, or Spanish. |
| `minPrice` / `maxPrice` | Number  | -                        | Item price range in USD, excluding shipping.                                                                               |
| `goldSellersOnly`       | Boolean | false                    | Only TCGplayer Gold Star sellers.                                                                                          |
| `verifiedSellersOnly`   | Boolean | false                    | Only TCGplayer verified sellers.                                                                                           |
| `sortBy`                | Select  | Price including shipping | Cheapest first, by price including shipping or by item price only.                                                         |
| `includeRecentSales`    | Boolean | false                    | Add-on: attach the latest completed sales (up to 5) to each product's listings.                                            |
| `enableFairValue`       | Boolean | false                    | Add-on: attach an AI-powered fair value estimate and grading data. Pokémon only, Scarlet & Violet and Mega Evolution sets. |

**Example input:**

```json
{
    "productUrls": [
        "https://www.tcgplayer.com/product/487805/magic-universes-beyond-the-lord-of-the-rings-tales-of-middle-earth-the-one-ring"
    ],
    "searchQueries": ["charizard ex"],
    "game": "pokemon",
    "maxProductsPerQuery": 5,
    "maxListingsPerProduct": 25,
    "minCondition": "Lightly Played",
    "languages": ["English"],
    "goldSellersOnly": true
}
```

***

### Output

One row per seller listing. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
{
    "productName": "The One Ring",
    "setName": "Universes Beyond: The Lord of the Rings: Tales of Middle-earth",
    "setCode": "LTR",
    "cardNumber": "246",
    "rarity": "Mythic",
    "game": "Magic: The Gathering",
    "productId": 487805,
    "productUrl": "https://www.tcgplayer.com/product/487805/magic-universes-beyond-the-lord-of-the-rings-tales-of-middle-earth-the-one-ring",
    "imageUrl": "https://tcgplayer-cdn.tcgplayer.com/product/487805_in_1000x1000.jpg",
    "listingId": 329542601,
    "sellerName": "Brute Force Games",
    "sellerRating": 99.9,
    "sellerSales": "50000+",
    "goldSeller": true,
    "verifiedSeller": true,
    "directSeller": false,
    "sellerLocation": "San Diego, CA, US",
    "condition": "Lightly Played",
    "printing": "Foil",
    "language": "English",
    "quantity": 1,
    "price": 130.49,
    "shippingPrice": 1.49,
    "totalPrice": 131.98,
    "currency": "USD",
    "marketPrice": 139.93,
    "listedMedianPrice": 149.6,
    "discountVsMarketPct": 6.7,
    "hasPhotos": false,
    "scrapedAt": "2026-10-19T15:14:14.141Z"
}
```

With the recent sales add-on, rows also have a `recentSales` array when the product has recent sales:

```json
"recentSales": [
    {
        "orderDate": "2026-10-19T02:58:51.327+00:00",
        "condition": "Near Mint",
        "printing": "Foil",
        "language": "English",
        "quantity": 1,
        "price": 136.94,
        "shippingPrice": 0
    }
]
```

With the Fair Value Analysis add-on, rows for a covered card also have these fields when a fair value estimate is returned. Individual fields are left out when no data exists for them:

```json
{
    "fairValueUsd": 30.5,
    "discountVsFairValuePct": 20,
    "rawPriceUsd": 27.73,
    "discountVsRawPct": 12,
    "psa9PriceUsd": 60,
    "psa10PriceUsd": 108.02,
    "gemRatePct": 33.3,
    "psa10Pop": 40,
    "totalPop": 120,
    "price1dChangePct": 0.5,
    "price7dVs30dChangePct": -1.3,
    "gemRateDate": "2026-10-18"
}
```

***

### Understanding the data

**Fair value** is an AI-generated price estimate for an ungraded copy of the card. **Raw market price** is the going rate for an ungraded copy. Comparing a listing's price against either gives you a deal score - positive means the listing is priced below that benchmark, negative means above it:

| Field                    | Compares the listing's price against | Positive means                   |
| ------------------------ | ------------------------------------ | -------------------------------- |
| `discountVsFairValuePct` | The AI fair value estimate           | Priced below fair value - a deal |
| `discountVsRawPct`       | The raw (ungraded) market price      | Priced below raw market price    |

`psa9PriceUsd` and `psa10PriceUsd` show what graded copies sell for, and `gemRatePct` / `psa10Pop` / `totalPop` show how likely a raw copy is to grade PSA 10 and how many already have. `price1dChangePct` and `price7dVs30dChangePct` show short-term price momentum.

***

### Output fields

| Field                            | What it contains                                                                                                  |
| -------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| `productName`                    | Card or product name                                                                                              |
| `setName` / `setCode`            | Set or expansion name and code                                                                                    |
| `cardNumber`                     | Collector number within the set                                                                                   |
| `rarity`                         | Rarity as listed on TCGplayer                                                                                     |
| `game`                           | Game, for example Pokémon or Magic: The Gathering                                                                 |
| `productId`                      | TCGplayer product ID                                                                                              |
| `productUrl`                     | TCGplayer product page                                                                                            |
| `imageUrl`                       | Product image                                                                                                     |
| `listingId`                      | TCGplayer listing ID                                                                                              |
| `sellerName`                     | Seller store name                                                                                                 |
| `sellerRating`                   | Seller feedback rating, 0-100                                                                                     |
| `sellerSales`                    | Seller sales volume bucket, for example `10000+`                                                                  |
| `goldSeller`                     | Seller is a TCGplayer Gold Star seller                                                                            |
| `verifiedSeller`                 | Seller is TCGplayer verified                                                                                      |
| `directSeller`                   | Seller ships through TCGplayer Direct                                                                             |
| `sellerLocation`                 | City, state, and country of the seller                                                                            |
| `condition`                      | Near Mint, Lightly Played, Moderately Played, Heavily Played, or Damaged (Unopened for sealed products)           |
| `printing`                       | Printing, for example Normal, Foil, or Holofoil                                                                   |
| `language`                       | Card language                                                                                                     |
| `quantity`                       | Copies available in this listing                                                                                  |
| `price`                          | Item price in USD, excluding shipping                                                                             |
| `shippingPrice`                  | Shipping in USD when this listing is bought on its own (0 = free shipping)                                        |
| `totalPrice`                     | `price + shippingPrice`                                                                                           |
| `currency`                       | Always USD                                                                                                        |
| `marketPrice`                    | TCGplayer market price for this exact condition, printing, and language                                           |
| `listedMedianPrice`              | Median price of current listings for this printing, when TCGplayer reports one for that exact printing name       |
| `discountVsMarketPct`            | `(marketPrice - price) / marketPrice × 100` - positive means the listing is cheaper than market                   |
| `hasPhotos`                      | The seller uploaded photos of the actual card                                                                     |
| `recentSales`                    | Add-on: latest completed sales for the product (up to 5)                                                          |
| `fairValueUsd`                   | Add-on: AI-powered fair value estimate for the card in USD                                                        |
| `discountVsFairValuePct`         | Add-on: `(fairValueUsd - price) / fairValueUsd × 100` - positive means the listing is cheaper than fair value     |
| `rawPriceUsd`                    | Add-on: market price for the raw (ungraded) card in USD                                                           |
| `discountVsRawPct`               | Add-on: `(rawPriceUsd - price) / rawPriceUsd × 100` - positive means the listing is cheaper than raw market price |
| `psa9PriceUsd` / `psa10PriceUsd` | Add-on: market price for a PSA 9 / PSA 10 graded copy in USD                                                      |
| `gemRatePct`                     | Add-on: share of graded copies that came back PSA 10, in percent                                                  |
| `psa10Pop` / `totalPop`          | Add-on: number of copies graded PSA 10, and total graded copies                                                   |
| `price1dChangePct`               | Add-on: 1-day change in raw market price, in percent                                                              |
| `price7dVs30dChangePct`          | Add-on: 7-day vs 30-day change in raw market price, in percent                                                    |
| `gemRateDate`                    | Add-on: date the grading population figures were last updated                                                     |
| `scrapedAt`                      | When the listing was scraped                                                                                      |

***

### How much does it cost to scrape TCGplayer?

This Actor uses pay-per-event pricing - you pay for the listings you receive, plus a tiny start fee and any add-on you turn on.

| Event                       | Free     | Starter  | Scale    | Business |
| --------------------------- | -------- | -------- | -------- | -------- |
| Actor start                 | $0.00005 | $0.00005 | $0.00005 | $0.00005 |
| Card listing                | $0.003   | $0.002   | $0.0015  | $0.0012  |
| Add-on: Recent sales        | $0.003   | $0.002   | $0.0015  | $0.0012  |
| Add-on: Fair Value Analysis | $0.07    | $0.06    | $0.05    | $0.04    |

The recent sales add-on is charged once per product, only when sales are returned and at least one listing is delivered. The Fair Value Analysis add-on is charged once per card, only when a fair value is returned and at least one listing is delivered. If the remaining maximum cost per run can't cover an add-on, the listings are delivered without it and it isn't charged.

**Typical run costs (Starter plan):**

- 10 cheapest listings for one card: **$0.02**
- 50 listings for one card: **$0.10**
- Daily watchlist of 20 cards, 10 listings each: **$0.40 per run**
- 10 listings for one card with Fair Value Analysis: **$0.08**

Set a **maximum cost per run** in the run options to cap spending. The Actor stops cleanly when it reaches the limit and keeps everything scraped so far.

***

### Tips

- **Keep `maxListingsPerProduct` low for monitoring.** For price alerts, the 5-10 cheapest listings are usually all you need.
- **Filter on TCGplayer's side.** Condition, printing, language, price, and Gold Star filters are applied before listings are counted, so you only pay for listings that match.
- **Use product URLs for watchlists.** Search results can change from day to day; product URLs always point to the same product.
- **Use exact printing names.** Printing names differ by game: Pokémon uses Holofoil and Reverse Holofoil, Magic uses Foil, and Yu-Gi-Oh! uses 1st Edition, Unlimited, and Limited.

***

### FAQ

**Do I need a TCGplayer account?**
No. The Actor uses public TCGplayer data, with no login or API key.

**Which games are supported?**
Any product on TCGplayer works with product URLs. The **Game** filter for search covers Pokémon, Pokémon Japan, Magic: The Gathering, Yu-Gi-Oh!, One Piece, Lorcana, Flesh and Blood, Digimon, Dragon Ball Super: Fusion World, Star Wars: Unlimited, Riftbound, Gundam, Union Arena, Weiss Schwarz, Cardfight!! Vanguard, Grand Archive, Sorcery: Contested Realm, and Final Fantasy.

**In what order are listings returned?**
Cheapest first. By default, listings follow TCGplayer's own Price + Shipping sort; set **Sort by** to **Item price only** to sort by item price instead. TCGplayer's ranking counts some sellers' shipping differently than the single-item `shippingPrice`, so `totalPrice` isn't always strictly ascending.

**Why is `marketPrice` sometimes empty?**
TCGplayer only calculates a market price for condition, printing, and language combinations with enough recent sales. Uncommon combinations may have none.

**Which cards does Fair Value Analysis cover?**
Pokémon only, mainly Scarlet & Violet and Mega Evolution sets, especially Illustration Rare and Special Illustration Rare cards. Other games, Pokémon Japan, and older Pokémon sets return listings as normal, without the fair value fields, and aren't charged for the add-on.

**Can I scrape sealed products?**
Yes. Booster boxes, Elite Trainer Boxes, and other sealed products work the same way as singles.

**Is it legal to scrape TCGplayer?**
This Actor collects publicly available listing data. It doesn't collect personal data beyond seller store names and the city, state, and country they publish. Make sure your use of the data complies with TCGplayer's terms and the laws that apply to you.

***

### Limitations

1. **US marketplace.** Prices, shipping, and availability are for buyers shipping to the United States.
2. **Up to 100 products per run.** Split bigger watchlists across several runs or tasks.
3. **Recent sales are limited to the latest 5 per product.** TCGplayer publicly shows only the latest sales.
4. **Verified sellers only scans a limited number of listings.** On cards with many unverified sellers, it can return fewer listings than **Max listings per product**.
5. **Prices change continuously.** Each run is a snapshot of TCGplayer at that moment. A listing can sell before you act on it.
6. **Fair Value Analysis has narrow coverage.** Pokémon only, mainly Scarlet & Violet and Mega Evolution sets, especially Illustration Rare and Special Illustration Rare cards. Cards outside that scope return listings as normal, with no fair value fields and no charge.

***

### Support

Questions, bugs, feature requests, or need a custom trading card data solution? Open a ticket in the **Issues** tab.

# Actor input Schema

## `productUrls` (type: `array`):

TCGplayer product page URLs (for example https://www.tcgplayer.com/product/487805/...) or bare product IDs. Up to 100 products per run.

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

Card names to search for on TCGplayer, for example "charizard ex". Each search adds its top results to the run.

## `game` (type: `string`):

Limit search results to one game. Applies to search terms only, not to product URLs.

## `maxProductsPerQuery` (type: `integer`):

How many of the top search results to scrape for each search term.

## `maxListingsPerProduct` (type: `integer`):

Maximum number of seller listings to return for each product, cheapest first.

## `minCondition` (type: `string`):

Only return listings in this condition or better.

## `printings` (type: `array`):

Only return listings with one of these printings, for example Normal, Foil, Holofoil, Reverse Holofoil, 1st Edition, or Unlimited. Names depend on the game. Leave empty for all printings.

## `languages` (type: `array`):

Only return listings in one of these languages. Leave empty for all languages.

## `minPrice` (type: `number`):

Only return listings at or above this item price in USD, excluding shipping.

## `maxPrice` (type: `number`):

Only return listings at or below this item price in USD, excluding shipping.

## `goldSellersOnly` (type: `boolean`):

Only return listings from TCGplayer Gold Star sellers.

## `verifiedSellersOnly` (type: `boolean`):

Only return listings from TCGplayer verified sellers.

## `sortBy` (type: `string`):

Listings are returned cheapest first. Choose whether shipping counts toward the price.

## `includeRecentSales` (type: `boolean`):

Attach the latest completed sales (up to 5) to each product's listings.

## `enableFairValue` (type: `boolean`):

Attach an AI-powered fair value estimate and grading data to each covered card's listings.

## Actor input object example

```json
{
  "productUrls": [
    "https://www.tcgplayer.com/product/517046/pokemon-sv-scarlet-and-violet-151-blastoise-ex-200-165"
  ],
  "game": "any",
  "maxProductsPerQuery": 5,
  "maxListingsPerProduct": 10,
  "minCondition": "any",
  "goldSellersOnly": false,
  "verifiedSellersOnly": false,
  "sortBy": "priceWithShipping",
  "includeRecentSales": false,
  "enableFairValue": false
}
```

# Actor output Schema

## `listings` (type: `string`):

All scraped seller listings

# 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 = {
    "productUrls": [
        "https://www.tcgplayer.com/product/517046/pokemon-sv-scarlet-and-violet-151-blastoise-ex-200-165"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("phantom_coder/tcgplayer-listings-scraper").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 = { "productUrls": ["https://www.tcgplayer.com/product/517046/pokemon-sv-scarlet-and-violet-151-blastoise-ex-200-165"] }

# Run the Actor and wait for it to finish
run = client.actor("phantom_coder/tcgplayer-listings-scraper").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 '{
  "productUrls": [
    "https://www.tcgplayer.com/product/517046/pokemon-sv-scarlet-and-violet-151-blastoise-ex-200-165"
  ]
}' |
apify call phantom_coder/tcgplayer-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,phantom_coder/tcgplayer-listings-scraper"
        }
    }
}
```

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/I4eqjxCEs7t6VpPtc/builds/dVvQjuLjFVniZBx7o/openapi.json
