Shopify MCP Server & API - Products, Prices, Stock avatar

Shopify MCP Server & API - Products, Prices, Stock

Pricing

from $0.70 / 1,000 result rows

Go to Apify Store
Shopify MCP Server & API - Products, Prices, Stock

Shopify MCP Server & API - Products, Prices, Stock

Shopify products for AI agents: an MCP server and live API that reads any Shopify store, collection or product link in seconds. Prices per country, sale prices, variants, stock, SKUs, images, descriptions and collections. No login, no proxy.

Pricing

from $0.70 / 1,000 result rows

Rating

0.0

(0)

Developer

Akhil rajesh

Akhil rajesh

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

11 hours ago

Last modified

Features

Limited permissionsSingle-tenantServer interface

Share

Give your AI agent Shopify product data on demand. This Actor is an MCP server and a live HTTP API that reads any Shopify store: the whole catalogue, one collection, or single products by link. An agent asks for "Gymshark's newest leggings under $60 that are in stock, priced for the UK" and gets the products back in seconds: title, brand, product type, price and sale price with the discount, every variant with its price, size and colour, SKU and whether it's in stock, images, dates and the product link.

It runs the same code as Shopify Scraper & Price Tracker, with Apify Standby switched on, so it answers each request at once instead of starting a run. For whole catalogues, daily price-drop and restock tracking, or Slack, Discord and Teams alerts, use that Actor.

Connect your agent

Authenticate with your Apify API token (Apify Console → Settings → API & Integrations).

MCP server (Streamable HTTP): https://akhil-rajesh--shopify-mcp-server.apify.actor/mcp

{"mcpServers": {"shopify": {"type": "http", "url": "https://akhil-rajesh--shopify-mcp-server.apify.actor/mcp",
"headers": {"Authorization": "Bearer <YOUR_APIFY_TOKEN>"}}}}

In Claude Code:

$claude mcp add --transport http shopify https://akhil-rajesh--shopify-mcp-server.apify.actor/mcp --header "Authorization: Bearer <YOUR_APIFY_TOKEN>"

A client that can't send headers can use https://akhil-rajesh--shopify-mcp-server.apify.actor/mcp?token=<YOUR_APIFY_TOKEN>. Keep that URL private, as it carries your token.

Through Apify's MCP server (https://mcp.apify.com, for Claude, ChatGPT, Cursor and other clients), add the tools with https://mcp.apify.com?tools=akhil_rajesh/shopify-mcp-server. They appear as akhil_rajesh--shopify-mcp-server--get_products and so on. Add them that way rather than through Apify's generic call-actor tool, which returns the rows only as text.

Then ask in plain words:

  • "What are Allbirds' 20 best-selling shoes right now, and which are on sale?"
  • "Compare Kith's prices for the UK and the US on its newest products."
  • "Is this product in stock in size 10?" (with the link)
  • "List Gymshark's collections, then show me the leggings under $50."

Tools

ToolWhat it returns
get_productsProducts of up to 5 stores, collections or product links, in the store's order (best selling, newest, price, title), priced for any country. Filters: keywords, excluded words, vendors, product types, tags, a price range, in stock only, on sale only, published within N days. One row per product, or per variant. Product details and Shopify's own recommendations when asked for
get_productProducts by link, with every detail: variants, every image and video, the full description, SEO texts, subscription plans and collections. Links the store doesn't have are named in notFound and not charged
list_collectionsA store's collections (categories) with title, link, description and image, to pass to get_products
run_actorThe whole input of Shopify Scraper & Price Tracker in one call, for reads the other tools can't express

The first request starts a Standby run, which took about 5 seconds in testing; after that, 20 best sellers came back in 0.6 to 1.6 seconds and a single product in about 1.3 seconds.

HTTP API

The same reads as plain HTTP requests, with the same token (header Authorization: Bearer <token>):

curl "https://akhil-rajesh--shopify-mcp-server.apify.actor/products?store=allbirds.com&max=20&country=GB&onSale=true" \
-H "Authorization: Bearer <YOUR_APIFY_TOKEN>"
EndpointParameters (defaults in brackets)
GET /productsstore, max (50), sort (bestSelling), country, keywords, exclude, vendors, types, tags, minPrice, maxPrice, inStock, onSale, days, variants, details (false), recs (0)
GET /collectionsstore, max (250)
POST /runThe Shopify Scraper & Price Tracker input as the JSON body

Separate several stores, links, keywords or tags with |. The Actor's Endpoints tab in Apify Console lists every parameter and lets you try them.

What each product holds

