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. The API is included in every plan and never billed separately.
- 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, Integration up to 10.
My API keysFirst call
One GET request, one Authorization header, JSON back. Nothing else to install.
curl "https://sourcing.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
The API is included in every plan
No call is billed per unit, no surcharge per returned row. You pick a plan, it sets a daily call cap and a number of companies per call. Everything else is identical across plans: same routes, same fields, same format.
| Plan | Calls per day | Companies per call | Active keys | Price excl. VAT |
|---|---|---|---|---|
| No account (preview) | 0 | 2 | 0 | No sign-up |
| Discovery | 50 | 5 | 1 | Free |
| Starter | 200 | 50 | 1 | EUR 39 / month |
| Business | 1,000 | 200 | 3 | EUR 119 / month |
| Integration | 5,000 | 500 | 10 | EUR 349 / month |
In practice: a free account gives 50 calls per day and 5 companies per call, enough to frame a project. The Integration plan gives 5,000 calls per day and 500 companies per call, up to 2,500,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://sourcing.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.
curl "https://sourcing.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, 100 with Integration.
curl -L "https://sourcing.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://sourcing.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://sourcing.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 Business, 500 on Integration): 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://sourcing.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://sourcing.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", 200
params = {"pays": "DE", "secteur": "machinerie", "limit": PAGE, "offset": 0}
tout = []
while True:
r = requests.get("https://sourcing.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. |
| 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, eight 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://sourcing.argos-finance.fr/api/mcp
https://sourcing.argos-finance.fr/openapi.json
https://sourcing.argos-finance.fr/llms.txt