# Shopify Catalog and Price Drop Tracker (Turkish stores, TRY) (`cexxz34/tr-shopify-katalog`) Actor

Reads the public products.json feed of Shopify stores: prices, discount percent, stock. Optional change tracking reports new products, price drops and back-in-stock between runs. No proxy, no browser.

- **URL**: https://apify.com/cexxz34/tr-shopify-katalog.md
- **Developed by:** [Arda Cem](https://apify.com/cexxz34) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 product scrapeds

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

## Shopify Katalog ve Fiyat Düşüşü Takibi (Türk mağazaları, TL)

Shopify mağazalarının herkese açık `products.json` akışını okur: ürün, fiyat, indirim yüzdesi, stok. İsterseniz önceki çalıştırmayla karşılaştırır ve yeni ürünleri, fiyat düşüşlerini ve stoğa girenleri raporlar.

Proxy, tarayıcı veya hesap bilgisi gerekmez. Yalnız herkese açık ve mağazanın kendisinin yayınladığı ürün akışı okunur.

### Ne yapar?

- Mağazadaki tüm ürünleri sayfa sayfa okur (sayfa başına 250).
- Para birimini mağazanın herkese açık bilgisinden alır (örneğin TRY).
- Her ürün için en düşük ve en yüksek fiyat, indirimli mi, en yüksek indirim yüzdesi, stok durumu, satıcı ve etiketleri verir.
- **Değişiklik takibi** açıkken her ürün için `changeType` verir: `new`, `price-drop`, `price-increase`, `back-in-stock`, `sold-out`, `unchanged`.
- **Yalnız değişenler** seçeneği ile sadece değişen ürünler döner. Günlük zamanlanmış çalıştırma için uygundur.

### Nasıl kullanılır?

1. "Mağaza adresleri" listesine Shopify mağazalarının ana sayfa adreslerini yazın.
2. Fiyat takibi için "Değişiklik takibi"ni açın. İlk çalıştırma temel durumu kaydeder; ikinci çalıştırmadan itibaren değişimler görünür.
3. Günlük takip için Apify'ın "Schedules" bölümünden çalıştırmayı zamanlayın.

### Girdi

| Alan | Açıklama |
|---|---|
| `storeUrls` | Shopify mağaza adresleri |
| `collection` | Yalnız bu koleksiyon (adresteki kısa ad) |
| `maxProductsPerStore` | Mağaza başına en fazla ürün. Varsayılan: 250 |
| `onlyAvailable` | Stokta olmayanları çıkar |
| `includeVariants` | Varyant listesini ekle |
| `trackChanges` | Önceki çalıştırmayla karşılaştır |
| `changesOnly` | Değişiklik takibinde yalnız değişenleri döndür |
| `timeoutSecs` | İstek başına bekleme süresi |

### Örnek kayıt

Aşağıdaki kayıt, actor'ün yerel testinde kullanılan örnek bir mağaza akışından alınmıştır.

```json
{
  "store": "http://127.0.0.1:PORT",
  "title": "Ürün 1",
  "currency": "TRY",
  "minPrice": 60,
  "onSale": false,
  "available": true,
  "changeType": "price-drop",
  "previousPrice": 100
}
```

### Fiyat

Kullandıkça öde (pay-per-event). Dönen her ürün kaydı bir `product-scraped` olayıdır. Hata veren mağazalar ücretlendirilmez. Değişiklik takibinde "yalnız değişenler" açıksa yalnız dönen kayıtlar ücretlenir.

### Sınırlar

- Yalnız `products.json` akışını açık bırakan Shopify mağazalarında çalışır. Akışı kapatmış veya Shopify kullanmayan siteler hata olarak raporlanır.
- Bot koruması olan mağazalarda (HTTP 403, 429) çalışmaz; engel aşılmaz.
- Para birimi bilgisi mağazanın herkese açık meta bilgisinden gelir; bulunamazsa boş kalır.
- Fiyat, akıştaki varyant fiyatıdır; sepette uygulanan kampanya, kupon veya kargo ücretini içermez.
- Değişiklik takibi, mağaza ve koleksiyon başına son çalıştırmanın durumunu hesabınızdaki adlandırılmış bir depoda saklar.
- Mağaza koşullarına ve ilgili mevzuata uymak kullanıcının sorumluluğundadır.

### Kişisel veri

Ürün akışı kişisel veri içermez. Müşteri veya sipariş verisi okunmaz.

***

## Shopify Catalog and Price Drop Tracker (Turkish stores, TRY)

Reads the public `products.json` feed of Shopify stores: products, prices, discount percent and stock. Optionally compares with the previous run and reports new products, price drops and back-in-stock items.

No proxy, browser or login is needed. Only the product feed the store itself publishes is read.

### What it does

- Reads all products page by page (250 per page).
- Takes the currency from the store's public metadata (for example TRY).
- Returns min and max price, on-sale flag, max discount percent, stock state, vendor and tags for every product.
- With **change tracking**, every product gets a `changeType`: `new`, `price-drop`, `price-increase`, `back-in-stock`, `sold-out` or `unchanged`.
- **Changes only** returns just the products that changed. Fits daily scheduled runs.

### Input

| Field | Description |
|---|---|
| `storeUrls` | Shopify store URLs |
| `collection` | Only this collection (handle from its URL) |
| `maxProductsPerStore` | Maximum products per store. Default: 250 |
| `onlyAvailable` | Skip out-of-stock products |
| `includeVariants` | Add the variant list |
| `trackChanges` | Compare with the previous run |
| `changesOnly` | With change tracking, return only changed products |
| `timeoutSecs` | Wait time per request |

### Output

- Dataset: one item per product. Failed stores appear with an `error` field and are not charged.
- Key-value store: `SUMMARY` with per-store counts.

### Pricing

Pay per event. Each returned product record is one `product-scraped` event. With changes-only, only returned records are charged.

### Limitations

- Works only on Shopify stores that keep `products.json` open. Stores that closed it or do not use Shopify are reported as errors.
- Does not work on bot-protected stores (HTTP 403, 429); protection is not bypassed.
- Currency comes from the store's public metadata and may be empty.
- Prices are the feed's variant prices. Campaigns, coupons and shipping applied in the cart are not included.
- Change tracking keeps the last run's state per store and collection in a named store in your account.
- You are responsible for following the store's terms and applicable law.

# Actor input Schema

## `storeUrls` (type: `array`):

Shopify mağazalarının ana sayfa adresleri. / Home pages of Shopify stores.

## `collection` (type: `string`):

Yalnız bu koleksiyonun ürünleri. Koleksiyon adresindeki kısa ad (handle). / Only this collection; the handle from the collection URL.

## `maxProductsPerStore` (type: `integer`):

Her mağazadan okunacak en fazla ürün. / Maximum products read per store.

## `onlyAvailable` (type: `boolean`):

Stokta olmayan ürünleri çıkar. / Skip products that are out of stock.

## `includeVariants` (type: `boolean`):

Her ürün için varyant listesini ekle. / Add the variant list to every product.

## `trackChanges` (type: `boolean`):

Önceki çalıştırmayla karşılaştır: yeni ürün, fiyat düşüşü, stoğa giriş. / Compare with the previous run: new, price drop, back in stock.

## `changesOnly` (type: `boolean`):

Değişiklik takibi açıkken yalnız değişen ürünleri döndür. / With change tracking, return only products that changed.

## `timeoutSecs` (type: `integer`):

İstek başına bekleme süresi. / Wait time per request.

## Actor input object example

```json
{
  "storeUrls": [
    "https://www.allbirds.com"
  ],
  "maxProductsPerStore": 250,
  "onlyAvailable": false,
  "includeVariants": false,
  "trackChanges": false,
  "changesOnly": false,
  "timeoutSecs": 20
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset with one item per product.

## `files` (type: `string`):

Key-value store with SUMMARY (JSON).

# 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 = {
    "storeUrls": [
        "https://www.allbirds.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cexxz34/tr-shopify-katalog").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 = { "storeUrls": ["https://www.allbirds.com"] }

# Run the Actor and wait for it to finish
run = client.actor("cexxz34/tr-shopify-katalog").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 '{
  "storeUrls": [
    "https://www.allbirds.com"
  ]
}' |
apify call cexxz34/tr-shopify-katalog --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cexxz34/tr-shopify-katalog"
        }
    }
}
```

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/8QBtKhlsuwCr1penq/builds/nPutdc755sA6ClXeb/openapi.json
