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, on-demand, coming-soon, alpha-frozen) is published.