# keyword plan — apify 1688 spike

this is the set of search queries the `prodiger/1688-scraper` actor will run,
the rationale for each, and the price-bracket splits we'd use if a single
keyword hits 1688's 2000-result cap.

## primary keywords (run by default)

| # | keyword | rationale | maxPages | sort |
|---|---------|-----------|----------|------|
| 1 | `气泵 智能手表` | the main compound — air pump + smart watch. hits 1688's product graph for BP-watches. | 30 | va_sales360 |
| 2 | `气泵 血压 手表` | tighter to the BP niche. more sellers, slightly different long tail. | 30 | va_sales360 |
| 3 | `腕表 气泵` | short tail, surfaces seller-brand listings (e.g. "XX brand 腕表 with 气泵") we might miss on the longer compounds. | 20 | va_sales360 |
| 4 | `智能 血压 腕表 oem` | surfaces oem/odm-tagged sellers. 4-word phrase matches how OEM shops tag their own product titles. | 30 | va_sales360 |
| 5 | `血压 手表 oem` | same as above with the brand-name-first ordering. different seller set. | 30 | va_sales360 |
| 6 | `tpu气囊 血压手表` | the airbag-component subset. useful for finding pump/valve/sensor subsuppliers. category hint: pump_valve_sensor_supplier. | 15 | va_sales360 |
| 7 | `血压智能手表 工厂` | factory-tagged cards. surfaces 生产加工 / manufacturer rows. | 20 | va_sales360 |

**total cap**: 175 pages × 20 cards/page = 3,500 products, but 1688 caps at
2,000/query, so realistic yield is 1,400–3,000 unique cards across the 7 queries
(after dedupe).

**sort**: `va_sales360` (30-day sales desc) for all of them. this prioritizes
proven products over fresh listings — useful for stage 1 because we want
"this seller has shipped 100+ air-pump watches in the last month" as a soft
quality signal. we can re-run with `composite` (1688's default) for a more
balanced mix.

**marketplace**: `pcmarket` (consumer). the alternative is `pcindustry` (B2B
/ industrial). for stage 1 the consumer marketplace is what we want — that's
where the wearable ODMs list. if a stage 2 pass wants component-level BP
modules from industrial sellers, we can re-run with `pcindustry` on keywords
like `血压 模块 贴牌` or `气泵 微型 oem`.

## if a keyword hits 2,000 — price-bracket splits

1688 hard-caps any single search at 2,000 results. to push past that we'd
add price-bracket runs. based on the current market (BP smartwatches retail
~$30–150 in CN, OEM unit price ~$10–40), the splits would be:

```
# for "气泵 智能手表":
#   run 1: priceStart 10, priceEnd 50
#   run 2: priceStart 50, priceEnd 100
#   run 3: priceStart 100, priceEnd 200
#   run 4: priceStart 200, priceEnd 9999
```

i'm not including these in the initial spike because the cap is way above
our $40 budget — adding 4 price-bracket runs of 2000 products each would
add ~$11 to the bill. **only do this if the un-split yield is too thin
(<500 wearable_odm rows).**

## if a keyword returns junk

the actor returns whatever 1688 returns. if a keyword is too generic
(e.g. `智能手表` alone would return apple-watch knockoffs) we get noise.
mitigations:
- prefer multi-word compounds: `气泵 智能手表` > `智能手表`.
- use `va_sales360` sort — noise listings have 0 sales and sink to the bottom.
- use the `quantityBegin` MOQ filter: setting it to e.g. 100 surfaces
  genuine wholesale rather than dropshipper noise.

## secondary keywords (for a future pass, not in this spike)

if stage 1 spike succeeds and we want to broaden, the next batch of
keywords would be:

- english / mixed:
  - `air pump smartwatch oem`
  - `bp watch factory`
  - `tpu airbag watch oem`
  - `oscillometric bp watch oem` (matches the technical term used by GY's S101 etc)
- component-level (for pump/valve/sensor subsuppliers):
  - `微型气泵 oem` (micro air pump)
  - `mems 压力传感器` (mems pressure sensor)
  - `血压 模块 贴牌` (bp module oem)
  - `压电泵` (piezoelectric pump)
- case / mold:
  - `智能手表 表带 工厂` (smartwatch strap factory)
  - `气囊 模具` (airbag mold)

each of these would be its own apify run with a tighter maxPages (5–10) and
`pcindustry` marketplace where appropriate.

## what we drop into the apify console "Try Actor" tab

paste this in the **Search array** field of the apify console's
"Try Actor" form to run it from the browser (no script needed):

```json
[
  {"keyword": "气泵 智能手表",     "maxPages": 30, "sortType": "va_sales360"},
  {"keyword": "气泵 血压 手表",     "maxPages": 30, "sortType": "va_sales360"},
  {"keyword": "腕表 气泵",         "maxPages": 20, "sortType": "va_sales360"},
  {"keyword": "智能 血压 腕表 oem", "maxPages": 30, "sortType": "va_sales360"},
  {"keyword": "血压 手表 oem",      "maxPages": 30, "sortType": "va_sales360"},
  {"keyword": "tpu气囊 血压手表",   "maxPages": 15, "sortType": "va_sales360"},
  {"keyword": "血压智能手表 工厂",  "maxPages": 20, "sortType": "va_sales360"}
]
```

proxy: leave on default (RESIDENTIAL, country=CN). that's a 1688-mobile-route
requirement — the desktop route returns SSR-rendered HTML to non-CN traffic
and the actor would fail.
