# Etsy Shop Sales Tracker & Scraper (`publicrecords/etsy-shop-velocity`) Actor

Track any Etsy shop's sales day by day with this Etsy shop scraper — measured counters, 7- and 28-day changes, modelled rates and breakout flags. One row per shop, pay per shop.

- **URL**: https://apify.com/publicrecords/etsy-shop-velocity.md
- **Developed by:** [Public Records](https://apify.com/publicrecords) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 shop rows

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Etsy Shop Sales Tracker & Scraper

Track Etsy sales for any shop with this Etsy shop scraper: daily sales, review and admirer counters, measured — with the date each counter was read, the change since the previous read, 7- and 28-day changes, a modelled sales rate with its interval, and a breakout flag that fires only when a shop's last seven days are improbable against its own prior four weeks. One row per shop, pay per shop.

### What you get

| Field | Meaning |
| --- | --- |
| `sales_count`, `sales_precision` | Lifetime sales counter on the shop page; `rounded` when Etsy shows "12.3k" |
| `as_of`, `read_interval_days` | The day this shop was last read, and the days since the read before it |
| `delta_last`, `sales_per_day` | Sales since the previous read, and that change per day (measured, not modelled) |
| `delta_7d`, `delta_28d` | Change in the counter over the last 7 and 28 days (`null` until the history exists) |
| `units_day`, `units_lo`, `units_hi` | Modelled sales rate per day with a 90 % interval (Gamma-Poisson, needs 2+ reads) |
| `lift_7d`, `breakout`, `breakout_p` | Last 7 days vs the prior 28, as a ratio; `breakout` is true when the tail probability is under 0.001, the step is at least 5 sales, and the shop's lift is at least twice its category's |
| `reviews_count`, `rating`, `admirers`, `listings_active` | The shop's other public counters |
| `first_seen`, `last_changed`, `history_days` | When the shop entered the panel, when any counter last moved, days of usable history |
| `vintage_event` | The counter fell on this read (shop reset or rename); deltas are suppressed and the series restarts |
| `snapshot_date`, `snapshot_stale` | The day of the snapshot; `true` if it is older than 48 hours |

A counter that could not be read is `null`, never `0`.

### Inputs

Shop names, keywords (title, headline or shop name), a panel category, a minimum sales counter, `since` (only shops whose counters changed on or after a date), `breakoutOnly`, `maxShops`.

### Coverage

The panel started on 2026-09-30 with 1,908 shops across Etsy's main categories and grows daily. Every shop is read at least every two days; shops that sell faster are read daily. A shop you name that is not in the panel is added on the next capture. `as_of` tells you how fresh each row is.

### Pricing

Pay per event: one actor-start event and one event per shop row returned. A run that returns no rows charges only the start event. Quote the Console prices on the Store pricing tab (planned history $0.05 / velocity $0.10 when Claude says they are live).

### Use it from an agent

Add `https://mcp.apify.com?tools=publicrecords/etsy-shop-velocity` to your MCP configuration.

### Need live search rows?

For keyword, market and category listings as clean rows (price, rating, reviews, badges, ad flag, rank, and shop), the companion product **Etsy Search Scraper — Keyword, Market & Category Listings** (`publicrecords/etsy-search-scraper`) is forthcoming. It is not listed on the Store yet — check back once Claude posts S4 PASS and it publishes.

# Actor input Schema

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

Etsy shop names (the part after etsy.com/shop/). Leave empty to use the keyword or category filters.

## `keywords` (type: `array`):

Case-insensitive words matched against the shop title and headline.

## `category` (type: `string`):

One of the panel categories (e.g. jewelry, home-decor, craft-supplies). Empty = all.

## `minSales` (type: `integer`):

Only shops at or above this sales counter.

## `minRate` (type: `integer`):

Only shops whose estimated sales rate (posterior mean, sales/day) is at or above this. 0 = no filter.

## `since` (type: `string`):

ISO date. Return only shops whose counters changed since this date. Empty = all matching shops.

## `breakoutOnly` (type: `boolean`):

Return only shops flagged as breakouts (needs 7 days of history; empty result until then is explained in the log).

## `maxShops` (type: `integer`):

Upper bound on rows returned (and charged).

## Actor input object example

```json
{
  "shops": [
    "OrelCeramics",
    "Bestickend"
  ],
  "minSales": 0,
  "minRate": 0,
  "breakoutOnly": false,
  "maxShops": 200
}
```

# Actor output Schema

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

No description

## `runSummary` (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 = {
    "shops": [
        "OrelCeramics",
        "Bestickend"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("publicrecords/etsy-shop-velocity").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": [
        "OrelCeramics",
        "Bestickend",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("publicrecords/etsy-shop-velocity").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": [
    "OrelCeramics",
    "Bestickend"
  ]
}' |
apify call publicrecords/etsy-shop-velocity --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,publicrecords/etsy-shop-velocity"
        }
    }
}
```

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/iSqAcbENkn1ZdUMm1/builds/4V6Z8MD8yRPQ8guLG/openapi.json
