# Firm-level aid and outcomes: sources and method

Retrieved 2026-10-03/04. Every file was downloaded through the publishers' own
export APIs (Opendatasoft `exports/parquet`, data-fair `lines?format=xlsx`) and
parsed locally. No value is imputed: a missing amount, date or account item is
left empty. The OCaml tools in `build/` rebuild everything from `raw/`, run
from the repository root (`FIRMS_DIR` names another directory):
`dune exec data/firms/build/build_aid.exe` (→ `aid_raw.csv`,
`aid_dropped.csv`), then `dune exec data/firms/build/build_outcomes.exe`
(→ `aid.csv`, `firm_attributes.csv`, `outcomes.csv`, `coverage.csv`), then
`dune exec data/firms/build/compact.exe -- data/firms data/firms/panel.csv`
(→ `panel.csv`, the extract `analysis/firms.ml` reads).

## Output files

| file | grain | rows |
|---|---|---|
| `aid.csv` | one award record as published | 222,551 records, 55,889 SIREN |
| `firm_attributes.csv` | one SIREN (aid recipients + control sample) | 201,619 |
| `outcomes.csv` | SIREN x fiscal year with filed accounts | 495,259 (aid 20,906 SIREN, sample 70,254 SIREN) |
| `coverage.csv` | counts by group and year | |
| `aid_dropped.csv` | records whose identifier could not be turned into a SIREN | |
| `evaluations.md` | published firm-level evaluations, verbatim quotes | 15 documents |

### aid.csv columns
`siren, scheme, amount_eur, date, source` (required), then `date_kind`
(convention / decision / publication / year / empty), `programme` (tag derived
by regex from the scheme name and object: "France Relance" for `PDR`, `plan de
relance`, `relance`; "France 2030/PIA"; "Fonds vert"; empty otherwise; a tag,
not an official classification), `sub_scheme`, `granting_body`,
`beneficiary_name`, `siret`, `siren_fix`, `record_ref`, `legal_category`,
`is_firm` (Sirene legal category starting 1-6), `sirene_found`.

Identifier rule: strip white space, then a trailing `.0` (an id stored as a
number), then dots; 13-14 digits are SIRET (left-padded to 14,
Luhn-checked; if the SIRET fails but its 9-digit prefix passes, it is kept and
`siren_fix` says `siret_luhn_fail`); 7-9 digits are SIREN (left-padded to 9,
Luhn-checked). Any padding is recorded in `siren_fix` (56 records; 5 of the
padded France Relance ids are not found in Sirene and are probably
New Caledonia RIDET numbers, so treat `siren_left_pad` rows with care).

## 1. Aid recipient lists

| source (as in `source` column) | publisher, URL | records / SIREN / firm SIREN | amount | date |
|---|---|---|---|---|
| `data.economie.gouv.fr/plan-de-relance` | DGE, "Plan de relance - Projets industriels : liste, géolocalisation et description synthétique des projets", https://data.economie.gouv.fr/explore/dataset/plan-de-relance/ (3,080 rows) | 3,033 / 2,684 / 2,606 | **not published** | **no award date**; only the list update date (`record_ref=list_update=…`, 2021-2022) |
| `data.ademe.fr/les-aides-financieres-de-l-ademe` | ADEME, all aid committed since 2021, no threshold, https://data.ademe.fr/datasets/les-aides-financieres-de-l'ademe (39,807 rows, updated 2026-10-03) | 39,511 / 23,370 / 11,835 | yes | convention date 2021-2026 |
| `…/fr-esr-laureats-concours-i-nov` | MESR, i-Nov laureates (PIA / France 2030 innovation contest), https://data.enseignementsup-recherche.gouv.fr/explore/dataset/fr-esr-laureats-concours-i-nov/ (753 rows) | 753 / 723 / 723 | grant (`subvention`), 48 missing | publication date 2018-2025 |
| `…/fr-esr-laureats-concours-national-i-lab` | MESR, i-Lab laureates 1999-2026, https://data.enseignementsup-recherche.gouv.fr/explore/dataset/fr-esr-laureats-concours-national-i-lab/ (3,992 rows; 941 without SIREN dropped) | 3,046 / 2,470 / 2,467 | not published | contest year only |
| `data.iledefrance.fr/aides-financieres-attribuees-par-la-region-aux-entreprises` | Région Île-de-France, aid decisions to firms 2016-2017 (3,731 rows; 20 "Désaffectation" dropped) | 3,280 / 1,738 / 1,314 | yes (text parsed) | decision date |
| `data.iledefrance.fr/laureats-relance-industrie` | Région IDF, "Relance industrie" laureates | 95 / 95 / 95 | yes | none |
| `data.iledefrance.fr/entreprises-laureates-innovup-leader-pia` | Région IDF, Innov'up Leader PIA | 144 / 144 / 144 | yes | none |
| `data.centrevaldeloire.fr/conventions-de-subventions-YYYY` | Région Centre-Val de Loire, SCDL subsidy conventions 2018-2025 (8 datasets) | 7,510 / 2,692 / 842 | yes | convention date |
| `data.laregion.fr/subventions-du-conseil-regional` | Région Occitanie, subsidies voted since 2018 where the yearly total per recipient ≥ 23,000 EUR (64,541 rows; 373 anonymised "*" ids dropped) | 64,124 / 12,091 / 5,830 | voted amount | decision date |
| `data.bretagne.bzh/subventions_attribuees_scdl0` | Région Bretagne, SCDL subsidies since 2014 (103,414 rows) | 101,055 / 14,134 / 3,959 | yes | convention date |

