# IRVE France — Bornes de recharge officielles (`coastal_reed/irve-france-bornes-recharge`) Actor

Localise les bornes de recharge pour véhicules électriques en France à partir du fichier consolidé officiel (data.gouv.fr / ODRÉ, réseau QualiCharge), avec filtres géographiques, puissance, type de prise, gratuité et accès.

- **URL**: https://apify.com/coastal\_reed/irve-france-bornes-recharge.md
- **Developed by:** [keazee kzp](https://apify.com/coastal_reed) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 charge point results

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

## IRVE France — Bornes de recharge officielles

Localisez les **bornes de recharge pour véhicules électriques (IRVE)** en France à partir
du **fichier consolidé officiel** (data.gouv.fr, organisme QualiCharge / DGEC, republié par
ODRÉ — Open Data Réseaux Énergies), filtrable par commune, code postal, zone géographique,
puissance, type de prise et gratuité.

### Pourquoi cet Actor

Les scrapers IRVE existants sur le Store s'appuient sur OpenChargeMap (base communautaire,
couverture mondiale mais incomplète en France). Celui-ci lit directement le **fichier
officiel français** (227 000+ points de charge au 07/09/2026, mis à jour en continu par les
aménageurs), ce qui garantit exhaustivité et fraîcheur sur le territoire français.

### Cas d'usage

- Applications de mobilité électrique (recherche de borne par trajet/zone)
- Immobilier : lister les bornes à proximité d'un bien
- Logistique / flottes VE : planification d'itinéraire et de recharge
- Études de couverture territoriale (collectivités, énergéticiens)

### Input

| Champ | Type | Description |
|---|---|---|
| `commune` | string | Nom exact de la commune (ex: `Lyon`) |
| `codePostal` | string | Code postal exact |
| `departement` | string | Préfixe du code INSEE commune (ex: `69`) |
| `latitude` / `longitude` / `rayonKm` | number | Recherche par cercle géographique |
| `puissanceMinKw` | integer | Puissance nominale minimum (ex: `50` pour la charge rapide) |
| `typePrise` | enum | `type_2`, `combo_ccs`, `chademo`, `ef`, `autre` |
| `gratuitUniquement` | boolean | Ne renvoyer que les bornes gratuites |
| `maxResultats` | integer | Plafond de résultats (et donc de coût), défaut 500 |

### Output (par borne)

`idPdcItinerance`, `nomStation`, `nomEnseigne`, `adresse`, `codePostal`, `commune`,
`codeInseeCommune`, `latitude`, `longitude`, `nbrePdc`, `puissanceNominaleKw`,
`priseType2`, `priseComboCcs`, `priseChademo`, `priseEf`, `gratuit`, `paiementActe`,
`paiementCb`, `tarification`, `conditionAcces`, `horaires`, `accessibilitePmr`, `dateMaj`.

### Tarification (pay-per-event, à configurer dans Apify Console avant publication)

- Événement `result-item` : **0,001 $ / borne renvoyée** (= 1 $ / 1 000 résultats).
- Pas d'abonnement, pas de minimum. Le champ `maxResultats` plafonne le coût par run.

### Source, licence, conformité

- Source : `bornes-irve` sur https://odre.opendatasoft.com (miroir du fichier consolidé
  officiel `data.gouv.fr`, organisation QualiCharge/DGEC).
- Licence : **Licence Ouverte / Etalab** — réutilisation libre, y compris commerciale, avec
  mention de la source (faite dans chaque enregistrement via `sourceDataset`/`sourceUrl`).
- Données : infrastructures publiques (bornes), noms d'aménageurs/opérateurs (personnes
  morales). **Aucune donnée personnelle d'individus.**
- Aucun contournement de mesure technique : appel direct à une API ouverte, sans
  authentification, sans CAPTCHA, sans limitation contractuelle identifiée.

### Limites connues (vérifiées, pas supposées)

- Le champ officiel `departement`/`region` est souvent vide dans le jeu de données source ;
  le filtre `departement` de cet Actor contourne le problème en testant le préfixe du code
  INSEE commune (fiable).
- La fonction `suggest()` de l'API n'existe pas sur ce dataset (elle ne renvoie pas
  d'erreur mais ignore silencieusement le filtre) — cet Actor utilise une correspondance
  exacte sur `consolidated_commune` à la place. Testez avec l'orthographe officielle INSEE
  de la commune (accents compris) si un résultat semble manquant.
- **Piège géo confirmé en test local** : ni le paramètre `geofilter.distance` (API v1,
  sans effet sur l'endpoint v2.1 utilisé) ni la fonction ODSQL `within_distance()` sur le
  champ géo natif `coordonneesxy` ne fonctionnent — ce champ contient des couples
  latitude/longitude **inversés à la source** (valeurs hors plage pour la France). Cet
  Actor contourne le défaut : préfiltre "bounding box" sur les champs numériques fiables
  `consolidated_latitude`/`consolidated_longitude`, puis distance exacte calculée en JS
  (formule de Haversine) et tri par proximité. Résultat vérifié : recherche 5 km autour du
  centre de Lyon → 15/15 bornes réellement à ≤ 5 km, triées, la plus proche à 0,4 km.
- Fraîcheur : chaque enregistrement porte son propre `dateMaj` (mise à jour par
  l'aménageur), pas une date globale — certaines bornes peuvent être plus anciennes que
  d'autres dans un même run.

### Test local (fait, vérifié le 07/09/2026)

```
node test_local.js
```

→ 2 cas réels exécutés avec succès, écrits dans `test_output.json` :

1. Filtre commune exacte : 20 bornes à Lyon.
2. Filtre géo-radius (centre de Lyon, 5 km) : 15 bornes, toutes vérifiées ≤ 5 km, triées
   par distance croissante (la plus proche à 0,4 km).

# Actor input Schema

## `commune` (type: `string`):

Filtre sur le nom de la commune (ex: "Lyon", "Marseille"). Laisser vide pour ne pas filtrer.

## `codePostal` (type: `string`):

Filtre exact sur le code postal (ex: "69001"). Laisser vide pour ne pas filtrer.

## `departement` (type: `string`):

Filtre sur le code département (ex: "69" pour le Rhône). Déduit du code postal si absent.

## `latitude` (type: `number`):

À utiliser avec longitude + rayonKm pour une recherche géographique par cercle.

## `longitude` (type: `number`):

À utiliser avec latitude + rayonKm pour une recherche géographique par cercle.

## `rayonKm` (type: `integer`):

Rayon autour du point latitude/longitude.

## `puissanceMinKw` (type: `integer`):

Ne retourne que les points de charge dont la puissance nominale est ≥ à cette valeur (ex: 50 pour de la charge rapide).

## `typePrise` (type: `string`):

Filtre sur un type de prise disponible.

## `gratuitUniquement` (type: `boolean`):

Ne retourner que les bornes gratuites.

## `maxResultats` (type: `integer`):

Plafonne le nombre de points de charge renvoyés (et donc le coût pay-per-event).

## Actor input object example

```json
{
  "rayonKm": 10,
  "typePrise": "",
  "gratuitUniquement": false,
  "maxResultats": 500
}
```

# Actor output Schema

## `results` (type: `string`):

The list of official EV charging points matching the input filters.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("coastal_reed/irve-france-bornes-recharge").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("coastal_reed/irve-france-bornes-recharge").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 '{}' |
apify call coastal_reed/irve-france-bornes-recharge --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,coastal_reed/irve-france-bornes-recharge"
        }
    }
}
```

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/TEd6Ue5tpnt9H4k50/builds/rGbeJe9buE8CXlBoH/openapi.json
