# France Local Tax Rates by Town: Property Tax, CFE, TEOM (`datacraft-studio/france-local-tax-rates`) Actor

Official 2021-2025 local tax rates for every French town (DGFiP): property tax (taxe foncière), land tax, waste tax (TEOM), second-home tax and surcharge, business tax (CFE), history and department ranking. Pay per town.

- **URL**: https://apify.com/datacraft-studio/france-local-tax-rates.md
- **Developed by:** [Yahya Nouali](https://apify.com/datacraft-studio) (community)
- **Categories:** Real estate, Business
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 town tax rates delivereds

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## France Local Tax Rates by Town: Property Tax, CFE, TEOM

Get the **official local tax rates of every French town** (about 35,000 communes) straight from the French tax administration (DGFiP) open data:

- **Taxe foncière** on built property (global rate = town + intercommunality + special taxes), with the town and intercommunality parts
- **Taxe foncière non bâtie** (land)
- **TEOM** household waste collection tax
- **Taxe d'habitation** on second homes, and whether the town applies the **second-home surcharge** (majoration, up to +60 %)
- **CFE** business property tax (cotisation foncière des entreprises), including business-zone and wind-turbine rates
- **History since 2021**, change over 1 year and since 2021, **median of the department**, **rank of the town** in its department and national median

No scraping, no account, no API key: the data comes from the official DGFiP datasets published on data.economie.gouv.fr.

### Who uses it

- **Property investors, agents and proptech apps**: compare the taxe foncière burden between towns, find towns with low or stable rates, spot big increases.
- **Buyers of second homes**: see where the second-home housing tax and surcharge apply.
- **Companies choosing a location, accountants and business advisers**: compare CFE rates between towns and intercommunalities.
- **Journalists, researchers and local authorities**: rankings and 5-year changes per department.

### Input examples

Two towns and a postal code:

```json
{ "towns": ["Lyon", "33063"], "postalCodes": ["75015"] }
```

The 20 towns of Gironde with more than 5,000 inhabitants and the lowest property tax rate:

```json
{ "departments": ["33"], "minPopulation": 5000, "sortBy": "propertyTaxAsc", "maxItems": 20 }
```

Towns of a département where taxe foncière rose the most since 2021:

```json
{ "departments": ["13"], "sortBy": "propertyTaxChangeDesc", "maxItems": 50 }
```

### Output (one row per town)

| Field | Example (Lyon, 2025) |
|---|---|
| townName, inseeCode, departmentCode, population | LYON, 69123, 69, 526912 |
| epciName, epciSiren, epciTaxRegime | Métropole de Lyon |
| propertyTaxRate (town / EPCI / other parts) | 32.82 % |
| landTaxRate, wasteCollectionTaxRate | 39.53 %, 5.19 % |
| secondHomeTaxRate, secondHomeSurcharge, secondHomeSurchargePct | 30.42 %, true, 60 |
| cfeRate, cfeTownRate, cfeEpciRate | 30.65 % |
| departmentMedianPropertyTaxRate, propertyTaxRankInDepartment, townsInDepartment | 32.98 %, 129 of 266 |
| propertyTaxRateHistory, propertyTaxChange1y, propertyTaxChangeSinceFirstYear | 2021: 29.93 → 2025: 32.82 (+2.89 pts) |
| cfeRateHistory | 2021-2025 |
| source, sourceLicence, sourceDataDate | DGFiP, Licence Ouverte 2.0 |

A final **run summary** row gives the tax year, counts, unknown towns or postal codes and the source date (not charged).

Rates are in percent of the cadastral rental value (valeur locative cadastrale), as voted for the tax year. The amount of tax actually paid also depends on each property's cadastral value, which is not part of this public dataset.

### Pricing

**$0.002 per town delivered** (pay per event). A whole department typically costs $0.50 to $2; all of France about $70. The summary row and filtered-out towns are free. Use `maxItems` and your run cost limit to control the budget.

### Source and licence

- DGFiP, "Fiscalité locale des particuliers" and "Fiscalité locale des professionnels" (rates voted by each commune and intercommunality), published on [data.economie.gouv.fr](https://data.economie.gouv.fr/explore/dataset/fiscalite-locale-des-particuliers/) under the **Licence Ouverte / Open Licence v2.0 (Etalab)**, which allows free reuse, including commercial reuse, with attribution. Each row cites the source and the date of the dataset.
- Postal codes are converted to towns with the official [geo.api.gouv.fr](https://geo.api.gouv.fr) service.
- The data is aggregated per town: it contains no personal data.

This Actor is not affiliated with the French administration. Rates are provided as published by DGFiP; check the official notices for any tax decision.

# Changelog

This Actor's version history is a separate document: https://apify.com/datacraft-studio/france-local-tax-rates/changelog.md

# Actor input Schema

## `towns` (type: `array`):

INSEE commune codes (e.g. 69123, 2A004) or town names (e.g. Lyon, Saint-Étienne). Names are matched without accents or hyphens; homonyms in several departments are all returned.

## `postalCodes` (type: `array`):

5-digit postal codes, converted to towns with the official geo.api.gouv.fr service (e.g. 75015, 13008).

## `departments` (type: `array`):

Department codes: every town of the department (e.g. 33, 2A, 974).

## `epciSirens` (type: `array`):

9-digit SIREN of an intercommunality (métropole, communauté d'agglomération...): all its member towns.

## `allFrance` (type: `boolean`):

Every town in France (about 35,000) when no area is given. Mind maxItems and your cost limit.

## `year` (type: `string`):

Tax year, e.g. 2025. Empty = latest year published by DGFiP.

## `minPopulation` (type: `integer`):

Only towns with at least this population.

## `minPropertyTaxRate` (type: `string`):

Only towns whose global taxe foncière (built property) rate is at least this value, e.g. 40 or 45,5.

## `maxPropertyTaxRate` (type: `string`):

Only towns whose global taxe foncière rate is at most this value, e.g. 35.

## `maxCfeRate` (type: `string`):

Only towns whose global CFE rate (outside special zones) is at most this value.

## `onlySecondHomeSurcharge` (type: `boolean`):

Only towns applying the surcharge (majoration) on the housing tax for second homes.

## `includeHistory` (type: `boolean`):

Adds the yearly property tax and CFE rates since 2021, the change over 1 year and since the first year.

## `includeBusinessRates` (type: `boolean`):

Adds the CFE (cotisation foncière des entreprises) rates.

## `sortBy` (type: `string`):

Sorting applied before maxItems.

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

Maximum number of towns delivered (and charged).

## Actor input object example

```json
{
  "towns": [
    "Lyon",
    "33063"
  ],
  "allFrance": false,
  "onlySecondHomeSurcharge": false,
  "includeHistory": true,
  "includeBusinessRates": true,
  "sortBy": "none",
  "maxItems": 1000
}
```

# Actor output Schema

## `towns` (type: `string`):

One row per town with property, waste, second-home and business tax rates.

## `summary` (type: `string`):

Tax year, counts, unknown towns and source date.

# 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 = {
    "towns": [
        "Lyon",
        "33063"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("datacraft-studio/france-local-tax-rates").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 = { "towns": [
        "Lyon",
        "33063",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("datacraft-studio/france-local-tax-rates").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 '{
  "towns": [
    "Lyon",
    "33063"
  ]
}' |
apify call datacraft-studio/france-local-tax-rates --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datacraft-studio/france-local-tax-rates"
        }
    }
}
```

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/PM0VNo5TuBFDiBouy/builds/pZK6yGBXQhgOA1Hq6/openapi.json
