{
  "openapi": "3.0.1",
  "info": {
    "title": "Tutti.ch $1.5💰 Swiss Classifieds, URLs & Rich Listing Data",
    "description": "Scrape listings from tutti.ch across all 23 categories, including vehicles, property, electronics, furniture, fashion, and jobs. Search by keyword, category, city, or use tutti.ch URLs. Returns price, location, canton, seller details, images, and optional GPS, phone, photos, and attributes.",
    "version": "1.0",
    "x-build-id": "94oWAEjMScOuz8HQT"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~tutti-ch-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-tutti-ch-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~tutti-ch-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-tutti-ch-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~tutti-ch-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-tutti-ch-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": "How to start the scrape. 'search' builds listing URLs from a keyword, category and locations. 'url' takes tutti.ch search or category URLs you paste.",
            "default": "search"
          },
          "keyword": {
            "title": "Keyword",
            "type": "string",
            "description": "Free-text search term, e.g. 'velo', 'iphone', 'wohnung'. Leave empty to browse a whole category or the entire marketplace. Search mode only."
          },
          "category": {
            "title": "Category",
            "enum": [
              "all",
              "realEstate",
              "vehicles",
              "clothesAccessories",
              "household",
              "phonesNavigation",
              "computersAccessories",
              "tvAudio",
              "sportsOutdoors",
              "babyChild",
              "toysHandicrafts",
              "gardenCraft",
              "animals",
              "antiquesArts",
              "books",
              "music",
              "films",
              "photoVideo",
              "collectibles",
              "officeBusiness",
              "services",
              "jobs",
              "ticketsVouchers",
              "other"
            ],
            "type": "string",
            "description": "Restrict the search to one tutti.ch category. 'All categories' searches the entire marketplace. Search mode only.",
            "default": "all"
          },
          "locations": {
            "title": "Locations (city slugs)",
            "type": "array",
            "description": "Swiss city slugs to search, e.g. 'zurich', 'bern', 'geneve', 'basel', 'lausanne', 'luzern', 'winterthur'. Use the canonical tutti slug (Geneva = 'geneve', Zürich = 'zurich'). Leave empty to search all of Switzerland. For precise or complex locations, use URL mode instead. Search mode only.",
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "Min price (CHF)",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep listings priced at or above this amount (applied to the numeric price). Listings with no price are kept. Search mode only."
          },
          "maxPrice": {
            "title": "Max price (CHF)",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep listings priced at or below this amount (applied to the numeric price). Listings with no price are kept. Search mode only."
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "newest",
              "oldest",
              "price_asc",
              "price_desc"
            ],
            "type": "string",
            "description": "Result ordering. tutti.ch defaults to newest first. Search mode only.",
            "default": "newest"
          },
          "urls": {
            "title": "tutti.ch URLs",
            "type": "array",
            "description": "Paste one or more tutti.ch search or category URLs (e.g. https://www.tutti.ch/de/q/marktplatz/Ak8CrgIWcA). Multiple URLs supported. Search-mode fields are ignored. Results continue from the page in the URL onward. URL mode only.",
            "items": {
              "type": "string"
            }
          },
          "language": {
            "title": "Site language",
            "enum": [
              "de",
              "fr",
              "it"
            ],
            "type": "string",
            "description": "Which tutti.ch language edition to scrape (affects URL path and localized slugs). Applies to search mode and to language inference in output.",
            "default": "de"
          },
          "fetchDetails": {
            "title": "Fetch full details (extra cost)",
            "type": "boolean",
            "description": "Adds GPS coordinates, ALL image URLs, seller account ID, member-since date, phone (when published), street address and structured properties. Costs one extra request per listing.",
            "default": false
          },
          "maxPages": {
            "title": "Max pages per search",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "How many result pages to walk per search/URL (30 listings per page, tutti.ch allows up to 100 pages = 3000 listings per search).",
            "default": 1
          },
          "maxListings": {
            "title": "Max listings (0 = no limit)",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap on total listings across all searches. 0 means no limit (still bounded by maxPages).",
            "default": 0
          },
          "proxy": {
            "title": "Proxy",
            "type": "object",
            "description": "tutti.ch is reachable from Swiss residential IPs. Residential proxy with country = CH is strongly recommended. Datacenter and free-tier connections are usually rejected by the upstream edge.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "CH"
            }
          },
          "maxResidentialPercent": {
            "title": "Residential usage cap (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Soft cap on how much of the run may use residential proxy. Once exceeded, the actor automatically downgrades to the cheaper rotating backup pool for remaining requests. 100 = never downgrade on this signal.",
            "default": 100
          },
          "residentialBudgetMb": {
            "title": "Residential traffic budget (MB)",
            "minimum": 0,
            "type": "integer",
            "description": "Approximate residential bandwidth budget for the run, in megabytes. Once the estimated residential transfer exceeds this, the actor downgrades to the cheaper backup pool. 0 = no budget limit.",
            "default": 0
          },
          "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}