# Shopee Seller Profile & Performance Scraper (`fanndev/shopee-seller-performance-scraper`) Actor

Qualify Shopee sellers before you buy or resell. Returns follower count, product count, rating breakdown, positive-rating share, chat response rate, response time, shop age and Official Shop status. Lookup by username, shop ID, shop URL or product URL. No login.

- **URL**: https://apify.com/fanndev/shopee-seller-performance-scraper.md
- **Developed by:** [Faisal Ahdan naufal](https://apify.com/fanndev) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 results

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

## Shopee Seller Profile & Performance Scraper

Qualify a Shopee seller before you buy from them, resell for them, or approve
them as a supplier.

Give it usernames, shop IDs, shop URLs — or even **product URLs**, because the
shop ID is embedded in them. Returns the metrics a buyer actually judges on:
follower count, product count, rating breakdown, positive-rating share, chat
response rate, response time, shop age and Official Shop status.

11 country sites. No login, no cookies, no API key.

### What you get

```json
{
  "shopName": "Samsung Official Shop",
  "username": "samsung.official",
  "shopId": 52635036,
  "isOfficialShop": true,
  "followerCount": 3277836,
  "itemCount": 1788,
  "ratingStar": 4.895646,
  "ratingGood": 328451,
  "ratingBad": 1842,
  "positiveRatingPercent": 98.51,
  "responseRate": 100,
  "responseTimeMinutes": 1.7,
  "shopAgeDays": 3169,
  "location": "KOTA JAKARTA SELATAN"
}
```

Four figures are computed for you because nobody wants to do them by hand:

| Field | Derived from |
| --- | --- |
| `positiveRatingPercent` | good ÷ (good + normal + bad) |
| `responseTimeMinutes` | Shopee reports **seconds**; 102 s → 1.7 min |
| `shopAgeDays` | `ctime` Unix timestamp → days since |
| `ratingTotal` | the three counters summed |

### Four ways to identify a shop

| Input | Example | Resolved as |
| --- | --- | --- |
| Username | `samsung.official` | username |
| Numeric ID | `52635036` | shop ID |
| Shop URL | `shopee.co.id/shop/52635036` | shop ID |
| Storefront URL | `shopee.co.id/tokopedia` | username |
| **Product URL** | `shopee.co.id/product-i.1457622087.44421234179` | **shop ID `1457622087`** |

That last row matters: the **Shopee Flash Sale & Price Drop Monitor** in this
portfolio emits exactly those product URLs, so you can pipe its output straight
into this Actor to profile every seller running a flash sale.

### The trap this Actor is built around

Shopee answers **HTTP 200 with an error body** when a username does not exist:

```json
{"error": 2003013, "error_msg": "invalid_username"}
```

A client that checks only the status code records an empty shop and reports a
real brand as having no followers, no rating and no products. This Actor emits
`recordType: "NOT_FOUND"` and tells you which lookup failed.

This is not hypothetical — `xiaomi.official` returns exactly that on
`shopee.co.id`. A brand having an official store does **not** mean its username
matches its brand name. When a username fails, look the shop up by numeric ID.

### Reliability

`get_shop_detail` is the **only** Shopee shop endpoint that answers a plain
HTTP client. Measured 2026-09-20:

| Endpoint | Result |
| --- | --- |
| **`shop/get_shop_detail`** (username **and** shopid) | **200**, 50–55 fields ✅ |
| `shop/get_shop_base` | 200 `service_err` |
| `shop/get_shop_seo` | **403** anti-bot |
| `search/search_items` | **403** anti-bot |
| `item/get_ratings` | **403** anti-bot |

The 403s come from Shopee's load balancer with an identical body every time and
**no `Set-Cookie` is ever issued**, so there is no session warm-up that unlocks
them. When an endpoint is refused this Actor emits a `GATED` record naming it,
rather than an empty result — switch on `proxyConfiguration` with a residential
group, since the gate is IP-sensitive.

`_rawFieldCount` rides along on every record (50–55 observed). A sudden drop is
your early warning that Shopee changed the payload.

### Input example

```json
{
  "mode": "shop",
  "country": "ID",
  "shops": [
    "samsung.official",
    "614132689",
    "https://shopee.co.id/product-i.1457622087.44421234179"
  ],
  "proxyConfiguration": { "useApifyProxy": true }
}
```

# Actor input Schema

## `mode` (type: `string`):

shop = one record per seller. reference = probe the endpoint and report what it yielded, including the 200-with-error-body case.

## `shops` (type: `array`):

Any of: a username (samsung.official), a numeric shop ID (52635036), a shop URL (/shop/52635036), a storefront URL (/samsung.official), or a PRODUCT URL (…-i.<shopId>.<itemId>) - the shop ID is read straight out of it, so output from the Shopee Flash Sale Monitor can be fed in directly.

## `country` (type: `string`):

Which Shopee site to query. A shop only exists on its own country site.

## `concurrency` (type: `integer`):

One request per shop.

## `tlsProfile` (type: `string`):

Optional. Tried first, then the rest of the ladder. All four answered 200 during recon; this is a tuning knob, not a requirement.

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

Recommended for larger runs. Shopee gates most of its API at the load balancer; if GATED records appear, a residential exit IP is the first thing to try.

## Actor input object example

```json
{
  "mode": "shop",
  "shops": [
    "samsung.official",
    "shopee_id"
  ],
  "country": "ID",
  "concurrency": 4,
  "tlsProfile": "chrome124",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Every seller, not-found, gated and error record from this run.

# 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 = {
    "shops": [
        "samsung.official",
        "shopee_id"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fanndev/shopee-seller-performance-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 = {
    "shops": [
        "samsung.official",
        "shopee_id",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("fanndev/shopee-seller-performance-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 '{
  "shops": [
    "samsung.official",
    "shopee_id"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call fanndev/shopee-seller-performance-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fanndev/shopee-seller-performance-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/JIc2BTa42S5UyllGr/builds/Lu9KAyI1rQ94SMca6/openapi.json
