Financial data
Frozen during alpha. This module is built and listed across the product as a regular module, but it cannot be launched while outsend is in alpha: extracting and parsing filed annual accounts is too resource-intensive for the current alpha capacity. The new-job page shows it with a 🛠️ "unavailable in alpha" banner and a disabled Launch button, and
POST /api/jobs/financereturns503. It will be enabled once capacity allows, with the contract described below.
The finance module turns each company in a list into a financial profile built from publicly filed annual accounts. Where legal_data returns an administrative snapshot with headline figures (revenue, net income, capital), finance goes deeper: multi-year revenue, profitability, balance-sheet structure, and derived solvency and liquidity ratios with a consolidated risk score.
The module is read-only: no credentials are required, no fees are charged by the upstream sources, and no business is contacted as part of the lookup.
Purpose
Qualify a list financially before spending outreach effort on it: prioritise solid companies and screen out fragile structures.
Typical use cases:
- Rank a scraped list by revenue trend or solvency before a campaign.
- Drop companies with a deteriorating risk score from a sequence.
- Segment by balance-sheet size (equity, debt, cash) for tiered offers.
- Spot growth signals (multi-year revenue increase) as an opportunity cue.
Inputs
finance is an enrichment module: it consumes an existing list of POI rather than producing one. The expected input is a poi_list, typically the output of a discovery job.
| Field | Required | Notes |
|---|---|---|
nom |
yes | Company name, used for matching. |
siren |
no | If present, used for an exact match (preferred). |
code_postal |
no | Disambiguates fuzzy name matches. |
Match resolution mirrors legal_data: exact SIREN lookup when available, then a fuzzy match on nom + code_postal. A row that cannot be resolved (or a company that has not filed accounts) is returned with empty enrichment columns and an error code (see Errors).
Outputs
Each input row is augmented with the following columns. Empty values are preserved as empty strings: the module never fabricates a value.
| Column | Type | Description |
|---|---|---|
ca_3ans |
object | Revenue for the last three filed fiscal years. |
resultat_net |
number | Net income for the latest filed year, in EUR. |
ebitda |
number | Earnings before interest, taxes, D&A, in EUR. |
fonds_propres |
number | Shareholders' equity, in EUR. |
dettes_financieres |
number | Financial debt, in EUR. |
tresorerie |
number | Cash and cash equivalents, in EUR. |
bfr |
number | Working capital requirement, in EUR. |
ratio_solvabilite |
number | Solvency ratio (equity / total assets). |
ratio_liquidite |
number | Current ratio (current assets / current liabilities). |
marge_nette |
number | Net margin (net income / revenue), as a percentage. |
score_risque |
string | Consolidated risk score (faible, modere, eleve). |
date_cloture |
date | Closing date of the latest filed fiscal year. |
Lifecycle
Standard job lifecycle. See Jobs lifecycle. Progress is reported per company processed. While the module is frozen in alpha, no job can be created; the section below documents the contract that applies once it is enabled.
Pipeline
Not pipelinable in alpha. The module appears in the dashboard, the new-job picker, the tools catalogue, and the landing page as an active module, but it is not exposed as a pipeline node while frozen. Once enabled it consumes a poi_list and emits an enriched_list carrying the original rows plus the columns described in Outputs.
Endpoints
Create a job
POST /api/jobs/finance
During alpha this endpoint returns 503 with an explanatory message. The request body below describes the contract that applies once the module is enabled:
{
"items": [
{ "nom": "Boulangerie Martin", "code_postal": "75011" },
{ "siren": "552120222" }
],
"source_job_id": "job_01HXYZ..."
}
Either items or source_job_id must be provided. When source_job_id references a completed discovery job, its rows are used as input directly.
Retrieve a job
GET /api/jobs/{job_id}
Returns the current state, progress counters, and (when done) the download URL for the enriched CSV.
Financial figures depend on the company having filed its accounts. A large share of French SMEs file under a confidentiality option, in which case detailed figures are unavailable and the row is returned with empty financial columns and a no_accounts_filed code.
Errors
Row-level errors are reported in an error column on the enriched output. Job-level errors transition the job to failed.
| Code | Scope | Meaning |
|---|---|---|
alpha_unavailable |
job | Module is frozen during alpha. POST returns 503. |
not_found |
row | No registry match for the provided name and postcode. |
no_accounts_filed |
row | Company exists but has not filed (or filed confidential) accounts. |
ambiguous_match |
row | Several candidates with equal score; none selected. |
source_unavailable |
job | One or more upstream public sources are unreachable. |
invalid_input |
job | Input list is empty or missing required fields. |
What's next
legal_data: administrative snapshot (legal form, capital, executives, headline financials) matched by name. The lighter companion to this module.legal_mentions: parse the legal notice page of a website to extract registered name, capital, RCS, postal address, and VAT number.- Module registry: how a module's state (active, coming-soon, alpha-frozen) is published.