SummaryFrance publishes one of the most usable medicine price files in Europe, and almost everyone reads it wrong. The public database carries a gross consumer price, not a manufacturer price, it covers only reimbursed products, and the route down to the French ex-factory level runs through a margin formula that is defined on the manufacturer price rather than on each trading stage. This article sets out what the file contains, what it leaves out, and how the back calculation actually works.
The public medicines database of the French state publishes a set of tab separated files. The one that carries prices is CIS_CIP_bdpm.txt, addressed through a constant URL without a token, which makes it one of the few European sources that a pipeline can fetch unattended. On 5 September 2026 the file returned HTTP 200 at 4,148,043 bytes.
| Property | Value |
|---|---|
| Source | Base de données publique des médicaments, file CIS_CIP_bdpm.txt |
| Price level | Consumer price including VAT |
| Format | Tab separated text |
| Update rhythm | Monthly, partial files more frequently |
| Pack code | CIP13 |
| Licence | Licence Ouverte Etalab 2.0, commercial use explicitly permitted |
| Conditions | Attribution and the date of the extract are mandatory |
The licence matters commercially. Etalab 2.0 permits commercial reuse, including reuse in a paid product, provided the source and the update date travel with the data. That is a lighter obligation than most European price sources impose, and it is the reason France sits in the first wave of any European price project.
The price field in the file is described as the price of the medicine in euro. It is a gross consumer price and it excludes the pharmacy dispensing fee, which is charged separately in France. A figure taken from that column is therefore neither what the manufacturer receives nor what the patient pays at the counter. It is a defined intermediate value, and it needs to be labelled as such in any dataset that stores it.
The file lists 20,900 packs. A price is present for 13,648 of them. The gap is not a data quality problem, it is the scope of the file: products that are not reimbursed by the statutory system are not priced there, because their prices are not regulated.
Anyone reporting a French average price from this file is therefore reporting the reimbursed segment. That is a defensible figure as long as the denominator is stated. Presented as a national average across all medicines, it is wrong.
The French pack code CIP13 is a valid GTIN-13. We verified this across all 20,900 packs in the file, and the property holds without exception. That is an unusually clean result for a European price source and it decides the whole matching strategy: the join runs on the code, not on the pack description.
The pack size itself is only available as free text inside the product designation, with inconsistent grammar. The number sometimes stands at the front, sometimes after a preposition, and combination packs carry it twice. Parsing it is worth doing as a plausibility check against the code based join, but it is not a foundation to build on.
The French ex-factory equivalent is the prix fabricant hors taxes. Reaching it from the published consumer price takes two operations, and the second one is more complicated than it looks.
Step one: remove VAT at 2.1 percent. France applies a super reduced rate to reimbursable medicines under Article 281 octies of the tax code. Divide the gross price by 1.021.
Step two: remove both trade margins. The statutory schedule is set in the Arrêté du 4 août 1987, annexes I-1 and I-2, in the version in force on 3 September 2026. Two properties of that schedule decide the implementation.
The wholesale margin is 6.93 percent with a minimum of 0.30 euro and a cap of 32.50 euro, and it applies up to a manufacturer price of 468.97 euro. The pharmacy margin follows a band scale:
| Manufacturer price from | to | Rate |
|---|---|---|
| 0.00 euro | 1.91 euro | 10 percent |
| 1.92 euro | 22.90 euro | 7 percent |
| 22.91 euro | 150.00 euro | 5.5 percent |
| 150.01 euro | 1,930.00 euro | 5 percent |
| above 1,930.00 euro | 0 percent |
The decisive detail: both margins are calculated on the manufacturer price, not on the purchase price of the respective stage. That is unusual in Europe, where most schedules apply each margin to the price at which that stage buys. It also means the formula cannot be inverted algebraically stage by stage. The forward function is monotonic, so the practical route is a numerical inversion: search for the manufacturer price whose forward calculation reproduces the published consumer price.
There is a second French source that carries the manufacturer price directly. The national health insurance code database exposes a field for the prix fabricant hors taxes in its item view, and the value is populated.
It is not usable as a bulk source. The field is reachable only through a single query per CIP13, the site states in plain words that the bulk module is not in operation, and the host is reachable over HTTP only, with port 443 refusing the connection. For a pipeline covering more than 20,000 packs, that route does not carry. It is useful for spot checks of a back calculation, and for nothing else.
The French wholesale margin changes on 20 January 2027. Every stored back calculation therefore needs a rule version and a validity window, not just a result. A dataset that carries a derived French manufacturer price without the date of the rule that produced it will be silently wrong from that day on, and the error will look like a price change rather than a calculation artefact.
This is the general lesson from France, and it applies to every derived price in Europe: store the rule, its legal basis and its effective date next to the number.
Reading the price column as a manufacturer price. It is a gross consumer figure. The distance between the two is not a rounding difference, it is two trade margins plus tax.
Treating a missing price as a price of zero. Roughly a third of the rows have no price because the product is outside the reimbursed segment. Those rows belong in a separate bucket, not in an average.
Joining on the pack description. The description carries the pack size in free text with inconsistent grammar, and combination packs carry two numbers. The code is a valid GTIN across the entire file, so the join belongs on the code and the description belongs in the validation step.
A fourth point is organisational rather than technical. The main file is monthly, but partial files appear more often, so a pipeline that fetches only once a month will lag behind the fastest available state of the data. Decide deliberately which rhythm you promise your own users, and record the extract date with every delivery.
France appears in several national reference price baskets, including the Dutch maximum price calculation, and it is one of the countries that publishes a gross figure while its basket partners publish net ones. That asymmetry is exactly why the normalisation above matters: without it, France looks systematically expensive against countries that publish at manufacturer level, for reasons that have nothing to do with French prices.
Read together with the German system, France is also the clearest illustration of the two European models. Germany publishes and negotiates at manufacturer level and the negotiated figure becomes visible. France publishes at consumer level and leaves the manufacturer figure to be reconstructed, except in a single query interface that no pipeline can use.
The French price file is open, licensed for commercial use, fetchable from a constant URL, and keyed by a code that doubles as a GTIN. Those four properties make it one of the best starting points in Europe. What it does not give you is a manufacturer price, a complete national universe or a stable formula: two thirds coverage, a numerically inverted margin schedule, and a rule change already scheduled for January 2027.
Related reading: European Drug Pricing Database: how cross-border prices work and Pharma pricing Germany: how the system works, plus VAT on medicines in Europe and wholesale and pharmacy margins.
pharmazie.com is the consolidated pharmaceutical data platform by DACON Datenbank Consulting GmbH that bundles 25+ specialist databases into a single search, exclusively for healthcare professionals. Price coverage focuses on the DACH region and a number of further EU countries, with more countries following in the coming months.
In the public medicines database of the French state, in the file CIS_CIP_bdpm.txt, reachable through a constant URL and licensed for commercial reuse under Licence Ouverte Etalab 2.0.
Remove VAT at 2.1 percent, then invert the statutory margin schedule from the Arrêté du 4 août 1987. Because both margins sit on the manufacturer price, the inversion is numerical rather than algebraic.
Not as a bulk field. The published figure is a gross consumer price. The manufacturer price exists in a separate single query interface of the health insurance code database, which is not usable for a pipeline.
It lists 20,900 packs and carries a price for 13,648 of them. Products outside the reimbursed segment have no regulated price and therefore no entry.
The French ex-factory price, the amount the manufacturer receives before wholesale margin, pharmacy margin and tax.
Yes. Licence Ouverte Etalab 2.0 permits commercial reuse, provided the source and the update date are stated.