{
  "openapi": "3.0.1",
  "info": {
    "title": "Sephora Product Scraper (Global)",
    "description": "Scrape Sephora products across 20 storefronts (US, Canada, 9 EU markets, 10 APAC countries) through one unified Python actor. Extract prices, variants, ratings, and catalog details via official mobile APIs with TLS fingerprint impersonation, OAuth2/guest-token auth, and per-market session isolation.",
    "version": "2.0",
    "x-build-id": "g52X6cboL5jrbUyxQ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/autofacts~sephora/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-autofacts-sephora",
        "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/autofacts~sephora/runs": {
      "post": {
        "operationId": "runs-sync-autofacts-sephora",
        "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/autofacts~sephora/run-sync": {
      "post": {
        "operationId": "run-sync-autofacts-sephora",
        "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": [
          "startUrls"
        ],
        "properties": {
          "startUrls": {
            "title": "Sephora start URLs",
            "type": "array",
            "description": "Product or category URLs from any Sephora storefront. The market is auto-detected from the hostname (e.g. sephora.com → US, sephora.fr → EU-FR, sephora.nz → SEA-NZ).",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "market": {
            "title": "Market override (optional)",
            "type": "string",
            "description": "Force a specific market module. Leave blank to auto-detect from startUrls hostname. Values: us, eu-fr, eu-it, eu-de, eu-es, eu-pl, eu-ro, eu-pt, eu-cz, eu-gr, mena-ae, mena-sa, mena-bh, mena-om, mena-kw, mena-qa, uk, in, sea-nz, sea-au, sea-sg, sea-my, sea-th, sea-id, sea-ph, sea-hk, sea-tw, sea-bn."
          },
          "locale": {
            "title": "Locale override (optional)",
            "type": "string",
            "description": "BCP 47 locale tag (e.g. en-US, fr-FR, en-NZ). Overrides the default locale for the detected market. Leave blank to use the market default."
          },
          "categoryIds": {
            "title": "EU category IDs (optional)",
            "type": "array",
            "description": "EU-only. SFCC category IDs like \"C479\" (body oils). Alternative to pasting category URLs in startUrls.",
            "items": {
              "type": "string"
            }
          },
          "onlyNewProducts": {
            "title": "Only new products",
            "type": "boolean",
            "description": "Return only recently-added products instead of the whole category. Designed for incremental refresh runs: one pass over the US top-level categories finds every new product in ~21 listing requests instead of ~180.\n\nHow it works depends on the market:\n• US/Canada and EU (FR, IT, DE, ES, PL, RO, PT) — a real server-side filter, so you get exactly the products Sephora flags as new.\n• SEA (all 10) and India — these storefronts cannot filter, only sort. The listing is ordered newest-first and capped at 'New products page limit', so you get the most recently published products rather than a flagged set.\n• Every other market is SKIPPED with an error rather than returning its full catalogue at your cost.\n\nNote the filter markets use Sephora's own merchandising flag, not 'added since your last run' — diff product IDs against your own store for true novelty.",
            "default": false
          },
          "newProductsPageLimit": {
            "title": "New products page limit (sort-only markets)",
            "minimum": 1,
            "type": "integer",
            "description": "How many listing pages to fetch per category on markets that can only sort newest-first (SEA and India). Ignored where a real filter exists (US/Canada, EU). Roughly 36 products per page on SEA and 24 on India, so the default of 3 yields ~70-110 of the newest products per category. Raising it costs proportionally more requests; without a cap these markets would return the entire category, just reordered.",
            "default": 3
          },
          "advancedFilter": {
            "title": "Advanced filter (US/Canada only)",
            "type": "string",
            "description": "Escape hatch for US/Canada category listings: a raw refinement expression appended as the `ref` parameter, e.g. `filters[isNew]=true` or `filters[shoppingPreferences]=koreanBeauty`. Discover valid expressions in the `refinements` block of any category response. Ignored by every non-US market — their listing APIs use entirely different filter grammars. Takes precedence over 'Only new products'; a `ref=` already present on a start URL takes precedence over both."
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Select proxies to be used by your crawler. Defaults to Apify RESIDENTIAL — datacenter IPs are blocked by Akamai on all Sephora storefronts (US, EU, SEA). Pin a country (e.g. FR for eu-fr, DE for eu-de) when scraping a single market to keep the exit geographically consistent with the storefront.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Maximum concurrent requests. US: 2-5 recommended. EU: 3 recommended. SEA: 8-16 fine (API is permissive).",
            "default": 5
          },
          "maxRequestsPerCrawl": {
            "title": "Max requests per crawl",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Hard cap on total Crawlee requests across every active market (includes listing, search, detail). 0 = unlimited. Applies uniformly to US, EU, and SEA.",
            "default": 0
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}