{
  "openapi": "3.0.1",
  "info": {
    "title": "PAP Scraper: pap.fr Real Estate Ads & Phones",
    "description": "Export PAP (pap.fr) ads de particulier à particulier across France: homes to buy or let, PAP Vacances holiday lets and PAP Commerces businesses, no login. Each ad gives its asking price or rent, m2, pièces, DPE, commune and badges; details add how to reach the owner. Alerts, CSV, API; pay per ad.",
    "version": "0.1",
    "x-build-id": "kUa2AcPdXGvOHi7WY"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/automation_craft~pap-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-automation_craft-pap-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/automation_craft~pap-scraper/runs": {
      "post": {
        "operationId": "runs-sync-automation_craft-pap-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/automation_craft~pap-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-automation_craft-pap-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",
        "properties": {
          "places": {
            "title": "Places",
            "type": "array",
            "description": "Towns, cities, arrondissements, departments, regions, postal codes or France, as you would type them on PAP: Paris, Lyon, Paris 12e, Marseille 8, Gironde, 33, Bretagne, 75011, France. A name that several towns share needs its postal code or department (Sainte-Colombe 69560); a name that matches none or several gives a free row with the candidates. A postal code of several towns searches them together. A region is searched department by department. PAP place ids (g439) are accepted too; countries outside France are refused. Up to 100.",
            "items": {
              "type": "string"
            }
          },
          "transaction": {
            "title": "Sale, rent or holiday rental",
            "enum": [
              "sale",
              "rent",
              "sale_and_rent",
              "holiday"
            ],
            "type": "string",
            "description": "Ads for sale or for rent on pap.fr (or both: each place and type is then searched for sale and for rent), or holiday rentals on papvacances.fr. Default sale."
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "Sales and rentals: the kinds of property to search, one search each (PAP's robots.txt asks crawlers not to read its links that join two types). Default apartment and house. Office, shop, business and workshop are PAP's commercial ads, the ads PAP Commerces shows.",
            "items": {
              "type": "string",
              "enum": [
                "house",
                "apartment",
                "land",
                "parking",
                "building",
                "other_surface",
                "houseboat",
                "mobile_home",
                "life_annuity",
                "timeshare",
                "service_residence",
                "rent_to_own",
                "housing_for_services",
                "office",
                "shop",
                "business",
                "workshop",
                "misc"
              ],
              "enumTitles": [
                "House (maison)",
                "Apartment (appartement)",
                "Land (terrain) (sale only)",
                "Parking or garage",
                "Building (immeuble) (sale only)",
                "Space to fit out (surface a amenager) (sale only)",
                "Houseboat (peniche)",
                "Mobile home or chalet",
                "Life annuity sale (viager) (sale only)",
                "Timeshare (multipropriete) (sale only)",
                "Serviced residence",
                "Rent to own (location accession) (rent only)",
                "Housing for services (rent only)",
                "Office (bureaux)",
                "Shop (local commercial)",
                "Business for sale (fonds de commerce) (sale only)",
                "Workshop or business premises (local d'activite)",
                "Other (divers)"
              ]
            }
          },
          "businessActivities": {
            "title": "Businesses for sale by activity (PAP Commerces)",
            "type": "array",
            "description": "Businesses for sale (fonds de commerce) by activity, as PAP Commerces lists them: one search per activity and place. Sales only; leave Property types out (or set it to business).",
            "items": {
              "type": "string",
              "enum": [
                "food",
                "gifts_flowers_leisure",
                "services_other",
                "hotel_bar_restaurant",
                "press_tobacco_books",
                "fashion_beauty",
                "electronics_photo"
              ],
              "enumTitles": [
                "Food shops",
                "Gifts, flowers and leisure",
                "Services and other businesses",
                "Hotels, bars and restaurants",
                "Press, tobacco, books and stationery",
                "Fashion, accessories and beauty",
                "Video, photo and computers"
              ]
            }
          },
          "holidayTypes": {
            "title": "Holiday rental types (PAP Vacances)",
            "type": "array",
            "description": "Holiday rentals: the kinds of stay to search, one search each. Default every kind.",
            "items": {
              "type": "string",
              "enum": [
                "house",
                "apartment",
                "gite",
                "mobile_home",
                "unusual",
                "bed_and_breakfast"
              ],
              "enumTitles": [
                "House",
                "Apartment",
                "Gite",
                "Mobile home",
                "Unusual stay (insolite)",
                "Bed and breakfast (chambre d'hotes)"
              ]
            }
          },
          "minPrice": {
            "title": "Minimum price or rent (EUR)",
            "minimum": 0,
            "maximum": 1000000000,
            "type": "integer",
            "description": "The lowest sale price, or the lowest monthly rent (charges included, as PAP shows it)."
          },
          "maxPrice": {
            "title": "Maximum price or rent (EUR)",
            "minimum": 0,
            "maximum": 1000000000,
            "type": "integer",
            "description": "The highest sale price, or the highest monthly rent."
          },
          "minSurface": {
            "title": "Minimum surface (m2)",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "The smallest living surface in square metres."
          },
          "maxSurface": {
            "title": "Maximum surface (m2)",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "The largest living surface in square metres."
          },
          "minRooms": {
            "title": "Minimum rooms (pieces)",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "The fewest rooms (1 = studio, 6 = 6 or more)."
          },
          "maxRooms": {
            "title": "Maximum rooms (pieces)",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "The most rooms (1 = studio, 6 = 6 or more, no upper bound)."
          },
          "minBedrooms": {
            "title": "Minimum bedrooms",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "The fewest bedrooms (holiday rentals too)."
          },
          "maxBedrooms": {
            "title": "Maximum bedrooms",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "The most bedrooms, checked on every row that shows a count (with Listing details, on the ad's own count too)."
          },
          "minPricePerSqm": {
            "title": "Minimum price per m2 (EUR)",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "The lowest price per square metre, checked on every row (PAP's own figure, else the price divided by the surface). An ad without one is left out, free."
          },
          "maxPricePerSqm": {
            "title": "Maximum price per m2 (EUR)",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "The highest price per square metre, checked on every row. An ad without one is left out, free."
          },
          "minLandSurface": {
            "title": "Minimum land (m2, with Listing details)",
            "minimum": 0,
            "maximum": 100000000,
            "type": "integer",
            "description": "The smallest plot of land of a house or land ad, read from the ad's page (PAP's robots.txt asks crawlers not to read its land filter links). An ad that shows no land surface is left out, free."
          },
          "maxLandSurface": {
            "title": "Maximum land (m2, with Listing details)",
            "minimum": 0,
            "maximum": 100000000,
            "type": "integer",
            "description": "The largest plot of land, read from the ad's page. An ad that shows no land surface is left out, free."
          },
          "excludeNewBuild": {
            "title": "Leave out new builds",
            "type": "boolean",
            "description": "Sales: leave out new build ads (PAP's own neuf exclus filter)."
          },
          "includeNearby": {
            "title": "Keep PAP's nearby ads",
            "type": "boolean",
            "description": "PAP pads a search of a small town with ads of nearby towns, each card showing its distance (Fleurance - 15 Km). Off (default): those ads are left out, free, and counted. On: they are delivered with nearbyKm, the distance PAP shows."
          },
          "features": {
            "title": "Features (must have)",
            "type": "array",
            "description": "Only ads with every one of these features. Duplex is PAP's own filter and a virtual tour shows on the result card; the others show only on the ad's own page (PAP's robots.txt asks crawlers not to read its feature filter links), so they need Listing details: each candidate's page is read and an ad without the feature is left out free (its page is not billed). A pool, parking or disabled access is not shown in a form that can be checked; use Keywords (piscine, parking) for them.",
            "items": {
              "type": "string",
              "enum": [
                "lift",
                "balcony_terrace",
                "top_floor",
                "furnished",
                "unfurnished",
                "duplex",
                "virtual_tour"
              ],
              "enumTitles": [
                "Lift (with Listing details)",
                "Balcony or terrace (with Listing details)",
                "Top floor (with Listing details)",
                "Furnished (with Listing details)",
                "Unfurnished (with Listing details)",
                "Duplex or triplex",
                "Virtual tour"
              ]
            }
          },
          "energyClasses": {
            "title": "Energy classes (DPE)",
            "type": "array",
            "description": "Only ads with one of these energy classes (DPE), checked on the result card (on the ad's page with Listing details). An ad that shows no class is left out, free.",
            "items": {
              "type": "string",
              "enum": [
                "A",
                "B",
                "C",
                "D",
                "E",
                "F",
                "G"
              ],
              "enumTitles": [
                "A",
                "B",
                "C",
                "D",
                "E",
                "F",
                "G"
              ]
            }
          },
          "ghgClasses": {
            "title": "Greenhouse gas classes (GES, with Listing details)",
            "type": "array",
            "description": "Only ads with one of these greenhouse gas classes (GES), which show only on the ad's page: needs Listing details.",
            "items": {
              "type": "string",
              "enum": [
                "A",
                "B",
                "C",
                "D",
                "E",
                "F",
                "G"
              ],
              "enumTitles": [
                "A",
                "B",
                "C",
                "D",
                "E",
                "F",
                "G"
              ]
            }
          },
          "exclusiveOnly": {
            "title": "Only ads seen only on PAP",
            "type": "boolean",
            "description": "Only ads PAP marks as published only on PAP (Seulement sur PAP)."
          },
          "priceDropOnly": {
            "title": "Only ads with a price drop",
            "type": "boolean",
            "description": "Only ads PAP marks with a lowered price (Baisse de prix)."
          },
          "flatshare": {
            "title": "Flatshares (rentals)",
            "enum": [
              "any",
              "only",
              "exclude"
            ],
            "type": "string",
            "description": "Rentals (transaction rent): only flatshare rooms, or none of them. Default any."
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Words to find in the ad (jardin, parquet, metro): whole words, accents and capitals ignored. Checked on the title and the card's description excerpt, or on the whole description with Listing details. Up to 10, each up to 60 characters.",
            "items": {
              "type": "string"
            }
          },
          "keywordsMatch": {
            "title": "Keywords must match",
            "enum": [
              "all",
              "any"
            ],
            "type": "string",
            "description": "With several keywords: all of them (default), or any of them."
          },
          "excludeKeywords": {
            "title": "Keywords to leave out",
            "type": "array",
            "description": "Leave out ads whose title or description holds any of these words (whole words, accents and capitals ignored), free. Up to 10.",
            "items": {
              "type": "string"
            }
          },
          "postedWithinDays": {
            "title": "Posted within (days, with Listing details)",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "Only ads published or republished in the last N days (PAP shows the day of the ad's latest publication, which it renews when the owner republishes). The search is read newest first and stops at the first page that reaches past the window."
          },
          "withPhotosOnly": {
            "title": "With photos only",
            "type": "boolean",
            "description": "Only ads that show at least one photo."
          },
          "withPhoneOnly": {
            "title": "With a phone number only (with Listing details)",
            "type": "boolean",
            "description": "Only ads whose page shows a phone number (the owner's own, or PAP's relay number)."
          },
          "ownerPhoneOnly": {
            "title": "With the owner's own phone only (with Listing details)",
            "type": "boolean",
            "description": "Only ads whose page shows the owner's own phone number, not PAP's relay number. The number itself is delivered only with Include personal data."
          },
          "excludeAdIds": {
            "title": "Ads to leave out",
            "type": "array",
            "description": "PAP ad numbers or ad links you already have (pap.fr, PAP Vacances, PAP Commerces); they are skipped, free. Up to 10,000.",
            "items": {
              "type": "string"
            }
          },
          "excludeDatasetIds": {
            "title": "Datasets of ads to leave out",
            "type": "array",
            "description": "Ids of your Apify datasets (an earlier run of this Actor, or any dataset whose rows carry a PAP ad number or link in \"id\" or \"url\"): their ads are skipped, free. Up to 10 datasets and 200,000 ads; a dataset that cannot be read stops the run before any paid work. Only the datasets picked here are readable to the run (limited permissions)."
          },
          "sort": {
            "title": "Sort",
            "enum": [
              "newest",
              "oldest",
              "price_low",
              "price_high",
              "surface_low",
              "surface_high"
            ],
            "type": "string",
            "description": "The order PAP lists the ads in. Default newest first (PAP's own order). A search link keeps its own order unless you set one here."
          },
          "minGuests": {
            "title": "Minimum guests (holiday rentals)",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Holiday rentals: the fewest people the place sleeps."
          },
          "minBathrooms": {
            "title": "Minimum bathrooms (holiday rentals)",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Holiday rentals: the fewest bathrooms."
          },
          "maxWeeklyPrice": {
            "title": "Maximum weekly price (holiday rentals, EUR)",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Holiday rentals: the highest starting price per week PAP Vacances shows (dès ... par semaine)."
          },
          "holidayAmenities": {
            "title": "Amenities (holiday rentals, with Listing details)",
            "type": "array",
            "description": "Holiday rentals: only places whose page lists every one of these amenities or services. Needs Listing details.",
            "items": {
              "type": "string",
              "enum": [
                "wifi",
                "pool",
                "air_conditioning",
                "pets_allowed",
                "parking",
                "terrace",
                "garden",
                "disabled_access",
                "washing_machine",
                "dishwasher",
                "tv",
                "baby_equipment",
                "barbecue",
                "linen_provided",
                "cleaning_included",
                "holiday_vouchers"
              ],
              "enumTitles": [
                "Wi-Fi",
                "Swimming pool",
                "Air conditioning",
                "Pets welcome",
                "Garage or parking",
                "Terrace",
                "Garden",
                "Disabled access",
                "Washing machine",
                "Dishwasher",
                "Television",
                "Baby equipment",
                "Barbecue",
                "Linen provided",
                "Cleaning included",
                "Holiday vouchers accepted (cheques vacances)"
              ]
            }
          },
          "stayFrom": {
            "title": "Stay from (holiday rentals, with Listing details)",
            "type": "string",
            "description": "Holiday rentals: the first night of your stay (YYYY-MM-DD). With Stay to, only places whose calendar shows every night free are delivered (a stay past the calendar's last bookable day cannot be judged and is left out); each row carries availableForStay. Needs Listing details."
          },
          "stayTo": {
            "title": "Stay to (holiday rentals)",
            "type": "string",
            "description": "The day you leave (YYYY-MM-DD; that night is not part of the stay). At most 90 nights."
          },
          "maxItems": {
            "title": "Maximum rows",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "The most paid rows the run delivers (ad rows, change and removed rows together). Default 100."
          },
          "maxItemsPerSearch": {
            "title": "Maximum rows per search",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "The most rows one search or link delivers."
          },
          "maxPagesPerSearch": {
            "title": "Maximum results pages per search",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "The most results pages (about 12 ads each) one search or link reads."
          },
          "maxRequestsPerSecond": {
            "title": "Requests a second (at most)",
            "minimum": 1,
            "maximum": 3,
            "type": "integer",
            "description": "The pace of the run's requests on its one French residential exit: 1 a second by default, up to 3 for a faster run (PAP answers in about a second, so the gain is modest)."
          },
          "searchUrls": {
            "title": "PAP search links",
            "type": "array",
            "description": "Search links copied from PAP: https://www.pap.fr/annonce/vente-appartements-paris-75-g439 or https://www.papvacances.fr/annonces/location-gers-32-g396, PAP's other wordings of its page links included. Every page is read from the first. The link's own type, place and filters must show on PAP's page, else the search is not read (free). A link PAP's robots.txt asks crawlers not to read (two property types, feature words, a page address under /pagination/), one that carries a query, a filter word outside PAP's rooms, bedrooms, price, surface and sort words, or a PAP Commerces search link (use places with businessActivities or the commercial property types) is refused with a free row. Up to 100.",
            "items": {
              "type": "string"
            }
          },
          "adUrls": {
            "title": "Ad links or ad numbers",
            "type": "array",
            "description": "Ads to read directly: pap.fr, PAP Vacances or PAP Commerces ad links, or ad numbers (r464602150 or 464602150). Each ad's page is read, so each row is billed as Listing and Listing details. An ad PAP no longer has is a free row. Up to 5,000.",
            "items": {
              "type": "string"
            }
          },
          "references": {
            "title": "PAP references",
            "type": "array",
            "description": "PAP ad references as printed on each ad (G46/2150), looked up with PAP's own reference search (pap.fr ads; for a PAP Vacances ad paste its link or number) and read like ad links. An unknown reference is a free row. Up to 500.",
            "items": {
              "type": "string"
            }
          },
          "includeDetails": {
            "title": "Listing details",
            "type": "boolean",
            "description": "Read each delivered ad's own page: the whole description, reference, latest publication day and the days since, energy and gas texts, nearby metro and train stops, features (lift, balcony, top floor, furnished ...), the offer condition as PAP labels it, price with fees and the monthly payment estimate, rent with charges, deposit and rent control, whether the owner refuses canvassing, how to reach the owner (their phone, PAP's relay number or messages only) and, for holiday rentals, the rate table, beds, rooms, amenities, services and calendar. Billed as Listing details per row."
          },
          "includePersonalData": {
            "title": "Include personal data",
            "type": "boolean",
            "description": "Off by default. On, with Listing details: the owner's own phone numbers (phone, phones and phonesE164), the street and the map position (latitude, longitude) are delivered as PAP shows them logged out. Off: those fields are empty (phones [], phonesE164 []), and the page's structured data in rawData carries no street, position, telephone or e-mail. PAP's relay number, which is PAP's own, is always shown. Titles, descriptions, holiday reviews (with their authors' shown names) and other texts are delivered exactly as PAP serves them, on or off. You are responsible for using personal data lawfully (GDPR included), and many owners state they refuse commercial canvassing (refusesCanvassing)."
          },
          "includeRawData": {
            "title": "Include PAP's raw data",
            "type": "boolean",
            "description": "Add rawData to each ad row: the result card as read (rawData.card) and, with Listing details, the ad page's structured data (its schema.org record, rawData.ldJson; without the street, position, telephone and e-mail unless Include personal data). Larger rows; no extra charge."
          },
          "descriptionMaxLength": {
            "title": "Cut descriptions at (characters)",
            "minimum": 50,
            "maximum": 30000,
            "type": "integer",
            "description": "Cut the description of each row at this many characters (at a word, marked ...). Default the whole text."
          },
          "omitEmptyFields": {
            "title": "Leave out empty fields",
            "type": "boolean",
            "description": "Leave out the fields of an ad row that are empty (null, an empty text or list). The fields that identify the row are always kept."
          },
          "flattenOutput": {
            "title": "Flatten nested fields",
            "type": "boolean",
            "description": "Write nested objects as dotted keys (features.lift), handy for spreadsheets."
          },
          "outputFields": {
            "title": "Only these fields",
            "type": "array",
            "description": "Keep only these top level fields of an ad row (price, surface, city, url ...); the fields that identify the row and the Listing details fields you pay for are always kept.",
            "items": {
              "type": "string"
            }
          },
          "runLabel": {
            "title": "Run label",
            "type": "string",
            "description": "A label of your choice copied to the run summary (letters, digits, spaces and . _ , - : # ( ) ' /, up to 100 characters; 24 characters or more without a space that mix letters and digits read as a token and are refused), to tell runs apart."
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "A short name of your choice (letters, digits, spaces and . _ , - : # ( ), up to 60 characters; 24 characters or more without a space that mix letters and digits read as a token and are refused, so separate words with spaces). One name belongs to one set of settings."
          },
          "monitorBaselineOnly": {
            "title": "First run: remember only",
            "type": "boolean",
            "description": "With a monitor: on its first run only (complete or not), the ads met are only remembered, not delivered (no Listing charged; the results pages read are billed as Results pages). Later runs deliver only ads new since then. Not with trackChanges: turn it on for the later runs of the same monitor."
          },
          "trackChanges": {
            "title": "Track changes and removals",
            "type": "boolean",
            "description": "With a monitor: an ad it delivered before whose price (or another watched field, below) changed is delivered again with what changed, an ad PAP no longer serves is reported as removed and a removed ad that comes back as reappeared (all billed as Listing). This reads every page of the searches each run, every results page billed."
          },
          "changeFields": {
            "title": "Changes to watch",
            "type": "array",
            "description": "With trackChanges: which changes of a known ad deliver it again (billed as Listing). A price change row carries the previous price, the change in euros and percent and the price history. Default price only.",
            "items": {
              "type": "string",
              "enum": [
                "price",
                "surface",
                "rooms",
                "bedrooms",
                "energy_class",
                "description",
                "photos"
              ],
              "enumTitles": [
                "Price or rent",
                "Surface",
                "Rooms",
                "Bedrooms",
                "Energy class",
                "Description",
                "Photos"
              ]
            }
          },
          "includeUnchanged": {
            "title": "Also deliver unchanged ads",
            "type": "boolean",
            "description": "With trackChanges: known ads met again without a watched change are delivered too, free, marked unchanged (they never count toward the maximum and are not sent in notifications, which carry new, changed and removed ads)."
          },
          "flagReposts": {
            "title": "Flag reposts",
            "type": "boolean",
            "description": "With trackChanges: a new ad that describes the same property as an ad this monitor reported removed (same kind, transaction, postal code, surface to the m2 and rooms) carries repost.repostOf with the removed ad's number and last price. Billed as a new ad."
          },
          "skipReposts": {
            "title": "Leave out reposts",
            "type": "boolean",
            "description": "With trackChanges: such a repost is left out, free (counted in the coverage row), instead of flagged, when its description is also the removed ad's; one with another description is delivered with its repost flag (sameDescription false), since a shared place, surface and rooms alone may be another property."
          },
          "webhookUrl": {
            "title": "Webhook address",
            "type": "string",
            "description": "An https address the run posts its new rows to (JSON, up to 100 rows a call, at most 1,000 a run, with a plain text summary in the field \"text\")."
          },
          "webhookSecret": {
            "title": "Webhook secret",
            "type": "string",
            "description": "Optional: each call then carries an x-signature-sha256 header, the HMAC SHA-256 of the body with this secret (16 to 200 letters, digits and - _ . ~, with at least one letter and one digit)."
          },
          "webhookHeaders": {
            "title": "Webhook headers",
            "type": "object",
            "description": "Optional: up to 5 headers sent with each webhook call ({\"Authorization\": \"Bearer ...\"}), each value 8 to 500 characters; treated as secrets."
          },
          "slackWebhookUrl": {
            "title": "Slack incoming webhook",
            "type": "string",
            "description": "A Slack incoming webhook address (https://hooks.slack.com/...): the run posts its first new rows as messages, one line per ad (at most 30 lines)."
          },
          "discordWebhookUrl": {
            "title": "Discord webhook",
            "type": "string",
            "description": "A Discord channel webhook address (https://discord.com/api/webhooks/...): the run posts its first new rows as messages, one line per ad (at most 30 lines)."
          },
          "whatsappPhoneNumberId": {
            "title": "WhatsApp phone number id",
            "type": "string",
            "description": "The phone number id of your WhatsApp Business app (WhatsApp Cloud API); with the token and the recipient below, the run sends one message per new row (at most 30). WhatsApp delivers free text only inside a conversation the recipient opened in the last 24 hours."
          },
          "whatsappAccessToken": {
            "title": "WhatsApp access token",
            "type": "string",
            "description": "The access token of your WhatsApp Business app."
          },
          "whatsappTo": {
            "title": "WhatsApp recipient",
            "type": "string",
            "description": "The phone number the messages go to, in international form (+33612345678)."
          },
          "telegramBotToken": {
            "title": "Telegram bot token",
            "type": "string",
            "description": "Your own bot's token from BotFather; the run sends one message per new row (at most 30)."
          },
          "telegramChatId": {
            "title": "Telegram chat id",
            "type": "string",
            "description": "The chat id (a number) or channel name (@name) your bot posts to."
          },
          "notifyOnlyChanges": {
            "title": "Notify only changes",
            "type": "boolean",
            "description": "With trackChanges: the notifications carry only change and removed rows, not new ads."
          },
          "notificationMaxRows": {
            "title": "Rows per notification channel",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "The most rows each notification channel sends (default: 1,000 for the webhook, 30 for the chat channels)."
          },
          "failIfIncomplete": {
            "title": "Fail the run when something was not read",
            "type": "boolean",
            "description": "Mark the run failed when a search or link could not be read to its end for a reason other than your own limits. The rows delivered stay."
          },
          "feedback": {
            "title": "Feedback for the developer",
            "type": "string",
            "description": "Optional: a note to the developer (a missing field, a place that did not resolve, an idea). It is copied to the run's summary row, where the developer reads it; up to 1,000 characters. Do not put personal data or secrets here."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify residential proxies in France are used and included in the price: PAP refuses other addresses. Other Apify groups and countries are refused; your own proxy links (http://user:password@host:port, a French residential exit, the password 12 characters or more, no space) can be given instead."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}