# Supplier Price Finder: Wholesale & Landed Cost (`cleanpull/supplier-price-finder`) Actor

Wholesale and dropship cost for a product idea: unit prices, MOQ, price breaks and supplier ratings from Made-in-China, AliExpress and Alibaba search, plus DHgate and Alibaba offer pages you pick, with a landed-cost estimate where a page shows shipping. Only your Apify account needed.

- **URL**: https://apify.com/cleanpull/supplier-price-finder.md
- **Developed by:** [CleanPull](https://apify.com/cleanpull) (community)
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 product summaries

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

## Supplier Price Finder: Wholesale & Landed Cost

Give it **product ideas in a few words** ("silicone baking mat", "dog harness") and get **what it costs to source them**: factory offers from **Made-in-China.com** with **unit price, minimum order (MOQ), quantity price breaks**, and the **supplier's name, badge, audit, years and reviews**. Add the **DHgate** and **Alibaba** offer pages you found to compare them in the same table: DHgate pages bring the **shipping cost and delivery days to the US**, so those offers get a **landed cost per unit** (labelled an estimate). **AliExpress** and **Alibaba** search join through CleanPull's marketplace data service when you add them to `sources`, with **only your Apify account needed**. Each idea gets one **summary row**: the spread of unit prices and MOQs, the cheapest, lowest-MOQ and cheapest-landed offers, and a landed-cost range where a page shows shipping. From **$2 per 1,000 offers**.

### What you can do with it

- **"What would this product cost me to source?"** One product idea, ten Made-in-China offers: the summary gives the lowest, median and highest unit price and MOQ in one row.
- **"What do these DHgate listings cost landed in the US?"** Paste the DHgate offer pages you found: each gets its US shipping quote, delivery days, price breaks and a landed cost per unit, as an estimate.
- **"What is the unit price at 1,000 units?"** Set an order quantity: each offer's price comes from the price break that holds it.
- **"Compare the Alibaba quotes I found with other suppliers."** Paste Alibaba product pages next to a product idea: their price breaks, MOQ, supplier years and rating join the same summary.
- **"Check margins for a product I want to sell."** Feed the summary's unit and landed cost into a margin estimate (the CleanPull plugin's `/validate` does this).
- **"Dropship from AliExpress."** Add `aliexpress` to `sources`: its prices per piece join the comparison, from its search for your product idea.
- **"What do Alibaba factories ask for it?"** Alibaba search gives each offer's price or price range and the supplier; give an offer's page for its price breaks and MOQ.

### Where the prices come from

| Source                    | How                                                                             | What it adds                                                                                                                 |
| ------------------------- | ------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| Made-in-China.com         | Searched by product idea (30 offers per search), plus the top offers' own pages | Unit price or range, MOQ, price breaks, Diamond or Gold member badge, audit, province, business type, years, reviews         |
| DHgate offer pages        | The pages you give (dhgate.com/product/…/<id>.html)                             | Price range, list price, price breaks, lot size, **shipping cost and days to the US**, store age, feedback, on-time delivery |
| Alibaba.com product pages | The pages you give (alibaba.com/product-detail/…)                               | Price breaks, MOQ, supplier name, years, rating, on-time delivery, verification, units sold                                  |
| AliExpress search         | aliexpress.us search, through CleanPull's marketplace data service              | Sale price and list price per piece in USD, store name. No price breaks, no shipping cost                                    |
| Alibaba.com search        | alibaba.com search, through CleanPull's marketplace data service                | Price or price range in USD (from the variants), supplier name and country. No price breaks, MOQ or shipping cost            |

Pages this actor reads itself are read signed out, as any visitor sees it, and only at addresses the site's robots.txt allows. **DHgate is not searched:** its robots.txt disallows its search pages (`/w/`) and any address with a query string; its offer pages are read when you give them, as are Alibaba's. **1688.com** needs a sign-in and is not read.

