{
  "openapi": "3.0.1",
  "info": {
    "title": "Carrefour Spain Scraper - Products, Prices, Nutrition",
    "description": "Scrape Carrefour Spain (carrefour.es) products. Search by keyword, browse a category, or paste product/category links. Returns name, brand, price, unit price, promotion, stock, category, image, and, with details, the barcode (EAN), ingredients, allergens, nutrition, extra images and rating.",
    "version": "1.0",
    "x-build-id": "z2EMkEBhQ853H48jn"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~carrefour-es-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-carrefour-es-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~carrefour-es-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-carrefour-es-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~carrefour-es-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-carrefour-es-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",
              "category",
              "url",
              "product"
            ],
            "type": "string",
            "description": "Choose 'search' for keywords + filters, 'category' to browse a category by its Carrefour category link OR a plain category name (e.g. 'leche', 'Vinos'), or 'url' to scrape pasted Carrefour Spain links — product links, bare product ids, category links, promotions links and search-result links are all accepted. 'product' is a legacy alias kept only so an old saved Task that already used it keeps working; new tasks should use 'url' instead.",
            "default": "search"
          },
          "queries": {
            "title": "Search keywords",
            "type": "array",
            "description": "Only used when mode = search — ignored in every other mode. One or more keywords to search, for example 'leche' (milk) or 'cerveza' (beer). Each keyword is searched separately.",
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Category links",
            "type": "array",
            "description": "Only used when mode = category — ignored in every other mode. A category page link, OR a plain category name such as 'leche' or 'Vinos' (resolved against Carrefour Spain's own category names — an unmatched name is reported, never guessed; paste the category's own link if your name doesn't resolve). To get a link: open carrefour.es, browse to the category you want, and copy the address from your browser — a category address ends in /catNNNNN/c (or /F-<token>/c for an \"Ofertas\" promotions category), for example https://www.carrefour.es/supermercado/lacteos-huevos/leche/cat20093/c",
            "items": {
              "type": "string"
            }
          },
          "urls": {
            "title": "Carrefour Spain links or product ids",
            "type": "array",
            "description": "Only used when mode = url — ignored in every other mode. Mix freely: product pages under /R-<id>/p , marketplace / non-food product pages under /<name>/<barcode>/p or /<name>/VC4A-<code>/p , bare product ids such as 521007071 , category pages under /catNNNNN/c , \"Ofertas\" promotions categories under /F-<token>/c , or a pasted search-result link (?q=... or #!q=...). Multiple entries supported.",
            "default": [
              "https://www.carrefour.es/supermercado/R-521007071/p",
              "836507271",
              "https://www.carrefour.es/glorioso-blanco-2025-vino-blanco-espana-rioja-doca-75-cl-120/8410351213004/p",
              "https://www.carrefour.es/extractor-portatil-de-leche-kikkaboo/VC4A-27082334/p",
              "https://www.carrefour.es/supermercado/lacteos-huevos/leche/cat20093/c",
              "https://www.carrefour.es/supermercado/bebidas-promocion/F-1086Z13rjo/c",
              "https://www.carrefour.es/?q=leche",
              "https://www.carrefour.es/#!q=cerveza"
            ],
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "price_asc",
              "price_desc",
              "unit_price_asc",
              "unit_price_desc",
              "name",
              "top_rated",
              "promotions"
            ],
            "type": "string",
            "description": "How to order the collected products. Price sorts on a keyword search are done by the store's own search, so the run stops as soon as it has enough; the other orderings are applied over the products gathered in the run before they are returned. 'Top rated first' and 'Promotions first' need product-page data (rating, promotion), so they order the products the run collects after reading their product pages — the cheapest Max products window, not the whole catalogue.",
            "default": "relevance"
          },
          "minRating": {
            "title": "Minimum average rating",
            "enum": [
              "0",
              "3",
              "4",
              "5"
            ],
            "type": "string",
            "description": "Optional. Only keep products whose average rating is at least this many stars. Requires details (ratings are collected during 'Fetch product details'). Products with no rating are excluded when this is set.",
            "default": "0"
          },
          "onPromotionOnly": {
            "title": "Only products on promotion",
            "type": "boolean",
            "description": "Optional. Keep only products currently on promotion — a cut price (was-price shown) or a multi-buy / basket promotion such as '3x2', 'Comprando 12' or '2ª unidad -50%'. Works in every mode. A keyword search does not carry promotion data, so its product pages are read to check (billed as detail-enriched for the products returned, even with 'Fetch product details' off).",
            "default": false
          },
          "inStockOnly": {
            "title": "Only products in stock",
            "type": "boolean",
            "description": "Optional. Keep only products currently in stock. Works in every mode. A keyword search does not carry stock data, so its product pages are read to check (billed as detail-enriched for the products returned, even with 'Fetch product details' off). A product whose stock the store does not publish is kept, and counted in the run log.",
            "default": false
          },
          "minPrice": {
            "title": "Minimum price (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Only keep products priced at or above this amount. Narrows a keyword search (filtered by the store's own search, so fewer pages are read), a category, or a pasted category link — a pasted product link is always returned as asked for, regardless of this filter."
          },
          "maxPrice": {
            "title": "Maximum price (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Only keep products priced at or below this amount. Narrows a keyword search (filtered by the store's own search, so fewer pages are read), a category, or a pasted category link — a pasted product link is always returned as asked for, regardless of this filter."
          },
          "brands": {
            "title": "Brands",
            "type": "array",
            "description": "Optional. Keep only products of these brands (e.g. 'Carrefour', 'Central Lechera Asturiana'; not case-sensitive, exact brand name). A keyword search is narrowed by the store's own search, so fewer pages are read; a category or pasted category link is narrowed on the listing. A pasted product link is always returned as asked for, regardless of this filter.",
            "items": {
              "type": "string"
            }
          },
          "fetchDetails": {
            "title": "Fetch product details",
            "type": "boolean",
            "description": "Collect each product's full detail (barcode / EAN, ingredients, allergens, nutrition panel, extra images, description, category path, origin, manufacturer, net content, storage and usage instructions, Nutri-Score, marketplace seller) plus its aggregate rating and customer reviews (see Max reviews per product), and — for keyword-search results — the promotion, was-price, unit price and stock that the search listing does not carry. Turn off for a faster, lighter run that returns only the listing-level fields (name, brand, price, unit price, image; plus promotion and stock in a category).",
            "default": true
          },
          "maxReviews": {
            "title": "Max reviews per product",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "With Fetch product details on, the most recent customer reviews collected for each product that has any (star rating, title, review text, date and the reviewer's public display name), nested in the product's `reviews` list — never as separate rows. Default 20; 0 skips review reads entirely. Products without reviews cost no extra request. Reviews are included in the per-product price with no separate review charge.",
            "default": 20
          },
          "maxItems": {
            "title": "Max products",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of products to return across the whole run. This is the run's cap. Use 0 for unlimited.",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per keyword / category",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum result pages walked per keyword / category / link. 0 = unlimited (walk all pages) — the run then stops only at Max products or when a page repeats no new products.",
            "default": 0
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy is required for reliable results. The actor connects through a Spanish residential exit by default.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "ES"
            }
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large crawl of products without returning or charging for products already collected there. Use this after an interrupted run, or when continuing a product catalogue pull in another 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 all matching products as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED products. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those products returned (and billed). State is kept separately for each search/category/URL and detail-mode setup; use State key when you want 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/category/URL and detail settings — different searches then 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 specifically 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 — not 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": "Optional. Field names to exclude from change detection in Incremental mode — those fields are still returned in every row, they just never cause a product to be classified UPDATED or appear in changedFields. Use a plain name for a top-level field (e.g. \"stock\"), \"parent.child\" for one field nested inside another (e.g. \"offer.price\"), \"parent.*\" for every field nested inside another, or \"field[]\" for a list field (e.g. \"images[]\"). Empty by default — nothing is excluded unless you add it here. (The nested `reviews` list is never compared: its length depends on Max reviews per product, so a new review shows up as a change in reviewCount / rating instead.) If you exclude stock-type fields, \"inStock\" (true/false) still changes on a real stock-out/restock, so you keep a stable signal for that.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write/digest. Leave empty to skip; never changes the dataset output. 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
          },
          "searchQuery": {
            "title": "Search keyword (alternative name)",
            "type": "string",
            "description": "Alternative spelling accepted for compatibility with other Carrefour Spain scrapers; prefer 'queries'."
          },
          "categoryUrl": {
            "title": "Category link (alternative name)",
            "type": "string",
            "description": "Alternative spelling accepted for compatibility with other Carrefour Spain scrapers; prefer 'categories'."
          },
          "maxResults": {
            "title": "Max results (alternative name)",
            "minimum": 0,
            "type": "integer",
            "description": "Alternative spelling accepted for compatibility with other Carrefour Spain scrapers; prefer 'maxItems'."
          },
          "maxResultsPerScrape": {
            "title": "Max results per run (alternative name)",
            "minimum": 0,
            "type": "integer",
            "description": "Alternative spelling accepted for compatibility with other Carrefour Spain scrapers; prefer 'maxItems'."
          },
          "promotionsOnly": {
            "title": "Only promotions (alternative name)",
            "type": "boolean",
            "description": "Alternative spelling accepted for compatibility with other Carrefour Spain scrapers; prefer 'onPromotionOnly'."
          },
          "proxyConfiguration": {
            "title": "Proxy configuration (alternative name)",
            "type": "object",
            "description": "Alternative spelling accepted for compatibility with other Carrefour Spain scrapers; prefer 'proxy'."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}