# Batch default-risk score, by basket

This route sorts a customer file without a second scorecard: every line carries the same score as the unit route, placed in a basket (exposed, to watch, healthy, not assessable, ceased). Two scores computed on different axes stay in separate groups. The exposed basket comes back whole, in served order (axis set, then score), 100 company numbers at most, with the 30-day quote for its daily watch, paid separately: the per-target price times the number of targets. To watch only the first 30, keep its first 30 company numbers.

## What the route returns

Catalogue description, exactly as agents read it:

**Batch credit risk scoring of 2 to 100 French companies (comma-separated sirens): each line has the score, class and model version of GET /v1/score/defaillance/{siren} and a closed-list basket (expose, a_surveiller, sain, non_evaluable with its cause, cessee). Rank my customers by risk and monitor the 30 most exposed: chainage.surveillance lists the whole ranked expose basket (100 at most) with its 30-day quote, targets x unit price; keep the first 30. $0.07 per SIREN, unknown SIREN included.**

## Expected identifier

`sirens` parameter: 2 to 100 company numbers, comma-separated.

> ⚠️ A wrongly formatted identifier in the **path** returns `400` and is **not billed** — but it costs you a round trip. It is the leading cause of failed calls on the foreign routes. A **search** parameter, by contrast, is cleaned up: unsupported characters are stripped and the usable query is served.

## Extract from a response rendered on test data

