{
  "openapi": "3.0.1",
  "info": {
    "title": "eBay Price & Inventory Monitor",
    "description": "Price and inventory monitor for eBay resellers, dropshippers, and flippers: instant alerts the moment a competitor's price drops or rises, an item sells out, or a new listing appears.",
    "version": "1.9",
    "x-build-id": "yUD8wUKlno0ebimrc"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/alex1313~ebay-price-inventory-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-alex1313-ebay-price-inventory-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/alex1313~ebay-price-inventory-monitor/runs": {
      "post": {
        "operationId": "runs-sync-alex1313-ebay-price-inventory-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/alex1313~ebay-price-inventory-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-alex1313-ebay-price-inventory-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",
        "required": [
          "urls"
        ],
        "properties": {
          "urls": {
            "title": "URLs to monitor",
            "type": "array",
            "description": "eBay item pages, search result pages, or seller pages. Item pages are tracked directly; search/seller pages are crawled once per run to discover item links, which are then tracked the same way. Mixing all three types in one list is fine. Any eBay country site works (ebay.co.uk, ebay.de, ebay.com.au, etc.), not just ebay.com.\n\nExamples:\n- Item page: `https://www.ebay.com/itm/123456789012`\n- Search page: `https://www.ebay.com/sch/i.html?_nkw=nintendo+switch+oled`\n- Seller page: `https://www.ebay.com/str/examplestore`\n- Other regions: `https://www.ebay.co.uk/sch/i.html?_nkw=nintendo+switch`",
            "items": {
              "type": "string"
            }
          },
          "checkIntervalHours": {
            "title": "Check interval (hours)",
            "minimum": 1,
            "type": "integer",
            "description": "Documentation only — recorded in the run's output for your own reference. It does not schedule anything. To actually run this Actor repeatedly, add an Apify Schedule (Schedules tab in the Apify Console) at whatever interval you choose.",
            "default": 24
          },
          "priceDropThresholdPercent": {
            "title": "Price drop alert threshold (%)",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Send a webhook alert when a tracked item's price drops by at least this percentage compared to the previous run. Smaller drops are still recorded in the \"changes\" dataset, just not pushed to the webhook.",
            "default": 10
          },
          "priceIncreaseThresholdPercent": {
            "title": "Price increase alert threshold (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Send a webhook alert when a tracked item's price rises by at least this percentage compared to the previous run — useful for resellers/dropshippers tracking a supplier or competitor listing where a price increase erodes margin the same way a drop erodes a buyer's deal. Set to 0 (default) to disable; this alert is off unless you opt in.",
            "default": 0
          },
          "alertWebhookUrl": {
            "title": "Alert webhook URL",
            "type": "string",
            "description": "Optional. If set, an alert is POSTed here after each run that has alert-worthy changes. Works directly with Zapier \"Catch Hook\" / Make.com \"Custom Webhook\" triggers, a Discord or Slack incoming webhook URL (set \"Notification format\" below to match), or any endpoint that accepts raw JSON."
          },
          "notificationFormat": {
            "title": "Notification format",
            "enum": [
              "raw",
              "discord",
              "slack"
            ],
            "type": "string",
            "description": "Shape of the webhook payload. \"Raw JSON\" is the full structured payload (all change details, for Zapier/Make/your own endpoint). \"Discord\" and \"Slack\" send a plain-text summary in the envelope those platforms' incoming webhooks actually expect, so you can paste a Discord/Slack webhook URL directly into \"Alert webhook URL\" above with no relay in between.",
            "default": "raw"
          },
          "alertOnStockZero": {
            "title": "Alert when stock hits zero",
            "type": "boolean",
            "description": "Include items whose available quantity dropped to 0 in the webhook alert payload, even if their price didn't change.",
            "default": true
          },
          "alertDigestIntervalHours": {
            "title": "Alert digest interval (hours)",
            "minimum": 0,
            "type": "integer",
            "description": "0 (default) sends every alert-worthy price change as its own webhook, immediately. Set this to hold price drop/increase alerts and send them together at most once per this many hours instead — useful if you check frequently and don't want a separate notification for every single change. A stock-out alert always sends immediately regardless of this setting, since it's more time-sensitive than a price change.",
            "default": 0
          },
          "targetCurrency": {
            "title": "Target currency (ISO code)",
            "pattern": "^[A-Za-z]{3}$",
            "type": "string",
            "description": "eBay auto-localizes the price currency it displays based on the scraping proxy's exit country, so consecutive runs can show the same item's price in different currencies. Every price is converted to this currency (via a free daily exchange rate) before comparing runs, so price-drop detection stays accurate regardless of which currency eBay happened to display. The raw `price`/`currency` eBay actually showed are still recorded alongside the converted `normalizedPrice` for reference. 3-letter ISO 4217 code, e.g. USD, EUR, GBP.",
            "default": "USD"
          },
          "aiEnrichment": {
            "title": "Enable AI brand/model/category extraction",
            "type": "boolean",
            "description": "Optional, off by default. When enabled, each newly-scraped or newly-retitled item's title is sent to an LLM to extract structured `aiBrand`/`aiModel`/`aiCategory` fields — useful for filtering or grouping messy titles. Charged as a separate \"ai-enrichment\" event, once per item actually enriched (unchanged titles on later runs aren't re-charged). Requires that event to be configured with a price in this Actor's monetization setup — leave this off otherwise.",
            "default": false
          },
          "enableInsightSignals": {
            "title": "Enable price insight signals",
            "type": "boolean",
            "description": "Optional, off by default. Flags three patterns a single-run diff can't see on its own: `consecutiveDropStreak` (price has just dropped for 3 runs in a row — real momentum, not a single blip), `isNewAllTimeLow` (the lowest price ever recorded for this item), and `isUnderpricedVsHistory` (price just dropped 15%+ below its own rolling average). Computed entirely from price history this Actor already tracks — no extra scraping. Charged as a separate \"price-insight\" event, once per signal actually fired (not per run or per item checked). Requires that event to be configured with a price in this Actor's monetization setup — leave this off otherwise.",
            "default": false
          },
          "trackListingVariations": {
            "title": "Track listing variations separately",
            "type": "boolean",
            "description": "Optional, off by default. eBay listings with a size/color/etc. picker only ever show one price for the whole listing until a shopper picks a specific combination — without this, that single ambiguous price is tracked, which can be outright wrong (e.g. a placeholder value) rather than just imprecise. Enabling this clicks through every combination (capped at 24 per listing) and tracks each one as its own item, each billed as its own \"result\"/\"checked-unchanged\" event — a real cost multiplier for any tracked listing that has variations, not just a data-shape change.",
            "default": false
          },
          "stateNamespace": {
            "title": "State namespace",
            "type": "string",
            "description": "Leave empty (default) unless you run more than one schedule/Task of this Actor tracking different items. Apify's named storage (this Actor's price history, carry-forward state, etc.) is scoped to your whole account, not per-schedule — two schedules left at the default would silently share and corrupt each other's history. Set a distinct value per schedule (e.g. \"phones\", \"shoes\") to keep them fully isolated. Only letters, numbers, hyphens, and underscores are used; anything else is stripped."
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}