API Reference
Référence complète de l'API Remendo Data Contract pour l'intégration client. Envoyez vos données, récupérez les corrections appliquées, et consultez les tarifs.
Version Beta v0.1.0 — Dernière mise à jour : Avril 2026
Vue d'ensemble
L'API Remendo permet d'envoyer vos données (entités tiers) au format Data Contract IN v2 et de récupérer les corrections appliquées au format Data Contract OUT. Deux modes d'intégration sont disponibles :
- Push — Vous envoyez vos données via
POST /api/ingest/entities(CSV ou JSON) - Pull — Remendo récupère vos données depuis une URL source configurée dans les paramètres tenant
Authentification
Chaque tenant dispose d'une clé API secrète générée automatiquement à la création du compte. Cette clé doit être envoyée dans le header Authorization de chaque requête.
# Format Authorization: Bearer rmdo_sk_<32_characters> # Example Authorization: Bearer rmdo_sk_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
La clé API est visible dans Paramètres > API de votre espace tenant. L'administrateur peut la régénérer à tout moment via le bouton dédié (l'ancienne clé est immédiatement invalidée).
Base URL
https://remendo.app/api
Toutes les routes sont préfixées par /api. Le protocole HTTPS est requis en production. En développement local, utilisez http://localhost:5001/api.
Gestion des erreurs
En cas d'erreur, l'API retourne un objet JSON avec un champ error décrivant le problème :
{
"error": "Clé API invalide ou tenant inactif"
}
| Code | Description | Cause |
|---|---|---|
400 | Bad Request | Format invalide, champs manquants ou payload vide |
401 | Unauthorized | Clé API manquante, invalide ou tenant inactif |
404 | Not Found | Ressource introuvable (ex: SIREN inconnu) |
429 | Too Many Requests | Limite de requêtes dépassée |
500 | Internal Server Error | Erreur interne — contactez le support |
Rate Limits
Les limites dépendent de votre plan. Le nombre de runs par mois (appels d'ingestion) est défini dans vos quotas tenant.
| Plan | Runs / mois | Entités max | Accès API |
|---|---|---|---|
| Free | 5 | 100 | Non |
| Starter | 50 | 5 000 | Non |
| Professional | 500 | 50 000 | Oui |
| Enterprise | Illimité | Illimité | Oui |
Data Contract IN
Le Data Contract IN v2 définit le format standardisé pour envoyer vos données à Remendo. Deux types de données sont acceptés : entités (tiers) et objets métier (comptes, contrats).
Formats acceptés : CSV (délimiteur ; ou , auto-détecté) ou JSON (tableau ou objet avec clé entities). Encodage : UTF-8.
Entités (tiers)
Champs obligatoires
| Champ | Type | Description |
|---|---|---|
source_system | VARCHAR(50) | Identifiant du système source (crm, erp, bmc) |
source_id | VARCHAR(100) | Identifiant unique de l'entité dans le système source |
entity_type | VARCHAR(50) | company, individual, association, public_body |
country_code | CHAR(2) | Code pays ISO 3166-1 alpha-2 (FR, GB, DE) |
national_id | VARCHAR(50) | Identifiant national : SIREN (FR), CRN (UK), HRB (DE), KVK (NL) |
Champs optionnels
| Champ | Type | Description |
|---|---|---|
national_id_type | VARCHAR(20) | siren, crn, hrb — déduit du country_code si absent |
legal_name | VARCHAR(500) | Raison sociale / dénomination |
tax_id | VARCHAR(30) | N° TVA intracommunautaire |
trade_name | VARCHAR(500) | Enseigne / nom commercial |
legal_form_code | VARCHAR(20) | Code forme juridique (ex: 5710 = SAS en France) |
activity_code | VARCHAR(20) | APE/NAF (FR), SIC (US), NACE (EU) |
address_line1 | VARCHAR(200) | Numéro + voie |
address_line2 | VARCHAR(200) | Complément d'adresse |
postal_code | VARCHAR(20) | Code postal |
city | VARCHAR(100) | Ville |
country | VARCHAR(100) | Pays |
establishment_id | VARCHAR(20) | SIRET siège (FR) ou équivalent |
registration_date | DATE | Date d'immatriculation |
admin_status_company | VARCHAR(20) | active, closed, unknown |
admin_status_establishment | VARCHAR(20) | active, closed, unknown |
portfolio | VARCHAR(50) | Code portefeuille interne client |
national_id_corrected | VARCHAR(50) | SIREN corrigé (pour les doublons pré-identifiés) |
establishment_id_corrected | VARCHAR(20) | SIRET corrigé (pour les doublons pré-identifiés) |
remediation_mode | VARCHAR(10) | AUTOMATIC, MANUAL, ou vide (auto-classifié par le moteur DQ) |
(source_system, source_id). Les colonnes inconnues sont ignorées sans erreur.Objets métier (comptes, contrats)
Champs obligatoires
| Champ | Type | Description |
|---|---|---|
source_system | VARCHAR(50) | Système source |
source_id | VARCHAR(100) | ID unique de l'objet dans le système source |
object_type | VARCHAR(50) | account, contract, policy, invoice |
entity_source_system | VARCHAR(50) | Source system de l'entité porteuse (jointure) |
entity_source_id | VARCHAR(100) | Source ID de l'entité porteuse (jointure) |
Champs optionnels
| Champ | Type | Description |
|---|---|---|
reference | VARCHAR(100) | Numéro de compte / contrat |
label | VARCHAR(500) | Libellé |
status | VARCHAR(50) | Statut métier |
vat_liable | BOOLEAN | Assujetti TVA |
vat_number | VARCHAR(30) | N° TVA |
ppf_id | VARCHAR(100) | ID adressage PPF (facturation électronique FR) |
start_date | DATE | Date de début |
end_date | DATE | Date de fin |
amount | DECIMAL(18,4) | Montant |
currency | CHAR(3) | ISO 4217 (défaut : EUR) |
Data Contract OUT
Le Data Contract OUT est le format de restitution des corrections appliquées. Il est disponible en JSON (via API) ou CSV (via téléchargement IHM).
La réponse JSON inclut un objet run (métadonnées) et un tableau entities contenant pour chaque entité : les données envoyées (input), les données du registre officiel (registry), les anomalies détectées (anomalies) et un score qualité.
Structure de la réponse
{
"run": {
"run_id": "run-2026-04-001",
"run_date": "2026-04-06T14:30:00Z",
"scope": "crm",
"status": "completed",
"duration_seconds": 127,
"summary": {
"total_entities": 100,
"total_objects": 85,
"total_anomalies": 42,
"by_severity": { "C1": 5, "C2": 18, "C3": 15, "C4": 4 },
"auto_remediable": 28,
"registries_consulted": ["insee", "rne"]
}
},
"entities": [
{
"source_system": "crm",
"source_id": "531add03-8aff-ed11",
"input": { /* echo of your data */ },
"registry": {
"source": "insee",
"consulted_at": "2026-04-06T14:30:12Z",
"siren": "831720719",
"siret_siege": "83172071900028",
"legal_name": "JS2C",
"legal_form_label": "SAS",
"activity_label": "Activités des sièges sociaux",
"admin_status": "active"
},
"anomalies": [
{
"anomaly_type": "missing_address",
"field_name": "address_line1",
"severity": "C2",
"current_value": null,
"proposed_value": "23 RUE PAUL MAMERT",
"proposed_source": "insee",
"confidence": 95.0,
"auto_remediable": true
}
],
"quality_score": 72,
"objects": [ /* ... */ ]
}
]
}
Ingestion d'entités
Envoie un lot d'entités (tiers) au format CSV ou JSON. Le moteur DQ est automatiquement déclenché après l'ingestion si l'option dq_auto_after_ingest est activée.
Authorizationrequis | Bearer rmdo_sk_... |
Content-Typerequis | application/json ou text/csv |
// Array format [ { "source_system": "crm", "source_id": "531add03-8aff-ed11", "entity_type": "company", "country_code": "FR", "national_id": "831720719", "legal_name": "JS2C" } ] // Object format { "entities": [ /* ... same as above ... */ ] }
source_system;source_id;entity_type;country_code;national_id;legal_name crm;531add03-8aff-ed11;company;FR;831720719;JS2C erp;TIER-00042;company;FR;515181691;ECOBEEZ CONSULTING
{
"ok": true,
"tenant_id": "t-abc123",
"entities_received": 42,
"file": "entities_20260407_143000.csv",
"precompute": {
"duplicates": { /* results */ },
"dedup": { /* results */ }
}
}
Export des corrections
Retourne l'ensemble des corrections appliquées (automatiques et manuelles) pour votre tenant. Chaque correction contient les valeurs originales, corrigées et les métadonnées de la correction.
Authorizationrequis | Bearer rmdo_sk_... |
{
"ok": true,
"tenant_id": "t-abc123",
"corrections": [
{
"source_id": "531add03-8aff-ed11",
"source_system": "crm",
"category": "duplicate_siren",
"sub_case": "A1",
"national_id_original": "831720710",
"national_id_corrected": "831720719",
"status": "corrected",
"applied_at": "2026-04-07T10:15:30Z",
"applied_by": "auto"
}
],
"total": 1
}
Plans & tarifs
Endpoint public (aucune authentification requise). Retourne la liste des plans SaaS avec leurs tarifs, quotas et features.
langoptionnel | fr (défaut) ou en — langue des libellés |
[
{
"id": "free",
"label": "Free",
"price_monthly": 0,
"price_annual": 0,
"max_users": 3,
"max_entities": 100,
"max_objects": 50,
"max_runs_month": 5,
"data_retention_days": 7,
"features": {
"rem_manual": true,
"rem_auto": false,
"api_access": false,
"sso": false,
"custom_branding": false,
"export_csv": true,
"export_pdf": false
}
},
// ... starter, professional, enterprise
]
SIREN Lookup
Endpoint public. Recherche une entreprise française par son numéro SIREN (9 chiffres) dans les registres officiels (INSEE + RNE).
sirenrequis | Numéro SIREN à 9 chiffres |
{
"siren": "515181691",
"siret": "51518169100030",
"denomination": "ECOBEEZ CONSULTING",
"adresse": "22 ALL DES DEMOISELLES",
"code_postal": "31400",
"commune": "TOULOUSE",
"forme_juridique": "5499"
}
Exemples cURL
Push JSON
curl -X POST https://remendo.app/api/ingest/entities \ -H "Authorization: Bearer rmdo_sk_YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '[ { "source_system": "crm", "source_id": "TIER-001", "entity_type": "company", "country_code": "FR", "national_id": "515181691", "legal_name": "ECOBEEZ CONSULTING" } ]'
Push CSV
curl -X POST https://remendo.app/api/ingest/entities \ -H "Authorization: Bearer rmdo_sk_YOUR_API_KEY" \ -H "Content-Type: text/csv" \ --data-binary @entities.csv
Upload fichier
curl -X POST https://remendo.app/api/ingest/entities \ -H "Authorization: Bearer rmdo_sk_YOUR_API_KEY" \ -F "file=@entities.csv"
Export corrections
curl https://remendo.app/api/export/corrections \
-H "Authorization: Bearer rmdo_sk_YOUR_API_KEY"
Lookup SIREN
curl https://remendo.app/api/lookup/siren/515181691
Exemple Python
# pip install requests import requests API_KEY = "rmdo_sk_YOUR_API_KEY" BASE = "https://remendo.app/api" headers = {"Authorization": f"Bearer {API_KEY}"} # ── Push entities (JSON) ── entities = [ { "source_system": "crm", "source_id": "TIER-001", "entity_type": "company", "country_code": "FR", "national_id": "515181691", "legal_name": "ECOBEEZ CONSULTING", } ] resp = requests.post(f"{BASE}/ingest/entities", json=entities, headers=headers) print(resp.json()) # {"ok": true, "entities_received": 1, ...} # ── Push CSV file ── with open("entities.csv", "rb") as f: resp = requests.post( f"{BASE}/ingest/entities", files={"file": f}, headers=headers, ) # ── Export corrections ── resp = requests.get(f"{BASE}/export/corrections", headers=headers) corrections = resp.json()["corrections"] print(f"Total corrections: {len(corrections)}") # ── Lookup SIREN (no auth needed) ── resp = requests.get(f"{BASE}/lookup/siren/515181691") print(resp.json()["denomination"]) # "ECOBEEZ CONSULTING"
Exemple JavaScript
// Node.js / Browser (fetch) const API_KEY = "rmdo_sk_YOUR_API_KEY"; const BASE = "https://remendo.app/api"; // ── Push entities ── const entities = [ { source_system: "crm", source_id: "TIER-001", entity_type: "company", country_code: "FR", national_id: "515181691", legal_name: "ECOBEEZ CONSULTING", }, ]; const resp = await fetch(`${BASE}/ingest/entities`, { method: "POST", headers: { "Authorization": `Bearer ${API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify(entities), }); const data = await resp.json(); console.log(data); // {ok: true, entities_received: 1, ...} // ── Export corrections ── const corrections = await fetch(`${BASE}/export/corrections`, { headers: { "Authorization": `Bearer ${API_KEY}` }, }).then(r => r.json()); console.log(`Total: ${corrections.total}`); // ── Lookup SIREN (public) ── const company = await fetch(`${BASE}/lookup/siren/515181691`).then(r => r.json()); console.log(company.denomination); // "ECOBEEZ CONSULTING"
Modes du moteur DQ
Le moteur de qualité de données peut fonctionner dans 3 modes, configurables par l'administrateur du tenant :
| Mode | Description | Cas d'usage |
|---|---|---|
internal | Remendo détecte les anomalies avec son propre moteur (défaut) | Vous envoyez vos données brutes, Remendo fait tout |
external | Le client envoie ses anomalies pré-détectées, Remendo fournit l'IHM de remédiation + enrichissement | Vous avez déjà un moteur DQ et souhaitez utiliser Remendo pour la remédiation |
mixed | Les deux : Remendo complète les anomalies du client avec ses propres détections | Vous détectez certaines anomalies et Remendo les complète |
Traitements DQ disponibles
| Traitement | Description | Statut |
|---|---|---|
dq_treat_dup_siren | Doublons SIREN/SIRET (6 sous-cas A1–D) | Actif |
dq_treat_dedup | Dédoublonnage intra-source (R1 exact + R2 suggestion) | Actif |
dq_treat_address | Normalisation adresses | Phase 2 |
dq_treat_classif | Classification NAF / forme juridique | Phase 2 |
dq_treat_enrichment | Enrichissement données INSEE | Phase 2 |
HTTP Status Codes
| Code | Signification | Action |
|---|---|---|
200 | OK | Requête traitée avec succès |
400 | Bad Request | Vérifiez le format du body et les champs obligatoires |
401 | Unauthorized | Vérifiez votre clé API et le statut de votre tenant |
404 | Not Found | La ressource demandée n'existe pas |
429 | Too Many Requests | Quota dépassé — attendez ou upgradez votre plan |
500 | Internal Server Error | Créez un ticket support avec le détail de la requête |
Changelog
| Version | Date | Changements |
|---|---|---|
| v0.1.0 | 2026-04-07 |
Version initiale Beta • POST /api/ingest/entities — Ingestion push (CSV + JSON)• GET /api/export/corrections — Export corrections• GET /api/pricing — Plans et tarifs publics• GET /api/lookup/siren/{siren} — Lookup SIREN INSEE+RNE• Data Contract IN v2 (entités + objets métier) • Data Contract OUT v2 (JSON hiérarchique + CSV aplati) |