{
  "openapi": "3.0.1",
  "info": {
    "title": "Zara Scraper - Prices, Rebajas, Variants & Composition",
    "description": "Scrape Zara (zara.com) products: current price plus strike-through Rebajas (sale) discount, full colour variant matrix with per-colour availability, and (with full detail) fabric composition and a per-size availability/price matrix. Browse by category or Rebajas, or paste links.",
    "version": "1.0",
    "x-build-id": "XU9URxjh1oyBlRmAr"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~zara-com-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-zara-com-scraper",
        "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/abotapi~zara-com-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-zara-com-scraper",
        "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/abotapi~zara-com-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-zara-com-scraper",
        "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": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "'search' browses a category or Zara's own Rebajas (sale) catalog for a chosen section. 'url' scrapes any product or category/listing page URL you paste.",
            "default": "search"
          },
          "market": {
            "title": "Market (country/language)",
            "type": "string",
            "description": "Zara's own market path prefix, e.g. 'es/es' (Spain, Castellano) or 'gb/en' (UK, English). Applies to search mode; a pasted URL in url mode carries its own market instead.",
            "default": "es/es"
          },
          "section": {
            "title": "Section",
            "enum": [
              "WOMAN",
              "MAN",
              "KID",
              "BEAUTY"
            ],
            "type": "string",
            "description": "Which Zara section to browse. Drives the Rebajas catalog below and labels results; a Category id (also below) can point at any category in any section.",
            "default": "WOMAN"
          },
          "categoryId": {
            "title": "Category id",
            "type": "string",
            "description": "A specific Zara category id to browse (any category, from any section). Find one by copying the number after '-l' from a category page's own URL and looking it up, or leave empty and use Rebajas only below. Ignored when Rebajas only is on. Search mode only: URL mode reads this from the link you paste."
          },
          "specialsOnly": {
            "title": "Rebajas (sale) only",
            "type": "boolean",
            "description": "Browse the chosen section's own, real, currently-running Rebajas (sale) catalog instead of a specific category id -- verified live (thousands of items). Every returned product carries a genuine strike-through original price and discount percentage. Search mode only: URL mode reads this from the link you paste.",
            "default": false
          },
          "urls": {
            "title": "URLs to scrape",
            "uniqueItems": true,
            "type": "array",
            "description": "Paste zara.com product pages, category/listing pages, keyword-search links (HTML or ajax=true), numeric category JSON links, category-tree links or products-details links, in any market. Left untouched it scrapes one example of each shape; an explicitly empty list fails the run. Search-mode fields are ignored here. The fields in the Filters section still apply, including to a pasted product URL.",
            "default": [
              "https://www.zara.com/es/es/mujer-vestidos-l1066.html",
              "https://www.zara.com/es/es/category/2420896/products?ajax=true",
              "https://www.zara.com/es/es/categories?ajax=true",
              "https://www.zara.com/es/es/search?searchTerm=vestido",
              "https://www.zara.com/es/es/search?searchTerm=vestido&ajax=true"
            ],
            "items": {
              "type": "string"
            }
          },
          "productUrls": {
            "title": "Product URLs (alias of URLs)",
            "type": "array",
            "description": "Same as URLs; accepts plain strings or {\"url\": ...} objects so an existing Zara Product Description input can be pasted unchanged. Ignored when URLs is set. Giving only this field switches to URL mode.",
            "items": {
              "type": "string"
            }
          },
          "searchTerm": {
            "title": "Keyword filter",
            "type": "string",
            "description": "Only keep products whose name or description contains this text (case-insensitive). In search mode with no Category id and no Rebajas only, a plain word such as 'vestido' is matched against Zara category names and those categories are browsed. Otherwise in search mode it narrows the section or category catalog that is loaded; in URL mode it narrows the products found at the URL you paste. Applies in BOTH search mode and URL mode, including a pasted product URL."
          },
          "colors": {
            "title": "Colours",
            "type": "array",
            "description": "Only keep products with at least one colourway matching one of these names (case-insensitive, partial match), e.g. 'negro', 'azul'. Applies in BOTH search mode and URL mode, including a pasted product URL.",
            "items": {
              "type": "string"
            }
          },
          "sizes": {
            "title": "Sizes",
            "type": "array",
            "description": "Only keep products with at least one of these sizes in stock, e.g. 'S', 'M', '40'. Requires Fetch full detail below (per-size availability is only available with full detail) -- without it the run logs a warning and no product can match (a pasted product URL always has size data). It is applied AFTER the Max products cap, so fewer rows than the cap may come back. Applies in BOTH search mode and URL mode, including a pasted product URL.",
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "Minimum price",
            "type": "number",
            "description": "Only return products priced at or above this amount, in the market's own currency. Applies in BOTH search mode and URL mode, including a pasted product URL."
          },
          "maxPrice": {
            "title": "Maximum price",
            "type": "number",
            "description": "Only return products priced at or below this amount, in the market's own currency. Applies in BOTH search mode and URL mode, including a pasted product URL."
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "priceAsc",
              "priceDesc",
              "discountDesc"
            ],
            "type": "string",
            "description": "Order results after filtering. 'Relevance' keeps the catalog's own order. Applies in BOTH search mode and URL mode, including a pasted product URL.",
            "default": "relevance"
          },
          "fetchDetails": {
            "title": "Fetch full product detail",
            "type": "boolean",
            "description": "Adds the product description, fabric composition (material breakdown by percentage), family and state, first-visible date, related looks and a real per-size matrix (in stock / low on stock / out of stock, and each size's own price) for every colour. Current price, was-price/discount, and colour-level availability are already included without this toggle. A pasted product URL in url mode always fetches full detail regardless of this toggle.",
            "default": false
          },
          "maxItems": {
            "title": "Max products total",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap on total products returned across every search/URL entry. 0 = unlimited.",
            "default": 20
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Connection settings for reaching zara.com. Starts on the selected connection and escalates to residential (paid Apify plan) or a backup connection when a route is refused. Free plans have no Apify proxy. Choose residential or your own proxy URLs to start there.",
            "default": {
              "useApifyProxy": true
            }
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large pull without returning or charging for products already collected there. Use this after an interrupted run. For recurring daily monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns every matching product as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED products, which is how a price cut or a stock change is spotted. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately for each search, filter and detail setup; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the search, filters and detail settings, so different searches never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged products (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired products (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return products that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, so never when Max products capped it or when Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Output field names that should NOT make a product count as UPDATED. Nothing is ignored by default. Add fields such as description or image if changes to them are not relevant to you. Use a dotted path (for example colors.images) to ignore a field inside a nested list. Ignored fields are still returned in the output.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify -> Settings -> Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}