# Pop Mart Drops History — release dates & sold-outs (`noahadler/popmart-drops-history`) Actor

Scrape Pop Mart US drop history: official release date, product title, starting price in USD and sold-out flag for Labubu, Molly, SkullPanda and more. One row per product — a release calendar, not a SKU catalogue. RESIDENTIAL US recommended.

- **URL**: https://apify.com/noahadler/popmart-drops-history.md
- **Developed by:** [Noah Adler](https://apify.com/noahadler) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 drops

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Pop Mart Drops History — release dates & sold-outs

**Pop Mart** US **drop history**: official **release dates**, **starting price in USD** and **sold-out** status for **Labubu**, Molly, SkullPanda, Crybaby, Dimoo and the rest of the catalogue. **One row per product**, sorted newest drop first — a **release calendar**, not a SKU price list.

> **Not a purchase bot.** Drops sell out in seconds. This Actor never touches checkout. It reads the public storefront once; the calendar lives in the official `upTime` timestamp. No state between runs.

**Keywords:** pop mart drops · popmart drop history · labubu drop · pop mart release calendar · popmart sold out · blind box drop dates

***

### What it does

| Step | Action |
|------|--------|
| 1 | Input: `searchTerms` (series) + optional date window + `maxItems` |
| 2 | Reads Pop Mart US search (server-rendered payload, no browser) |
| 3 | Keeps **one product per row**, drops gift/bonus items unless you ask |
| 4 | Sorts by official release time (search itself is not chronological) |

Use `popmart-products` if you need **every SKU** (Single box vs Whole Set) and live **stock level**. This Actor answers “what dropped when”.

***

### Input

| Field | Required | Description |
|-------|----------|-------------|
| `searchTerms` | Yes | Series as typed on popmart.com: `labubu`, `molly`, `skullpanda`… |
| `maxItems` | No | 1–500 output rows after sort (default 80) |
| `dateFrom` / `dateTo` | No | `YYYY-MM-DD` window on the release date |
| `includeSoldOut` | No | `true` (default) — needed for history |
| `includeUpcoming` | No | `true` (default) — scheduled drops still in the future |
| `includeGifts` | No | `false` (default) — hide unpriced giveaway rows |
| `includeUnpriced` | No | `false` (default) — hide add-ons with no starting price |
| `includeUndated` | No | `false` (default) — hide legacy items without a usable `upTime` |
| `proxyConfiguration` | No | RESIDENTIAL US recommended |

#### Example (Try it)

```json
{
  "searchTerms": ["labubu", "skullpanda"],
  "maxItems": 40,
  "includeSoldOut": true,
  "includeUpcoming": true,
  "includeGifts": false,
  "includeUndated": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

***

### Output (one product per row)

| Field | Example |
|-------|---------|
| `releaseAt` | `2026-09-24T23:30:00Z` — official online drop |
| `productTitle` | THE MONSTERS 10TH ANNIVERSARY EXCLUSIVE BUNDLE |
| `startingPrice` | `36.99` — cheapest priced SKU of that product (USD, US store) |
| `isSoldOut` | `true` when every SKU is stock level 0 |
| `skuCount` / `soldOutSkuCount` | how many SKUs, how many already at 0 |
| `url` / `imageUrl` | `https://www.popmart.com/us/products/{id}` |
| `error` | honest soft-fail if the storefront blocks |

This Actor does **not** output SKU-level stock 0/1/2, restock-subscribe flags or purchase limits: those fields are constant or belong to the product scraper.

***

### Pricing

Pay-per-event per drop row (see Actor pricing on Apify).

***

### Notes

- Coverage is the **US store** only. Other regions do not expose the same SSR search payload.
- A handful of legacy products have no usable release timestamp; they are omitted unless `includeUndated` is on.
- `startingPrice` is missing on gift/bonus rows (filtered by default).
- If a run returns a single row with `error=true` mentioning Cloudflare, turn on **RESIDENTIAL US** and retry.

# Actor input Schema

## `searchTerms` (type: `array`):

Series or keywords as typed on popmart.com, e.g. labubu, molly, skullpanda, crybaby, dimoo. One search per term; results are merged, de-duplicated and sorted by release date.

## `maxItems` (type: `integer`):

Maximum products to return after filtering and sorting (1–500). The Actor fetches extra search pages first because Pop Mart search is not chronological.

## `dateFrom` (type: `string`):

Keep drops on or after this calendar day (UTC date of releaseAt). Leave empty for no lower bound.

## `dateTo` (type: `string`):

Keep drops on or before this calendar day. Leave empty for no upper bound.

## `includeSoldOut` (type: `boolean`):

Keep products where every SKU is stock level 0. Leave on for drop history; turn off for what is still listed as buyable.

## `includeUpcoming` (type: `boolean`):

Keep products whose official release time is still in the future.

## `includeGifts` (type: `boolean`):

Pop Mart lists giveaway and tier-bonus items (type=gift) with no real price. Off by default so every row is a priced drop.

## `includeUnpriced` (type: `boolean`):

Add-on / extra catalogue rows sometimes have no usable SKU price. Off by default so every calendar row carries a starting price in USD.

## `includeUndated` (type: `boolean`):

A few legacy catalogue items have an unusable upTime sentinel. Off by default so the calendar only has real dates.

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

popmart.com sits behind Cloudflare. RESIDENTIAL with country US avoids 503s on multi-series runs.

## Actor input object example

```json
{
  "searchTerms": [
    "labubu"
  ],
  "maxItems": 80,
  "includeSoldOut": true,
  "includeUpcoming": true,
  "includeGifts": false,
  "includeUnpriced": false,
  "includeUndated": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `drops` (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 = {
    "searchTerms": [
        "labubu"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("noahadler/popmart-drops-history").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 = { "searchTerms": ["labubu"] }

# Run the Actor and wait for it to finish
run = client.actor("noahadler/popmart-drops-history").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 '{
  "searchTerms": [
    "labubu"
  ]
}' |
apify call noahadler/popmart-drops-history --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,noahadler/popmart-drops-history"
        }
    }
}
```

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/x3YWTqZX2vxKaJ1Zx/builds/SeSmGqwZakh4gc0YG/openapi.json
