{
  "openapi": "3.0.1",
  "info": {
    "title": "Promotions & Launch Monitor: Sales, Codes & New Products",
    "description": "Watch competitor stores for sale banners, discount codes, free-shipping thresholds, markdowns and new products or collections. Shopify feeds plus any store's pages; a promotion ends only after two runs without it. Changes-only watchlists, compact JSON for AI agents.",
    "version": "0.1",
    "x-build-id": "N6gYaYPOX2G3sQDrn"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/cleanpull~promotions-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-cleanpull-promotions-monitor",
        "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/cleanpull~promotions-monitor/runs": {
      "post": {
        "operationId": "runs-sync-cleanpull-promotions-monitor",
        "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/cleanpull~promotions-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-cleanpull-promotions-monitor",
        "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",
        "properties": {
          "stores": {
            "title": "Stores",
            "type": "array",
            "description": "Store addresses, one per line (brand.com, or brand.com/us/ for a country site). The home page is read for its announcement bar, banners and offers; on Shopify, the store's public product and collection feeds add markdowns and launches with their dates.",
            "items": {
              "type": "string",
              "pattern": "\\.[A-Za-z]{2,}"
            }
          },
          "pages": {
            "title": "Extra pages",
            "type": "array",
            "description": "Optional. Other pages of those stores to read too, one per line: a sale page, a new-arrivals page, or a product page (its structured sale price counts as a markdown). Up to 10 per store; each is one page check.",
            "items": {
              "type": "string",
              "pattern": "\\.[A-Za-z]{2,}"
            }
          },
          "promotionTypes": {
            "title": "Promotions to report",
            "type": "array",
            "description": "Which kinds of promotion to report and remember.",
            "items": {
              "type": "string",
              "enum": [
                "sitewide-sale",
                "sale",
                "code",
                "free-shipping",
                "bundle",
                "gift",
                "signup-offer",
                "markdown"
              ],
              "enumTitles": [
                "Sitewide sale (25% off everything)",
                "Sale or event (Black Friday, 30% off jackets)",
                "Discount code shown on the site",
                "Free shipping and its threshold",
                "Bundle or multi-buy (buy 2 get 1, 3 for $30)",
                "Free gift with purchase",
                "Sign-up, first-order, member or card offer",
                "Markdowns (prices below compare-at or crossed-out prices)"
              ]
            },
            "default": [
              "sitewide-sale",
              "sale",
              "code",
              "free-shipping",
              "bundle",
              "gift",
              "signup-offer",
              "markdown"
            ]
          },
          "includeLaunches": {
            "title": "New products and collections",
            "type": "boolean",
            "description": "Report new products (and, on Shopify, new collections). Shopify: from the store's feed, with the date each went live (high confidence). Other stores: product links new on the pages read since the last run (medium confidence; the first run is the baseline).",
            "default": true
          },
          "includeCollections": {
            "title": "Shopify collections",
            "type": "boolean",
            "description": "Also read Shopify's collections feed for new collections (one to four small requests per store).",
            "default": true
          },
          "launchWindowDays": {
            "title": "Launch window on the first run (days)",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "On a watchlist's first run, Shopify products and collections published within this many days are reported as launches. Later runs report what went live since the last run.",
            "default": 7
          },
          "maxProductsPerStore": {
            "title": "Shopify products read per store",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many of a Shopify store's newest products to read from its feed (up to 250 a request). Launches and the markdown share come from these.",
            "default": 100
          },
          "maxLaunchesPerStore": {
            "title": "Launches per store per run",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "The most launch rows one store gives in a run; the rest are reported on the next run.",
            "default": 25
          },
          "changesOnly": {
            "title": "Changes only",
            "type": "boolean",
            "description": "Return only what changed since the last run with the same watchlist name: new promotions, promotions that ended, and launches, plus one change summary per store. A promotion counts as ended only after two runs in a row without it, so rotating banners are not reported as ended. The first run is the baseline. Schedule it daily.",
            "default": false
          },
          "monitorName": {
            "title": "Watchlist name",
            "type": "string",
            "description": "Runs with the same name compare against each other. Use one name per watchlist.",
            "default": "default"
          },
          "maxRunCostUsd": {
            "title": "Max cost per run (USD)",
            "minimum": 0.01,
            "maximum": 1000,
            "type": "number",
            "description": "Optional. Stop once this run's charges would pass this amount. Use it for scheduled runs, which may have no spending limit of their own. Stores not finished are checked in full on the next run."
          },
          "fields": {
            "title": "Only these fields",
            "type": "array",
            "description": "Optional. Keep only these fields, for example [\"store\", \"type\", \"status\", \"text\", \"code\", \"threshold\"].",
            "items": {
              "type": "string"
            }
          },
          "maxConcurrency": {
            "title": "Stores at a time",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Stores read in parallel. Each store gets at most two requests at a time.",
            "default": 3
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional. The actor picks proxies itself per store: direct, then datacenter, then residential only for stores that block the others."
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Optional. Accepted for compatibility with other actors: store addresses, same as Stores.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}