Regional and ADEME lists cover every kind of beneficiary (communes, schools,
associations, public bodies). Use `is_firm = 1` to keep firms. Firm SIREN
across all lists: 27,043, of which 18,866 have at least one filed account in
`outcomes.csv`.

France Relance industrial list by measure (records): territorial industrial
investment ("Territoires d'industrie" calls) 1,153; (re)localisation in
critical sectors 518 published, 516 kept; automotive modernisation 484;
aeronautics 418; nuclear supply chain 195; energy efficiency in industry 92;
low-carbon heat 87; AMI Capacity (Covid therapeutics) 48; skills 40.
Additional France Relance recipients are in the ADEME list (`programme`
contains "France Relance": 2,934 SIREN across lists) and France 2030/PIA
recipients (851 SIREN across lists).

### Aid sources looked for and not obtained
- **EU State aid Transparency Award Module (TAM), France.** The public search
  (https://webgate.ec.europa.eu/competition/transparency/public?lang=en) only
  returns results after an interactive (POST/JavaScript) search; GET requests
  return the empty form, and data.europa.eu only links back to it. No bulk
  file exists. To get it: open the public search, choose Country = France,
  run the search and use the page's export (xlsx), in date slices if the
  export is capped. Not downloaded.
- **France 2030 laureates (SGPI / Bpifrance).** No national open list with
  SIREN found on data.gouv.fr (one prefecture dataset "France 2030" has no
  files; CDC publishes "Démonstrateurs ville durable", which are local
  authorities). France 2030 calls operated by ADEME are inside the ADEME list;
  i-Nov and Innov'up are included.
- **Bpifrance innovation aid.** Bpifrance publishes no beneficiary list on
  data.gouv.fr (only vehicle-fleet declarations).
- **CIR / JEI beneficiaries.** Not public (tax secrecy). MESR publishes only
  the lists of *approved R&D providers* (CIR/CII agréments), which are not
  beneficiaries, so they were not used.
- **Other regions.** Normandie publishes yearly SCDL subsidy CSVs 2016-2025
  (https://www.datanormandie.fr/…/subventions_region_normandie_YYYY.csv,
  listed on data.gouv.fr org `region-normandie`) but serves them as text that
  the download tool truncates, so they are not included; download them
  directly. Pays de la Loire publishes a scheme catalogue, not recipients.
  Grand Est (2012-2014 dataset with no file), Hauts-de-France (FEDER
  operations only), AURA, Nouvelle-Aquitaine, BFC and PACA: no recipient
  dataset found through the data.gouv.fr API. Île-de-France PM'up 2008-2014
  laureates have names only, no SIREN, so they are not included
  (`raw/regions/idf_pmup_2008_2014.parquet`).

## 2. Outcomes

### Sirene (legal-unit attributes)
Source: Insee Sirene v3 as mirrored by Opendatasoft,
https://public.opendatasoft.com/explore/dataset/economicref-france-sirene-v3/
(one row per establishment with the legal-unit fields; latest
`datederniertraitementunitelegale` 2026-07-31). Downloaded as head-office rows
(`etablissementsiege = "oui"`):
- every head office with legal-unit headcount band ≥ "1 ou 2 salariés",
  active or ceased: 1,747,844 rows, which matches the server's group counts
  exactly (`raw/sirene/chunk_*.parquet`, `heads_tr21plus.parquet`);
- every head office with band "0 salariés": `raw/sirene/heads_tr0.parquet`;
- per-SIREN lookups for the 1,459 France Relance / France 2030 / i-Lab / i-Nov
  recipients not in those files: 1,451 found
  (`raw/sirene_lookup/priority_lookups.parquet`).
14,290 other aid SIREN (mostly non-employer associations, farms and small
firms on the regional and ADEME lists) were not looked up: the tool accepts
URLs of about 2,000 characters, so the lookup takes 80 SIREN per request and
would need about 180 more. The ready-made URLs are in
`raw/missing_sirens_urls.txt` (it also contains the priority SIREN).
`sirene_found = 0` marks them.

Fields kept: creation date, NAF (`activiteprincipaleunitelegale`), legal
category, current headcount band and its reference year (2023 for all bulk
rows), firm category (PME/ETI/GE), state (A/C), start date of the current
period (= closure date when state is C), head-office commune.

**Headcount band by year is not available in open data.** Sirene keeps only
the latest band; the history files (`StockUniteLegaleHistorique`) do not
track headcount. `headcount_band` is therefore the same 2023 value on every
year of a firm in `outcomes.csv`, and `headcount_band_year` says so. Yearly
employment needs DSN / FARE microdata through CASD (restricted access).
The full Insee stock files (data.gouv.fr "Base Sirene des entreprises et de
leurs établissements", `StockUniteLegale_utf8.zip/parquet`) are the canonical
bulk source, but each is over the tool's 10 MB download limit, which is why
the Opendatasoft mirror was used.

### Annual accounts
Source: "Ratios Financiers (BCE / INPI)", Ministères économiques et financiers,
https://data.economie.gouv.fr/explore/dataset/ratios_inpi_bce/ (built from the
INPI RNCS/RNE open accounts; 6,813,145 rows, modified 2026-09-15). Downloaded
**completely**: 45 parquet chunks by fiscal year x first SIREN digit,
`raw/ratios/`. The yearly row counts match the server's group-by counts
exactly. Fields: turnover (`chiffre_d_affaires`), gross margin, EBE (EBITDA),
EBIT, net income, balance type (C complete, S simplified, K consolidated) and
confidentiality status. `outcomes.csv` keeps one account per SIREN x
fiscal-year-end year: type C first, then S, then K; within a type, the latest
closing date. `n_accounts_in_year` counts the alternatives.

Caveats: firms that opt for confidentiality ("Partiellement confidentiel")
may show 0 for P&L items. Turnover 0 is reported as published.
**Value added and payroll are not in this dataset**, so those columns are
empty. They are in the full liasse fiscale, which INPI distributes as
"comptes annuels" (RNE) through its own data portal (data.inpi.fr) API/SFTP
after free registration. Access terms were not verified in this session and
nothing was downloaded from INPI. Coverage by year (firms with accounts):
2016-2024 about 11-14k aid SIREN and 31-42k sample SIREN a year; 2025
partial.

### Control sample
Frame: Sirene head offices that are Active, have band ≥ 1 employee, have a
legal category starting with 1-6 (firms; excludes 7 public administration, 8
social-security and mutual bodies, 9 associations and foundations) and are not
in any aid list. That is 1,457,299 SIREN. Simple random sample without
replacement of 10% (145,730) of the sorted frame: `build_outcomes` draws it by a
partial Fisher-Yates shuffle with OCaml's `Random.State.make [| 20261003 |]`,
so a rerun on the same frame draws the same sample. The frame is today's
active firms, so the sample is survivor-biased for pre-2026 years. Aid
recipients are kept whatever their state.

## 3. Evaluations
See `evaluations.md` (sources, verbatim quotes and page numbers; PDFs and
extracted text in `raw/eval/`).

## 4. Industrial CO2 by facility (`co2.csv`)

Added 2026-10-15 for the decarbonisation aim. Source: Ministère de la
Transition écologique, registre des émissions polluantes (IREP), yearly
files https://files.georisques.fr/irep/YYYY.zip for 2015-2024 (the copies
dated 13 November 2025 that the `house` project downloaded into
`pipeline/data/raw/irep/`), Licence Ouverte. Each zip was unzipped and
`dune exec data/firms/build/co2.exe -- IREP_DIR data/firms/co2.csv` keeps,
for each facility and year, the line "Dioxyde de carbone (CO2) total
(d'origine biomasse et non biomasse)" (its two parts are published beside it
and would double it), in tonnes, with the facility's SIREN (the first nine
digits of its SIRET) and NAF code from `etablissements.csv`. A quantity
written "<[valeur seuil]>" (below the reporting threshold) is left out;
facilities without a SIRET are dropped. `analysis/firms.ml` keeps the
facilities that declared CO2 every year 2015-2024, because the number
declaring doubled in 2021.
