# Fashionphile Handbag Listings Scraper (`devilscrapes/fashionphile-handbag-listings-scraper`) Actor

Scrape live Fashionphile.com luxury handbag inventory by brand or keyword search — price, condition, SKU, images, and retail savings per row, sourced directly from Fashionphile's own Algolia search backend. No per-item HTTP calls, no HTML parsing, fully-resolved records in one pass.

- **URL**: https://apify.com/devilscrapes/fashionphile-handbag-listings-scraper.md
- **Developed by:** [DevilScrapes](https://apify.com/devilscrapes) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

<div align="center">
  <img src=".actor/icon.svg" width="160" alt="Devil Scrapes mark" />

## Fashionphile Handbag Listings Scraper

**💰 $3.05 / 1 000 results**  ·  pay only for results  ·  no credit card to try

*We do the dirty work so your dataset stays clean.* 😈

Scrape live Fashionphile.com luxury handbag inventory by brand or keyword search — price, condition, SKU, images, and retail savings per row, sourced directly from Fashionphile's own Algolia search backend. No per-item HTTP calls, no HTML parsing, fully-resolved records in one pass.

</div>

***

### 🎯 What this scrapes

Fashionphile doesn't publish a bulk export of its live handbag inventory, and its own `/shop` search page ships a decoy JSON block with null price and SKU fields. This Actor queries Fashionphile's own Algolia search index directly — the same backend that powers its on-site search — so luxury handbag resellers, authenticators, and price-arbitrage operators get fully-resolved listing data (price, condition, SKU, images, retail savings) in one pass, with zero per-item HTTP calls and no HTML parsing.

### 🔥 What we handle for you

- 🛡️ **Browser fingerprint rotation** — `curl-cffi` impersonates real Chrome / Firefox / Safari TLS handshakes so the target sees a browser, not Python.
- 🌐 **Residential proxy rotation** via Apify Proxy — fresh session and exit IP on every block.
- 🔁 **Retries with exponential backoff** on `408 / 429 / 5xx` — up to 5 attempts per page, `Retry-After` honoured.
- 🧱 **Rate-limit-aware pacing** — when the target pushes back, we slow down instead of getting banned.
- 🧊 **Clean, typed dataset rows** — Pydantic-validated, ISO-8601 timestamps, stable IDs, JSON / CSV / Excel export straight from the Apify Console.
- 💰 **Pay-Per-Event pricing** — you only pay for results that hit your dataset. No data, no charge.

### 💡 Use cases

- **Price-arbitrage sourcing** — scan brand/keyword queries for underpriced authenticated handbags before casual buyers find them via Fashionphile's own storefront search.
- **Authentication and resale comps** — pull condition, SKU, and retail-savings data to benchmark a bag's resale value against Fashionphile's live listings.
- **Inventory monitoring** — track how many listings a brand or model holds in Fashionphile's catalog and at what price band, run over run.
- **Luxury market research** — build a keyword-level snapshot of live handbag supply, condition mix, and pricing across brands.

### ⚙️ How to use it

1. Click **Try for free** at the top of the page.
2. Fill in the input form — most fields have sensible defaults.
3. Click **Start**. Output streams into the run's dataset.
4. Export from **Storage → Dataset** as JSON, CSV, or Excel — or fetch via the API.

### 📥 Input

| Field | Type | Required | Default | Notes |
|---|---|:--:|---|---|
| `searchTerms` | `array` | **yes** | \['chanel', 'hermes birkin'] | Brand or keyword queries to run against Fashionphile's Algolia search index, e.g. "chanel", "hermes birkin". Blank… |
| `maxItemsPerSearch` | `integer` | no | 60 | Cap on rows collected per search term. Pagination stops early once this is reached. |
| `proxyConfiguration` | `object` | no | {'useApifyProxy': True} | Apify Proxy configuration. Datacenter default — Fashionphile's Algolia backend showed no block signal in testing;… |

#### Example input

```json
{
  "searchTerms": [
    "chanel",
    "hermes birkin"
  ],
  "maxItemsPerSearch": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

### 📤 Output

Every row is one dataset item.

| Field | Type | Notes |
|---|---|---|
| `object_id` | `string` | Stable Algolia identifier (objectID), used as dedup key. |
| `sku` | `string` | Fashionphile's own SKU. |
| `title` | `string` | Listing title. |
| `url` | `string` | Canonical fashionphile.com/products/ URL, constructed with no extra fetch. |
| `price` | `number` | Current asking price, whole USD. |
| `compare_at_price` | `['number', 'null']` | Retail price before markdown, whole USD. |
| `retail_savings_percent` | `['number', 'null']` | Percent saved vs. retail. |
| `condition` | `['string', 'null']` | Fashionphile's own condition label, e.g. 'Excellent'. |
| `images` | `array` | CDN image URLs — may be empty, never null. |
| `categories` | `array` | Category/collection tags — may be empty, never null. |
| `description` | `['string', 'null']` | Listing description (Shopify-sanitized HTML passthrough). |
| `inventory_quantity` | `integer` | Units in stock, default 0. |
| `published_at` | `['string', 'null']` | ISO-8601 publish timestamp, pass-through. |
| `search_term` | `string` | The input search term that produced this row. |
| `scraped_at` | `string` | ISO-8601 UTC timestamp when this row was recorded. |

#### Example output

```json
{
  "object_id": "shopify_products_7841234567890",
  "sku": "FP-CHN-00042",
  "title": "Chanel Classic Medium Double Flap Black Caviar",
  "url": "https://www.fashionphile.com/products/chanel-classic-medium-double-flap-black-caviar-00042",
  "price": 5095.0,
  "compare_at_price": 6200.0,
  "retail_savings_percent": 17.8,
  "condition": "Excellent",
  "images": [
    "https://cdn.shopify.com/s/files/1/fashionphile/00042-front.jpg"
  ],
  "categories": [
    "Handbags",
    "Chanel",
    "Flap Bags"
  ],
  "description": "Chanel Classic Medium Double Flap in black caviar leather with gold hardware.",
  "inventory_quantity": 1,
  "published_at": "2026-07-30T14:22:00Z",
  "search_term": "chanel",
  "scraped_at": "2026-08-24T12:00:00.000Z"
}
```

### 💰 Pricing

Pay-Per-Event — you pay only when these events fire:

| Event | USD | What it is |
|---|---:|---|
| `actor-start` | $0.05 | One-off warm-up charge per run |
| `result-row` | $0.003 | Per unique dataset item |

Example: 1 000 results at the rates above ≈ **$3.05**. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.

### 🚧 Limitations

- Live inventory only — no sold/historical pricing or comps mode.
- No strict "bags only" filtering — a broad brand query may return non-bag accessories from the wider catalog; scope via search\_terms.
- USD pricing only — non-US storefronts are out of scope.
- No cross-search-term deduplication — overlapping queries can return the same listing twice, each tagged with its own search term.

### ❓ FAQ

**Do I need a Fashionphile account or API key?**

No. This Actor queries Fashionphile's own public, search-only Algolia index — the same backend that powers its on-site search — no login, no API key.

**Does this scrape the /shop HTML page instead?**

No — the /shop page's embedded JSON block carries null price and SKU placeholders. This Actor queries Algolia directly for fully-resolved data.

**Does this fetch each listing's detail page?**

No — the Algolia hit already carries every field this Actor emits (price, condition, SKU, images), so there's no extra per-item HTTP call.

**What happens if a search term matches nothing?**

That term finishes as a clean, zero-row success — a genuine no-match is not treated as a failure. The run only fails if every search term could not be reached at all.

### 💬 Your feedback

Spotted a bug, hit a weird edge case, or need a new field? Open an
issue on the Actor's **Issues** tab on Apify Console — we ship
fixes weekly and we read every report.

***

<div align="center">

Built by **[Devil Scrapes](https://apify.com/DevilScrapes)** 😈 — a small fleet of
opinionated public-data Actors. Honest pricing, real engineering, zero fine print.

</div>

# Actor input Schema

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

Brand or keyword queries to run against Fashionphile's Algolia search index, e.g. "chanel", "hermes birkin". Blank entries are stripped; at least one non-blank term is required.

## `maxItemsPerSearch` (type: `integer`):

Cap on rows collected per search term. Pagination stops early once this is reached.

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

Apify Proxy configuration. Datacenter default — Fashionphile's Algolia backend showed no block signal in testing; RESIDENTIAL is selectable as defense-in-depth.

## Actor input object example

```json
{
  "searchTerms": [
    "chanel",
    "hermes birkin"
  ],
  "maxItemsPerSearch": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

All dataset items as JSON.

## `datasetItemsCsv` (type: `string`):

Same data exported to CSV.

## `datasetView` (type: `string`):

Open the run dataset in the Console.

# 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": [
        "chanel",
        "hermes birkin"
    ],
    "maxItemsPerSearch": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("devilscrapes/fashionphile-handbag-listings-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 = {
    "searchTerms": [
        "chanel",
        "hermes birkin",
    ],
    "maxItemsPerSearch": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("devilscrapes/fashionphile-handbag-listings-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 '{
  "searchTerms": [
    "chanel",
    "hermes birkin"
  ],
  "maxItemsPerSearch": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call devilscrapes/fashionphile-handbag-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,devilscrapes/fashionphile-handbag-listings-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/ZVYjFktbflAZPmEgP/builds/F84ECHV8lE9eeUJyt/openapi.json
