# Competitor Price Tracking API - Prices, Stock and SmartPrice (`nabeelbaghoor/competitor-price-tracking-api`) Actor

Competitor price tracking export: latest competitor price, total price and stock per product and domain, ranked against rivals, plus tracked URL detail with last check and price change, products, SmartPrice, brands and categories, from the Prisync API v2. Read only. Bring your own key.

- **URL**: https://apify.com/nabeelbaghoor/competitor-price-tracking-api.md
- **Developed by:** [Nabeel Hassan](https://apify.com/nabeelbaghoor) (community)
- **Categories:** E-commerce, Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 competitor price returneds

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

## Competitor Price Tracking API - Prices, Stock and SmartPrice

Export the competitor prices your price tracking account already collects: one row per product per competitor domain, with the latest price, total price and stock, ranked against every other domain tracked for that product, ready for a warehouse, a spreadsheet or a repricing rule.

### What it collects

- **Competitor prices**: for every product, the latest price, total price (with shipping) and in stock flag at each competitor domain, read 100 products per call.
- **Computed on every price**: its rank among the domains tracked for the product (1 is cheapest), the lowest price, the gap to the lowest in percent, and how many domains are tracked.
- **Competitor URLs**: every tracked product page in full, with price, stock, currency, last check time, last price change date, old price, the change in amount and percent, and the daily change.
- **Your product data beside each row**: product id, name, product code, barcode, brand, category, cost, additional cost, tags, your position and SmartPrice where the provider returns them.
- **Lookups**: products, SmartPrices (the provider's suggested price), brands, categories and the account's plan, product limit and status.
- **Filters**: product ids, brand, category, name, code or barcode, competitor domain and in stock only.
- Read only, pay per result, bring your own key.

### Input

| Field | What it does |
| --- | --- |
| What to read | Competitor prices (default, needs nothing else), competitor URLs, products, SmartPrices, brands, categories or account. |
| Product ids | Competitor URLs and products: read just these products. Empty reads every product. |
| Only these brands / categories | Keep products whose brand or category contains one of these. |
| Product name, code or barcode contains | Keep products that match one of these. |
| Only these competitor domains | Competitor prices and URLs: keep prices from these domains, such as amazon.com. |
| In stock only | Competitor prices and URLs: keep in stock prices only. |
| Maximum results | Row cap for the run. |
| Requests per minute | Pacing for calls to the provider, at most 41 (2,500 per hour). |
| API key / API token | Your own credentials, as secret inputs. |

### FAQ

#### What is a competitor price tracking API used for?

Getting competitor prices out of a price tracking tool and into the systems that act on them. An ecommerce team loads every competitor price into BigQuery or Snowflake each morning and flags products where it is no longer the cheapest. A pricing analyst compares Amazon, Best Buy and Walmart prices per SKU or barcode. A category manager tracks which rivals went out of stock on a best seller. A repricing script reads the lowest in stock price per product and the provider's SmartPrice.

#### Which data source does this actor read?

The Prisync API v2 at api.prisync.com, through the read routes documented in its public Swagger file: account details (`GET /account`), the product list with and without competitor price summary (`GET /list/product/summary/startFrom/{n}` and `GET /list/product/startFrom/{n}`), SmartPrices (`GET /list/smartprice/startFrom/{n}`), brands, categories, one product (`GET /get/product/id/{id}`) and one tracked URL (`GET /get/url/id/{id}`). It reads the products and competitor URLs already set up in your own account.

#### Do I need an API key?

Yes. This actor is bring-your-own-key and never ships one. The provider shows an API key and an API token on the API access page of your account settings; its API key is your login email. Paste both into the input, or set them once as the `DATA_API_KEY` and `DATA_API_TOKEN` environment secrets. API access is included only in some provider plans. Missing or refused credentials end the run cleanly with a message saying which it was.

#### What is the difference between competitor prices and competitor URLs?

Competitor prices reads the product summary list, which gives the latest price, total price and stock per competitor domain for 100 products in one call, so it is fast and cheap on the provider's rate limit. Competitor URLs reads each tracked page on its own and adds the page URL, currency, last check time, last price change date, old price and daily change, at one call per page. Use competitor prices for a daily feed and competitor URLs for price change history detail.

#### How are price rank and gap to the lowest worked out?

Both are computed here from the provider's summary. For each product, every tracked domain with a price is compared: rank 1 is the cheapest, and the gap is how far this price is above the lowest, as a percentage of the lowest. Your own store is one of the tracked domains when you added its URL, so your rank shows where you stand. The domain filter never changes the comparison, only which rows are kept.

#### Can this actor change anything in my account?

No. Every route it calls is a GET, and the provider documents GET requests as read-only. The add, edit and delete routes the provider also offers are not wired. The credentials travel as the two request headers the provider requires and never appear in a row or in the log.

#### How far back does the data go?

The provider's API returns the latest known state of each tracked page, not a daily history: the current price, the last check time, the last price change date and the price before that change. Schedule this actor daily to build your own history.

#### How is it priced?

Pay per result: one price per competitor price row, a higher one per tracked URL row, and a lower price per product, SmartPrice, brand, category or account row. Products with no competitor yet, ids the provider does not know and rows left out by the filters are free. Your provider subscription applies separately, and the provider allows 2,500 requests per hour.

### Example output

```json
{
  "mode": "competitorPrices",
  "modeLabel": "Competitor prices",
  "found": true,
  "productId": 24612,
  "productName": "Samsung S8",
  "productCode": "G950F",
  "barcode": "194252022191",
  "brandId": 9868,
  "brand": "Samsung",
  "categoryId": 2536,
  "category": "Mobile Phones",
  "tags": ["Tag1", "tag2"],
  "cost": 499,
  "additionalCost": 40,
  "myPosition": "cheapest",
  "competitorDomain": "bestbuy.com",
  "price": 786,
  "totalPrice": 799,
  "inStock": true,
  "competitorCount": 2,
  "priceRank": 2,
  "lowestPrice": 766,
  "gapToLowestPercent": 2.61,
  "retrievedAt": "2026-09-29T08:14:52.118Z",
  "note": null
}
```

A competitor URLs row adds `urlId`, `url`, `currency`, `lastCheck` (such as 2026-09-29 06:22:21), `lastChanged` (as YYYY-MM-DD), `oldPrice`, `priceChange`, `priceChangePercent` and `changeDayPercent`. Values are illustrative; every source field is one the provider documents.

### Keyword map

competitor price tracking API, competitor price monitoring, ecommerce price tracking, competitor stock tracking, price scraping export, dynamic pricing data, SmartPrice export, Amazon price tracking, repricing data feed, MAP monitoring, price comparison by SKU and barcode, Prisync API.

### Pricing

| Row | Price |
| --- | --- |
| Competitor price | 0.008 USD |
| Tracked URL | 0.012 USD |
| Product or SmartPrice | 0.005 USD |
| Brand, category or account | 0.005 USD |

Rows with `found` set to false are never charged.

# Actor input Schema

## `mode` (type: `string`):

Competitor prices reads, for every product in the account, the latest price, total price and stock at each competitor domain, 100 products per call, and needs nothing else, so it is the default. Competitor URLs reads every tracked product page in full, one call per page, with last check time and last price change. The other modes list products, SmartPrices, brands, categories or the account details.

## `productIds` (type: `array`):

Competitor URLs and products only: read just these products, one numeric product id per line, as the products mode lists them. Leave empty to read every product in the account.

## `brands` (type: `array`):

Competitor prices, competitor URLs and products: keep only products whose brand contains one of these, one per line. Applied to the provider's answer.

## `categories` (type: `array`):

Competitor prices, competitor URLs and products: keep only products whose category contains one of these, one per line. Applied to the provider's answer.

## `productSearch` (type: `array`):

Keep only products whose name, product code or barcode contains one of these, one per line. SmartPrices match on product code and barcode only. Applied to the provider's answer.

## `competitorDomains` (type: `array`):

Competitor prices and competitor URLs: keep only prices from domains that contain one of these, one per line, such as amazon.com or bestbuy.com. Price rank and gap to the lowest still compare against every tracked domain.

## `onlyInStock` (type: `boolean`):

Competitor prices and competitor URLs: keep only prices the provider reports as in stock.

## `maxResults` (type: `integer`):

Stop after this many rows. Competitor prices gives one row per product per competitor domain, so 500 products with 6 competitors each give about 3,000 rows.

## `requestsPerMinute` (type: `integer`):

Pacing ceiling for calls to the provider, which allows 2,500 requests per hour per token, about 41 a minute. Competitor URLs makes one call per product and one per tracked page, so it is the mode this matters for.

## `apiKey` (type: `string`):

Your own API key, shown as API Key on the API access page of your provider account; the provider uses your login email as the API key. This actor is bring-your-own-key and never ships one. Leave blank to use the DATA\_API\_KEY environment secret instead. It is never written to a row or the log.

## `apiToken` (type: `string`):

Your own API token, shown beside the API key on the same page. Leave blank to use the DATA\_API\_TOKEN environment secret instead. It is never written to a row or the log.

## Actor input object example

```json
{
  "mode": "competitorPrices",
  "onlyInStock": false,
  "maxResults": 1000,
  "requestsPerMinute": 40
}
```

# Actor output Schema

## `records` (type: `string`):

One row per competitor price, tracked URL, product, SmartPrice, brand, category or account.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/competitor-price-tracking-api").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/competitor-price-tracking-api").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 '{}' |
apify call nabeelbaghoor/competitor-price-tracking-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nabeelbaghoor/competitor-price-tracking-api"
        }
    }
}
```

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/8bGdEwQuxGyKZQiND/builds/t9vQuntMbHw1Elcfg/openapi.json
