{
  "openapi": "3.0.1",
  "info": {
    "title": "Steam Sales & Discount Tracker - Deals, Prices, Events",
    "description": "Track every Steam discount: all ~9,500 deals with end dates and deal type, Daily/Weekend Deals, free-to-keep games, regional prices in USD, sale page items and the seasonal sale and Fest calendar. Built-in price-drop and ended-deal detection.",
    "version": "0.0",
    "x-build-id": "ce5fyz7qOtby7WNSL"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fanndev~steam-sales-discount-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fanndev-steam-sales-discount-tracker",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/fanndev~steam-sales-discount-tracker/runs": {
      "post": {
        "operationId": "runs-sync-fanndev-steam-sales-discount-tracker",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/fanndev~steam-sales-discount-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-fanndev-steam-sales-discount-tracker",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "What to collect",
            "enum": [
              "deals",
              "featured",
              "freebies",
              "appPrices",
              "salePage",
              "saleEvents"
            ],
            "type": "string",
            "description": "deals = every discounted game/DLC/package on Steam (~9,500), with filters, discount end date and deal type. featured = storefront deal events: Daily Deal, Weekend Deals, Free Weekends, franchise/publisher sale spotlights and the featured specials. freebies = free-to-keep giveaways (100% off) and Free Weekends. appPrices = price and discount of your games in several countries, converted to USD. salePage = every item on a Steam sale page (publisher, franchise or developer sales) with prices. saleEvents = Steam's official calendar of seasonal sales, themed Fests and Next Fest.",
            "default": "deals"
          },
          "country": {
            "title": "Store country",
            "type": "string",
            "description": "Two-letter country code (US, GB, DE, ID, BR, ...). Steam discounts and prices are regional, so the deal list and currency follow this country. Used by every mode except appPrices and saleEvents.",
            "default": "US"
          },
          "maxItems": {
            "title": "Max results",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Maximum deal / sale-item records to return. Steam lists about 9,500 discounted items in the US; set 10000 to read them all (about 5 minutes). Ended-deal detection only runs when the whole list was read.",
            "default": 500
          },
          "minDiscount": {
            "title": "Minimum discount (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "deals: only return items discounted by at least this much. Default 1 drops the ~2% of Steam's specials list shown at 0% (edition upgrades, DLC whose bundle is the discounted item); 0 keeps them. Applied after download (Steam has no discount filter), so it does not reduce the number of pages read.",
            "default": 1
          },
          "maxPrice": {
            "title": "Maximum price",
            "minimum": 0,
            "type": "number",
            "description": "deals: only return items whose discounted price is at most this amount, in the store country's currency (e.g. 10 = $10.00 in the US). Leave empty for no limit."
          },
          "category": {
            "title": "Item type",
            "enum": [
              "all",
              "games",
              "dlc",
              "software",
              "soundtracks"
            ],
            "type": "string",
            "description": "deals: restrict to games, DLC, software or soundtracks.",
            "default": "all"
          },
          "tags": {
            "title": "Steam tags",
            "type": "array",
            "description": "deals: only items with ALL of these Steam tags. Tag names (Horror, RPG, Cooking, Roguelike, ...) or numeric tag ids. Useful for themed Fests: their sale pages are dynamic, so tag-filtered deals is how you list them.",
            "items": {
              "type": "string"
            }
          },
          "searchTerm": {
            "title": "Search term",
            "type": "string",
            "description": "deals: only discounted items matching this text (title, franchise, publisher)."
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "priceAsc",
              "priceDesc",
              "releasedDesc",
              "nameAsc",
              "reviewsDesc"
            ],
            "type": "string",
            "description": "deals: order of results. Note that 'Best reviewed' only lists items that have reviews (about half of all deals).",
            "default": "relevance"
          },
          "hideFreeToPlay": {
            "title": "Hide free-to-play games",
            "type": "boolean",
            "description": "deals: drop free-to-play games (their DLC deals still appear).",
            "default": false
          },
          "apps": {
            "title": "Games (for appPrices)",
            "type": "array",
            "description": "appPrices: one per line - a Steam appid (1808500), a Steam store URL, or a game name (resolved through Steam store search; an exact title match wins).",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Countries (for appPrices)",
            "type": "array",
            "description": "appPrices: two-letter country codes to compare. Each record gets its USD equivalent (ECB reference rates), the cheapest country and the difference versus the US price.",
            "default": [
              "US"
            ],
            "items": {
              "type": "string"
            }
          },
          "saleUrls": {
            "title": "Sale pages (for salePage)",
            "type": "array",
            "description": "salePage: store.steampowered.com/sale/<name> URLs or just the <name>. Get current ones from the featured mode (SPOTLIGHT records with targetType 'sale'). Ended sales are reported as not_found.",
            "items": {
              "type": "string"
            }
          },
          "includeDiscountDetails": {
            "title": "Include discount end date & deal type",
            "type": "boolean",
            "description": "Adds discountEndsAt, hoursLeft, discountType (weekend / weeklong / launch / special / named campaign), developers, publishers and discounted bundles, from Valve's official store API (1 extra request per 100 items).",
            "default": true
          },
          "includeUsdPrices": {
            "title": "Add USD prices",
            "type": "boolean",
            "description": "Convert every price to USD with the European Central Bank's daily reference rates (about 30 currencies; others stay null).",
            "default": true
          },
          "includePastEvents": {
            "title": "Include ended events",
            "type": "boolean",
            "description": "saleEvents: also return calendar entries that already ended.",
            "default": false
          },
          "compareWithPrevious": {
            "title": "Compare with previous run (monitoring)",
            "type": "boolean",
            "description": "Remember each item's price between runs and add previousFinalPriceCents, priceChangeCents, priceDropPct, isNewDeal, lowestPriceSeenCents and alert. In deals/freebies mode, items that disappeared since the last complete run come back as DEAL_ENDED records. Schedule the actor (e.g. every 6 hours) to turn it into a deal monitor. Snapshots are per mode and per filter set, in the named key-value store 'steam-sales-tracker-snapshots'.",
            "default": true
          },
          "alertPriceDropPct": {
            "title": "Price-drop alert threshold (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "When comparing with the previous run, set alert=true on items whose price fell by at least this percentage (new deals are always alerted). 0 = alert on any drop.",
            "default": 0
          },
          "maxConcurrency": {
            "title": "Max concurrent requests",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Parallel requests for price lookups. Store search pages are always paced to about 1 every 2.5 seconds per IP (Steam's rate limit).",
            "default": 4
          },
          "maxRetries": {
            "title": "Max retries per request",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "Attempts per request with exponential backoff before an item is reported as an error.",
            "default": 6
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Residential proxy is recommended: Steam rate-limits store search per IP, and with a proxy a rate limit switches to a new IP instead of pausing ~25 seconds. Prices always follow the 'country' setting, not the proxy location.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}