# Pools & Tennis · Cadastre Plots by City (FR · ES) (`corent1robert/france-pool-tennis-plots`) Actor

Paste a city in France or Spain. Get pool, tennis or padel plots. House number only when it sits on the same cadastre parcel. Optional SIRENE in France. Open data. No login.

- **URL**: https://apify.com/corent1robert/france-pool-tennis-plots.md
- **Developed by:** [Corentin Robert](https://apify.com/corent1robert) (community)
- **Categories:** Lead generation, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.29 / 1,000 verified pool plots

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Pools & Tennis · Cadastre Plots by City (FR·ES·PL·NL·AT)

Paste a **city in France, Spain, Poland, the Netherlands or Austria**. Export plots that already have a swimming pool, tennis court or padel court — with a **house number only when it sits on the same parcel**.

**No login. No API key. Address only when it sits on the same parcel.**

### Who is this for?

| You are… | Typical goal | Suggested setup |
| --- | --- | --- |
| Pool, cover, heat-pump or tennis installer | Territory of equipped plots | Country + city, verified only, companies off |
| Outdoor / garden equipment brand | Private lots, not clubs | Maps flag on (applied when Maps is available) |
| Agency / off-market desk | Parcels with pool + tennis | Both sports on, verified only |
| Wealth / SCI workflow (France) | Holdings at the street number | Company lookup on |

**What you get by default:** `country`, parcel ID, equipment flags, verified address, parcel m², building count, footprint m², garden m², **roof length × width**. France also has BD TOPO height when Z exists.

**Company lookup:** France only (SIREN / SCI / SAS / association and published directors). Individual owners are **not** in open data. Other countries have no company register on this Actor.

### Countries

| Country | Cadastre | Address | Height | Companies |
| --- | --- | --- | --- | --- |
| France | IGN / PCI (IDU) | BAN point inside the parcel | BD TOPO when Z exists | Optional SIRENE |
| Spain | Catastro (referencia catastral) | CartoCiudad portal on the parcela, or Catastro situs with a number | Plan outline only | Not available |
| Poland | ULDK / EGiB (TERYT) | UUG house number on the działka | Plan outline (OSM) | Not available |
| Netherlands | Kadaster perceel (PDOK) | BAG locatieserver on the perceel | Plan outline (BAG pand) | Not available |
| Austria | BEV KG + Gst (id) | Nominatim house number on the OSM lot | Plan outline (OSM) | Not available |

Basque Country and Navarre are **not** on the national Catastro API. **Austria:** BEV gives the official KG + Grundstücksnummer at the point; the lot polygon is the OSM building (DKM outline is not a public query API).

### What it extracts

One **row per cadastral parcel** (several pools on the same lot collapse to one row).

| Field | Meaning |
| --- | --- |
| `country` | `FR`, `ES`, `PL`, `NL` or `AT` |
| `hasSwimmingPool` / `hasTennisCourt` / `hasPadelCourt` | Mapped equipment on the parcel |
| `address` + `addressStatus` | `verified` only if the house number is on the same parcel |
| `parcelIdu`, `parcelAreaM2` | Cadastre id (FR IDU, ES referencia, PL TERYT, NL perceel, AT OSM-way) |
| `cadastralLabel` | Situs / official parcel label when published |
| `buildingFootprintM2`, `buildingCount`, `gardenM2` | Plan area from cadastre buildings |
| `roofLengthM` / `roofWidthM` / `roofPlanM2` | Size of the **main** roof outline (metres / m² plan) |
| `buildingHeightM`, `roofRiseM`, `roofAreaM2` | Height and gable 3D m² when IGN BD TOPO has altitudes — **not** LiDAR |
| `roofMaterial`, `buildingFloors`, `roofSource` | `bdtopo` or `cadastre_plan` |
| `siren`, `companyLegalForm`, `directors` | Optional, France, verified addresses only |
| `mapsStatus` | `off`, `ok`, or `skipped_quota` (listing check not applied) |

### How to use

1. Open the Actor in [Apify Console](https://console.apify.com).
2. Set **Country**. Enter a **city** (Cannes, Marbella, Sopot, Wassenaar or Graz), keep max plots at 25.
3. Click **Start**.
4. Download CSV / Excel from the dataset.

### Ready-made examples

| Example | Best for |
| --- | --- |
| [Cannes pool plots, verified address](https://apify.com/corent1robert/france-pool-tennis-plots/examples/cannes-pool-plots-verified) | Pool installers, Côte d’Azur |
| [Bordeaux tennis plots](https://apify.com/corent1robert/france-pool-tennis-plots/examples/bordeaux-tennis-plots) | Court / club territory |
| [Antibes 06400 pool + tennis](https://apify.com/corent1robert/france-pool-tennis-plots/examples/antibes-pool-tennis-06400) | Estate / off-market |
| [Cannes plots with SIREN](https://apify.com/corent1robert/france-pool-tennis-plots/examples/cannes-plots-with-siren) | SCI / directors at the number |

Paste a verified French `address` into **[French Property Intel](https://apify.com/corent1robert/french-property-intel-hub)** for DPE, flood/clay, value and yield — billed **per dossier**, not per cadastral row.

### Input

| Field | Default |
| --- | --- |
| Country | France |
| City, postcode or department / province | Cannes (or Marbella / Sopot / Wassenaar / Graz) |
| Swimming pools / tennis / padel | on |
| Company lookup | off (France only) |
| Maps public-place flag | off |
| Max plots | 25 (`0` or `null` = no cap; Free plan 20 / run) |

### Output example

```json
{
  "country": "FR",
  "parcelIdu": "06029000CK0027",
  "hasSwimmingPool": true,
  "hasTennisCourt": false,
  "addressStatus": "verified",
  "address": "68 Avenue du Roi Albert 1er 06400 Cannes",
  "parcelAreaM2": 2504,
  "buildingFootprintM2": 410,
  "roofLengthM": 22.1,
  "roofWidthM": 8.4,
  "buildingHeightM": 7.2,
  "roofAreaM2": 198,
  "gardenM2": 2094,
  "companyLegalForm": null,
  "mapsStatus": "off"
}
```

### Pricing

Pay-per-event (platform usage included — HTTP open data only). Tennis and padel count as a **court**. SIREN is a bump on the **same** pool / court / both ladder (France).

| You get | Free / 1,000 |
| --- | --- |
| Verified **pool** (no court) | **$1.29** |
| Verified **court** (tennis/padel, no pool) | **$1.99** |
| Verified **pool + court** | **$2.49** |
| Pool + published company | **$2.79** |
| Court + published company | **$3.29** |
| Pool + court + company | **$3.79** |
| Unverified plot (Flag mode) | **$0.39** |

Actor start is $0.00005 / GB. Free Apify accounts export **20 plots per run**.

#### How much does it cost to export pool or tennis plots?

| Scenario | Approx. cost (Free) |
| --- | --- |
| 20 verified pool plots (first try) | ~$0.03 |
| 1,000 verified pool plots | ~$1.29 |
| 1,000 verified tennis plots | ~$1.99 |
| 1,000 pool plots with a SIREN | ~$2.79 |

### Limits (read this)

- Coverage follows **OpenStreetMap**. Dense on the Côte d’Azur, Costa del Sol and some villa belts; sparse in the countryside.
- Many pools sit far from the street. Only ~one in five Cannes samples kept a **verified** house number — that is the product, not a bug. Console runs always **drop** unverified rows (`unverifiedAddressPolicy` stays `drop` unless you pass `flag` in JSON).
- France: `buildingFootprintM2` is the **plan** of cadastre buildings. `roofAreaM2` is a **gable estimate** from BD TOPO eave/ridge when those altitudes exist — not a LiDAR mesh.
- Spain: roof size from the Catastro building outline. No nationwide height model. **Basque Country and Navarre** are not on the national Catastro API.
- Poland / Netherlands: official parcel APIs (ULDK, Kadaster). Austria uses an OSM building lot because BEV cadastre is not publicly queryable.
- No particulier owner names. Directors appear only for a **published company** at that number (France).
- Maps club/hotel detection is skipped when platform Maps quota is exhausted (`mapsStatus: skipped_quota`).

### Is it legal to scrape pool and tennis plots?

This Actor only uses **public open data** (OpenStreetMap, IGN cadastre / PCI + BAN + optional SIRENE in France; Catastro + CartoCiudad in Spain; ULDK in Poland; Kadaster / BAG in the Netherlands; OSM buildings in Austria). It does **not** extract private individual owner names. As with any address-level dataset, make sure your use complies with GDPR and local marketing rules.

### Also available

**[France Pool-Ready Plots · Builders by City](https://apify.com/corent1robert/france-pool-ready-plots)** — house + large garden, no OSM pool.\
**[France Building Heights · Facades by City](https://apify.com/corent1robert/france-building-heights)** — buildings taller than X metres (facade / scaffolding).\
**[France Building Roofs · Size by City](https://apify.com/corent1robert/france-building-roofs)** — every building whose roof plan is larger than X m² (no pool/tennis needed).\
**[French Property Intel](https://apify.com/corent1robert/french-property-intel-hub)** — DPE, hazards, yield and owner SIREN from a street address.\
**[French DPE F/G · Property Owner SIRENs](https://apify.com/corent1robert/dpe-fg-proprietaires-siren)** — SCI / foncières on class F/G dwellings.

### Support

Questions or a custom run: **corentin@outreacher.fr**

# Actor input Schema

## `country` (type: `string`):

**France:** IGN cadastre + BAN. **Spain:** Catastro + CartoCiudad (Basque Country and Navarre out). **Poland:** ULDK działka + UUG. **Netherlands:** Kadaster perceel + BAG. **Austria:** BEV Grundstücksnummer + OSM lot polygon. Company lookup is France only.

## `locations` (type: `array`):

**France:** commune, postcode (06400) or department (06). **Spain:** city, postcode or province code (29 = Málaga). **PL / NL / AT:** city or postcode. Start with one city.

## `detectSwimmingPools` (type: `boolean`):

Include plots that have a mapped swimming pool.

## `detectTennisCourts` (type: `boolean`):

Include plots that have a mapped tennis court.

## `detectPadel` (type: `boolean`):

Include plots that have a mapped padel court.

## `enrichCompanies` (type: `boolean`):

France only. When the address is verified, attach SIREN / SCI / SAS / association and published directors. Ignored outside France.

## `excludePublicPlaces` (type: `boolean`):

Mark plots that look like a public place. Currently skipped if Maps quota is unavailable — rows are never silently deleted.

## `maxItems` (type: `integer`):

How many rows to export. **0 or null = no cap** (timeout still applies). Free Apify accounts: 20 per run.

## Actor input object example

```json
{
  "country": "france",
  "locations": [
    "Cannes"
  ],
  "detectSwimmingPools": true,
  "detectTennisCourts": true,
  "detectPadel": true,
  "enrichCompanies": false,
  "excludePublicPlaces": false,
  "maxItems": 25
}
```

# Actor output Schema

## `overview` (type: `string`):

Parcel, equipment flags, verified address

## `outreachCrm` (type: `string`):

Address + company + directors

## `unverifiedPlots` (type: `string`):

Rows kept when you chose Flag

## `dataset` (type: `string`):

No description

## `output` (type: `string`):

No description

## `runLog` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "country": "france",
    "locations": [
        "Cannes"
    ],
    "enrichCompanies": false,
    "excludePublicPlaces": false,
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/france-pool-tennis-plots").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "country": "france",
    "locations": ["Cannes"],
    "enrichCompanies": False,
    "excludePublicPlaces": False,
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/france-pool-tennis-plots").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "country": "france",
  "locations": [
    "Cannes"
  ],
  "enrichCompanies": false,
  "excludePublicPlaces": false,
  "maxItems": 25
}' |
apify call corent1robert/france-pool-tennis-plots --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corent1robert/france-pool-tennis-plots"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/e7RwY7quWLy9Q7Bsb/builds/6XC8fyNfYeUswJhdK/openapi.json