GroupFields
Producttitle, vendor, productType, tags, handle, productId, url, imageUrl, options
Priceprice (the lowest variant's), maxPrice, compareAtPrice, discountPercent, onSale, currency, country
Stockavailable, variantsCount, variantsInStock, backorder
Variantsvariants: each with variantId, title, sku, barcode, price, compareAtPrice, available, options, weight and image
Details (product_details)images, videos, description, descriptionHtml, seoTitle, seoDescription, sellingPlans, requiresSellingPlan, collections
Morerecommendations (Shopify's own related products), createdAt, publishedAt, updatedAt, rank, store, storeName, scrapedAt

With one row per variant, each row is one size or colour with its own price, SKU and stock. Shopify doesn't share stock counts without the store's own token, so rows say whether each variant can be bought, not how many are left. Fields without a value are left out of a row.

A product, shortened:

{
"type": "product",
"store": "www.allbirds.com",
"storeName": "Allbirds",
"rank": 1,
"title": "Men's Wool Runner - Natural Grey (Light Grey Sole)",
"vendor": "Allbirds",
"productType": "Shoes",
"price": 110,
"onSale": false,
"currency": "USD",
"available": true,
"variantsCount": 7,
"variantsInStock": 3,
"options": [{"name": "Size", "values": ["8", "9", "10", "11", "12", "13", "14"]}],
"url": "https://www.allbirds.com/products/mens-wool-runners"
}

Reading stores well

  • Any Shopify store's address works, with or without www., and so does its .myshopify.com address. A collection's link (.../collections/mens) reads only that collection, a product's link only that product.
  • Prices for another country: set country (GB, CA, DE, or a name) and prices come in that country's currency, as the store sells there. A store that doesn't sell to a country answers with its own market's prices, and the rows' country says which.
  • A store's own order: bestSelling is the store's best sellers, newest its newest products, storeOrder a collection's own arrangement.
  • Headless stores, whose front end is built apart from Shopify's and doesn't pass its API through, are named in notLoaded. The Actor identifies itself and never disguises itself as a browser.

Answers and limits

Every answer carries the rows, notFound (inputs that aren't a Shopify store, collection or product, each with the reason: free), notLoaded (stores that didn't answer), notRead (what a limit left out: not charged) and notes.

A request that reads nothing gets an error, and nothing is charged:

  • HTTP 400 for an argument it can't read (a tool error over MCP).
  • 503 when no store answered or the run was busy (send it again).
  • 402 when your spending limit for the run is reached (it lifts when the run ends, after 2 minutes without requests).

A 503 can also carry rows, when the platform stopped the run while a request was being read: those were stored and charged, and notRead names the rest.

Stores or linksRowsAnswer sizeTime
MCP tool call5100about 350 kB50 seconds
HTTP request101,000about 6 MB170 seconds

The MCP limits keep answers inside what MCP clients wait for (60 seconds) and what Apify's MCP server passes on (about 1 MB). Product details add a few kB a product, so fewer products fit an answer with them. A request that has started runs to its end even if you stop waiting: Apify's Standby proxy keeps it open, so its rows are read and charged. Ask for what you need.

How much does it cost?

Pay-per-event, the same prices per row as Shopify Scraper & Price Tracker:

Your planPer 1,000 rows
Free$1.00
Starter$0.90
Scale$0.80
Business and above$0.70

A row is a product, a variant (with one row per variant) or a collection. Plus the start fee when a Standby run starts, and the run's platform usage while it serves you and until it has been idle for 2 minutes, at Apify's usual rates. That's why the Store page's pricing box mentions platform usage. Inputs that aren't stores, and products a filter leaves out, cost nothing.

Agents that pay per call

Apify's MCP server doesn't offer Actors with a live endpoint to agents that pay per call with x402 or Skyfire. Those agents can use Shopify Scraper & Price Tracker through https://mcp.apify.com instead: it takes the same input and returns the same rows, as a normal run that starts for each call instead of a live answer. An agent with an Apify account or API token can use either.

FAQ

Why did I get fewer products than I asked for?

The store or collection ran out of products, a filter left the rest out, or a limit was reached (notRead says which). For whole catalogues of thousands of products, run Shopify Scraper & Price Tracker, which has no per-request limits.

Can it tell me what changed since yesterday, or post price drops to Slack?

Not over the live endpoint, which answers each request on its own and ignores those fields. A normal run of this Actor does both, with the same input as Shopify Scraper & Price Tracker: schedule it, or schedule the scraper. Each Actor keeps its own price history (this one's is shopify-mcp-history by default), because Apify lets an Actor open only the history stores it created itself.

Why does a store come back as not loaded?

Either the store didn't answer (try again shortly), or its front end is built apart from Shopify's and doesn't pass Shopify's API through (a "headless" store, such as some large brands). The reason is in notLoaded.

Is the data the same as on the store's website?

It comes from the store's own Storefront API, which powers its pages and apps: the same products, prices and availability a shopper sees, for the country asked for.

Other Actors by this developer

Data source

All data comes from each store's Shopify Storefront API, which Shopify opens to everyone without a token. The Actor identifies itself as a bot, asks each store about once a second, and reads public product data only; it never signs in or checks out.

Disclaimer: This is an independent tool. It is not affiliated with, endorsed by, or sponsored by Shopify Inc. or any store it reads. All product and company names are the property of their respective owners.

Limitations

  • Shopify stores only, and not headless stores whose front end doesn't pass Shopify's API through
  • No stock counts: Shopify shares them only with the store's own token, so rows say whether each variant can be bought
  • Per-request limits (see above); whole catalogues belong to a normal run
  • No change tracking or alerts over the live endpoint: those are a scheduled run's
  • Prices and stock change constantly, and a product can sell out between requests