{
  "openapi": "3.0.1",
  "info": {
    "title": "Watch Digest: Price, Stock & Rank Changes",
    "description": "One schedule for your whole watchlist: runs CleanPull's store, Amazon, rank, Shopify, reviews, promotions and marketplace watchers and sends one digest of what changed (price, stock, rank, reviews, sales, new entrants) by email, Slack, Discord, Teams or webhook. $5 per 1,000 digests.",
    "version": "0.1",
    "x-build-id": "pcUEvI4BFnp5IAaau"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/cleanpull~watch-digest/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-cleanpull-watch-digest",
        "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~watch-digest/runs": {
      "post": {
        "operationId": "runs-sync-cleanpull-watch-digest",
        "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~watch-digest/run-sync": {
      "post": {
        "operationId": "run-sync-cleanpull-watch-digest",
        "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": {
          "title": {
            "title": "Digest title",
            "type": "string",
            "description": "The digest's name, used in its subject line.",
            "default": "Watch digest"
          },
          "monitorName": {
            "title": "Watchlist name",
            "type": "string",
            "description": "Runs with the same name compare against each other. Use one name per watchlist.",
            "default": "digest"
          },
          "productUrls": {
            "title": "Products on any online store",
            "type": "array",
            "description": "Product page URLs from any shop (Shopify, WooCommerce, Magento, Wix…), checked with Any Store Product Monitor for price, stock, sale, variant and page changes.",
            "items": {
              "type": "string"
            }
          },
          "amazonAsins": {
            "title": "Amazon products",
            "type": "array",
            "description": "ASINs or Amazon product URLs, checked with Amazon Product Scraper for price, Buy Box, stock, rank, rating and seller changes.",
            "items": {
              "type": "string"
            }
          },
          "amazonMarketplace": {
            "title": "Amazon marketplace (products)",
            "type": "string",
            "description": "For the ASINs above: US, GB, DE, FR, JP…",
            "default": "US"
          },
          "rankKeywords": {
            "title": "Amazon keywords",
            "type": "array",
            "description": "Search keywords (at most 300) whose rank for your products is watched with Amazon Keyword Rank Tracker (needs Rank: your ASINs).",
            "items": {
              "type": "string"
            }
          },
          "rankAsins": {
            "title": "Rank: your ASINs",
            "type": "array",
            "description": "Your products whose organic and sponsored place is tracked for each keyword above.",
            "items": {
              "type": "string"
            }
          },
          "rankMarketplace": {
            "title": "Amazon marketplace (ranks)",
            "type": "string",
            "description": "For the keywords above.",
            "default": "US"
          },
          "rankSponsored": {
            "title": "Rank: sponsored places",
            "type": "boolean",
            "description": "Also record each product's ad (sponsored) place. Off: organic rank only, which costs less (Amazon Keyword Rank Tracker reads the ads through residential addresses).",
            "default": true
          },
          "shopifyStores": {
            "title": "Whole Shopify stores",
            "type": "array",
            "description": "Store addresses (brand.com), watched with Shopify Store Scraper for new and removed products, price moves, discounts and stock.",
            "items": {
              "type": "string"
            }
          },
          "maxProductsPerStore": {
            "title": "Products per store",
            "minimum": 1,
            "maximum": 25000,
            "type": "integer",
            "description": "At most this many products watched in each Shopify store (each one read is billed by Shopify Store Scraper).",
            "default": 1000
          },
          "shopifyIncludeStock": {
            "title": "Shopify: stock and sales per day",
            "type": "boolean",
            "description": "Optional, paid: exact stock per variant where the store publishes it and, from the second run, units sold and sales per day (Shopify Store Scraper's stock add-on, $0.50 per 1,000 products).",
            "default": false
          },
          "reviewProductUrls": {
            "title": "Reviews: product pages",
            "type": "array",
            "description": "Product pages on shops using Judge.me, Yotpo, Okendo, Loox or Stamped (or Amazon product URLs, or Trustpilot review pages), watched with Reviews Monitor for new reviews, rating moves and review-count jumps, with the top complaint themes.",
            "items": {
              "type": "string"
            }
          },
          "reviewAsins": {
            "title": "Reviews: Amazon ASINs",
            "type": "array",
            "description": "ASINs whose rating and new top reviews are watched with Reviews Monitor.",
            "items": {
              "type": "string"
            }
          },
          "reviewTrustpilotDomains": {
            "title": "Reviews: Trustpilot businesses",
            "type": "array",
            "description": "Business domains (brand.com) or Trustpilot review pages (trustpilot.com/review/brand.com), whose Trustpilot reviews and rating are watched with Reviews Monitor.",
            "items": {
              "type": "string"
            }
          },
          "reviewMarketplace": {
            "title": "Amazon marketplace (reviews)",
            "type": "string",
            "description": "For the review ASINs above: US, GB, DE, FR, JP…",
            "default": "US"
          },
          "promotionStores": {
            "title": "Promotions: stores",
            "type": "array",
            "description": "Store addresses (brand.com, any platform), watched with Promotions Monitor for sales, codes and free-shipping offers that start or end, and for new products and collections. At most 200.",
            "items": {
              "type": "string"
            }
          },
          "marketKeywords": {
            "title": "Marketplace keywords",
            "type": "array",
            "description": "Search keywords watched with Marketplace Search Scanner for new entrants in the top results, new sellers and price-band moves, on Amazon, eBay, Etsy, Walmart, Target or Best Buy. At most 300 searches (keywords × marketplaces).",
            "items": {
              "type": "string"
            }
          },
          "marketSources": {
            "title": "Marketplaces to search",
            "type": "array",
            "description": "Where the keywords above are searched. eBay, Etsy, Walmart, Target and Best Buy are read through CleanPull's marketplace data service; no keys of your own.",
            "items": {
              "type": "string",
              "enum": [
                "amazon",
                "ebay",
                "etsy",
                "walmart",
                "target",
                "bestbuy"
              ],
              "enumTitles": [
                "Amazon",
                "eBay (US)",
                "Etsy",
                "Walmart (US)",
                "Target (US)",
                "Best Buy (US)"
              ]
            },
            "default": [
              "amazon"
            ]
          },
          "marketAmazonMarketplaces": {
            "title": "Amazon marketplaces (keywords)",
            "type": "array",
            "description": "Amazon countries to search: US, GB, DE, JP… (default US). Each one is a search per keyword.",
            "items": {
              "type": "string"
            }
          },
          "adAdvertisers": {
            "title": "Ads: advertisers",
            "type": "array",
            "description": "Brand names or domains (allbirds.com) whose ads are watched with Ad Library Monitor on Google's Ads Transparency Center, the Meta Ad Library and the TikTok Ad Library, for ads that start or stop.",
            "items": {
              "type": "string"
            }
          },
          "adKeywords": {
            "title": "Ads: keywords",
            "type": "array",
            "description": "Words in the ads' text, watched on Meta and TikTok (Google is searched by advertiser only).",
            "items": {
              "type": "string"
            }
          },
          "adGoogleAdvertiserIds": {
            "title": "Ads: Google advertiser ids",
            "type": "array",
            "description": "Google advertiser ids (AR…) or Ads Transparency Center addresses.",
            "items": {
              "type": "string"
            }
          },
          "adMetaPageIds": {
            "title": "Ads: Meta page ids",
            "type": "array",
            "description": "Meta page ids, or Meta Ad Library addresses with view_all_page_id.",
            "items": {
              "type": "string"
            }
          },
          "adPlatforms": {
            "title": "Ad platforms",
            "type": "array",
            "description": "Where the ads above are watched. Each watch item on each platform is an item.",
            "items": {
              "type": "string",
              "enum": [
                "google",
                "meta",
                "tiktok"
              ],
              "enumTitles": [
                "Google Ads Transparency Center",
                "Meta Ad Library",
                "TikTok Ad Library"
              ]
            },
            "default": [
              "google",
              "meta",
              "tiktok"
            ]
          },
          "adCountries": {
            "title": "Ad countries",
            "type": "array",
            "description": "Optional. Two-letter country codes (at most 5) the ads are watched in; empty is anywhere the platform covers.",
            "items": {
              "type": "string"
            }
          },
          "tiktokKeywords": {
            "title": "TikTok Shop keywords",
            "type": "array",
            "description": "Shopping terms on TikTok Shop US (at most 100). Each keyword is an item: its products' units per day speeding up or slowing down (from the third run), products new to it, and price moves, read by TikTok Shop Sales Tracker ($3 per 1,000 products delivered; $0.50 per 1,000 unchanged).",
            "items": {
              "type": "string"
            }
          },
          "tiktokMaxProductsPerKeyword": {
            "title": "TikTok products per keyword",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "The top products watched per TikTok Shop keyword. The first run delivers all of them (the baseline); later runs the ones that sold or changed.",
            "default": 20
          },
          "chartCategories": {
            "title": "Amazon chart categories",
            "type": "array",
            "description": "Department slugs (kitchen, toys-and-games), names (Toys & Games) or department/node for a subcategory (kitchen/289728), read by Amazon Best Sellers Tracker: new entries, re-entries, climbers and brands entering. Each category × chart × marketplace is an item (at most 200).",
            "items": {
              "type": "string"
            }
          },
          "chartTypes": {
            "title": "Amazon charts",
            "type": "array",
            "description": "Which charts of each category are watched.",
            "items": {
              "type": "string",
              "enum": [
                "best-sellers",
                "new-releases",
                "movers-and-shakers",
                "most-wished-for",
                "gift-ideas"
              ],
              "enumTitles": [
                "Best Sellers",
                "New Releases",
                "Movers & Shakers",
                "Most Wished For",
                "Gift Ideas"
              ]
            },
            "default": [
              "best-sellers",
              "new-releases"
            ]
          },
          "chartMarketplaces": {
            "title": "Amazon chart marketplaces",
            "type": "array",
            "description": "Optional. Amazon countries (US, GB, DE, FR, JP…) for the charts; empty is US.",
            "items": {
              "type": "string"
            }
          },
          "chartMaxItemsPerChart": {
            "title": "Ranks per chart",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "How many ranks of each chart are watched. The first run delivers all of them ($1.50 per 1,000), later runs only the moves ($2 per 1,000; $0.10 per 1,000 unchanged).",
            "default": 100
          },
          "chartMinRankChange": {
            "title": "Smallest climb",
            "minimum": 1,
            "maximum": 99,
            "type": "integer",
            "description": "A product that climbed fewer places than this is not reported (nor billed as a change).",
            "default": 10
          },
          "chartProductDetailsTopN": {
            "title": "Brands: product pages per chart",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Optional, paid: read the product pages of this many top products per chart ($4 per 1,000) so the digest can name brands entering the chart. 0 (default) is off.",
            "default": 0
          },
          "trendsTerms": {
            "title": "Google Trends terms",
            "type": "array",
            "description": "Searches that describe your niches (at most 100), read by Google Trends Scraper ($1.50 per 1,000 terms): new rising related searches and breakouts since the last run, and terms whose interest crossed the threshold below. Each term is an item. The first run is the baseline.",
            "items": {
              "type": "string"
            }
          },
          "trendsGeo": {
            "title": "Google Trends location",
            "type": "string",
            "description": "A country or region code (US, GB, US-CA). Clear it, or write worldwide, for worldwide."
          },
          "trendsTimeRange": {
            "title": "Google Trends period",
            "enum": [
              "past-7-days",
              "past-30-days",
              "past-90-days",
              "past-12-months",
              "past-5-years"
            ],
            "type": "string",
            "description": "The period rising searches and interest moves are measured over. Past 90 days suits a weekly digest.",
            "default": "past-90-days"
          },
          "trendsMinInterestChangePercent": {
            "title": "Smallest interest move (%)",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "A term is reported when its interest (its latest quarter of the period against its earliest) moves at least this much up or down, once each time it crosses (it must come back 10 points inside the threshold before it can cross again).",
            "default": 50
          },
          "minPriceChangePercent": {
            "title": "Smallest price change (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Ignore price moves smaller than this percentage, in every watcher.",
            "default": 0
          },
          "maxRunCostUsd": {
            "title": "Max cost per run (USD)",
            "minimum": 0.01,
            "maximum": 1000,
            "type": "number",
            "description": "Optional. The most one digest may cost in all: its own events, every watcher's run and the delivery. Use it for scheduled runs, which may have no spending limit of their own. With a run spending limit too, the lower one applies."
          },
          "sendWhenNoChanges": {
            "title": "Send when nothing changed",
            "type": "boolean",
            "description": "Also send a digest that says nothing changed. Off: a quiet run sends nothing.",
            "default": false
          },
          "maxChangesShown": {
            "title": "Changes shown",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "At most this many changes in the message; all of them are in the run's dataset.",
            "default": 50
          },
          "alertBelowRating": {
            "title": "Alert: reviews under (stars)",
            "minimum": 1,
            "maximum": 5,
            "type": "number",
            "description": "Optional. The digest sent to your channels lists only new reviews with one under this many stars, and ratings that fell under it; other review changes stay in the run's dataset. Empty: every review change."
          },
          "alertPriceDropPercent": {
            "title": "Alert: store price drops of at least (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "Optional. The digest sent to your channels lists only price drops of at least this percent from store products and Shopify stores; their other changes stay in the run's dataset. Empty: every store product change."
          },
          "alertRankMilestonesOnly": {
            "title": "Alert: rank milestones only",
            "type": "boolean",
            "description": "The digest sent to your channels lists only Amazon search rank milestones (entered or left the top 3 or 10, reached or left page 1); every rank move stays in the run's dataset.",
            "default": false
          },
          "emailTo": {
            "title": "Email to",
            "type": "array",
            "description": "Recipients, one per line (at most 50 in all). Each one gets the digest separately (see Send separately).",
            "items": {
              "type": "string"
            }
          },
          "emailCc": {
            "title": "Email CC",
            "type": "array",
            "description": "Optional. Copied recipients (shown to everyone; with CCs the email goes out once to all).",
            "items": {
              "type": "string"
            }
          },
          "emailBcc": {
            "title": "Email BCC",
            "type": "array",
            "description": "Optional. Hidden recipients.",
            "items": {
              "type": "string"
            }
          },
          "emailSeparately": {
            "title": "Send separately",
            "type": "boolean",
            "description": "Send each recipient their own email (no one sees the other addresses; each email is billed). Off: one email to all of them.",
            "default": true
          },
          "emailFrom": {
            "title": "Email from",
            "type": "string",
            "description": "The sender, on a domain your provider lets you send from, for example alerts@yourdomain.com or \"Alerts <alerts@yourdomain.com>\"."
          },
          "emailReplyTo": {
            "title": "Reply to",
            "type": "string",
            "description": "Optional. Where replies go."
          },
          "emailProvider": {
            "title": "Email provider",
            "enum": [
              "resend",
              "postmark",
              "sendgrid",
              "smtp"
            ],
            "type": "string",
            "description": "How the email is sent: with your account at Resend, Postmark or SendGrid (API key), or through any SMTP server (Gmail, Outlook, Mailgun, your own).",
            "default": "resend"
          },
          "emailApiKey": {
            "title": "Email API key",
            "type": "string",
            "description": "Your Resend, Postmark (server token) or SendGrid API key. Stored encrypted; never shown in logs or results."
          },
          "smtpHost": {
            "title": "SMTP host",
            "type": "string",
            "description": "For SMTP: the server, for example smtp.gmail.com or smtp.office365.com."
          },
          "smtpPort": {
            "title": "SMTP port",
            "minimum": 1,
            "maximum": 65535,
            "type": "integer",
            "description": "For SMTP: 587 (STARTTLS) or 465 (TLS, with Secure on).",
            "default": 587
          },
          "smtpSecure": {
            "title": "SMTP secure (port 465)",
            "type": "boolean",
            "description": "On for servers that use TLS from the start (usually port 465). Off: STARTTLS on 587.",
            "default": false
          },
          "smtpUser": {
            "title": "SMTP user",
            "type": "string",
            "description": "For SMTP: the login, usually your email address."
          },
          "smtpPassword": {
            "title": "SMTP password",
            "type": "string",
            "description": "For SMTP: the password or app password. Stored encrypted; never shown in logs or results."
          },
          "slackWebhookUrl": {
            "title": "Slack webhook",
            "type": "string",
            "description": "A Slack incoming webhook (https://hooks.slack.com/services/…)."
          },
          "discordWebhookUrl": {
            "title": "Discord webhook",
            "type": "string",
            "description": "A Discord channel webhook (https://discord.com/api/webhooks/…)."
          },
          "teamsWebhookUrl": {
            "title": "Microsoft Teams webhook",
            "type": "string",
            "description": "A Teams workflow webhook (\"Post to a channel when a webhook request is received\"); the message arrives as an Adaptive Card."
          },
          "webhookUrl": {
            "title": "Other webhook",
            "type": "string",
            "description": "Any https endpoint (Zapier, Make, n8n, your own): receives the subject, text, markdown and items as JSON."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}