Vous monitorez les prix d'un retailer qui opère dans une dizaine de pays ? Sur Lidl, la même référence ERP peut valoir 17,99 € en France, 29,99 € en Allemagne et 119 PLN en Pologne le même jour, avec ou sans promo, parfois sans listing du tout.
Pour une équipe pricing ou data, le défi n'est pas seulement de collecter ces chiffres : c'est de comparer des offres régionales distinctes sans mélanger devises, promos asynchrones et trous d'assortiment. Piloterr expose chaque boutique Lidl telle qu'elle s'affiche au client local, via l'API Lidl, sur 27 marchés.
Cet article explique comment structurer un pipeline de monitoring des prix multirégionaux, pourquoi les écarts existent (et ne sont pas des bugs), puis comment les observer concrètement avec des appels API et un script Python.
Un produit, plusieurs offres commerciales
En théorie économique, la discrimination tarifaire consiste à facturer chaque segment selon sa disposition à payer. Sur le web, la segmentation géographique est triviale : lidl.fr et lidl.de sont deux contextes commerciaux distincts, même s'ils portent la même enseigne.
Concrètement, chaque boutique nationale calibre son prix en fonction de :
- La concurrence locale (Castorama en France, OBI en Allemagne, etc.)
- Le positionnement perçu de la marque sur ce marché
- Le calendrier promo propre à la filiale
- Le pouvoir d'achat et les repères tarifaires locaux
Le résultat : même identité produit, offre économique différente. Ce n'est pas une anomalie à corriger dans votre pipeline, c'est la donnée à capturer.
Ce qui fait bouger le prix d'un pays à l'autre
Coûts et contraintes locales
Deux régions peuvent vendre le même SKU tout en faisant face à des structures de coût différentes :
| Facteur | Impact |
|---|---|
| TVA et règles fiscales | Affichage TTC, taux variables |
| Douanes et import | Hors marché unique, surtout |
| Logistique et dernier kilomètre | Contrats transporteurs, main-d'œuvre |
| Conformité (emballage, étiquetage) | Coûts de mise en conformité |
| Fraude et moyens de paiement | Risque et frais par marché |
Le prix affiché intègre ces contraintes. Comparer la France et la Pologne sans conversion de devise ni contexte local ne dit rien de la stratégie commerciale réelle.
Les promotions ne sont pas synchronisées
Les mécaniques promo (prix barré, badge « −44 % », « mega deal ») sont décidées pays par pays. Un produit soldé en France peut être au prix plein en Allemagne le même jour. Ce n'est pas une incohérence API : c'est la décentralisation des calendriers promo.
Pour l'analyse, deux conséquences :
- Le prix courant et le prix de référence doivent être stockés séparément.
- Le
discount_percentageest une donnée dérivée : il peut être absent quand aucune promo locale n'est active.
L'assortiment n'est jamais identique à 100 %
Certaines références ERP sont pan-européennes. D'autres ne sont listées que là où la demande, la réglementation ou la logistique le permettent. Titres, slugs et fiches produit varient aussi selon la locale.
L'absence de listing est elle-même un signal : produit non distribué, rupture temporaire ou retrait catalogue. À ne pas confondre avec une erreur de requête.
La devise fait partie de l'offre légale
Les boutiques multirégionales exposent la devise native de leur juridiction. Pour certains marchés (Bulgarie, par exemple), une seconde devise peut apparaître en complément.
En analytics, stockez toujours (prix, devise, région, horodatage). Convertissez offline si vous avez besoin de comparabilité. L'API ne doit pas normaliser tout en EUR : le prix affiché est l'offre commerciale et légale telle que le client la voit.
Le bon modèle mental pour vos données
Pensez en offres régionales, pas en prix unique :
Identité produit globale (ERP / SKU)
│
┌────┼────┐
▼ ▼ ▼
Offre Offre Offre
FR DE PL
17,99€ 29,99€ 119 PLN
promo — —
Chaque couple (erp_id, région) est une offre distincte. Votre clé d'enregistrement devrait ressembler à :
(erp_id, region, observed_at) → { price, currency, old_price, in_stock, url, locale }
C'est ce modèle qui évite les comparaisons trompeuses et les dashboards qui mélangent des pommes et des poires.
Cas concret : une perceuse PARKSIDE sur 8 pays
Prenons la référence ERP 100397447, la perceuse à percussion PARKSIDE PSBM 750 B3. Même produit, observé sur plusieurs boutiques Lidl en juin 2026 :
| Région | Prix | Devise | Ancien prix | Lecture |
|---|---|---|---|---|
| France | 17,99 | EUR | 31,99 | Promo active (~−44 %) |
| Espagne | 19,99 | EUR | — | Pas de barré au moment de l'observation |
| Slovaquie | 19,99 | EUR | 29,99 | Promo |
| Belgique (FR/NL) | 24,99 | EUR | 34,99 | Même prix sur les deux locales BE |
| Pologne | 119,00 | PLN | — | ≈ 27 € au change courant |
| Allemagne | 29,99 | EUR | — | ~67 % de plus qu'en France, en nominal EUR |
| Pays-Bas | 29,99 | EUR | — | Aligné sur l'Allemagne |
| Tchéquie | 999,90 | CZK | — | ≈ 40 € au change courant |
Non listé au moment du test : Royaume-Uni, Italie, Portugal, Hongrie, Roumanie. Même ERP, assortiment partiel.
Quatre enseignements en une seule fiche produit :
- L'euro ne garantit pas l'uniformité : 17,99 € vs 29,99 € dans la zone euro.
- Les promos sont asynchrones : FR, SK et BE soldés ; DE et NL au plein tarif.
- Les devises exigent une conversion pour toute comparaison sérieuse.
- La couverture catalogue varie : un produit « européen » n'est pas forcément partout.
Ce que renvoie l'API (France vs Allemagne)
En France, la boutique affiche une promotion :
{
"product_id": "100397447",
"title": "PARKSIDE® Perceuse à percussion PSBM 750 B3, 10 Nm, 750 W",
"price": 17.99,
"old_price": 31.99,
"discount_percentage": 43.0,
"currency": "EUR",
"locale": "fr-fr",
"in_stock": true
}
En Allemagne, même référence, autre titre, autre prix, pas de promo :
{
"product_id": "100397447",
"title": "PARKSIDE® Schlagbohrmaschine »PSBM 750 B3«",
"price": 29.99,
"currency": "EUR",
"locale": "de-de",
"in_stock": true
}
L'API ne cherche pas à harmoniser. Elle remonte ce que chaque boutique affiche. L'écart que vous voyez dans les réponses est le même écart qu'un client verrait en changeant de site national.
Exemples avec l'API Piloterr
Deux endpoints couvrent le cas d'usage : produit pour une offre régionale précise, recherche pour découvrir des références dans un catalogue national. Le paramètre query accepte une référence ERP, une URL Lidl complète ou un mot-clé ; region cible la boutique quand l'URL n'est pas fournie.
Appels curl : même ERP, deux régions
Remplacez YOUR-API-KEY par votre clé depuis le tableau de bord Piloterr.
France (promo active au moment de l'observation) :
curl -G "https://api.piloterr.com/v2/lidl/product" \
-H "x-api-key: YOUR-API-KEY" \
--data-urlencode "query=100397447" \
--data-urlencode "region=fr"
Allemagne (même référence, prix différent) :
curl -G "https://api.piloterr.com/v2/lidl/product" \
-H "x-api-key: YOUR-API-KEY" \
--data-urlencode "query=100397447" \
--data-urlencode "region=de"
Vous pouvez aussi passer une URL nationale : la région est alors inférée du domaine et le paramètre region est ignoré.
curl -G "https://api.piloterr.com/v2/lidl/product" \
-H "x-api-key: YOUR-API-KEY" \
--data-urlencode "query=https://www.lidl.pl/p/parkside-wiertarka-udarowa-750-w-psbm-750-b3/p100397447"
Recherche pour identifier des références ERP dans un marché donné :
curl -G "https://api.piloterr.com/v2/lidl/search" \
-H "x-api-key: YOUR-API-KEY" \
--data-urlencode "query=perceuse" \
--data-urlencode "region=fr"
Python : comparer une référence sur plusieurs régions
Ce script interroge plusieurs boutiques pour une même référence ERP et affiche un snapshot comparatif. Les listings absents sont traités comme des offres nulles, pas comme des erreurs fatales.
import requests
from datetime import datetime, timezone
PILOTERR_API_KEY = "YOUR-API-KEY"
ERP_ID = "100397447"
REGIONS = ["fr", "de", "pl", "es", "nl", "cs"]
def fetch_lidl_offer(erp_id: str, region: str) -> dict | None:
response = requests.get(
"https://api.piloterr.com/v2/lidl/product",
headers={"x-api-key": PILOTERR_API_KEY},
params={"query": erp_id, "region": region},
timeout=30,
)
if response.status_code == 404:
return None
response.raise_for_status()
return response.json()
def main():
observed_at = datetime.now(timezone.utc).isoformat()
print(f"ERP {ERP_ID} — observed at {observed_at}\n")
for region in REGIONS:
try:
offer = fetch_lidl_offer(ERP_ID, region)
except requests.HTTPError as exc:
print(f"{region.upper():<4} error {exc}")
continue
if offer is None:
print(f"{region.upper():<4} — not listed")
continue
price = offer.get("price")
currency = offer.get("currency", "?")
old_price = offer.get("old_price")
promo = f" (was {old_price})" if old_price else ""
stock = "in stock" if offer.get("in_stock") else "out of stock"
print(f"{region.upper():<4} {price} {currency}{promo} {stock}")
if __name__ == "__main__":
main()
Exemple de sortie (juin 2026) :
ERP 100397447 — observed at 2026-06-15T09:00:00+00:00
FR 17.99 EUR (was 31.99) in stock
DE 29.99 EUR in stock
PL 119.0 PLN in stock
ES 19.99 EUR in stock
NL 29.99 EUR in stock
CS 999.9 CZK in stock
Pour une comparaison cross-devise, convertissez offline avec vos taux FX du jour. L'API renvoie le prix tel qu'affiché sur la boutique locale ; c'est la bonne granularité pour du monitoring conforme et de l'archivage promo.
Doc complète : Lidl Search et scraper Lidl.
Ce que ça implique pour votre veille tarifaire
Si vous monitorez des prix multirégionaux (Lidl ou ailleurs), quelques principes simples :
À faire
- Fixer une clé produit globale (ERP, GTIN, SKU fabricant) pour joindre les offres.
- Interroger chaque région explicitement :
region=fr,region=de, etc. - Conserver horodatage, devise et locale à chaque snapshot.
- Traiter les listings absents comme des offres nulles, pas comme des erreurs.
- Séparer prix courant, prix de référence et disponibilité.
À éviter
- Comparer 119 PLN et 17,99 EUR sans conversion FX.
- Prendre une seule région comme « le prix Lidl ».
- S'attendre à des flags promo identiques d'un pays à l'autre.
- Confondre absence de produit et panne technique.
Pour Lidl spécifiquement, Piloterr couvre 27 boutiques nationales (fr, de, pl, gb, ch, cs, be, etc.).
Les cas limites qui surprennent en production
| Phénomène | Interprétation |
|---|---|
price: null sur certains listings autrichiens | Produit visible, mais pas de prix en ligne dans le payload |
| Double devise (ex. Bulgarie) | La devise principale suit les règles d'affichage du shop |
Produit absent sur lidl.co.uk | Trou dans l'assortiment, pas échec API |
| Titres et slugs différents FR/DE | Même ERP, merchandising localisé |
old_price incohérent sur certaines catégories | Valider la sémantique par univers produit |
Ces cas ne remettent pas en cause le principe général : chaque région est une offre autonome.
En résumé
Les écarts de prix entre pays en e-commerce sont structurels et intentionnels. Ils viennent de la segmentation de marché, des coûts locaux, des devises, des promos décentralisées et des choix d'assortiment.
Lidl en est une illustration nette : une référence ERP, huit offres régionales différentes sur le même outil. Avec Piloterr, vous accédez à chacune telle qu'elle est présentée au client local, prête à alimenter un pipeline de monitoring des prix ou une analyse de positionnement concurrentiel.
Pour aller plus loin sur la conformité des prix promo en Europe, voir notre article sur la directive Omnibus.
Prix et disponibilités mentionnés : observations de juin 2026. Ils évoluent avec les promotions et les révisions tarifaires.