# Krakt PriceCreep (`kurtholes/krakt-pricecreep`) Actor

Catch subscription price hikes. Tracks the official US pricing pages of 40+ subscriptions (Netflix, Spotify, ChatGPT, Microsoft 365, Dropbox, Disney+, NYT and more) and flags every plan whose price moved since the last run. $0.001 per plan, $0.005 per change.

- **URL**: https://apify.com/kurtholes/krakt-pricecreep.md
- **Developed by:** [Kurt Holes](https://apify.com/kurtholes) (community)
- **Categories:** E-commerce, Automation
- **Security:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 plan price rows

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

## Krakt PriceCreep: catch subscription price hikes before your card does

Netflix, Spotify, ChatGPT, Microsoft 365 and Dropbox all raise prices quietly. PriceCreep reads their **official public pricing pages**, remembers every plan's price, and tells you exactly what moved since the last run. **$0.001 per plan, $0.005 per detected change.** A full sweep of 44 services costs about a dime.

- **Official sources only**: every row links to the pricing page it came from. No bank connections, no logins, no third-party price lists.
- **Old vs new, in one row**: plan, old price, new price, % change, source URL, checked-at.
- **Never invents a price**: each service has hand-written selectors and regexes, plus a strict generic fallback. If a page can't be parsed it's marked `unparsed` and **you aren't charged** for it.
- **Remembers for you**: snapshots live in a named key-value store, so scheduled runs diff automatically.
- **Schedule it**: run daily or weekly with `onlyChanges: true` and you only see (and only pay row fees for) hikes.

### Covered services

- **Streaming**: Netflix (`netflix`), YouTube Premium (`youtube-premium`), Disney+ bundles (`disney-plus`), Hulu (`hulu`), HBO Max (`max`), Peacock (`peacock`), Paramount+ (`paramount-plus`), Apple TV (`apple-tv`), YouTube TV (`youtube-tv`), Philo (`philo`), Amazon Prime (`amazon-prime`)
- **Music**: Spotify (`spotify`), Apple Music (`apple-music`), Apple One (`apple-one`), Deezer (`deezer`), Pandora (`pandora`), SiriusXM (`siriusxm`), TIDAL (`tidal`), Audible (`audible`)
- **AI & software**: ChatGPT (`chatgpt`), Claude (`claude`), Adobe Creative Cloud (`adobe-cc`), Microsoft 365 (`microsoft-365`), Dropbox (`dropbox`), Google One (`google-one`), iCloud+ (`icloud`), Notion (`notion`), Grammarly (`grammarly`), Slack (`slack`), GitHub (`github`), Figma (`figma`), Canva (`canva`), Todoist (`todoist`), 1Password (`1password`), Proton (`proton`), ExpressVPN (`expressvpn`)
- **Gaming**: Nintendo Switch Online (`nintendo-online`), Xbox Game Pass (`xbox-game-pass`), PlayStation Plus (`playstation-plus`)
- **News**: New York Times (`nyt`), The Economist (`economist`)
- **Fitness**: Headspace (`headspace`), Strava (`strava`), Planet Fitness (`planet-fitness`)

Some sites block datacenter traffic or render prices with JavaScript. PriceCreep tries plain HTTP first, then a headless browser. Blocked ones show up as `unparsed`, free.

### Quick start

```json
{ "services": ["netflix", "spotify", "chatgpt"], "onlyChanges": false }
```

| Field | Default | What it does |
|---|---|---|
| `services` | all | ids or names to check |
| `onlyChanges` | `false` | only output rows whose price moved |
| `useBrowser` | `true` | headless browser fallback for JS/blocked pages |
| `snapshotStore` | `krakt-pricecreep-snapshots` | named KV store holding the previous prices |

### Output

```json
{
  "service": "Netflix", "plan": "Standard", "period": "month",
  "oldPrice": 17.99, "newPrice": 19.99, "changePct": 11.12, "status": "increase",
  "sourceUrl": "https://help.netflix.com/en/node/24926", "checkedAt": "2026-10-16T04:40:00Z"
}
```

`status` is `new` (first time seen), `unchanged`, `increase`, `decrease`, `unconfirmed` (a re-check disagreed, e.g. an A/B-tested promo; not charged as a change) or `unparsed`. Every change is confirmed with a second fetch before it is reported. The first run seeds the snapshot, so changes appear from the second run on.

### Pricing

| Event | Price |
|---|---|
| Plan price row | $0.001 |
| Price change detected | $0.005 |
| Unparsed service | free |

### Limits

US list prices as shown to a logged-out visitor. Promo/intro offers are skipped where the page separates them, but some plans (e.g. "from" prices, per-seat business tiers, VPN annual renewals) are labeled as shown. Taxes aren't included. If a site redesigns, its plans go `unparsed` until the rules are updated; PriceCreep never fills the gap with a guess.

# Actor input Schema

## `services` (type: `array`):

Leave empty to check all 44 services. Or list ids/names: netflix, youtube-premium, disney-plus, hulu, max, peacock, paramount-plus, apple-tv, youtube-tv, philo, spotify, apple-music, apple-one, deezer, pandora, siriusxm, tidal, audible, chatgpt, claude, adobe-cc, microsoft-365, dropbox, google-one, icloud, notion, grammarly, slack, github, figma, canva, todoist, 1password, proton, expressvpn, nintendo-online, xbox-game-pass, playstation-plus, nyt, economist, headspace, strava, planet-fitness, amazon-prime

## `onlyChanges` (type: `boolean`):

Off = one row per plan (old price, new price, % change). On = only rows whose price moved since the last run. Unparsed services are always listed (free).

## `useBrowser` (type: `boolean`):

Some pricing pages only render prices with JavaScript or block plain requests. Off = plain HTTP only (faster, fewer services parse).

## `snapshotStore` (type: `string`):

Named key-value store holding the previous prices. Use your own name to keep separate histories.

## Actor input object example

```json
{
  "services": [
    "netflix",
    "spotify",
    "chatgpt",
    "microsoft-365",
    "dropbox"
  ],
  "onlyChanges": false,
  "useBrowser": true,
  "snapshotStore": "krakt-pricecreep-snapshots"
}
```

# Actor output Schema

## `prices` (type: `string`):

No description

## `summary` (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 = {
    "services": [
        "netflix",
        "spotify",
        "chatgpt",
        "microsoft-365",
        "dropbox"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kurtholes/krakt-pricecreep").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 = { "services": [
        "netflix",
        "spotify",
        "chatgpt",
        "microsoft-365",
        "dropbox",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("kurtholes/krakt-pricecreep").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 '{
  "services": [
    "netflix",
    "spotify",
    "chatgpt",
    "microsoft-365",
    "dropbox"
  ]
}' |
apify call kurtholes/krakt-pricecreep --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kurtholes/krakt-pricecreep"
        }
    }
}
```

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/bFT32DkxtZAFWbpdT/builds/xqvkXzOgOHaFDi1XJ/openapi.json
