Skip to content
firmus.shdocs

Every page's text, headings and title. Code samples are not indexed.

Get a job

A file job's status, progress, counts per step and, once it has finished, the links to its result.

The job a submission created, read by the id it answered with, job_ and 24 letters and digits. status is queued, running, succeeded or failed; only the last two are final. progress counts the rows processed out of total_rows, and partial_rows the rows among them written without a conclusive answer: a search or a read still cut short by its time budget after the job tried it again. Each is also counted under its status in counts, and marked true in the result's firmus_partial column, so a not_found there may only mean "not found in time": submit those rows again. counts holds, per step, the statuses answered so far: resolve (matched, ambiguous, not_found, invalid) and enrich (enriched, ambiguous, not_found, invalid, not_processed), with null for a step the job does not run. agent_rows is what the job has counted against the month's allowance so far, per step.

A segment export is a job too, of operation segment_export: its counts.segment_export holds exported, withheld and not_found, exported_rows what it has counted against the month's exported rows, and segment the segment it was admitted from. On every other job both are null.

result_url and download_url are null until the job has finished, succeeded or failed. result_url needs your key; download_url needs none and expires with the job, at expires_at. A failed job's result holds the rows it answered before it stopped, its first progress.processed_rows lines, and error says so: submit the lines after them again. All timestamps are UTC; started_at and finished_at are null until they happen.

A job of another organization, a job past expires_at, an id that never existed and one that is not a job id at all are each 404 not_found, and cannot be told apart. Reading a job is not counted as a call, but the plan's requests per second apply: leave a few seconds between reads. On Free, it is refused with 402 quota_exceeded once the month's 1 000 lookups are spent.

GET/v1/{country_code}/jobs/{id}Scope read

Parameters

ParameterInTypeRequiredExample
country_codepathstringYesfr
idpathstringYesjob_Spec11111111111111111111

Request

bash
curl -H "Authorization: Bearer $FIRMUS_KEY" \
  "https://api.firmus.sh/v1/fr/jobs/job_Spec11111111111111111111"

Fields

  • idstring
  • statusstring
  • operationstring
  • filenamestring
  • mappingobject
    • registry_numberstringoptional
    • namestringoptional
    • postal_codestringoptional
    • citystringoptional
  • mapping_detectedboolean
  • fieldsstring[]nullable
    • []stringoptional
  • progressobject
    • total_rowsinteger
    • processed_rowsinteger
    • partial_rowsinteger
  • countsobject
    • resolveobjectnullable
      • matchedinteger
      • ambiguousinteger
      • not_foundinteger
      • invalidinteger
    • enrichobjectnullable
      • enrichedinteger
      • ambiguousinteger
      • not_foundinteger
      • invalidinteger
      • not_processedinteger
    • segment_exportobjectoptionalnullable
      • exportedinteger
      • withheldinteger
      • not_foundinteger
  • agent_rowsobject
    • resolveinteger
    • enrichinteger
  • errorstringnullable
  • result_urlstringnullable
  • download_urlstringnullable
  • created_atstring
  • started_atstringnullable
  • finished_atstringnullable
  • expires_atstring
  • exported_rowsintegeroptionalnullable
  • segmentobjectoptionalnullable
    • idinteger
    • namestring
    • filtersobject
      • activitystring[]
        • []stringoptional
    • as_ofstring
    • include_sole_tradersboolean
    • acknowledgementobject
      • versionstring
      • acknowledged_atstring
      • acknowledged_bystring
      • textstringoptional
    • noticestring
    • limitstringoptionalnullable

Responses

A job's status (`queued`, `running`, `succeeded`, `failed`), its progress in rows, the statuses each step has answered so far, the agent rows counted, and, once it has finished, `result_url` (the result, with a key) and `download_url` (the same CSV behind a signed link that needs no key, valid until `expires_at`). Not counted as a call. A job of another organization, or past its retention, is 404.

{
  "id": "job_Spec11111111111111111111",
  "status": "succeeded",
  "operation": "resolve_then_enrich",
  "filename": "crm_export.csv",
  "mapping": {
    "registry_number": "SIREN",
    "name": "Société",
    "postal_code": "Code postal",
    "city": "Ville"
  },
  "mapping_detected": true,
  "fields": [
    "name",
    "status",
    "activity",
    "workforce",
    "head_office_address"
  ],
  "progress": {
    "total_rows": 5,
    "processed_rows": 5,
    "partial_rows": 0
  },
  "counts": {
    "resolve": {
      "matched": 2,
      "ambiguous": 1,
      "not_found": 1,
      "invalid": 1
    },
    "enrich": {
      "enriched": 2,
      "ambiguous": 1,
      "not_found": 1,
      "invalid": 1,
      "not_processed": 0
    },
    "segment_export": null
  },
  "agent_rows": {
    "resolve": 4,
    "enrich": 2
  },
  "error": null,
  "result_url": "http://www.example.com/v1/fr/jobs/job_Spec11111111111111111111/result",
  "download_url": "http://www.example.com/downloads/eyJfcmFpbHMiOnsiZGF0YSI6ImpvYl9TcGVjMTExMTExMTExMTExMTExMTExMTEiLCJleHAiOiIyMDI2LTExLTA4VDA5OjAwOjAwLjAwMFoiLCJwdXIiOiJjc3Zfam9iX3Jlc3VsdCJ9fQ--6382227ad5163aafed87b17f2a9f2be79c8b8171a153704e1a66c7a41a42b05f",
  "created_at": "2026-11-01T09:00:00Z",
  "started_at": "2026-11-01T09:00:00Z",
  "finished_at": "2026-11-01T09:00:00Z",
  "expires_at": "2026-11-08T09:00:00Z",
  "exported_rows": null,
  "segment": null
}

Try it

Calls the real API with a demo key. No account, no signup.