Discover/tutti API
live

tutti APItutti.ch ↗

Search and retrieve tutti.ch Swiss classifieds listings by keyword, category, price range, and postcode radius. Returns prices, seller info, images, and more.

Endpoint health
verified 16h ago
search_listings
get_listing
2/2 passing latest checkself-healing
Endpoints
2
Updated
17h ago

What is the tutti API?

The tutti.ch API provides 2 endpoints to search and fetch Swiss classifieds listings from tutti.ch. search_listings returns up to 30 listing summaries per page with price, location, and category data; get_listing fetches a single listing by numeric ID including seller details, item condition, shipping availability, and full-size images. Both endpoints return prices in CHF as a structured numeric field.

This call costs5 credits / call— charged only on success
Try it
4-digit Swiss postcode to centre the search on (e.g. 8925). Without `radius` only listings in that postcode match. A postcode the site does not know (e.g. 8000) is dropped by the site and reported through applied_filters.filters_honored = false.
1-based result page, 30 listings per page.
Result ordering.
Free-text search term (e.g. enduro mountainbike). Optional when `category` is given.
Search radius in km around `zip`; values above 30 are clamped to 30 (the site's maximum). Ignored without `zip`.
Site category id to restrict the search to, as emitted in listings[*].category_id (confirmed: bicycles, sportsOutdoors). An id the site does not know makes it discard the whole search and return the unfiltered newest listings, reported through applied_filters.filters_honored = false. Omitted = all categories.
Maximum asking price in CHF (inclusive). Omitted = no upper bound.
Minimum asking price in CHF (inclusive). Omitted = no lower bound.
→ api.parse.bot/scraper/e6026c72-0f70-4db2-886e-ab4af0379cc5/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
curl -X GET 'https://api.parse.bot/scraper/e6026c72-0f70-4db2-886e-ab4af0379cc5/search_listings?query=enduro+mountainbike' \
  -H 'X-API-Key: $PARSE_API_KEY'
All endpoints · 2 totalmissing one? ·

Searches tutti.ch listings for a free-text query and/or a category and returns one page of up to 30 listing summaries, newest first by default, in a single lightweight page-data fetch per call (a second small fetch happens only right after the site redeploys or when the site rejects a filter value). Each listing already carries title, asking price, full ad text, postcode/place/canton, posting time and seller summary. Pagination is caller-driven through `page` (1-based, 30 per page); `total_count` is the site's total for the filtered search and `has_more` tells whether a further page exists. Filters are forwarded to the site: `sort`, `price_from`/`price_to` (CHF, inclusive), `zip` with optional `radius` (km, clamped to the site's 30 km maximum), and `category`. `applied_filters` echoes what the site actually applied: an unknown postcode is dropped by the site, and an unknown category id makes the site discard the whole search (query included) and answer the unfiltered newest listings; `filters_honored` is false in both cases. Listing summaries from search do not carry the site's property list, so `condition`, `shipping` are null and `properties` is empty here — use get_listing for those; `images` holds the single search thumbnail and `image_count` the number of photos. `price_chf` is the asking price only: on search it is parsed from the site's formatted price (`price_source` = "formattedPrice"); `description` is the seller's ad text with `description_source` naming the source key. At least one of `query` or `category` is required.