**The marketplace data service** is a third-party web data provider. CleanPull holds the account and its key, which never appears in your input, logs or results. A search there takes about a minute, whatever the depth, and all the product ideas of a run are searched together, so more ideas add little time. It is searched only when `sources` lists `aliexpress` or `alibaba`. Each result delivered as an offer row is a **provider record** on your bill; results the title filter or **Offers per source** leave out are not charged per record. Each search job (one source with the run's ideas) is one **provider search**, a flat fee that covers the results left out. Its offers carry no price breaks and no shipping cost, so they have no landed cost, and each offer row says so in `notes`. AliExpress sells single pieces (MOQ 1); Alibaba's minimum order is not on its search page (`moq` is null).

In tests from Apify's servers, every Made-in-China and DHgate page was read on the first try from Apify's own address, and every DHgate offer page given had a US shipping quote.

### What makes the data right

- **Landed cost only where a page shows shipping.** It is the unit price plus the shipping the page shows for your country, spread over the units of that quote. It never guesses a freight rate, and it excludes import duties, taxes, payment fees and customs brokerage. Every landed figure is labelled as an estimate, with its basis. Today that means DHgate offer pages you give, quoted to the US.
- **Prices only in US dollars.** A price is taken only where the page marks it as US dollars (US$, Alibaba's dollar fields, DHgate's USD fields, AliExpress's currency code); anything else stays empty, with a note in the row. Nothing is silently read as dollars.
- **Unit prices per piece.** DHgate sells some products by the lot: the unit price is the lot price divided by the pieces per lot, and the row keeps the lot price and lot size.
- **Only offers about your product.** Search results get padded with unrelated "recommended" listings; an offer whose title does not name every word of the idea (plurals count) is left out and never charged. Turn off **Every word in the title** to keep them.
- **Specs to compare like with like.** Two "silicone baking mats" can differ in material, size or thickness. Each offer carries the source's own attribute table (`specs`: Material, Size, Capacity, Model NO.… as the supplier filled them in), its `category` and the options a buyer picks from (`variantOptions`: colours, sizes), wherever the page or search record already read shows them. They are passed through as written, never normalised or checked, and cost nothing extra: no further request is made for them.
- **Prices at your quantity.** With an order quantity, the price break that holds it is used; below an offer's MOQ, the quantity is raised to the MOQ and the row says so.
- **A block is never an empty result.** Each source gets its own proxy ladder (Apify's own address, then datacenter, then residential for a source that blocks the others, one request per page there), at most 2 requests at a time. A source or page that cannot be read is named in the summary row and the run summary, with the reason; the others still deliver.
- **A service problem stops only its sources.** If the marketplace data service is unavailable, AliExpress and Alibaba are named in the summary row with the reason, and Made-in-China and your pages still deliver.
- **Only delivered rows are billed, and the summary describes them.** A failed source, a removed page, a filtered offer or an idea with no offers (its summary is free) costs nothing. Runs stop cleanly at your spending limit or at **Max cost per run**; the summary then covers only the offers delivered with it (`offersFound` says how many were found).

### Input

| Field                                            | What it does                                                                                         |
| ------------------------------------------------ | ---------------------------------------------------------------------------------------------------- |
| `products`                                       | Product ideas, a few words each (up to 50). `keywords`, `queries` and `searchTerms` are accepted too |
| `sources`                                        | Searched by idea: `made-in-china` (the default), `aliexpress`, `alibaba`                             |
| `dhgateUrls`                                     | DHgate offer pages to compare (shipping to the US); with one product idea they join its summary      |
| `alibabaUrls`                                    | Alibaba product pages to compare; with one product idea they join its summary                        |
| `maxOffersPerSource`                             | Offers kept per searched source and idea (10 by default, up to 100)                                  |
| `offerPagesPerSource`                            | Top Made-in-China offers whose own page is read: price breaks, supplier years (3 by default)         |
| `quantity`                                       | Your order quantity: the price break that holds it                                                   |
| `shipToCountry`                                  | Country for shipping quotes (`US` by default)                                                        |
| `matchAllWords`                                  | Keep only offers whose title names every word of the idea (on by default)                            |
| `maxRunCostUsd`                                  | A product idea starts only when its worst case fits under this amount                                |
| `maxConcurrency`, `fields`, `proxyConfiguration` | Pace, field selection, your own proxy                                                                |

#### Example inputs

One product idea on Made-in-China:

```json
{ "products": ["silicone baking mat"] }
```

Landed cost to the US for DHgate listings you found, next to factory prices:

```json
{
  "products": ["resistance bands"],
  "dhgateUrls": [
    "https://www.dhgate.com/product/heavy-duty-resistance-band-latex-elastic/1117083369.html",
    "https://www.dhgate.com/product/resistance-bands-band-exercise-elastic-workout/908303873.html"
  ]
}
```

Unit price at 1,000 units on every searched source, with Alibaba pages you found for their price breaks:

```json
{
  "products": ["cotton tote bag"],
  "sources": ["made-in-china", "aliexpress", "alibaba"],
  "quantity": 1000,
  "alibabaUrls": ["https://www.alibaba.com/product-detail/_1600786838410.html"]
}
```

### Output

First a **summary** row per product idea, then its **offer** rows (`recordType` says which). A real summary row (shortened):

```json
{
  "recordType": "summary",
  "product": "resistance bands",
  "offers": 8,
  "offersFound": 8,
  "offersBySource": { "made-in-china": 5, "dhgate": 3 },
  "sources": {
    "made-in-china": { "status": "ok", "offers": 5 },
    "dhgate": { "status": "ok", "offers": 3 }
  },
  "currency": "USD",
  "unitPriceMin": 0.5,
  "unitPriceMedian": 5.615,
  "unitPriceMax": 17.16,
  "moqMin": 1,
  "moqMedian": 300,
  "landedUnitCostMin": 17.02,
  "landedUnitCostMedian": 18.42,
  "landedUnitCostMax": 25.41,
  "offersWithShipping": 3,
  "shipTo": "US",
  "landedCostIsEstimate": true,
  "cheapestOffer": {
    "title": "Wholesale Custom Printed Logo Yoga Stretch Band Rubber Exercise Resistance Bands",
    "source": "made-in-china",
    "unitPrice": 0.5,
    "moq": 500
  },
  "cheapestLandedOffer": {
    "title": "Resistance Bands Band Exercise Elastic Workout Ruber Loop Strength Pilates Fitness…",
    "source": "dhgate",
    "unitPrice": 9.03,
    "moq": 1,
    "landedUnitCostMin": 17.02
  },
  "notes": [
    "…",
    "Landed cost: Estimate: unit price plus the shipping the source shows for the destination, spread over the units. Excludes import duties, taxes, payment fees and customs brokerage."
  ]
}
```

A real offer row (shortened):

```json
{
  "recordType": "offer",
  "product": "resistance bands",
  "source": "dhgate",
  "title": "Heavy Duty Resistance Band Latex Elastic Belt Pull Up Assist for Pilates Workout Fitness Home Gym Shape Body Exercise 260725",
  "url": "https://www.dhgate.com/product/heavy-duty-resistance-band-latex-elastic/1117083369.html",
  "unitPriceMin": 9.4,
  "unitPriceMax": 19.45,
  "listPriceMin": 22.93,
  "priceTiers": [
    { "minQuantity": 1, "maxQuantity": 43, "unitPrice": 10.17 },
    { "minQuantity": 44, "maxQuantity": null, "unitPrice": 9.41 }
  ],
  "moq": 1,
  "quantity": 1,
  "unitPriceAtQuantity": 10.17,
  "shippingShown": true,
  "shippingCost": 8.25,
  "shippingTo": "US",
  "shippingDaysMin": 10,
  "shippingDaysMax": 20,
  "landedUnitCostMin": 18.42,
  "landedUnitCostMax": 18.42,
  "landedCostIsEstimate": true,
  "supplierName": "fan06",
  "supplierYears": 4,
  "supplierPositiveFeedbackPercent": 97.2,
  "supplierOnTimeDeliveryPercent": 90,
  "offerPageRead": true,
  "category": "Resistance Bands",
  "specs": [
    { "name": "Type", "value": "Resistance Bands" },
    { "name": "Training Site", "value": "Waist,ARMS,Legs" }
  ],
  "variantOptions": [{ "name": "Color", "values": ["Red", "Blue", "Black", "Green"] }]
}
```

Also on offers: `offerKey` (SHA-256 of source and listing id, stable across runs), `image`, `unit`, `lotSize` and `lotPriceMin` (DHgate offers sold by the lot), `shippingFree`, `shippingMethod`, `supplierUrl`, `supplierRating`, `supplierRatingCount`, `supplierType`, `supplierLevel` (Diamond Member, Gold Supplier, Verified…), `supplierVerified`, `supplierLocation`, `ordersCount`, `notes`, and the spec clues: `category`, `specs` (name and value pairs, at most 40, values up to 200 characters) and `variantOptions` (name and values), null where the source shows none in what was read. Where they come from: Made-in-China offer pages (attribute table and category path; its search cards show only price and MOQ), DHgate offer pages (attributes, category, options), Alibaba offer pages (attribute table and options; the page names its category by id only), AliExpress search records (specifications and options) and Alibaba search records (category path and options). The **Specs and options** view lists them. On summaries: `unitPriceP25`, `unitPriceP75`, `pricedOffers`, `moqMax`, `lowestMoqOffer`, `quantity`.

Dataset views: **Product summaries**, **Offers**, **Shipping and landed cost** and **Price breaks** (one row per break). `RUN_SUMMARY` in the key-value store gives the outcome (`COMPLETE`, `PARTIAL`, `EMPTY`, `FAILED`), counts per source, charges, and every source or page that could not be read, with the reason.

### Pricing

| Event                                                                                             | Free and Bronze | Silver | Gold and above |
| ------------------------------------------------------------------------------------------------- | --------------- | ------ | -------------- |
| Product summary (one product idea priced; free when no offer is found)                            | $5.00           | $4.50  | $4.00          |
| Supplier offer (a delivered offer row)                                                            | $2.00           | $1.80  | $1.60          |
| Page through residential proxy (add-on, per delivered page, only for a site that blocks the rest) | $7.00           | $7.00  | $7.00          |
| Provider record (an AliExpress or Alibaba search result delivered as an offer row)                | $3.00           | $2.70  | $2.40          |
| Provider search (one per source and run: all the run's product ideas on it)                       | $20.00          | $20.00 | $20.00         |

Per 1,000. Each run also has a $0.00005 start fee. One product idea with 10 Made-in-China offers costs about $0.025; each DHgate or Alibaba page you add is one more offer. The add-on is charged only for a page that came back through residential addresses and was delivered, with that page's row; each page gets at most one such request, capped at 450 KB transferred. In tests every source answered on Apify's own address, so the add-on did not apply. A provider record is billed with its offer row, and the provider search with the first product idea's summary that has offers; an idea with no offers is free. Five product ideas on AliExpress at 10 offers each are one provider search ($0.02) and 50 provider records ($0.15), plus the summaries and offers; results filtered out by title cost nothing per record. **Max cost per run** counts one provider search per idea and source, since an idea can be its own search.

### Limits

- **Landed cost needs a shipping quote.** Made-in-China pages say "contact the supplier" for freight and Alibaba loads shipping for a signed-in buyer, so their offers have unit prices but no landed cost. DHgate offer pages show shipping, quoted to the US (the country of the actor's addresses); for another country, they have no landed cost either.
- **DHgate is read only from the pages you give.** Its search pages are disallowed by robots.txt.
- **AliExpress and Alibaba search results** come from the US sites, without price breaks, shipping or (on Alibaba) MOQ. Give Alibaba offer pages for their breaks and MOQ.
- **Prices are list prices for a signed-out visitor**, in US dollars. Negotiated, sample, coupon and member prices are not included; "Negotiable" offers and prices in other currencies have no price.
- **DHgate price ranges cover all variants;** its price breaks are for the default variant.
- **One-off research.** Each run is a fresh look; there is no watchlist or change tracking.
- **robots.txt:** only addresses each site's robots.txt allows are read: Made-in-China `/products-search/hot-china-products/` and supplier offer pages, DHgate `/product/…` pages without a query string, Alibaba `/product-detail/` pages. Read at a pace and scale the sites' terms allow (2 requests at a time per source).
- **Nothing found**: when nothing could be read because the pages do not exist (a removed Alibaba or DHgate offer page), the run still succeeds, with one free `recordType: "unreadable"` row per page giving the `reason`; nothing is charged. A run near its time limit stops starting product ideas, delivers what it read and lists the rest with the reason.

### Changelog

- **0.3.x, reliability** (2026-10-24): runs that find nothing (removed offer pages, input naming nothing readable) end SUCCEEDED with a free `unreadable` row per item saying why, instead of FAILED; a run stops starting product ideas before its time limit and ends with what it read, never TIMED-OUT. A run where every source blocked us still fails. Ship to country is checked in the input form. Prices and events unchanged.
- **0.3** (October 2026): spec clues on every offer row: `category`, `specs` (the source's attribute table: material, size, capacity…) and `variantOptions`, taken from the pages and search records already read; no new requests, events or prices. Only fields are added: saved inputs run as they did.
- **0.2** (October 2026): AliExpress and Alibaba searched by product idea through CleanPull's marketplace data service; no AliExpress app key needed (inputs with the old key fields run as they are, the keys ignored). New events: provider record (a search result delivered as an offer row) and provider search ($0.02 per source per run). **Default sources stay as 0.1 ran them:** with no `sources` in the input, only Made-in-China is searched, so a saved task without `sources` costs what it did. AliExpress and Alibaba are searched (and billed) only when `sources` lists them; a saved task that lists `aliexpress` now searches it through the service, without a key.
- **0.1** (October 2026): Made-in-China search and offer pages, DHgate and Alibaba offer pages by URL, AliExpress affiliate API with your key; summary per product idea with unit price and MOQ spread and a landed-cost range where a page shows shipping; prices only in US dollars; DHgate lots priced per piece; title matching; order quantity; Max cost per run.

# Actor input Schema

## `products` (type: `array`):

What you want to source, in a few words, one per line ("silicone baking mat", "dog harness reflective"). Each idea is searched on every chosen source and gets one summary row plus its offers. Up to 50 per run.

## `sources` (type: `array`):

Where to search by product idea (Made-in-China by default). Made-in-China is read directly. AliExpress and Alibaba search come through CleanPull's marketplace data service (nothing to set up) and run only when listed here: a search takes about a minute, all of a run's ideas are searched together, and each result delivered as an offer is a provider record on your bill. Their results carry no price breaks or shipping cost. DHgate is not searched (its robots.txt disallows search pages): give its offer pages below.

## `alibabaUrls` (type: `array`):

Optional. Alibaba.com product pages (alibaba.com/product-detail/…\_<id>.html) to compare, one per line: price breaks, MOQ, supplier years and rating (Alibaba search results have none of these). With exactly one product idea, these pages join its summary; otherwise they get their own summary.

## `dhgateUrls` (type: `array`):

Optional. DHgate offer pages (dhgate.com/product/<name>/<id>.html) to compare, one per line: price range, price breaks, lot size, the shipping quote to the US and delivery days (for a landed cost), store age and feedback. Query strings are dropped. With exactly one product idea, these pages join its summary.

## `maxOffersPerSource` (type: `integer`):

The most offers kept from each searched source for each product idea, in the source's own order (Made-in-China shows 30 per search). For AliExpress and Alibaba, also the most results read; only those delivered as offers are charged as provider records.

## `offerPagesPerSource` (type: `integer`):

How many of the top Made-in-China offers per product idea get their own page read: price breaks, the supplier's years and reviews. 0 reads search results only (fastest).

## `quantity` (type: `integer`):

Optional. The units you plan to order: each offer's unit price is taken from the price break that holds it (raised to the offer's MOQ when below it). Empty: each offer's own minimum order.

## `shipToCountry` (type: `string`):

Two-letter country code for shipping quotes. Landed cost is only given where a page shows shipping to this country (DHgate offer pages quote shipping to the US). AliExpress and Alibaba search results are the US sites' prices.

## `matchAllWords` (type: `boolean`):

Keep only offers whose title names every word of the product idea (plurals count). Sources fill thin results with unrelated "recommended" offers; those are left out and never charged.

## `maxRunCostUsd` (type: `number`):

Optional. A product idea starts only when its worst case still fits under this amount, counting what the run has already charged. For scheduled and API runs without a spending limit.

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

How many product ideas are priced at once. Each source still gets at most 2 requests at a time.

## `fields` (type: `array`):

Optional. Only these fields in each row (dotted paths for nested ones, e.g. unitPrice.median); recordType and product always stay. Empty: every field.

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

Optional. Your own proxy, tried after the direct attempt. By default the actor uses Apify's own address, then datacenter, then residential proxies only for a source that blocks the others (one request per page, billed as an add-on).

## Actor input object example

```json
{
  "products": [
    "silicone baking mat",
    "resistance bands"
  ],
  "sources": [
    "made-in-china"
  ],
  "maxOffersPerSource": 10,
  "offerPagesPerSource": 3,
  "shipToCountry": "US",
  "matchAllWords": true,
  "maxConcurrency": 3
}
```

# Actor output Schema

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

One summary row per product idea, then its offers (recordType says which).

## `summaries` (type: `string`):

No description

## `offers` (type: `string`):

No description

## `landed` (type: `string`):

No description

## `priceBreaks` (type: `string`):

No description

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

Outcome (COMPLETE, PARTIAL, EMPTY, FAILED), counts, charges and every source or page that could not be read, with the reason.

## `specs` (type: `string`):

No description

# 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 = {
    "products": [
        "silicone baking mat",
        "resistance bands"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cleanpull/supplier-price-finder").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 = { "products": [
        "silicone baking mat",
        "resistance bands",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("cleanpull/supplier-price-finder").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 '{
  "products": [
    "silicone baking mat",
    "resistance bands"
  ]
}' |
apify call cleanpull/supplier-price-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cleanpull/supplier-price-finder"
        }
    }
}
```

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/Ic0egsA8xLqaai4s0/builds/ohCm5FPJuxphM5GFi/openapi.json
