# Geo Price Comparator (`rainminer/geo-price-comparator-scraper`) Actor

Compare the same product URL across countries with Apify residential proxies. Extract local prices (structured data + AI), convert FX, adjust for PPP, and find the best deal plus geo-pricing gaps. Try Spotify Premium US vs IN vs BR.

- **URL**: https://apify.com/rainminer/geo-price-comparator-scraper.md
- **Developed by:** [rainminer](https://apify.com/rainminer) (community)
- **Categories:** E-commerce, AI, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.37 / 1,000 geo price results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Geo Price Comparator

**Compare the same product or pricing page across countries** using Apify residential proxies. Paste a public URL (for example [Spotify Premium](https://www.spotify.com/premium/)), pick markets like `US`, `IN`, and `BR`, and get local prices converted to one currency — plus the **best deal** and **geo-pricing spread**.

Merchants and SaaS vendors often charge different amounts by visitor geography and purchasing power. This Actor turns that into structured data you can schedule, export, and plug into pricing research or deal monitoring.

***

### What does Geo Price Comparator do?

For every product URL × country pair, Geo Price Comparator:

1. Opens the page through an **Apify Residential Proxy** IP in that country
2. Extracts **title**, **image**, **price**, and **currency** (JSON-LD → meta → microdata → selectors → optional AI)
3. Converts prices into your **compare currency** (default `USD`) using live FX rates
4. Optionally estimates a **PPP-adjusted** international-dollar cost
5. Writes one **observation** per country and one **comparison** summary per product (cheapest market, spread %, best deal)

Try it with the default input: Spotify Premium from the United States, India, and Brazil — a real geo-pricing gap shows up after FX conversion.

***

### What can this Actor do?

- **Multi-country proxy fetches** — same URL, different Apify Proxy country codes
- **Structured + AI extraction** — works on JSON-LD shops and messy SaaS pricing pages
- **FX normalization** — compare INR, BRL, EUR, and USD in one column
- **PPP adjustment** — rough purchasing-power view alongside cash prices
- **Best-deal summary** — cheapest country, most expensive country, absolute and % spread
- **Apify platform** — schedule runs, monitor jobs, export JSON/CSV/Excel, call via API, and integrate with webhooks

***

### What data can you extract?

| Field | Description |
| ----- | ----------- |
| `countryCode` / `countryName` | Market simulated via residential proxy |
| `title` | Product or plan name |
| `imageUrl` | Primary product image when available |
| `price` / `currency` / `priceText` | Local price as shown |
| `priceConverted` / `compareCurrency` / `fxRate` | FX-normalized comparison |
| `pricePppIntl` / `pppConversionFactor` | Optional PPP international-dollar estimate |
| `bestDealCountry` / `spreadPercent` | Comparison summary fields |
| `extractionMethod` | `json-ld`, `meta`, `microdata`, `selector`, or `ai` |

***

### Why scrape geo prices?

Use Geo Price Comparator when you need to:

- Find the **cheapest country** to buy a digital subscription or product
- Measure **price discrimination** after currency conversion
- Compare cash prices with **PPP-adjusted** cost
- Monitor competitor or SaaS geo pricing on a schedule
- Feed deal alerts, research notebooks, or pricing dashboards via the Apify API

#### Who is it for?

- **SaaS pricing teams** auditing regional list prices vs purchasing power
- **Deal hunters** looking for the cheapest market for the same digital good
- **Market researchers** quantifying cross-border price gaps after FX
- **E-commerce analysts** spotting geo offers on public product pages
- **Competitive intelligence** monitoring rival subscription tiers by country
- **Agencies** delivering geo-pricing reports for clients
- **Fintech / FX desks** studying listed prices vs mid-market rates
- **Travel researchers** comparing viewer-country hotel or fare quotes
- **Policy / consumer advocates** documenting discriminatory list prices
- **Indie builders** validating PPP-aware pricing before launch
- **Affiliate publishers** finding regional deals worth promoting
- **Procurement** checking vendor public price pages from multiple geos

***

### How to compare product prices by country

1. Open the Actor in [Apify Console](https://console.apify.com/)
2. Keep or replace the default **Product URL** (Spotify Premium works out of the box)
3. Set **Countries** to ISO codes such as `US`, `IN`, `BR`
4. Leave **Apify Proxy** on with **RESIDENTIAL** groups
5. Click **Start**, then open the **Overview** and **Comparisons** dataset views

For every input option, see the **Input** tab.

#### Example input

```json
{
  "startUrls": [{ "url": "https://www.spotify.com/premium/" }],
  "countries": ["US", "IN", "BR"],
  "maxItems": 1,
  "compareCurrency": "USD",
  "includePppAdjustment": true,
  "useAiExtraction": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

#### Example result (Spotify Premium)

| Country | Local price | → USD |
| ------- | ----------- | ----- |
| US | $12.99 | $12.99 |
| BR | R$23.90 | ~$4.62 |
| IN | ₹139 | ~$1.45 |

Best deal: **IN**. Spread vs US in a live UAT run: **~794%**. Exact figures move with FX and plan copy on the page.

***

### Input

| Field | Required | Default | Description |
| ----- | -------- | ------- | ----------- |
| `startUrls` | yes | Spotify Premium | Public product or pricing page URLs |
| `countries` | yes | `US`, `IN`, `BR` | ISO 3166-1 alpha-2 codes for proxy geolocation |
| `maxItems` | no | `3` | Max product URLs to process |
| `compareCurrency` | no | `USD` | ISO currency for cross-country comparison |
| `includePppAdjustment` | no | `true` | Add PPP international-dollar estimates |
| `useAiExtraction` | no | `true` | Fall back to OpenRouter when structured price tags are missing |
| `proxyConfiguration` | no | Residential on | Must use Apify Proxy + residential for real geo prices |

***

### Output

#### Observation (one row per country)

```json
{
  "recordType": "observation",
  "url": "https://www.spotify.com/premium/",
  "finalUrl": "https://www.spotify.com/br-pt/premium/",
  "title": "Premium Individual",
  "imageUrl": null,
  "countryCode": "BR",
  "countryName": "Brazil",
  "price": 23.9,
  "currency": "BRL",
  "priceText": "R$ 23,90",
  "priceConverted": 4.6201,
  "compareCurrency": "USD",
  "fxRate": 0.1933,
  "pricePppIntl": 9.56,
  "pppConversionFactor": 2.5,
  "extractionMethod": "ai",
  "proxyUsed": true,
  "error": null,
  "scrapedAt": "2026-08-21T19:20:00.000Z"
}
```

#### Comparison (one row per product)

```json
{
  "recordType": "comparison",
  "url": "https://www.spotify.com/premium/",
  "title": "Premium Individual",
  "bestDealCountry": "IN",
  "cheapestPriceConverted": 1.4525,
  "mostExpensiveCountry": "US",
  "mostExpensivePriceConverted": 12.99,
  "spreadConverted": 11.5375,
  "spreadPercent": 794.32,
  "compareCurrency": "USD",
  "pppCheapestCountry": "IN",
  "countries": []
}
```

Download results as JSON, CSV, Excel, or HTML from the dataset, or pull them with the Apify API.

***

### How much does it cost to compare geo prices?

This Actor uses **pay-per-event** pricing **plus platform usage**:

- You pay a small PPE fee per dataset row (`geo-price-result`: each country observation and each product comparison)
- You also pay **Apify platform usage** for this run — mainly **residential proxy** traffic, compute, and optional AI extraction

Residential proxies are required for realistic geo prices, so usage is part of the product. Start with 2–3 countries and one URL while validating a site. Schedule larger country sets once the page extracts cleanly.

***

### Tips for better geo price comparison

- Prefer one **canonical URL**; many sites redirect to `/us/`, `/in/`, `/br/` paths automatically from the proxy country
- Keep **residential** proxies on — datacenter or no-proxy runs will not show true geo pricing
- Leave **AI extraction** on for SaaS pricing pages without JSON-LD
- PPP factors are approximate World Bank-style ratios for relative comparison, not financial advice
- Some storefronts (Steam age gates, heavy JS checkouts) may need cookies or a browser crawler — start with public pricing pages like Spotify

***

### FAQ

#### Is it legal to compare prices by country?

This Actor only reads **publicly visible** pricing pages. You are responsible for complying with each site’s terms and applicable law. Do not use results to abuse regional licensing or payment rules.

#### Why do I need residential proxies?

Geo prices usually depend on the visitor’s IP country. Apify Residential Proxy with a `countryCode` is what makes the same URL look like a local customer in each market.

#### Why is India sometimes much cheaper on Spotify?

Spotify (and many SaaS brands) use **regional pricing**. India and Brazil often list lower local prices than the US after FX conversion. Plan names can also differ (Individual vs Student); check the `title` field on each observation.

#### Can I monitor prices on a schedule?

Yes. Save the input as an Actor task and schedule it in Apify Console, or call the Actor from the API / integrations.

***

### Related Actors

- [Website Price Extractor](https://apify.com/rainminer/website-price-extractor) — find SME pricing pages and extract priced goods and services
- [Booking.com Price Scraper](https://apify.com/rainminer/booking-price-scraper) — hotel stay prices

### Image Credit

Image credit: [Spotify](https://www.spotify.com/)

# Actor input Schema

## `startUrls` (type: `array`):

Public product or pricing page URLs to open from each country. Use the same canonical URL when possible so geo pricing differences are comparable. Default: Spotify Premium — a live example of regional pricing.

## `countries` (type: `array`):

ISO 3166-1 alpha-2 country codes used for Apify Proxy geolocation (e.g. US, IN, BR). Each product URL is fetched once per country. Default set shows a clear Spotify Premium geo spread.

## `maxItems` (type: `integer`):

Maximum number of product URLs to compare (each URL is still fetched for every selected country).

## `compareCurrency` (type: `string`):

ISO 4217 currency code used for cross-country comparison (e.g. USD, EUR, GBP).

## `includePppAdjustment` (type: `boolean`):

Convert local prices into approximate international dollars using World Bank-style PPP conversion factors so you can compare purchasing-power-adjusted cost, not only FX rates.

## `useAiExtraction` (type: `boolean`):

When JSON-LD or meta price tags are missing, use OpenRouter (Gemini Flash Lite) to read the product name and price from page text.

## `proxyGroups` (type: `array`):

Proxy groups used for country targeting. Residential is strongly recommended for realistic geo prices.

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

Base Apify Proxy settings. Country codes from the Countries field override country selection per request. Disable Apify Proxy only for dry-run extraction tests (prices will not differ by market).

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.spotify.com/premium/"
    }
  ],
  "countries": [
    "US",
    "IN",
    "BR"
  ],
  "maxItems": 1,
  "compareCurrency": "USD",
  "includePppAdjustment": true,
  "useAiExtraction": true,
  "proxyGroups": [
    "RESIDENTIAL"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `comparisons` (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 = {
    "startUrls": [
        {
            "url": "https://www.spotify.com/premium/"
        }
    ],
    "countries": [
        "US",
        "IN",
        "BR"
    ],
    "maxItems": 1,
    "compareCurrency": "USD",
    "proxyGroups": [
        "RESIDENTIAL"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("rainminer/geo-price-comparator-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 = {
    "startUrls": [{ "url": "https://www.spotify.com/premium/" }],
    "countries": [
        "US",
        "IN",
        "BR",
    ],
    "maxItems": 1,
    "compareCurrency": "USD",
    "proxyGroups": ["RESIDENTIAL"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("rainminer/geo-price-comparator-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 '{
  "startUrls": [
    {
      "url": "https://www.spotify.com/premium/"
    }
  ],
  "countries": [
    "US",
    "IN",
    "BR"
  ],
  "maxItems": 1,
  "compareCurrency": "USD",
  "proxyGroups": [
    "RESIDENTIAL"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call rainminer/geo-price-comparator-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rainminer/geo-price-comparator-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/vZO5CLsgegaxuyvNY/builds/lhhv3HkaHsXh8MVrz/openapi.json