Input
ParamTypeDescription
zipstring4-digit Swiss postcode to centre the search on (e.g. 8925). Without `radius` only listings in that postcode match. A postcode the site does not know (e.g. 8000) is dropped by the site and reported through applied_filters.filters_honored = false.
pageinteger1-based result page, 30 listings per page.
sortstringResult ordering.
querystringFree-text search term (e.g. enduro mountainbike). Optional when `category` is given.
radiusintegerSearch radius in km around `zip`; values above 30 are clamped to 30 (the site's maximum). Ignored without `zip`.
categorystringSite category id to restrict the search to, as emitted in listings[*].category_id (confirmed: bicycles, sportsOutdoors). An id the site does not know makes it discard the whole search and return the unfiltered newest listings, reported through applied_filters.filters_honored = false. Omitted = all categories.
price_tointegerMaximum asking price in CHF (inclusive). Omitted = no upper bound.
price_fromintegerMinimum asking price in CHF (inclusive). Omitted = no lower bound.
Response
{
  "type": "object",
  "fields": {
    "page": "integer, the page returned",
    "has_more": "boolean, whether page+1 exists",
    "listings": "array of listing summaries: listing_id (string), url, title, price_chf (integer CHF asking price or null), price_source, price_text, description (ad text), description_source, posted_at (ISO 8601 with offset), condition (null on search), shipping (null on search), postcode, place, canton, category_id, images (array of URLs, thumbnail only on search), image_count, seller (object: alias, logoURL, subscriptionInfo), properties (empty on search)",
    "page_size": "integer, listings per page (30)",
    "total_count": "integer, the site's total number of matching listings",
    "applied_filters": "object echoing the filters the site applied: query, category_id, category_label, price_from, price_to, zip, radius_km, sort, filters_honored (boolean, false when the site dropped a filter value)"
  },
  "sample": {
    "data": {
      "page": 1,
      "has_more": true,
      "listings": [
        {
          "url": "https://www.tutti.ch/de/vi/83550129",
          "place": "Hochdorf",
          "title": "Hornet Al Wheeler Enduro Bike ",
          "canton": "LU",
          "images": [
            "https://c.tutti.ch/big/2093206041.jpg"
          ],
          "seller": {
            "alias": "Laurin ",
            "logoURL": null,
            "subscriptionInfo": null
          },
          "postcode": "6280",
          "shipping": null,
          "condition": null,
          "posted_at": "2026-10-15T19:17:03+02:00",
          "price_chf": 500,
          "listing_id": "83550129",
          "price_text": "500.-",
          "properties": [],
          "category_id": "bicycles",
          "description": "Wheeler Enduro Hornet AL  Fully Mountainbike ...",
          "image_count": 5,
          "price_source": "formattedPrice",
          "description_source": "localization.body"
        }
      ],
      "page_size": 30,
      "total_count": 173,
      "applied_filters": {
        "zip": null,
        "sort": "newest",
        "query": "enduro mountainbike",
        "price_to": null,
        "radius_km": null,
        "price_from": null,
        "category_id": "bicycles",
        "category_label": "Velos",
        "filters_honored": true
      }
    },
    "status": "success"
  }
}

About the tutti API

Searching Listings

search_listings accepts a free-text query, a category (using the category ID as emitted in listings[*].category_id), and price bounds via price_from and price_to in CHF. Location filtering is available through a 4-digit Swiss zip and an optional radius in km (capped at 30). Results are paginated at 30 listings per page using the page parameter; the response includes total_count and has_more to support sequential pagination. Each listing in the listings array carries listing_id, url, title, price_chf, price_text, postcode, place, canton, and posting time.

Fetching a Single Listing

get_listing takes a numeric listing_id (as returned by search_listings) and returns the full listing record. This includes the canonical url, title, price_chf, price_text, description, postcode, place, canton, an images array of full-size URLs, a seller object (with alias, memberSince, publicAccountID, locationName, logoURL, and subscriptionInfo), status, condition, and shipping. The price_chf field is always sourced from the site's numeric price field — never parsed from ad text.

Filters and Applied Filters Echo

The search_listings response includes an applied_filters object that echoes back the filters actually applied by the site, including category_id, category_label, price_from, price_to, zip, radius_km, and sort. This lets callers verify which parameters took effect, which is useful when combining optional filters that may interact (e.g. zip without radius restricts to that postcode only).

Reliability & maintenanceVerified

The tutti API is a managed, monitored endpoint for tutti.ch — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when tutti.ch changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.

This isn't an official tutti.ch API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.

Last verified
16h ago
Latest check
2/2 endpoints passing
Maintenance
Monitored & self-healing
Will this API break when the source site changes?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • Monitor price trends for specific goods on the Swiss second-hand market using price_chf across paginated search_listings results
  • Build a local deal finder by combining zip and radius to surface classifieds near a given Swiss postcode
  • Aggregate bicycle or other category-specific listings by passing a confirmed category ID to search_listings
  • Enrich a listing record with full seller details, images, and item condition via get_listing after a bulk search
  • Filter listings within a price band using price_from and price_to to feed a budget-aware recommendation tool
  • Track new postings for a search term by polling search_listings and comparing listing_id values against a stored set
  • Extract canton and postcode distribution of listings to analyse regional supply for a given product category
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo2005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 req/min
Team$300/mo20,000300 req/min
Company$1,000/mo100,000500 req/min

Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.

Frequently asked questions
Does tutti.ch provide an official developer API?+
Tutti.ch does not publish a public developer API or API documentation. There is no official API key program or documented endpoint reference available to third parties.
What does `get_listing` return that `search_listings` does not?+
get_listing adds the full description text, an images array of full-size image URLs, the seller object (including memberSince, publicAccountID, logoURL, and subscriptionInfo), condition, and shipping. The search endpoint returns summaries sufficient for listing display, while get_listing provides everything needed to render a complete ad detail page.
How does the radius filter work, and what is its limit?+
The radius parameter sets a search radius in km around the provided zip value. Values above 30 are clamped to 30, which is the maximum the site enforces. If zip is omitted, radius has no effect. The applied_filters object in the response shows the radius_km actually applied.
Are sold, expired, or removed listings accessible?+
Removed listings are reported as not found rather than returned with a historical record. The status field on a live listing is "live". Historical sold-listings data and price history are not currently exposed by either endpoint. You can fork this API on Parse and revise it to add an endpoint targeting archived or expired listing data if that surface becomes accessible.
Can I retrieve contact details or direct messaging data for sellers?+
The seller object returned by get_listing includes alias, locationName, publicAccountID, logoURL, and subscriptionInfo, but no phone numbers, email addresses, or private messaging data. Contact and messaging data are not currently covered. You can fork this API on Parse and revise it to add any contact fields that are publicly accessible on a listing page.
Page content last updated . Spec covers 2 endpoints from tutti.ch.
Related APIs in MarketplaceSee all →