Tutorial · France

BODACC API in Node.js

France publishes its company notices as open data, insolvency included. Here is how to query it from Node — and how to read the results without drawing the wrong conclusion.

The endpoint

BODACC is published by the DILA through an Opendatasoft instance. No key, no signup — but the query language is Opendatasoft's, not something bespoke, which is the main thing to learn.

const BASE = 'https://bodacc-datadila.opendatasoft.com/api/explore/v2.1'
const DATASET = 'annonces-commerciales'

async function bodacc(params) {
  const url = new URL(`${BASE}/catalog/datasets/${DATASET}/records`)
  for (const [k, v] of Object.entries(params)) url.searchParams.set(k, v)
  const res = await fetch(url)
  if (!res.ok) throw new Error(`BODACC ${res.status}`)
  return res.json()
}

const { results } = await bodacc({ where: 'registre LIKE "552032534"', limit: 5 })
console.log(results.length, 'notices')

The families of notice

familleavis is the field that tells you what kind of event you are looking at. Filter on it or you will mix an incorporation in with a liquidation.

ValueMeaning
collectiveProcédures collectives — sauvegarde, redressement, liquidation. The risk signal.
creationImmatriculations — new registrations.
modificationChanges to an existing registration.
radiationRemoval from the register.
venteSales and transfers of a fonds de commerce.
depotFiling of annual accounts — note this is the FACT of filing, not the accounts.
async function insolvencyFor(siren) {
  const { results } = await bodacc({
    where: `registre LIKE "${siren}" AND familleavis = "collective"`,
    order_by: 'dateparution DESC',
    limit: 20,
  })
  return results.map(r => ({
    date: r.dateparution,
    court: r.tribunal,
    kind: r.familleavis_lib,
    detail: r.jugement,           // often a JSON string, see below
  }))
}

Two traps worth knowing

  1. jugement is frequently a JSON-encoded string, not an object. Parse defensively — the shape is not stable across years.
  2. [ND] means "non disponible". It is a privacy redaction applied at source, not missing data or a broken feed. Treat it as a legitimate value rather than filtering the record out.
function parseJugement(raw) {
  if (!raw) return null
  if (typeof raw === 'object') return raw
  try { return JSON.parse(raw) } catch { return { texte: String(raw) } }
}

const isRedacted = v => typeof v === 'string' && v.includes('[ND]')

Do not treat every collective notice as a failure

This is the mistake that produces bad credit decisions. The three main procedures mean materially different things:

  • Sauvegarde — the company is not in cessation des paiements. It is acting early. Treating this as insolvency is simply wrong.
  • Redressement judiciaire — cessation des paiements established, with a prospect of recovery.
  • Liquidation judiciaire — recovery judged impossible.

A single boolean "has insolvency notice" flag collapses all three and will misprice risk in both directions.

Where a multi-country layer helps

BODACC is free and authoritative, and if France is your only market, querying it directly is entirely reasonable — you do not need us for that.

What you take on by doing it yourself: the notice families and their historical drift, the jugement shape changes, SIREN linkage where the notice does not carry a clean identifier, and a wholly different integration for every other country. The same French insolvency through Prometiam, normalised alongside eight other markets:

const res = await fetch(
  'https://api.prometiam.com/functions/v1/risk-api/insolvency/search?name=' +
  encodeURIComponent('exemple sarl') + '&country=FR',
  { headers: { Authorization: `Bearer ${process.env.PROMETIAM_API_KEY}` } })
const { data } = await res.json()
// /insolvency/search is the cross-border endpoint: same shape for FR, FI, DE,
// GB, AT, NO, CH, US, NL, DK, HR and SE. NOTE: plain /search is the ES-only index and returns
// an empty set with an explanatory notice for country=FR.

Corporate notices only — personal insolvency is never returned, which is a deliberate boundary rather than a filter.

FAQ

Is the BODACC API free?
Yes. It is published as open data by the DILA through Opendatasoft, with no key required.

What does familleavis mean?
The category of notice — collective for insolvency proceedings, creation for registrations, radiation for removals, and so on. Filter on it or you will mix event types.

What does [ND] mean in a BODACC record?
"Non disponible" — a privacy redaction applied at source. It is a legitimate value, not missing data.

Does BODACC publish annual accounts?
It publishes the fact that accounts were filed, not the financial statements. For the accounts themselves, Prometiam serves annual accounts as filed for France from the Scale plan (not for companies that declare their accounts confidential), or you can use Infogreffe or a specialist provider.

Is a sauvegarde notice a bankruptcy?
No. Sauvegarde means the company is not in cessation des paiements and is acting pre-emptively. Collapsing it together with liquidation judiciaire is a common and costly misreading.