The result of a file job, as text/csv; charset=utf-8 with
Content-Disposition: attachment and the name of the file you sent followed by
-firmus.csv (the job's id when it had no name). Every line and column of the input is
kept, in its own delimiter, behind a UTF-8 byte-order mark whatever the input had, and the
firmus_ columns are appended, ending with firmus_partial: true on a row
whose answer is not conclusive because its search or read ran out of time even after the job
tried it again, false otherwise. Submit the true rows again rather than recording their
not_found or ambiguous. A cell starting with =, +, -, @, a tab or a carriage
return, other than a number, is written behind a leading apostrophe so that a spreadsheet
does not run it as a formula; the submission page lists them. On a job that enriches,
firmus_partial is followed by firmus_partially_disclosed, true when something on the
row is masked, so that an empty cell may be withheld by law rather than missing, and
firmus_sources, the registries the row's values come from, insee_sirene; bodacc 2026-06-02 when a legal field was selected. A job keeps the columns it was created with:
one submitted before a column was added has none of it. A failed job's result stops after
the rows it answered, its first progress.processed_rows lines.
While the job is queued or running the answer is 409 job_not_finished; it stops once
the job has finished, so retrying after a few seconds is safe. A job of another
organization, a job past its expires_at and an id that is not one of your jobs are
404 not_found.
Downloading is not counted as a call; on Free it is refused with 402 quota_exceeded once
the month's 1 000 lookups are spent.
The job's download_url serves the same file with no key, until expires_at. It is a link
the API hands over rather than an operation, so it is not in the contract: use it as given,
and do not build it.