{
  "openapi": "3.0.1",
  "info": {
    "title": "ResQ Club Scraper - Surplus Food Offers & Venues",
    "description": "Scrape ResQ Club surplus food offers in Finland, Sweden and Estonia: name, price, current price, discount, portions left, pickup and order windows, tags and photo, plus the venue address, phone, website, coordinates and ratings. Search by area, name or country, or paste venue links.",
    "version": "1.0",
    "x-build-id": "UGfmugPLIytSK32Qr"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~resq-club-surplus-food-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-resq-club-surplus-food-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~resq-club-surplus-food-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-resq-club-surplus-food-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~resq-club-surplus-food-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-resq-club-surplus-food-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 picks venues out of the ResQ Club venue list by area, name and country. URL mode reads only the venue links or venue ids you paste.",
            "default": "search"
          },
          "locations": {
            "title": "Areas to search",
            "type": "array",
            "description": "Search mode only. One entry per area: coordinates as lat,lng (60.1699,24.9384), or a place name (Helsinki, Tampere, Tallinn) which is looked up for you and cached. Leave empty to cover every country at once.",
            "items": {
              "type": "string"
            }
          },
          "radiusKm": {
            "title": "Radius (km)",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Search mode only. How far from each area to look. Ignored when no area is given, and ignored in URL mode.",
            "default": 25
          },
          "searchPhrase": {
            "title": "Venue name contains",
            "type": "string",
            "description": "Search mode only. Keep only venues whose name contains this text, matched without case. Ignored in URL mode."
          },
          "includeVenuesWithoutOffers": {
            "title": "Also return venues with no offer right now (extra charge)",
            "type": "boolean",
            "description": "Search mode only. Off by default, so only venues that currently advertise surplus are read. Turn it on to get the full partner directory as well, including venues with nothing listed today. This reads every venue in range instead of only the active ones and each directory record is billed as the venue-directory event. Ignored in URL mode, where a pasted venue always comes back.",
            "default": false
          },
          "urls": {
            "title": "Venue links or ids",
            "type": "array",
            "description": "URL mode only. One venue per entry: a venue link such as https://resq-club.com/app/#provider/5258 or https://app.resq-club.com/provider/28, the number 145, or an offer share link such as https://app.resq-club.com/offer/17056292 (resolved to the venue that lists that offer right now). Multi-URL supported. Omit the field to scrape the four examples; an empty list scrapes nothing. Area, name and directory settings are ignored here; the filters below still apply.",
            "default": [
              "https://resq-club.com/app/#provider/5258",
              "https://app.resq-club.com/provider/28",
              "145",
              "https://app.resq-club.com/offer/17056292"
            ],
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "Keep only venues in these countries. Applies in BOTH search and URL mode. Leave empty for every country.",
            "items": {
              "type": "string",
              "enum": [
                "fin",
                "swe",
                "est"
              ],
              "enumTitles": [
                "Finland",
                "Sweden",
                "Estonia"
              ]
            }
          },
          "tags": {
            "title": "Offer tags",
            "type": "array",
            "description": "Keep only offers carrying at least one of these tags. Applies in BOTH search and URL mode. Use the tag ids the source itself publishes, for example snack, meal, dessert, pastry, sandwich, grocery-bag, lactose-free, gluten-free, vegetarian. Leave empty for every tag.",
            "items": {
              "type": "string"
            }
          },
          "includeSoldOutOffers": {
            "title": "Include sold-out offers",
            "type": "boolean",
            "description": "Off by default, so only offers with portions left are returned. Turn on to also return offers that are listed but already gone. Applies in BOTH search and URL mode.",
            "default": false
          },
          "maxPrice": {
            "title": "Max price",
            "minimum": 0,
            "type": "number",
            "description": "Keep only offers whose current price is at or below this amount, in the venue's own currency (EUR in Finland and Estonia, SEK in Sweden). Applies in BOTH search and URL mode. Leave empty for no price limit."
          },
          "pickupAfter": {
            "title": "Pickup window starts after",
            "type": "string",
            "description": "Keep only offers whose pickup window starts at or after this moment (ISO date or date-time, UTC unless an offset is given, e.g. 2026-10-31 or 2026-10-31T16:00:00Z). Applies in BOTH search and URL mode. Leave empty for no limit."
          },
          "pickupBefore": {
            "title": "Pickup window ends before",
            "type": "string",
            "description": "Keep only offers whose pickup window ends at or before this moment (ISO date or date-time, UTC unless an offset is given). Applies in BOTH search and URL mode. Leave empty for no limit."
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "none",
              "price",
              "discountPercent",
              "distanceKm",
              "pickupStart"
            ],
            "type": "string",
            "description": "Order of the returned offers. The default keeps the source order. When a sort is chosen the run reads all matching venues first, then returns the first Max items in that order; offers without a value for the chosen field and venue directory records come last.",
            "default": "none"
          },
          "sortOrder": {
            "title": "Sort order",
            "enum": [
              "asc",
              "desc"
            ],
            "type": "string",
            "description": "Direction used when Sort by is set.",
            "default": "asc"
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many records (0 = no limit; the run then stops when the venue list runs out).",
            "default": 20
          },
          "maxPages": {
            "title": "Max venue pages",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Venues are read 25 at a time; 0 means as deep as the list goes, bounded by Max items.",
            "default": 0
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy settings. Works on every proxy plan; leave the defaults unless you need a specific exit."
          },
          "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 records already collected there."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns every matching record as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED records. 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 lookup setup; use State key to name or deliberately share a monitoring campaign.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the search and filter settings."
          },
          "emitUnchanged": {
            "title": "Emit unchanged records (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired records (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return records 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.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Incremental mode only. Field names (for example unitsLeft, venueUnitsLeft, venueOffersLeft) whose movement alone should not make a record UPDATED. The fields stay in every row and are simply left out of the change comparison and out of changedFields. Rows already stored are compared with the current list, so adding a field here never causes a one-time wave of UPDATED rows.",
            "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 or 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
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}