# Magento Scraper: Adobe Commerce Products & Prices (`mrslm_data/magento-products`) Actor

Export products, SKUs, prices, stock, ratings and variant counts from public Magento 2 / Adobe Commerce stores via their public GraphQL or sitemap.

- **URL**: https://apify.com/mrslm_data/magento-products.md
- **Developed by:** [MRSLM Data](https://apify.com/mrslm_data) (community)
- **Categories:** E-commerce
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 products

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

## Magento Scraper: Adobe Commerce Products & Prices

**Export products, SKUs, prices, stock, ratings and variant counts from public Magento 2 / Adobe Commerce stores. $1.00 per 1,000 products.**

Magento 2 (now Adobe Commerce) runs the online stores of many retailers and brands. This Magento scraper turns any store's public catalog into clean product rows you can filter, export and schedule: catalog research, competitor checks and Magento price monitoring without a store API key.

### Quick start

1. Press **Start**. The form is already filled with this example input, so the first run returns real rows in under a minute:

```json
{
  "stores": [
    "magento2-demo.magebit.com"
  ],
  "maxProductsPerStore": 20
}
```

2. Swap in your own values, or call the Actor through the Apify API, Make, Zapier, n8n or the Python/JS clients with the same JSON.
3. Download the results as JSON, CSV or Excel from the **Output** tab, or schedule the run to repeat.

**Full guide: How to Scrape Magento 2 Products with the Public GraphQL API (Prices, Stock, Ratings and Variants)**

### What the Magento Scraper does

You give the Actor one or more Magento store domains and, optionally, a search keyword. It queries each store's public storefront GraphQL catalog, the same read-only API a shopper's browser uses, and saves one row per product: SKU, name, product type, price, regular price, maximum price, discount percent, currency, stock, rating, review count, category paths, variant count and variant SKUs, images, the product link and a plain-text description if you want it.

Some stores close their GraphQL catalog. With `useSitemapFallback` on (the default), the Actor then reads the store's public sitemap and product pages instead, and the `source` column tells you which method was used for each row.

- Whole catalogs (`maxProductsPerStore` 0) or a keyword search.
- Configurable products come with their variant SKUs, e.g. every size and colour.
- Placeholder images are dropped, so `imageUrl` is either a real photo or empty.

### Who it is for

- **Brands and distributors**: check what Magento retailers charge for your products and whether they are in stock.
- **Competitor and price analysts**: track a rival Magento store's prices and discounts over time.
- **Agencies and Magento developers**: audit a client's catalog: missing images, reviews, categories and variants.
- **Marketplaces and comparison sites**: import product feeds from Magento shops that have no feed of their own.

### Real example: search a Magento store for jackets

Say you want every jacket in a Magento store, with price, stock, rating and the number of size/colour combinations. We use Magebit's public Magento 2 demo store, which runs the standard Luma sample catalog, so you can reproduce the run exactly. The description is left out to keep rows short.

#### Step 1: Enter the input

Open the [Magento Scraper](https://apify.com/mrslm_data/magento-products) in Apify Console, switch the input form to **JSON** and paste this. It is the exact input used for the run in this guide:

```json
{
  "stores": [
    "magento2-demo.magebit.com"
  ],
  "search": "jacket",
  "includeDescription": false,
  "maxProductsPerStore": 20
}
```

What each setting does:

- `stores`: one store domain. A full URL works too, and you can list many stores.
- `search`: only products matching "jacket". Leave it empty for the whole catalog.
- `includeDescription`: false to skip the product description.
- `maxProductsPerStore`: save at most 20 products from each store.

#### Step 2: Run it

Press **Start**. On 30 October 2026 this input finished with status `SUCCEEDED` in about 5 seconds and saved 20 rows to the run's dataset. The run was charged 20 `product` events plus one start event, so the bill was $0.0201 on the Free/Bronze tier. The summary shows 20 products from the store, read with the `graphql` method.

#### Step 3: Read the output

Here are the first rows of the real dataset, cut to the most useful columns:

| sku | name | type | price | inStock | ratingPercent | reviewCount | variantCount |
|---|---|---|---|---|---|---|---|
| WJ02 | Josie Yoga Jacket | Configurable | 56.25 | yes | 70 | 4 | 15 |
| WJ09 | Jade Yoga Jacket | Configurable | 32 | yes | 87 | 3 | 15 |
| WJ08 | Adrienne Trek Jacket | Configurable | 57 | yes | 60 | 2 | 15 |
| WJ01 | Stellar Solar Jacket | Configurable | 75 | yes | 67 | 3 | 9 |
| WJ04 | Ingrid Running Jacket | Configurable | 84 | yes | 90 | 2 | 15 |
| WJ07 | Inez Full Zip Jacket | Configurable | 59 | yes | 67 | 3 | 15 |
| WJ05 | Riona Full Zip Jacket | Configurable | 60 | yes | 87 | 3 | 15 |
| WJ03 | Augusta Pullover Jacket | Configurable | 57 | yes | 87 | 3 | 15 |
| WJ06 | Juno Jacket | Configurable | 77 | yes | 87 | 3 | 15 |
| WJ11 | Neve Studio Dance Jacket | Configurable | 69 | yes | 87 | 3 | 15 |
| MJ08 | Lando Gym Jacket | Configurable | 99 | yes | 67 | 3 | 15 |
| WJ12 | Olivia 1/4 Zip Light Jacket | Configurable | 77 | yes |  | 0 | 15 |

And one full row as JSON (long text shortened with …):

```json
{
  "store": "magento2-demo.magebit.com",
  "storeName": "Default Store View",
  "sku": "WJ02",
  "name": "Josie Yoga Jacket",
  "type": "Configurable",
  "price": 56.25,
  "regularPrice": 56.25,
  "maxPrice": 56.25,
  "discountPercent": 0,
  "currency": "EUR",
  "inStock": true,
  "ratingPercent": 70,
  "reviewCount": 4,
  "categories": [
    "women/tops-women",
    "women/tops-women/jackets-women",
    "promotions/women-sale"
  ],
  "variantCount": 15,
  "variantSkus": [
    "WJ02-XS-Black",
    "WJ02-XS-Blue",
    "WJ02-XS-Gray",
    "WJ02-S-Black",
    "…"
  ],
  "imageUrl": null,
  "url": "https://magento2-demo.magebit.com/josie-yoga-jacket.html",
  "source": "graphql"
}
```

What the 20 real rows show:

- **Prices and ratings are clean numbers.** Prices run from €32 (Jade Yoga Jacket, and the Compete Track Tote) to €99 (Lando Gym Jacket), all in EUR. `ratingPercent` is Magento's 0–100 rating summary; Kenobi Trail Jacket has the highest at 93. Two jackets with no reviews (Olivia 1/4 Zip Light Jacket and Typhon Performance Fleece-lined Jacket) have an empty rating rather than a misleading 0.
- **Variants are listed.** 18 of the 19 jackets have 15 variants (five sizes times three colours), and `variantSkus` lists each one, such as WJ02-XS-Black. Stellar Solar Jacket has 9.
- **Search matches more than the name.** The 20th row is a bag, the Compete Track Tote, because Magento's search also looks at descriptions and attributes. Filter on `categories` (here `women/tops-women/jackets-women` or `men/tops-men/jackets-men`) if you need jackets only.
- **Categories show sale membership.** Josie Yoga Jacket sits in `promotions/women-sale`, yet its `discountPercent` is 0 and price equals regular price. Category names are what the merchant set up; the price fields are what a shopper actually pays.
- **Images are real or empty.** Only the tote returned a real photo in this demo store. For the jackets the store returned no image or only Magento's placeholder, which the Actor drops, so `imageUrl` is empty.

### How to tell if a store runs Magento

Signs of Magento 2 include product URLs ending in `.html`, paths such as `/static/version…/frontend/` and `/media/catalog/product/` in image links, and a `/checkout/cart/` page. The quickest test is to run the Actor on the domain with `maxProductsPerStore` set to 5: if GraphQL is open, `source` is `graphql`; if the store is Magento but closed, the sitemap fallback still reads its products, and if it is not Magento the run summary says no products were found, at no charge.

### GraphQL or sitemap: what changes

GraphQL rows have the full set of fields, including regular price, discount, rating, categories and variant SKUs. Sitemap rows come from each product page's public structured data, so they have the price, currency, stock, rating and images, but no regular price, discount or category paths. The keyword `search` only works with GraphQL; sitemap mode reads the catalog in sitemap order.

### Output fields

Each row in the dataset has these fields. The example column shows a value from the run above.

| Field | What it means | Example from this run |
|---|---|---|
| `store / storeName` | The store domain and its store view name. | magento2-demo.magebit.com / Default Store View |
| `sku / name` | Product SKU and name. | WJ02 / Josie Yoga Jacket |
| `type` | Magento product type: Simple, Configurable, Bundle and so on. | Configurable |
| `price / regularPrice` | Final price a shopper pays, and the regular price before discounts. | 56.25 / 56.25 |
| `maxPrice` | Highest variant price, for configurable products. | 56.25 |
| `discountPercent` | Discount off the regular price. | 0 |
| `currency` | Store currency, e.g. EUR. | EUR |
| `inStock` | true when the product is in stock. | yes |
| `ratingPercent / reviewCount` | Rating summary from 0 to 100, and the number of reviews. | 70 / 4 |
| `categories` | Category paths, e.g. women/tops-women/jackets-women. | women/tops-women, women/tops-women/jackets-women, promotions… |
| `variantCount / variantSkus` | Number of variants and their SKUs. | 15 / WJ02-XS-Black, WJ02-XS-Blue, WJ02-XS-Gray … |
| `imageUrl / images` | Main image and gallery, without placeholder images. | https://magento2-demo.magebit.com/media/catalog/product/cach… / https://magento2-demo.magebit.com/media/catalog/product/cach… |
| `url` | Product page link. | https://magento2-demo.magebit.com/josie-yoga-jacket.html |
| `source` | graphql or sitemap: how the row was read. | graphql |

### Export Magento products to CSV, Excel or Google Sheets

Every run saves its rows to a dataset, and a dataset can be downloaded in any common format. You do not need to write code for this.

**From Apify Console.** Open the run, go to the **Output** tab and click **Export**. Pick CSV, Excel (XLSX), JSON, XML, HTML or RSS. You can tick only the columns you want, for example `store`, `sku`, `name`, `price`, `regularPrice`. Nested values such as lists are flattened into columns like `variantSkus/0` in CSV and Excel.

**From a URL.** The same export is a plain HTTPS link. Replace `<DATASET_ID>` with the dataset ID shown on the run's Storage tab:

```bash
## CSV with just the columns you need
curl -H "Authorization: Bearer $APIFY_TOKEN" \
  "https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv&clean=1&fields=store,sku,name,price,regularPrice,discountPercent,inStock,ratingPercent,reviewCount,url" -o magento-products.csv

## Excel
curl -H "Authorization: Bearer $APIFY_TOKEN" \
  "https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=xlsx&clean=1" -o magento-products.xlsx
```

**Into Google Sheets.** You have three good options:

1. **One-off:** download the CSV and use **File > Import > Upload** in Google Sheets. Choose "Replace current sheet" to refresh an existing tab.
2. **Automatic, no code:** in Make, Zapier or n8n, use the Apify app's "Watch Actor runs" (or "Run Actor") trigger, then "Get dataset items", then the Google Sheets "Add row" action. Every scheduled run then lands in your sheet. Apify's own [Google Sheets Import & Export](https://apify.com/lukaskrivka/google-sheets) Actor can also append a dataset to a sheet, and you can chain it to this Actor's runs with an integration.
3. **Formula:** `=IMPORTDATA("https://api.apify.com/v2/actor-tasks/<USERNAME>~<TASK_NAME>/runs/last/dataset/items?status=SUCCEEDED&format=csv&token=<YOUR_TOKEN>")` always pulls the latest successful run of a saved task. The token sits in the formula, so anyone who can open the sheet can see it. Only use this in a private sheet.

### Schedule it to run every day at 5:00

For price monitoring, run daily on the same stores and compare `sku`, `price` and `inStock` with yesterday's file. If you only care about changes, our [Store Change Watcher](https://apify.com/mrslm_data/store-change-watcher) does the comparison for Shopify and WooCommerce stores; for Magento, schedule this Actor and diff the two files.

1. In the Actor's input form, set up the input from Step 1 and click **Save as new task**. Give it a clear name such as `magento-price-watch-daily`.
2. Go to **Schedules > Create new**, set the cron expression to `0 5 * * *` and pick your timezone, so it runs every day at 5:00.
3. Add the task to the schedule and save. Each run gets its own fresh dataset.
4. Optional: on the task's **Integrations** tab, add a webhook, Slack or email notification for "Run succeeded", or connect Make, Zapier or n8n, so the new rows go where you need them.

To fetch the newest results without looking up a run ID, use the task's last-run link: `https://api.apify.com/v2/actor-tasks/<USERNAME>~magento-price-watch-daily/runs/last/dataset/items?status=SUCCEEDED&format=json`.

### Call it from the API (Python, JavaScript or curl)

You can start the Actor from your own code with the official Apify clients. Put your API token (Console > Settings > API & Integrations) in an environment variable called `APIFY_TOKEN` rather than in the code.

**Python** (`pip install "apify-client>=3"`). Tested with apify-client 3.4:

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = {
    "stores": [
        "magento2-demo.magebit.com"
    ],
    "search": "jacket",
    "includeDescription": False,
    "maxProductsPerStore": 20
}

run = client.actor("mrslm_data/magento-products").call(run_input=run_input)

## apify-client 3.x returns a Run object, so use run.default_dataset_id
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item["sku"], item["name"])
```

In apify-client 3.x, `call()` returns a typed object. Older examples that use `run["defaultDatasetId"]` were written for 1.x and 2.x and fail in 3.x with `TypeError: 'Run' object is not subscriptable`.

**JavaScript / Node.js** (`npm install apify-client`):

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const input = {
    "stores": [
        "magento2-demo.magebit.com"
    ],
    "search": "jacket",
    "includeDescription": false,
    "maxProductsPerStore": 20
};

const run = await client.actor('mrslm_data/magento-products').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]);
```

**curl**, one request that runs the Actor and returns the rows as CSV (it waits up to 5 minutes, so keep the input small):

```bash
curl -X POST "https://api.apify.com/v2/acts/mrslm_data~magento-products/run-sync-get-dataset-items?format=csv" \
  -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"stores": ["magento2-demo.magebit.com"], "search": "jacket", "includeDescription": false, "maxProductsPerStore": 20}' -o magento-products.csv
```

### What it costs

The Actor uses pay-per-event pricing. **Product**: $1.00 per 1,000 on the Free and Bronze tiers, $0.90 on Silver and $0.80 on Gold. Each run also has a start fee of $0.00005 per GB of memory (one event at the default memory). You are not billed separately for compute on normal runs: the event prices are the whole bill.

#### Price per event

Current pay-per-event prices for this Actor on Apify, by Apify subscription plan:

| Event (per 1,000) | Free / Bronze | Silver | Gold / Platinum / Diamond |
|---|---|---|---|
| Product (`product`) | $1.00 | $0.90 | $0.80 |
| Actor start (once per run at the default memory, not per 1,000) | $0.00005 | $0.00005 | $0.00005 |

You are charged only for the events in this table: nothing for compute, and nothing for searches that return no rows beyond the start fee.

| Scenario | Free / Bronze | Silver | Gold |
|---|---|---|---|
| The run in this guide (20 products) | $0.0201 | $0.0181 | $0.0161 |
| Daily check of a 1,000-product store (30 runs, 30,000 a month) | $30.00 | $27.00 | $24.00 |
| One-off export of 10 stores with 2,000 products each | $20.00 | $18.00 | $16.00 |

To cap spending, set **Maximum cost per run** in the run options (or `maxTotalChargeUsd` in the API). The Actor stops cleanly at the cap and you are never billed past it.

### Limits

- Public catalog data only. Customer-group prices, B2B price lists and logged-in prices are not visible.
- Stores that block GraphQL and have no public sitemap cannot be read; they are reported in the run summary at no charge.
- Keyword search uses the store's own search, which can return related products.
- Variant rows are summarised as SKUs on the parent product; there is no separate row per variant.

### FAQ

**Does it work on Adobe Commerce (Magento Commerce Cloud)?**
Yes. Adobe Commerce uses the same storefront GraphQL API. Stores that switch it off are read through the sitemap fallback.

**Does it work on Magento 1?**
Only through the sitemap fallback, if the store publishes a sitemap and structured product data. Magento 1 has no GraphQL API.

**Why is regularPrice empty on some rows?**
Those rows came from the sitemap fallback (`source` is `sitemap`), where the page only shows the selling price.

**Can I get stock quantities?**
No, only in or out of stock. Magento's public API does not expose quantities by default.

**Can I run it on a schedule?**
Yes. Save your input as a task and attach a schedule, as shown above. Each run is independent and returns the Magento products available at that moment.

**Does it work with Make, Zapier or n8n?**
Yes. All three have an Apify app. Use "Run Actor" (or run a saved task), then "Get dataset items" to pass the rows to the next step, such as Google Sheets, Airtable, a CRM or Slack.

**Can AI agents use it through MCP?**
Yes. Apify's hosted MCP server can expose this Actor as a tool to any MCP client (Claude Desktop, Cursor, VS Code and others). Add `https://mcp.apify.com/?tools=mrslm_data/magento-products` as a remote MCP server and sign in with your Apify account or API token. The agent fills in the same input fields shown above and gets the same rows back, billed at the same per-event prices.

**How do I export Magento products to CSV?**
Enter one or more store domains, run the Actor and choose CSV from the Output tab. Set `maxProductsPerStore` to limit rows per store, and use `includeDescription` to control whether descriptions are included.

**Can I scrape Magento products without a store API key?**
Yes. The Actor reads the store's public storefront GraphQL catalog without a login. If GraphQL is closed, the default sitemap fallback reads public product pages when a sitemap is available.

**How can I monitor competitor Magento prices?**
Schedule runs on the same stores and compare `sku`, `price` and `inStock` across datasets. You can use `search` to focus on a keyword, but it only works with GraphQL; sitemap fallback reads products in sitemap order.

### Related scrapers for other store platforms

- [Shopify Scraper](https://apify.com/mrslm_data/shopify-products): products, prices and variants from any Shopify store.
- [WooCommerce Scraper](https://apify.com/mrslm_data/woocommerce-products): products and prices from WooCommerce stores.
- [Product Page Scraper](https://apify.com/mrslm_data/product-page-json): one product URL from any platform to clean JSON.
- [Price Drop & Restock Tracker](https://apify.com/mrslm_data/store-change-watcher): only the changes since your last run, for Shopify and WooCommerce.

### Is it legal?

This Actor only reads pages and feeds that the website itself publishes to every visitor without a login. It obeys each site's robots.txt, keeps a polite request rate, and never tries to get past logins, paywalls, captchas or bot checks. It does not collect personal data such as emails, phone numbers or names of private individuals. You are responsible for how you use the data: follow the source site's terms, copyright and the privacy laws that apply to you (GDPR, CCPA, etc.). This tool is independent and not affiliated with or endorsed by the platforms it reads.

# Actor input Schema

## `stores` (type: `array`):

Store domains or URLs, e.g. "magento2-demo.magebit.com". Read through the store's public storefront GraphQL catalog; falls back to the public sitemap and product pages.

## `search` (type: `string`):

Only products matching this keyword (GraphQL mode). Leave empty for the whole catalog.

## `includeDescription` (type: `boolean`):

Plain-text product description (up to 1,000 characters).

## `useSitemapFallback` (type: `boolean`):

If a store's GraphQL catalog is closed or empty, read products from its public sitemap and product pages instead (slower, same price).

## `maxProductsPerStore` (type: `integer`):

0 = the whole catalog.

## `maxResults` (type: `integer`):

Safety cap on saved products across all stores. 0 = no cap. Your max cost per run is always respected.

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

Usually not needed.

## Actor input object example

```json
{
  "stores": [
    "magento2-demo.magebit.com"
  ],
  "includeDescription": true,
  "useSitemapFallback": true,
  "maxProductsPerStore": 20,
  "maxResults": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All results as a dataset (JSON, CSV, Excel and more via the API or Console).

## `summary` (type: `string`):

Counts of results, targets that succeeded or failed, and the stop reason.

# 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 = {
    "stores": [
        "magento2-demo.magebit.com"
    ],
    "maxProductsPerStore": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrslm_data/magento-products").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 = {
    "stores": ["magento2-demo.magebit.com"],
    "maxProductsPerStore": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("mrslm_data/magento-products").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 '{
  "stores": [
    "magento2-demo.magebit.com"
  ],
  "maxProductsPerStore": 20
}' |
apify call mrslm_data/magento-products --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrslm_data/magento-products"
        }
    }
}
```

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/ddgvsjl3aqgMyMHVy/builds/gsytUwDhYqaopjlMv/openapi.json