Dated snapshot from 2026-10-06, rendered by the route on test data (fictitious companies), with no purchase, truncated to one item per array. It is not live data. The full extract is served **free of charge** from [the samples surface](https://api.sirenic.eu/exemples/score-defaillance-lot.json), and the schema from the OpenAPI document.

```
{
 "nombre_demande": 2,
 "nombre_trouve": 2,
 "paniers": {
  "expose": 1,
  "a_surveiller": 0,
  "sain": 0,
  "non_evaluable": 1,
  "cessee": 0
 },
 "groupes": {
  "expose": [
   {
    "jeu_axes": 0,
    "effectif": 1
   }
  ],
  "non_evaluable": [
   {
    "jeu_axes": 1,
    "effectif": 1
   }
  ]
 },
 "jeux_axes": [
  [
   "structure",
   "rentabilite",
   "liquidite",
   "dette",
   "anciennete",
   "etat",
   "bodacc"
  ],
  [
   "anciennete",
   "etat",
   "bodacc"
  ]
 ],
 "lignes": [
  {
   "trouve": true,
   "siren": "000000042",
   "denomination": "SOCIETE FICTIVE DELTA",
   "panier": "expose",
   "classe": "risque_eleve",
   "score_risque": 66,
   "confiance": "forte",
   "jeu_axes": 0,
   "axes_calcules": 7,
   "motifs_principaux": [
    "rentabilite",
    "structure",
    "liquidite"
   ],
   "signaux_bodacc": {
    "procedure_collective": false,
    "liquidation_judiciaire": false,
    "cloture_insuffisance_actif": false
   },
   "version_modele": "defaillance-v1.9"
  },
  {
   "trouve": true,
   "siren": "000000075",
   "denomination": "SOCIETE FICTIVE ETA",
   "panier": "non_evaluable",
   "classe": "indetermine",
   "score_risque": 0,
   "confiance": "faible",
   "jeu_axes": 1,
   "axes_calcules": 3,
   "motifs_principaux": [],
   "cause": "aucun_exercice"
  }
 ],
 "chainage": {
  "surveillance": {
   "route": "GET /v1/surveillance/creer",
   "parametres": {
    "cibles": "000000042",
    "duree": 30
   },
   "nombre_cibles": 1,
   "devis_30_jours": "$0.05",
   "prix_unitaire_30_jours": "$0.05",
   "au_dela_du_plafond_client": false
  }
 }
}
```

## Price and billing

Price: **$0.07 / entity**. The authoritative amount is the one in the `402` quote returned by the route itself, not this text, which derives from the same grid but is still just a page.

**Batch** billing: the `sirens` parameter accepts 2 to 100 comma-separated values, and the amount is the unit price times the number of values. The quote is frozen before settlement: there is no partial settlement.

An error response **cancels the payment**: a `400`, `404` or `503` is never billed. An upstream outage closes the route with a `503` rather than serving a degraded response.

## Calling the route

```
# 1. The quote, without paying anything: the route answers 402 with its amount
curl -i "https://api.sirenic.eu/v1/score/defaillance/lot?sirens=000000042,000000075"

# 2. The paid call: the x402 client settles the quote and replays the request
npx x402-fetch "https://api.sirenic.eu/v1/score/defaillance/lot?sirens=000000042,000000075"

# 3. Or over MCP, in Claude Code / Cursor / an agent
claude mcp add --transport http sirenic https://api.sirenic.eu/mcp

# Or as a local server (stdio), with your key or an x402 wallet
claude mcp add sirenic -e SIRENIC_API_KEY=srn_live_... -- npx -y sirenic-mcp
```

## What this route does not do

On an arbitrary file of legal entities, most lines are not assessable for lack of published accounts (measured on 2026-10-03: 86% of active legal entities, 71.5% of commercial companies); they are billed with their cause. The proposed watch is daily, never real time.

## Neighbouring routes

- `/v1/score/defaillance/{siren}`: $0.10
- `/v1/surveillance/creer`: $0.05 (30 days) · $0.135 (90 days) · $0.50 (365 days) / entity
- `/v1/kyb/batch`: $0.105 / entity

## How you pay

Every route is paid **per call**, in USDC or EURC on the Base network, over the x402 protocol: no account to create, no API key, no subscription. The first call returns a `402` quote your client settles, then replays the call. A failed call is never billed.

Open today: 150 free calls a month with an account, on 106 of 122 routes (the price list says which), and pay-per-call over x402 (USDC or EURC), with no account except registry filings. Prepaid credits: card top-up is not open yet.

Paid responses are **Ed25519-signed**: you can later prove what was served to you, and when. The whole catalogue is free to read in the [OpenAPI document](https://api.sirenic.eu/openapi.json) and in [llms.txt](https://api.sirenic.eu/llms.txt).

**One call, end to end**

```
# x402 client (npm): the 402 quote is settled and the call replayed automatically
npx x402-fetch https://api.sirenic.eu/v1/entreprise/552032534

# Or over MCP, in Claude Code / Cursor
claude mcp add --transport http sirenic https://api.sirenic.eu/mcp

# Or as a local server (stdio), with your key or an x402 wallet
claude mcp add sirenic -e SIRENIC_API_KEY=srn_live_... -- npx -y sirenic-mcp
```

## Routes used and pricing

| Route | Price | Sample | What it returns |
| --- | --- | --- | --- |
| `/v1/score/defaillance/lot` | $0.07 / entity | [free sample](https://api.sirenic.eu/exemples/score-defaillance-lot.json) | Batch credit risk scoring of 2 to 100 French companies (comma-separated sirens): each line has the score, class and model version of GET /v1/score/defaillance/{siren} and a closed-list basket (expose, a_surveiller, sain, non_evaluable with its cause, cessee). Rank my customers by risk and monitor the 30 most exposed: chainage.surveillance lists the whole ranked expose basket (100 at most) with its 30-day quote, targets x unit price; keep the first 30. $0.07 per SIREN, unknown SIREN included. |

> ⚠️ The default-risk score is a decision-support indicator. It is neither a solvency opinion nor a credit rating in the regulatory sense, and it guarantees no payment.

## Take it further

- [See a response on test data (free)](https://api.sirenic.eu/exemples/score-defaillance-lot.json)
- [Get the quote for /v1/score/defaillance/lot](https://api.sirenic.eu/v1/score/defaillance/lot?sirens=000000042,000000075)
- [Create an account: 150 free calls a month](https://api.sirenic.eu/compte?lang=en&utm_source=recherche&utm_campaign=referencement)

## Read next

- [Assessing a customer's default risk](https://api.sirenic.eu/en/use-cases/assess-customer-s-default-risk-with-scorecard-returned)


---

[Home](https://api.sirenic.eu/en) · [Pricing](https://api.sirenic.eu/en/offres) · [Guides](https://api.sirenic.eu/en/articles) · [Routes](https://api.sirenic.eu/en/api) · [About](https://api.sirenic.eu/en/about) · [Legal notice](https://api.sirenic.eu/mentions-legales) · [Privacy](https://api.sirenic.eu/en/privacy)
