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 :

L'accès API est disponible à partir du plan Professional. Les plans Free et Starter n'incluent pas l'accès API. Vérifiez les tarifs pour plus de détails.

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).

Ne partagez jamais votre clé API. Traitez-la comme un mot de passe. Ne la commitez pas dans votre code source. Utilisez des variables d'environnement.

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"
}
CodeDescriptionCause
400Bad RequestFormat invalide, champs manquants ou payload vide
401UnauthorizedClé API manquante, invalide ou tenant inactif
404Not FoundRessource introuvable (ex: SIREN inconnu)
429Too Many RequestsLimite de requêtes dépassée
500Internal Server ErrorErreur 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.

PlanRuns / moisEntités maxAccès API
Free5100Non
Starter505 000Non
Professional50050 000Oui
EnterpriseIllimitéIllimitéOui
Les quotas exacts sont configurés par votre administrateur et visibles dans Usage de votre espace client. Les valeurs ci-dessus sont indicatives.

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

ChampTypeDescription
source_systemVARCHAR(50)Identifiant du système source (crm, erp, bmc)
source_idVARCHAR(100)Identifiant unique de l'entité dans le système source
entity_typeVARCHAR(50)company, individual, association, public_body
country_codeCHAR(2)Code pays ISO 3166-1 alpha-2 (FR, GB, DE)
national_idVARCHAR(50)Identifiant national : SIREN (FR), CRN (UK), HRB (DE), KVK (NL)

Champs optionnels

ChampTypeDescription
national_id_typeVARCHAR(20)siren, crn, hrb — déduit du country_code si absent
legal_nameVARCHAR(500)Raison sociale / dénomination
tax_idVARCHAR(30)N° TVA intracommunautaire
trade_nameVARCHAR(500)Enseigne / nom commercial
legal_form_codeVARCHAR(20)Code forme juridique (ex: 5710 = SAS en France)
activity_codeVARCHAR(20)APE/NAF (FR), SIC (US), NACE (EU)
address_line1VARCHAR(200)Numéro + voie
address_line2VARCHAR(200)Complément d'adresse
postal_codeVARCHAR(20)Code postal
cityVARCHAR(100)Ville
countryVARCHAR(100)Pays
establishment_idVARCHAR(20)SIRET siège (FR) ou équivalent
registration_dateDATEDate d'immatriculation
admin_status_companyVARCHAR(20)active, closed, unknown
admin_status_establishmentVARCHAR(20)active, closed, unknown
portfolioVARCHAR(50)Code portefeuille interne client
national_id_correctedVARCHAR(50)SIREN corrigé (pour les doublons pré-identifiés)
establishment_id_correctedVARCHAR(20)SIRET corrigé (pour les doublons pré-identifiés)
remediation_modeVARCHAR(10)AUTOMATIC, MANUAL, ou vide (auto-classifié par le moteur DQ)
Clé de dédoublonnage : (source_system, source_id). Les colonnes inconnues sont ignorées sans erreur.

Objets métier (comptes, contrats)

Champs obligatoires

ChampTypeDescription
source_systemVARCHAR(50)Système source
source_idVARCHAR(100)ID unique de l'objet dans le système source
object_typeVARCHAR(50)account, contract, policy, invoice
entity_source_systemVARCHAR(50)Source system de l'entité porteuse (jointure)
entity_source_idVARCHAR(100)Source ID de l'entité porteuse (jointure)

Champs optionnels

ChampTypeDescription
referenceVARCHAR(100)Numéro de compte / contrat
labelVARCHAR(500)Libellé
statusVARCHAR(50)Statut métier
vat_liableBOOLEANAssujetti TVA
vat_numberVARCHAR(30)N° TVA
ppf_idVARCHAR(100)ID adressage PPF (facturation électronique FR)
start_dateDATEDate de début
end_dateDATEDate de fin
amountDECIMAL(18,4)Montant
currencyCHAR(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

POST /api/ingest/entities Envoyer des entités au format Data Contract IN

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.

Headers
AuthorizationrequisBearer rmdo_sk_...
Content-Typerequisapplication/json ou text/csv
Body JSON
// 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 ... */ ]
}
Body CSV
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
Réponse
{
  "ok": true,
  "tenant_id": "t-abc123",
  "entities_received": 42,
  "file": "entities_20260407_143000.csv",
  "precompute": {
    "duplicates": { /* results */ },
    "dedup": { /* results */ }
  }
}

Export des corrections

GET /api/export/corrections Récupérer les corrections appliquées

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.

Headers
AuthorizationrequisBearer rmdo_sk_...
Réponse
{
  "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

GET /api/pricing Liste des plans et tarifs publics

Endpoint public (aucune authentification requise). Retourne la liste des plans SaaS avec leurs tarifs, quotas et features.

Paramètres query
langoptionnelfr (défaut) ou en — langue des libellés
Réponse
[
  {
    "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

GET /api/lookup/siren/{siren} Rechercher une entreprise par SIREN

Endpoint public. Recherche une entreprise française par son numéro SIREN (9 chiffres) dans les registres officiels (INSEE + RNE).

Paramètres URL
sirenrequisNuméro SIREN à 9 chiffres
Réponse
{
  "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 :

ModeDescriptionCas d'usage
internalRemendo détecte les anomalies avec son propre moteur (défaut)Vous envoyez vos données brutes, Remendo fait tout
externalLe client envoie ses anomalies pré-détectées, Remendo fournit l'IHM de remédiation + enrichissementVous avez déjà un moteur DQ et souhaitez utiliser Remendo pour la remédiation
mixedLes deux : Remendo complète les anomalies du client avec ses propres détectionsVous détectez certaines anomalies et Remendo les complète

Traitements DQ disponibles

TraitementDescriptionStatut
dq_treat_dup_sirenDoublons SIREN/SIRET (6 sous-cas A1–D)Actif
dq_treat_dedupDédoublonnage intra-source (R1 exact + R2 suggestion)Actif
dq_treat_addressNormalisation adressesPhase 2
dq_treat_classifClassification NAF / forme juridiquePhase 2
dq_treat_enrichmentEnrichissement données INSEEPhase 2

HTTP Status Codes

CodeSignificationAction
200OKRequête traitée avec succès
400Bad RequestVérifiez le format du body et les champs obligatoires
401UnauthorizedVérifiez votre clé API et le statut de votre tenant
404Not FoundLa ressource demandée n'existe pas
429Too Many RequestsQuota dépassé — attendez ou upgradez votre plan
500Internal Server ErrorCréez un ticket support avec le détail de la requête

Changelog

VersionDateChangements
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)