REST API
The whole European database, as JSON, in your code
The same companies as the interface, the same country and sector filters, returned as stable JSON. One key, one header, no SDK to install. A free key from the Discovery account, then the API tool, included or as an option.
- companies
- 18.7 M
- countries
- 25
- sectors
- 84
Get started
Three steps, under five minutes
Create an account
Free, no card. The Discovery plan immediately opens 50 calls per day and 5 companies per call.
Create an accountGenerate a key
In My account, API keys section. The key starts with as_live_ and is shown only once: copy it into your secret manager. Discovery gives 1 key, Complete up to 20.
My API keysFirst call
One GET request, one Authorization header, JSON back. Nothing else to install.
curl "https://argos-finance.fr/api/v1/societes?pays=FR§eur=restauration&limit=5" \
-H "Authorization: Bearer as_live_XXXXXXXXXXXXXXXXXXXX"The authentication header
Every route accepts the key as a header. Without a key the API answers in preview mode: 2 companies per call, offset locked at 0. Handy for a quick test or for an agent discovering the database.
Authorization: Bearer as_live_XXXXXXXXXXXXXXXXXXXXPricing
A free key, then the API as a tool
A key can be created from the free account and runs at Discovery level. Beyond that, the API is a tool: included in the Market finance and Complete plans, or added as an option at EUR 250 excl. VAT a year on any other plan or custom subscription. Without that tool, a key stays at Discovery level. Searches and taxonomy use no credits; a full record uses 5, as on the site, only once a month for the same company. Same routes, same fields, same format across plans.
| Plan | Calls per day | Companies per call | Active keys | API tool | Plan excl. VAT |
|---|---|---|---|---|---|
| No account (preview) | 0 | 2 | 0 | No key | No sign-up |
| Discovery | 50 | 5 | 1 | Free key | Free |
| Data | 1,000 | 200 | 3 | Option, EUR 250 / year | EUR 5,000 / year |
| Corporate finance | 5,000 | 500 | 10 | Option, EUR 250 / year | EUR 17,500 / year |
| Market finance | 5,000 | 500 | 10 | Included | EUR 17,500 / year |
| Complete | 10,000 | 500 | 20 | Included | EUR 30,000 / year |
| Custom | 1,000 | 200 | 3 | Option, EUR 250 / year | Depends on modules |
In practice: a free account gives 50 calls per day and 5 companies per call, enough to frame a project. The Complete plan gives 10,000 calls per day and 500 companies per call, up to 5,000,000 rows a day, enough to feed a data warehouse. Beyond that, write to contact@argos-finance.fr.
Reference
Endpoints
GET /api/v1/pays
The 25 countries with counts and source. Public, no key.
GET /api/v1/secteurs?pays=FR,IT
The 84 sectors with counts, for all countries or for a scope. Public, no key.
GET /api/v1/societes
Paginated search. Parameters: pays, secteur, q, tri, limit, offset, ca_min, ca_max, effectif_min, effectif_max, site_web=1, avec_ca=1.
curl "https://argos-finance.fr/api/v1/societes?pays=IT§eur=machinerie&limit=50" \
-H "Authorization: Bearer as_live_XXXX"{
"total": 12456, "limit": 50, "offset": 0, "apercu": false,
"societes": [{
"iso2": "IT", "id": "00123456789", "nom": "ESEMPIO S.P.A.",
"secteur": "Machinerie", "grand_secteur": "Industrie manufacturière & Matériaux",
"ville": "Bergamo", "effectif": 240, "ca_eur": 58400000, "ca_year": 2024,
"site_web": "www.esempio.it", "url_registre": "https://..."
}]
}GET /api/v1/societes/{iso}/{id}
Full record. Line-by-line financial statements (balance sheet, income statement, up to 5 fiscal years) are returned to identified calls. A full record uses 5 credits, only once a month for the same company.
curl "https://argos-finance.fr/api/v1/societes/FR/552032534" -H "Authorization: Bearer as_live_XXXX"GET|POST /api/v1/export
xlsx workbook of the scope (same parameters, plus lang=fr|en). Account required, monthly quota: 2 workbooks with Discovery, 200 with Complete.
curl -L "https://argos-finance.fr/api/v1/export?pays=FR,BE§eur=restauration&limit=500" \
-H "Authorization: Bearer as_live_XXXX" -o restauration_FR_BE.xlsxConventions
pays: 2-letter ISO codes separated by commas;UKfor the United Kingdom.secteur: slug or exact FR label, multiple values with|.tri:ca_desc(default),ca_asc,nom,effectif_desc,recent,capital_desc,score.- Amounts:
ca_eurin euros;ca_last×ca_multin local currency (ca_devise). - UTF-8 JSON, open CORS on /api/v1, pagination by
limit+offset.
Python
import requests
CLE = "as_live_XXXX"
r = requests.get("https://argos-finance.fr/api/v1/societes",
params={"pays": "FR,BE", "secteur": "restauration|hotellerie", "limit": 100},
headers={"Authorization": f"Bearer {CLE}"})
r.raise_for_status()
for s in r.json()["societes"]:
print(s["nom"], s["ville"], s["ca_eur"])JavaScript
const r = await fetch("https://argos-finance.fr/api/v1/societes?pays=IT§eur=machinerie&limit=50",
{ headers: { Authorization: "Bearer as_live_XXXX" } });
const { total, societes } = await r.json();Pagination: limit and offset
limit never exceeds your plan cap (5 companies on Discovery, 200 on Data, 500 on Complete): a higher value is clamped to the cap, without an error. total gives the real number of companies in the scope: walk it by incrementing offset.
# page 1 : sociétés 1 à 500
curl "https://argos-finance.fr/api/v1/societes?pays=DE§eur=machinerie&limit=500&offset=0" \
-H "Authorization: Bearer as_live_XXXX"
# page 2 : sociétés 501 à 1000
curl "https://argos-finance.fr/api/v1/societes?pays=DE§eur=machinerie&limit=500&offset=500" \
-H "Authorization: Bearer as_live_XXXX"import requests
CLE, PAGE = "as_live_XXXX", 500
params = {"pays": "DE", "secteur": "machinerie", "limit": PAGE, "offset": 0}
tout = []
while True:
r = requests.get("https://argos-finance.fr/api/v1/societes", params=params,
headers={"Authorization": f"Bearer {CLE}"})
r.raise_for_status()
j = r.json()
tout += j["societes"]
params["offset"] += PAGE
if params["offset"] >= j["total"] or not j["societes"]:
break
print(len(tout), "sociétés")Handling 429 (quota reached)
Every identified response carries X-Quota-Used and X-Quota-Limit: watch them to stop before the wall. The quota is daily and resets at midnight UTC: retrying straight away is pointless, better resume the loop the next day from the last offset.
r = requests.get(url, params=params, headers=entetes)
if r.status_code == 429:
utilise = r.headers.get("X-Quota-Used")
limite = r.headers.get("X-Quota-Limit")
# { "erreur": { "code": "quota_api", "message": "...", "quota": {...} } }
raise SystemExit(
f"Quota journalier atteint : {utilise}/{limite}. "
f"Reprendre demain a l'offset {params['offset']}."
)
r.raise_for_status()const r = await fetch(url, { headers });
if (r.status === 429) {
const utilise = r.headers.get("X-Quota-Used");
const limite = r.headers.get("X-Quota-Limit");
console.warn(`Quota atteint : ${utilise}/${limite}, reprise demain (UTC).`);
return null;
}Robustness
Error codes
All errors come out in the same shape, with a machine code and a readable message. An unknown parameter is never silently ignored: it raises an error naming the offending value, so a script never works on a scope different from the one it thinks it queried.
| HTTP | code | When, and what to do |
|---|---|---|
| 400 | pays_inconnu, secteur_inconnu | A country or sector sent does not exist in the reference data. The parameter is never silently ignored: the response names the faulty value and points to /api/v1/pays or /api/v1/secteurs. |
| 401 | compte_requis | The call asks for an account-only resource (Excel export, detailed financial statements) without a valid key. Create an account, generate a key, pass it in the Authorization header. |
| 402 | credits_epuises | The month's credits and packs are used up. The preview is still served; debits resume next month or after buying a pack from My account. |
| 403 | module_non_inclus | The resource needs a module your plan does not include. The response names the plan that opens it. |
| 403 | essai_epuise | Your plan opens this module as a trial (Data: a few corporate and market finance analyses a month) and this month's trial is used up. The response gives the number of analyses, the plan that opens it without limit and the reset date. |
| 429 | quota_api, quota_export, trop_de_requetes | Cap reached. The X-Quota-Used and X-Quota-Limit headers give the consumption and the plan limit. The API counter resets at midnight UTC, the export counter on the first day of the calendar month. |
| 503 | indisponible, config | Service temporarily unavailable (database refreshing, payment not configured). Retry, the call has no side effect. |
{
"erreur": {
"code": "secteur_inconnu",
"message": "Secteur inconnu : machinerei. Liste des 84 secteurs sur /api/v1/secteurs.",
"secteurs_inconnus": ["machinerei"]
}
}AI assistants and agents
A database an agent can query on its own
The shortest path is the MCP server: one line of configuration in Claude or in your agent, and it gets named tools to search, read a company record and read the filed accounts. Otherwise give it the OpenAPI specification URL: it discovers the routes and fields with no extra documentation. The llms.txt file summarises the site and its rules in natural language, for context.
- Public MCP server, 21 read-only tools, stateless.
- OpenAPI 3.1, stable JSON responses, open CORS on /api/v1.
- Key-free preview mode (2 companies) for a first try, then a key for volume.
- One key per agent: revoke it without touching the others.
Give this to your assistant
https://argos-finance.fr/api/mcp
https://argos-finance.fr/openapi.json
https://argos-finance.fr/llms.txt