Le même moteur,
dans votre application.

Un endpoint par service, un appel, la réponse documentée champ par champ : vérification de contact, dédoublonnage, e-mail, téléphone, site web, codice fiscale, autocomplétion. À l'unité ou par lots ; pour les gros fichiers, le traitement passe en file d'attente et vous le récupérez quand il est prêt.

Spécification OpenAPI : openapi.json, pour générer le client ou l'importer dans votre outil.

Un endpoint par service, avec le même nom que le service porte sur ce site : /contact, /dedupe, /email, /phone, /website, /tax-code, /enrichment. Chacun accepte un élément dans le corps de la requête ou une liste dans items, jusqu'à 500 par appel (100 pour les sites web, qu'il faut contacter un par un). Le dédoublonnage fait exception et veut toujours une liste : il compare les fiches entre elles. À part se tiennent /suggest, l'autocomplétion pour les formulaires (elle travaille par session pendant que l'utilisateur tape, pas par lots), et /credit, qui dit combien d'opérations il reste et dans quel état est chaque compteur, sans en consommer.

Authentification

L'hôte de l'API est www.radaraddress.com. Les noms des champs, des points de terminaison et des valeurs sont des identifiants anglais, identiques dans toutes les langues ; les libellés, les motifs et les messages suivent la langue de la requête ("language": "de" ou ?language=de, ou l'en-tête Accept-Language, ou la langue du compte). L'en-tête Content-Language indique dans quelle langue la réponse est arrivée.

L'accès à l'API se fait par token Bearer. Le compte est gratuit : vous créez le token depuis l'espace personnel et vous l'incluez dans l'en-tête de chaque requête sous la forme :

# Every request needs the Authorization header
Authorization: Bearer {your-token}

À la création, vous pouvez donner au token une date d'expiration facultative : passée cette date, les requêtes reçoivent HTTP 401 avec le code token_expired ; sans expiration, le token vaut tant que vous ne le révoquez pas. Vous pouvez le révoquer ou le régénérer à tout moment depuis votre espace personnel, où vous voyez aussi la dernière utilisation et le nombre de requêtes servies. Une requête sans token ou avec un token non valide renvoie HTTP 401.

Les noms italiens, pour ceux qui les utilisent déjà

L'API n'a qu'une version, en anglais. Qui avait intégré avec les noms italiens n'a rien à changer : les champs italiens sont acceptés dans chaque requête, les points de terminaison répondent aussi sous leur nom italien (/contatto, /deduplica, /codicefiscale, /arricchimento, /telefono, /sito, /suggerisci, /nazioni, /credito), et la réponse ressort avec les clés et les codes italiens pour qui le demande avec "language": "it" ou appelle www.radaraddress.it sans indiquer de langue.

Le tableau complet des champs : anglais → italien
anglaisitalienanglaisitalien
accountaccount membersmembri
actionazione methodmetodo
activated_onattivato_il metricmetrico
activeattiva min_levellivello_minimo
active_packsattivi missingmancano
addressindirizzo modifiedmodificati
address_keyindirizzo_confronto monthmese
addressesindirizzi monthly_cap_eurtetto_mese_eur
afterdopo multiple_postcodesmulticap
ageeta municipalitycomune
agreementconsenso municipality_codecomune_codice
ambiguous_yearanno_ambiguo municipality_code_typecomune_codice_tipo
areaarea n_recordsn_anagrafiche
asyncasincrono name_idnome_id
auto_topupauto_ricarica name_originalnome_originale
availabledisponibile national_numbernazionale
beforeprima nearbyvicino
belfiore_codecodice_belfiore needednecessarie
birth_countrynazione_nascita needs_topupda_ricaricare
birth_datedata_nascita networkrete
birth_placecomune_nascita normalizednormalizzato
birth_place_nameluogo_nascita normalized_postalnormalizzato_postale
birth_provinceprovincia_nascita not_foundnon_trovati
born_abroadnato_estero notenota
boughtcomprati notesnote
buildingedificio numbernumero
cadastral_codecatastale numbersnumeri
canonical_addressindirizzo_canonico occurrencesoccorrenze
canonical_citylocalita_canonica operationselaborazioni
care_ofpresso operatoroperatore
certificate_okcertificato_ok originorigine
changedmodificato otheraltro
changesmodifiche outcomeesito
chargedconsumate outcome_labelesito_label
checkcontrolla outcomesesiti
check_digitcontrollo overall_cap_eurtetto_globale_eur
citylocalita packspacchetti
city_keylocalita_confronto parsedletto
city_passescicli_localita phasefase
city_typelocalita_tipo phonetelefono
classclasse phone2telefono2
codecodice phone3telefono3
colourcolore phonestelefoni
commentscommenti placeluogo
conditionscondizioni positionposizione
confidenceconfidenza postcodecap
confirmedconfermato postcode_checkcap_verifica
consolidateconsolida precisionprecisione
contactcontatto preserve_originalpreserva_originale
contact_personreferente presumedpresunto
corrected_fromcorretta_da processedlavorato
countercontatore processed_atdatalav
counterscontatori professionqualifica
countriesnazioni provenanceprovenienza
countrynazione provinceprovincia
country_codenazione_iso2 provincial_capitalcapoluogo
country_originalnazione_originale reachableraggiungibile
country_prefixprefisso_paese reasonmotivo
createdcreato record_outcomeesito_record
creditcredito recordsanagrafiche
dedupededuplica redirectsredirect
detaildettaglio referenceriferimento
differencesdifferenze reference_idriferimento_id
discardedscartati remainingrimaste
disposableusa_e_getta renews_onsi_rinnova_il
districtquartiere reset_onsi_azzerano_il
domain_checkeddominio_verificato rowsrighe
domain_existsdominio_esiste salutationsaluto
donefatte savesalva
duration_msdurata_ms segment_passescicli_arcostradale
e164formato_e164 sessionsessione
educationtitolo_studio shortbreve
entriesschede singlessingoli
errorerrore sizetaglia
existsesiste sourcefonte
expiryscadenza specificityspecificita
explanationsspiegazioni spent_month_eurspeso_mese_eur
extensionestensione spent_overall_month_eurspeso_globale_mese_eur
fieldcampo statestato
final_urlurl_finale statesstati
first_namenome streetstrada
foreignesteri street_idvia_id
foreign_addressestero street_nametoponimo
formal_salutationsaluto_formale street_passescicli_toponimo
formatformato street_proper_nameduf
foundtrovato street_typedug
freegratuite sub_addresssubindirizzo
free_forevergratis_per_sempre sub_address_confirmedsubindirizzo_confermato
full_namenominativo subject_typetipo_soggetto
gendersesso subscriptionabbonamento
gender_sourcefonte_sesso suffixesponente
genericgenerica suggestionsuggerimento
groupgruppo summaryriepilogo
groupsgruppi supportedsupportato
hamletfrazione syntaxsintassi
hintssuggerimenti tax_codecodice_fiscale
homocodeomocodo tax_code_outcomecodice_fiscale_esito
house_numbercivico territoryterritorio
house_number_labelcivico_label texttesto
house_number_verifiedcivico_verificato time_mstempo_ms
house_numberscivici titletitolo
informal_salutationsaluto_informale to_checkda_controllare
iso2codice_iso2 totaltotali
iso3codice_iso3 towncitta
istat_codeistat truncatedtroncato
itemselementi typetipo
joblavoro type_normalizedtipo_norm
languagelingua typestipi
languageslingue unresolvednon_risolti
last_namecognome url_normalizedurl_normalizzato
last_onultimo_il usedusate
last_usedultimo_uso validvalida
leftresiduo valuevalore
legacy_defaultdefault_storico warningavviso
levellivello warningsavvisi
lightleggere websitesito
longlungo website2sito2
long_namenome_esteso website3sito3
main_recordprincipale websitessiti
matchcorrisponde zonedzonato
matchesabbinamenti

Les valeurs des options ont aussi un nom italien : format nazionale/internazionale, action genera/valida/estrai/confronta/seleziona, foreign dichiarati/rileva, min_level certo/probabile/ambiguo ; avec "language": "it" ressortent ainsi aussi level, confidence, state, les codes de outcome et les en-têtes des fichiers. En entrée, les synonymes courants sont aussi acceptés (zip, surname, phone_number, date_of_birth…), ainsi que les mêmes en-têtes dans les fichiers des traitements par lots.

Endpoint vérification de contact

POST /api/v1/contact

Met en ordre le contact entier : l'adresse selon le standard postal de son pays — en Italie et dans les pays dont le référentiel est en service, la voie et le numéro sont vérifiés dans le référentiel national des adresses ; ailleurs l'adresse sort dans la forme postale du pays —, le nom et — si la requête le porte — le code fiscal italien, nettoyé, complété s'il ne manque que le caractère de contrôle et confronté au nom, au prénom, au sexe et à la date de naissance. Un contact à la fois, ou jusqu'à 500 dans items : le schéma est le même pour tous les autres endpoints.

Le pays s'indique avec country_code (ISO 3166-1 : IT, DE, FR…) ou avec country, écrit comme il vient : « Germania », « Germany », « Deutschland », « République fédérale d'Allemagne », « UK », « Hollande ». S'il manque, l'Italie est présumée. Dans les pays dont le référentiel est en service — aujourd'hui France, Allemagne, Espagne, Pays-Bas, Belgique, Finlande, Tchéquie, Portugal, Danemark, Norvège, Autriche, Suisse, Slovaquie, Croatie, Roumanie, Hongrie, Slovénie, Irlande, Islande, Luxembourg, Liechtenstein, Saint-Marin, Monaco, Andorre, Cité du Vatican, la liste à jour est dans Pays — la voie et le numéro sont vérifiés dans le référentiel national des adresses comme en Italie : code postal confirmé ou complété, coordonnées du numéro dans geo, quartier ou arrondissement dans district là où la ville en a (Hamburg-Altstadt, Paris 4e Arrondissement), code de la commune dans territory.municipality_code. En italien le résultat porte FOREIGN suivi des modifications, dans les autres langues seulement les modifications ; si la voie existe et pas le numéro, HOUSE_NUMBER_NOT_FOUND. Dans les autres pays nous travaillons sur la forme, et le message le dit : code postal au format du pays, abréviations de la voie développées, majuscules et nom de la ville tels que la poste de ce pays les écrit (Hauptstr. 5, Munich → Hauptstraße 5, MÜNCHEN), avec la ligne du pays. Dans les deux cas revient address_key, la forme avec laquelle la déduplication reconnaît la même voie écrite de deux façons. Avec "foreign": "detect", un enregistrement sans pays introuvable en Italie est reconnu comme étranger quand le texte le dit clairement ; la valeur par défaut declared ne laisse étranger que ce qui le déclare. Le catalogue complet des pays, avec nom court et officiel, en anglais et dans la langue du pays, est disponible avec GET /api/v1/countries et s'interroge avec ?q=Germania, ?q=Deutschland ou ?q=DE.

curl -X POST https://www.radaraddress.com/api/v1/contact \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"address":"via leopardi 4","postcode":"20100","city":"milano","province":"mi","id":"RIF-001"}'

Pour le lot, les mêmes champs dans items ; la réponse est { count, results: [ { id, result } ] } dans le même ordre que l'envoi.

curl -X POST https://www.radaraddress.com/api/v1/contact \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"items":[{"id":"1","address":"via leopardi 4","city":"milano"},
                   {"id":"2","address":"via roma 1","postcode":"20121","tax_code":"RSSMRA85M01H501Q"}]}'

Le même endpoint pour une adresse d'un autre pays : country_code suffit. Ici Hambourg, vérifiée dans le référentiel allemand, avec le quartier et les coordonnées du numéro.

curl -X POST https://www.radaraddress.com/api/v1/contact \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"address":"Mönckebergstr. 7","postcode":"20095","city":"Hamburg","country_code":"DE"}'
→ { "outcome": "FOREIGN MODIFIED CITY_FORM STREET_FORM",
  "normalized": { "address": "Mönckebergstraße 7", "postcode": "20095", "city": "HAMBURG", "country": "Germany", "country_code": "DE" },
  "municipality": "Hamburg", "district": "Hamburg-Altstadt", "address_key": "MONCKEBERGSTRASSE",
  "geo": { "lat": 53.5512437, "lon": 10.0028651, "precision": "house_number", "source": "inspire" },
  "territory": { "country": "DE", "municipality_code": "AdminUnitName_49021011010101", "municipality_code_type": "inspire" } }

Options valables pour l'appel entier : postal_form (force aussi normalized dans la forme postale), preserve_original (garde le nom tel que l'utilisateur l'a écrit et expose le canonique à part), precision 1–5 (3 par défaut ; au-delà de 3, la correspondance est approximative et la fiabilité ne sera pas high).

Avec l'adresse revient city_type, qui dit si le point de distribution est dans un chef-lieu de province ou dans une commune de la province — la différence qui compte pour qui segmente une campagne par ville. provincial_capital vaut true, false ou null quand nous n'avons pas d'éléments pour le dire — et dans ce cas nous ne devinons pas.

→ { "city_type": { "provincial_capital": true, "label": "Provincial capital" } }

À côté du code postal vient postcode_check : d'où il vient (source) et avec quelle précision (precision : house_number le numéro lui-même, interpolated les numéros voisins de la même rue, street la majorité de la rue, locality, municipality), combien de numéros le disent (house_numbers) et avec quel accord (agreement, de 0 à 1). Sans confirmation pour ce numéro, le résultat porte POSTCODE_UNCONFIRMED et confirmed vaut false : le code postal reste celui indiqué, s'il fait partie de ceux de la ville, et doit être vérifié.

→ { "postcode_check": { "source": "osm", "precision": "house_number", "house_numbers": 3, "agreement": 1, "confirmed": true } }

Reviennent aussi les coordonnées dans geo (latitude et longitude WGS84) et les identifiants territoriaux dans territory : en Italie le code ISTAT et le code cadastral de la commune, le CAB et l'identifiant national de la voie ; dans les autres pays country et le code de la commune dans le référentiel national (municipality_code). Le champ precision dit à quel niveau nous sommes arrivés : house_number quand le numéro est géoréférencé, interpolated quand le numéro exact manque et que le point est estimé, street quand nous avons le point de la voie, municipality quand nous n'avons que le centre de la commune. source dit d'où vient le point : anncsu est le référentiel national italien, inspire le référentiel national du pays, osm OpenStreetMap : dans ce cas les données sont © OpenStreetMap contributors, licence ODbL, et l'attribution doit être reproduite si vous les publiez. Là où le référentiel d'un pays impose une attribution, elle sort dans le message. Dans le CSV des travaux en bloc ce sont les colonnes latitude, longitude, geo_precision, istat_code et cadastral_code.

→ { "geo": { "lat": 45.4762711, "lon": 9.207104, "precision": "house_number", "source": "anncsu" },
  "territory": { "istat_code": "015146", "cadastral_code": "F205", "cab": "01600", "street_id": "1026700" } }

L'étage, l'escalier et l'appartement écrits dans l'adresse reviennent aussi comme données à part dans sub_address : une liste de paires type et value, lues selon les règles postales du pays (en Allemagne après « // », en France sur une ligne à part, au Portugal « 3º Esq »). Les types sont unit (appartement), staircase (escalier), floor (étage), block, building, building_number et block_number. La ligne d'adresse reste dans la forme du pays. Ce que nous ne reconnaissons pas reste tel qu'il était écrit et n'entre pas dans la liste : nous ne le devinons pas. Quand l'unité indiquée figure à ce numéro, sub_address_confirmed vaut true ; sinon null, jamais false : ne pas la trouver ne veut pas dire qu'elle est fausse.

→ { "sub_address": [ { "type": "floor", "value": "3" }, { "type": "unit", "value": "ESQ" } ], "sub_address_confirmed": true }

Endpoint dédoublonnage

POST /api/v1/dedupe

Reconnaît les fiches qui désignent la même personne à la même adresse même quand elles sont écrites différemment : diminutifs et équivalences de prénoms (Dany ≈ Daniela), nom et prénom inversés, abréviations ("V. Roma" ≈ "Via Roma"), fautes de frappe. La comparaison des adresses passe par le moteur de normalisation : deux graphies différentes de la même voie se rabattent sur la forme canonique avant la comparaison. Au maximum 500 contacts par appel (fiches + référence) ; pour des listes plus grandes, utilisez le traitement par lots depuis l'espace personnel.

Carnets d'adresses. Un contact d'un carnet d'adresses (Contacts d'Apple, Google, Outlook : le modèle vCard) a plusieurs adresses, plusieurs téléphones et plusieurs e-mails, chacun avec une étiquette. L'endpoint les accepte tels quels, sans plafond : addresses est une liste d'objets avec type et les champs habituels ; phones et emails sont des listes dont chaque élément est la donnée seule ("340 7491386") ou {"type": "work", "value": "02 66710423"}, même mélangés ; les champs plats habituels restent valables et valent comme première adresse et première coordonnée. Deux contacts sont la même personne si n'importe quelle paire de leurs adresses coïncide (le bureau de l'un avec l'unique adresse de l'autre), ou s'ils ont le même nom et un téléphone ou un e-mail en commun, à n'importe quelle position et sous n'importe quelle étiquette. Le type ne pèse pas sur le rapprochement : il revient tel qu'il est arrivé, plus type_normalized dans le vocabulaire vCard (home, work, cell…), pour que l'application sache où réécrire. Un contact est une opération, quel que soit le nombre d'adresses et de coordonnées.

curl -X POST https://www.radaraddress.com/api/v1/dedupe \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "records": [
      { "id": "C1", "last_name": "Rossi", "first_name": "Daniela",
        "address": "Via Leopardi 4", "postcode": "20123", "city": "Milano", "province": "MI" },
      { "id": "C2", "last_name": "Rossi", "first_name": "Daniela",
        "address": "V. Leopardi 4", "postcode": "20100", "city": "milano", "province": "MI" }
    ]
  }'

La réponse regroupe les doublons dans groups : chaque groupe énumère les id de ses members, indique laquelle garder (main_record) et propose le record consolidé : le meilleur nom et l'union des adresses et des coordonnées (addresses, phones, emails), chacune avec son type, avec provenance (de quels contacts elle vient) et dédoublonnée : la même voie en deux graphies est une seule adresse, le même numéro sous deux étiquettes un seul numéro. Les contacts sans correspondance sont dans singles, sous forme d'objets {id, outcome} : avec outcome INTERNAL_DUPLICATE, le contact n'a pas de doublon avec d'autres mais en a en son sein (adresse écrite deux fois, numéro répété), et porte son record fusionné. Il reconnaît la même voie écrite de différentes façons ("V. Leopardi 4" ≈ "Via Giacomo Leopardi 4"), le code postal remis d'aplomb automatiquement et nom et prénom inversés.

Paramètres du dédoublonnage
ParamètreTypeDescription
recordsarrayObligatoire. Fiches avec last_name, first_name, address, postcode, city, province et, facultatifs, id, gender, email, phone, country. Les fiches étrangères (champ country, ou province EE) sont reconnues même écrites différemment (« Hauptstr. 5 » et « Hauptstraße 5 ») ; deux pays différents ne sont jamais la même fiche. Un téléphone ou un e-mail en commun rapprochent deux fiches même avec une adresse différente : au plus probable si la coordonnée est personnelle, seulement ambiguous si elle appartient à un lieu partagé (un fixe, un e-mail générique)
addresses, phones, emailsarrayFacultatifs, dans chaque fiche : les listes du carnet d'adresses, sans plafond (voir ci-dessus). phone et email acceptent les trois mêmes formes : la donnée seule, une liste de données, une liste de {type, value}
tax_codestringFacultatif, dans chaque fiche. S'il est valide et cohérent avec le nom de la fiche, deux fiches avec le même code sont la même personne même à des adresses différentes (certain, raison « même codice fiscale ») ; avec deux codes valides et différents, elles ne sont jamais certain ni probable. Un code qui ne concorde pas avec le nom ne pèse pas
referencearrayFacultatif : mode deux listes. Chaque fiche est cherchée dans la référence ; réponse avec matches et not_found
min_levelstringcertain | probable (par défaut) | ambiguous : l'élasticité de la correspondance. certain = la voie et le numéro doivent coïncider ; ambiguous ignore le numéro. Deux fiches sans adresse ni ville ne sont jamais certain
foreignstringdeclared (par défaut : n'est étrangère que la fiche qui indique le pays) | detect (aussi d'après les signaux explicites dans le texte : nom du pays, ville étrangère connue, code postal d'une forme non italienne)
savebooltrue par défaut : le résultat reste consultable pendant 30 jours avec GET /api/v1/dedupe?job=<code> ; le code arrive dans le champ job. Avec POST {"job", "group", "processed": true}, vous marquez un groupe comme revu

Endpoint codice fiscale

POST /api/v1/tax-code

Trois actions sur le codice fiscale (identifiant fiscal italien) des personnes physiques : generate à partir des données d'état civil, validate un code existant (format, caractère de contrôle et omocodia), extract les informations qu'il contient — date de naissance, âge, sexe, commune ou pays étranger de naissance. En plus, compare vérifie qu'un code correspond aux données déclarées. Il couvre les codes cadastraux de toutes les communes italiennes et des pays étrangers. Le nom et le prénom doivent être passés en caractères latins : pour une personne dont le nom est dans un autre alphabet, le code se calcule sur la translittération figurant sur le document, qui n'est pas unique (Dmitrij/Dmitry) ; un nom non latin renvoie cognome_non_latino ou nome_non_latino, et dans compare une différence sur le nom d'une personne née à l'étranger porte une note sur une possible translittération différente.

Les 500 premières opérations légères par mois sont gratuites (codice fiscale compris), et le quota est unique quel que soit le mode d'utilisation : ce que vous faites ici, sur le site et dans les fichiers par lots compte sur le même plafond. Au-delà, les opérations légères se paient à leur prix (voir tarifs).

curl -X POST https://www.radaraddress.com/api/v1/tax-code \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "generate",
    "last_name": "Rossi", "first_name": "Mario", "gender": "M",
    "birth_date": "1980-01-01", "birth_place": "Roma"
  }'

→ { "ok": true, "tax_code": "RSSMRA80A01H501U", "place": "Roma", "province": "RM" }

Pour les volumes : { "action": "validate", "items": [ … ] } traite jusqu'à 500 éléments par appel, chacun avec son propre id de corrélation. L'extraction signale avec ambiguous_year les cas où les deux chiffres de l'année ne permettent pas de distinguer le siècle (1926 ou 2026).

Chaque réponse porte outcome, reason, notes et comments dans la langue de la requête : GENERATED pour generate, vide pour un code valide dans validate, MATCH ou MISMATCH pour compare (avec differences : les champs qui ne concordent pas). Quand le code échoue aux contrôles, le résultat est l'un des codes TAX_CODE_* listés ci-dessous et error en donne la forme courte (check_digit, length, format, homocode, month, date, place, empty) ; sur generate il dit quelle donnée manque ou ne se résout pas (last_name, first_name, gender, birth_date, birth_place, ambiguous_place avec options, last_name_non_latin). suggestion porte le code correct quand le contrôle sait le reconstruire.

Endpoint enrichissement

POST /api/v1/enrichment

Enrichit un nom : sexe déduit du prénom, type de sujet (personne physique ou morale), titre normalisé (Dott.ssa, Avv., …) et formules d'appel prêtes pour la correspondance — "Egregio Sig. Rossi", "Gentile Dott.ssa Bianchi", "Spett.le" pour les entreprises, "Gentile Famiglia" pour les foyers, "Caro/Cara" pour le registre familier. Il reconnaît aussi la forme d'épouse dans le nom ("Rossi in Verdi" → femme, avec le détail des deux noms). Le champ gender accepte aussi les formes écrites (« maschio », « donna », « Sig.ra », « male ») ; X désigne un organisme et G une famille ou un couple. Si le titre manque, nous le déduisons de profession (la profession) ou de education, quand l'un des deux est renseigné. Les dictionnaires sont italiens.

curl -X POST https://www.radaraddress.com/api/v1/enrichment \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "last_name": "Rossi", "first_name": "Dott.ssa Maria" }'

→ { "ok": true, "gender": "F", "subject_type": "natural_person", "title": "Dott.ssa",
    "formal_salutation": "Gentile Dott.ssa Rossi", "informal_salutation": "Cara Maria", … }

Par lots : { "items": [ … ] }, jusqu'à 500 par appel. Le résultat est ENRICHED (sexe et formules d'appel définis), LEGAL_PERSON (société ou organisme : traité comme raison sociale) ou PARTIAL (prénom absent, ou sexe non déductible) : reason dit pourquoi, comments quoi ajouter pour compléter.

Endpoint vérification d'e-mail

POST /api/v1/email

Vérifie une adresse e-mail : syntaxe, existence du domaine (enregistrements MX/A), fautes de frappe des domaines courants avec correction proposée (gmial.com → gmail.com), domaines jetables, adresses génériques (info@, comptabilite@ : pas celles d'une personne). Nous ne faisons pas de vérification SMTP de la boîte elle-même, pratique intrusive et peu fiable. Lot items jusqu'à 500 ; "dns": false saute la consultation du domaine.

Une faute de frappe certaine est corrigée d'office : quand l'adresse telle qu'elle est écrite n'est même pas une adresse (nom@domaine,fr avec une virgule) ou quand la correction aboutit à un fournisseur connu (gmai.com → gmail.com, y compris à une lettre près si le domaine écrit ne reçoit pas de courrier), email ressort corrigé, corrected_from garde ce qui était écrit et le résultat est MODIFIED EMAIL_DOMAIN. Une faute possible sur un domaine quelconque (rossi.con) reste une proposition : EMAIL_TYPO avec la correction dans suggestion, et les contrôles (domain_exists, domain_checked) portent sur elle ; l'adresse telle qu'elle est écrite n'est pas vérifiée.

Endpoint vérification de téléphone

POST /api/v1/phone

Contrôle un numéro sans appeler personne : forme, classe et type, longueur selon le plan de numérotation, zone du fixe et opérateur auquel la tranche a été attribuée à l'origine. La class est la lecture qui sert à travailler une liste : mobile (vous pouvez lui envoyer un SMS), landline (vous l'appelez aux heures de bureau), special (ce n'est pas la coordonnée d'une personne : urgences, utilité publique, numéros verts et à tarif majoré), foreign pour les numéros avec indicatif international. Quand nous reconnaissons aussi le service précis, type le dit (numéro vert, tarif spécial, coût partagé, utilité publique). L'indicatif italien écrit sans le + (39347…, coquille classique des exports), nous l'enlevons quand les chiffres ne laissent aucun doute — 3934567890 reste le mobile qu'il est. Si le même champ contient plusieurs numéros (« 347… - 338… »), nous les séparons : ils reviennent comme phone, phone2, phone3, et phone n'est jamais vide quand il y a au moins un numéro. Avec "format": "international", le numéro italien sort sous la forme +39… ; la valeur par défaut national le laisse nu et ne met l'indicatif que sur les numéros étrangers. Pour les étrangers reviennent aussi e164, le pays de l'indicatif dans country_code, et le zéro de réseau après l'indicatif est enlevé (« +44 (0)20… » et « +44 20… » donnent le même numéro). Avec country_code (ou country) dans l'appel ou dans l'élément, un numéro écrit sans indicatif est lu comme numéro national de ce pays : « 020 7946 0958 » dans une fiche du Royaume-Uni, c'est Londres, pas Milan. Sans pays, il reste italien. Lot items jusqu'à 500.

Un numéro du pays de la fiche n'est pas « étranger » : là où nous connaissons le plan de numérotation, il reçoit sa class (mobile, landline, special), avec format national il reste sans indicatif dans la forme de son pays (zéro de réseau compris), et national_number est renvoyé à côté de e164. PHONE_FOREIGN et class foreign restent pour les numéros d'un pays autre que celui de la fiche.

curl -X POST https://www.radaraddress.com/api/v1/phone \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"phone":"3470328959 - 011 1253265"}'

Endpoint vérification de site web

POST /api/v1/website

Vérifie que l'adresse est bien écrite et que le site répond vraiment : existence du domaine, requête HTTP avec suivi des redirections, code final, validité du certificat. Aucun jugement sur le contenu. Ici aussi, plusieurs adresses dans le même champ reviennent comme website, website2, website3. Avec "network": false, nous contrôlons seulement la forme, sans contacter le site. Lot items jusqu'à 100 : chaque vérification ouvre une connexion, le lot est donc plus petit que sur les autres endpoints.

curl -X POST https://www.radaraddress.com/api/v1/website \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"website":"www.example.com"}'

Endpoint autocomplétion d'adresse

POST /api/v1/suggest

Vous partez de zéro ? Le widget ra-suggerisci.js et un petit proxy sur votre serveur suffisent : le jeton ne va jamais dans le navigateur.

Des suggestions pendant que l'utilisateur tape une adresse dans votre formulaire : tout le référentiel des voies italien, avec le nom complété (« via verdi » → « Via Giuseppe Verdi »), commune et province ; le code postal arrive avec la sélection, dans les grandes villes à zones postales le bon code du numéro. Cela fonctionne par session : le client génère un UUID pour chaque adresse en cours de saisie, les requêtes de suggestion sont gratuites, et vous payez une vérification de contact quand l'utilisateur sélectionne et que les champs se remplissent (action select, qui renvoie la fiche déjà normalisée par le moteur). Les champs déjà remplis dans le formulaire — même en partie — voyagent comme contexte et resserrent les suggestions.

curl -X POST https://www.radaraddress.com/api/v1/suggest \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"session":"CLIENT-UUID","q":"via verdi","city":"monz"}'

# when the user picks one: closes the session and charges the selection
curl -X POST https://www.radaraddress.com/api/v1/suggest \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"session":"CLIENT-UUID","action":"select","street_id":1063428,"house_number":"4"}'

Une fois la voie choisie, le numéro se complète : en passant street_id avec le numéro partiel, vous obtenez les numéros existants de cette voie, avec exists vrai/faux pour valider celui qui a été tapé — et la sélection peut se répéter avec le numéro sans nouveau débit : le débit est par session et par voie, pas par clic ; une autre voie dans la même session est un autre débit. Les numéros ne se complètent que dans la session qui a sélectionné cette voie. Dans les villes à zones postales, c'est le numéro qui détermine le code postal exact.

Le token API ne va jamais dans le navigateur : le widget prêt à l'emploi (ra-suggerisci.js) appelle un petit proxy sur votre serveur, qui ajoute le token et transmet. Chaque session admet jusqu'à 30 appels et vaut 10 minutes ; les sessions sans sélection sont gratuites jusqu'à 200 par jour et par token, plus cinq par sélection. Widget, proxy prêt et formulaire d'exemple se trouvent dans le kit de Votre formulaire.

Fonctionne dans chaque pays en service (aujourd'hui France, Allemagne, Espagne, Pays-Bas, Belgique, Finlande, Tchéquie, Portugal, Danemark, Norvège, Autriche, Suisse, Slovaquie, Croatie, Roumanie, Hongrie, Slovénie, Irlande, Islande, Luxembourg, Liechtenstein, Saint-Marin, Monaco, Andorre, Cité du Vatican ; la liste à jour est dans Pays) : avec country_code ou country, les suggestions viennent du registre de ce pays, et le texte s'écrit comme on l'écrit là-bas — rue, numéro, code postal et ville même dans un seul champ : «kalverstraat 92 amst», «92 rue de rivoli paris», aux Pays-Bas «1012PH 92». Chaque réponse porte parsed, c'est-à-dire comment le serveur a lu la rue (street), le numéro (house_number) et le code postal (postcode) : votre formulaire sait où se trouve le numéro sans connaître les règles du pays. Les suggestions portent la rue, la ville, la localité s'il y en a une, et source (registry, ou osm là où le registre national ne publie pas) ; le code postal et les numéros ne figurent jamais dans les suggestions : ils arrivent avec la sélection, qui passe par le moteur et renvoie le même enregistrement que /contact (postcode confirmé par le registre, geo au numéro). Avec la sélection vous pouvez aussi passer postcode, celui écrit dans le formulaire. attribution est la mention de source à afficher à côté des suggestions : la licence du registre l'exige. Si le pays manque, IT est présumé ; pour un pays hors service la réponse reste HTTP 200 avec supported:false et hints:[], sans créer la session ni rien facturer. Une session appartient à un pays : s'il change, le client génère un nouvel UUID (sinon 409 session_country).

curl -X POST https://www.radaraddress.com/api/v1/suggest \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"session":"CLIENT-UUID","q":"kalverstraat 92 amst","country_code":"NL"}'

{"ok":true,"phase":"streets",
 "hints":[{"type":"street","id":642154,"name":"Kalverstraat","municipality":"Amsterdam","area":"","source":"registry"}],
 "parsed":{"street":"kalverstraat","house_number":"92","postcode":""},
 "attribution":"Bron: Kadaster — BAG"}

Gros volumes : le traitement asynchrone

Les appels normaux répondent tout de suite, et c'est pourquoi ils ont un plafond d'éléments — une requête HTTP qui dure des minutes ne sert à personne. Les plafonds suivent le coût de l'opération :

Plafonds d'éléments par appel
EndpointÉléments par appelPourquoi
/phone5.000vérification immédiate
/tax-code, /enrichment2.000vérification rapide
/contact, /email, /dedupe500vérification complète
/website100une connexion au site pour chaque adresse

Au-delà de ces nombres, pas besoin de découper la liste à la main : on ajoute "async": true et l'appel revient tout de suite avec un code, pendant que le traitement rejoint la même file d'attente que le chargement de fichiers. Jusqu'à 100 000 éléments par appel, et dans Mes traitements il n'en apparaît qu'un seul.

curl -X POST https://www.radaraddress.com/api/v1/contact \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"async":true,"items":[ … 100,000 contacts … ]}'

{"ok":true,"job":"369e46e9e7bb…","state":"queued","rows":100000}

Ensuite, vous le relisez quand il le faut, et le résultat arrive en JSON ou en CSV :

curl 'https://www.radaraddress.com/api/v1/contact?job=369e46e9e7bb…' \
  -H 'Authorization: Bearer YOUR_TOKEN'

{"ok":true,"state":"completed","rows":100000,"done":100000,
 "outcomes":{"ok":1240,"modified":95300,"to_check":2100,"unresolved":1360}}

curl 'https://www.radaraddress.com/api/v1/contact?job=369e46e9e7bb…&format=csv' \
  -H 'Authorization: Bearer YOUR_TOKEN' -o result.csv

Sous 5 000 lignes, le résultat revient aussi dans results à l'intérieur du JSON ; au-dessus, il se télécharge en CSV. Le débit a lieu quand le traitement est mis en file d'attente, et la partie non traitée revient sur votre solde si le traitement s'arrête. Le token doit être lié à un compte : le traitement finit dans votre file.

Codes de statut

Chaque réponse contient le champ outcome : une liste de mots-clés, vide quand il n'y a rien à signaler. Le schéma est toujours <conditions> [MODIFIED <types>] — les conditions devant, les modifications à la fin — et vaut pour tous les services. À côté, vous trouvez outcome_label (ou kind) avec ok, modified, warning, error, et reason avec l'explication en une ligne. Les codes sont des identifiants : ils se comparent, ils ne se traduisent pas ; avec "language": "it" ressortent les codes italiens (LOCALITA_NON_TROVATA MODIFICATO CAP INDIRIZZO), les mêmes mot pour mot.

Adresse (vérification de contact)

Codes de statut — adresse (vérification de contact)
CodeSignification
OKAucune modification nécessaire, adresse déjà conforme (statut vide)
MODIFIEDAdresse normalisée, suivie des champs modifiés : POSTCODE, PROVINCE, CITY/CITY_FORM, STREET/STREET_FORM, BUILDING (le suffixe _FORM = seulement le format/les accents, la valeur était déjà correcte). Le schéma du champ est <conditions> [MODIFIED <types>] : les éventuelles conditions viennent d'abord, MODIFIED et ses types à la fin
PO_BOXDistribution en boîte postale reconnue (pas une voie) : forme CASELLA POSTALE n
LOCALITY_WITHOUT_STREETL'adresse est un lieu-dit sans nom de voie ; la distribution reste possible
CITY_NOT_FOUNDCommune non reconnue
CITY_AMBIGUOUSNom de commune présent dans plusieurs provinces
STREET_NOT_FOUNDVoie non répertoriée pour cette ville
STREET_AMBIGUOUSNom de voie présent dans plusieurs quartiers de la commune
STREET_TYPE_MISSINGType de voie non reconnaissable (Via/Corso/Piazza… manquant)
HOUSE_NUMBER_MISSINGNuméro de voie absent ou non valide
HOUSE_NUMBER_INVALID_FORMATNuméro de voie dans une forme non reconnue
POSTCODE_UNCONFIRMEDLa rue existe mais il n'y a pas de confirmation du code postal pour ce numéro : celui indiqué reste, s'il fait partie de ceux de la ville
POSTCODE_PRESUMEDLa rue existe et nous avons mis le code postal sans confirmation du numéro : la rue en a plusieurs et le numéro ne tranche pas, ou aucun n'était indiqué et il vient des numéros voisins
INCOMPLETE_DATAInformations insuffisantes pour la normalisation
FOREIGNAdresse hors d'Italie, dans la forme postale de son pays ; là où le référentiel national est en service, la voie et le numéro sont vérifiés, et le message le dit (en italien seulement)
HOUSE_NUMBER_NOT_FOUNDÉtranger : la rue existe dans le registre national, le numéro indiqué non (seulement là où le registre a tous les numéros : d'une source partielle ou d'OpenStreetMap, un numéro absent n'est pas un verdict)
POSTCODE_INVALID_FORMATÉtranger : le code postal n'a pas la forme en usage dans le pays indiqué
COUNTRY_UNRESOLVEDÉtranger : le pays écrit dans l'adresse ne figure pas dans le catalogue ISO 3166-1

Codice fiscale italien

Codes de statut — codice fiscale
CodeSignification
TAX_CODE_INVALIDLe code ne passe pas les contrôles ; reason dit lequel (caractère de contrôle, longueur, mois, date, commune) et suggestion propose la forme correcte quand elle est reconstituable
TAX_CODE_MISMATCHLe code est valide mais ne concorde pas avec le nom, le prénom, le sexe ou la date de la requête
MODIFIED TAX_CODELe caractère de contrôle manquait : recalculé à partir des 15 premiers
MODIFIED TAX_CODE_FORMSeule la forme a été nettoyée (majuscules, espaces)
GENERATEDEndpoint /tax-code, action generate : code calculé à partir des données d'état civil
MATCH / MISMATCHEndpoint /tax-code, action compare : le code correspond ou non aux données ; differences liste les champs qui ne concordent pas

Sur l'endpoint /tax-code, les mêmes contrôles ont leurs propres codes — TAX_CODE_CHECK_DIGIT_WRONG, TAX_CODE_CHECK_DIGIT_MISSING, TAX_CODE_LENGTH_WRONG, TAX_CODE_FORMAT_WRONG, TAX_CODE_MONTH_WRONG, TAX_CODE_DATE_INVALID, TAX_CODE_PLACE_UNKNOWN, TAX_CODE_EMPTY — parce que là, le codice fiscale est l'objet de la vérification, pas un champ de la fiche.

Enrichissement

Codes de résultat — enrichissement
CodeSignification
ENRICHEDPersonne physique : sexe déduit ou confirmé, titre et formules d'appel définis
LEGAL_PERSONSociété ou organisme : en-tête traité comme raison sociale (Spett.le)
PARTIALPrénom absent, ou sexe non déductible du prénom : formule d'appel neutre

E-mail

Codes de statut — e-mail
CodeSignification
EMAIL_INVALIDSyntaxe non valide
EMAIL_DOMAIN_NOT_FOUNDLe domaine ne reçoit pas d'e-mails (aucun enregistrement MX/A)
EMAIL_TYPOFaute de frappe possible dans le domaine : la correction est une proposition, dans suggestion et dans le champ normalisé
MODIFIED EMAIL_DOMAINFaute de frappe certaine dans le domaine, corrigée : corrected_from garde ce qui était écrit
EMAIL_DISPOSABLEDomaine de messagerie jetable
EMAIL_ROLE_BASEDAdresse de l'organisation (info@, commandes@), pas d'une personne. C'est un signalement, pas une erreur
EMAIL_EMPTYAucune adresse dans le champ
MODIFIED EMAIL_FORMSeule la forme a été nettoyée (espaces, majuscules)

Téléphone

Codes de statut — téléphone
CodeSignification
PHONE_INVALIDCe n'est pas un numéro reconnaissable
PHONE_LENGTH_ANOMALOUSNombre de chiffres incompatible avec le plan de numérotation
PHONE_OUT_OF_PLANNe commence ni par 0 (fixe) ni par 3 (mobile)
PHONE_FOREIGNNuméro avec un indicatif international non italien (ou numéro national d'une fiche étrangère) : nous n'en contrôlons que la forme, en E.164
PHONE_SPECIALNuméro vert ou à tarif spécial : ce n'est pas la coordonnée d'une personne
PHONE_SERVICENuméro d'utilité publique (112, 118…)
PHONE_WITH_EXTENSIONLe champ contenait aussi un poste ou une note : nous vérifions seulement le numéro
PHONE_EMPTYAucun numéro dans le champ
MODIFIED PHONE_FORMSeule la forme a été nettoyée (espaces, points, indicatif)

Site web

Codes de statut — site web
CodeSignification
WEBSITE_INVALIDCe n'est pas une adresse web correctement écrite
WEBSITE_DOMAIN_NOT_FOUNDLe domaine n'existe pas (aucun enregistrement DNS)
WEBSITE_NOT_RESPONDINGLe domaine existe mais aucun serveur ne répond
WEBSITE_PAGE_NOT_FOUNDLe site répond mais la page n'existe pas (404/410)
WEBSITE_ACCESS_DENIEDLe site refuse l'accès (401/403) : souvent une protection anti-robots
WEBSITE_CERTIFICATE_INVALIDLe site répond mais le certificat n'est pas vérifiable
WEBSITE_RESPONSE_ANOMALOUSCode de réponse inattendu
WEBSITE_EMPTYAucune adresse dans le champ
MODIFIED WEBSITE_FORMAdresse complétée (schéma, www) sans en changer la substance

Ce que consomme chaque appel

Chaque appel consomme des opérations du compteur du service : vérification de contact (/contact, /suggest à la sélection), dédoublonnage (/dedupe) et opérations légères (/email, /phone, /website, /enrichment, /tax-code au-delà du quota gratuit). Les opérations s'achètent par packs qui restent, ou avec un abonnement mensuel ; le prix pour 1 000 baisse avec la taille et se trouve sur la page tarifs. Chaque mois, 50 vérifications de contact, 100 fiches en dédoublonnage et 500 opérations légères sont gratuites.

Chaque réponse dit ce qu'elle a consommé et d'où : le champ credit du JSON (counter, charged, free, subscription et packs avec les opérations prélevées et le reste, available, auto_topup avec le nombre de packs achetés automatiquement, note) et les en-têtes X-RA-Charged, X-RA-Available et, quand elle intervient, X-RA-Auto-Topup. Si les opérations disponibles ne couvrent pas l'appel et que la recharge automatique du compteur n'est pas active (ou échoue), la réponse est 402 payment_required et rien n'est traité.

Pour savoir combien d'opérations il reste sans en consommer aucune, il y a GET /api/v1/credit. Pour chacun des trois compteurs (contact, dedupe, light), il renvoie available, les gratuites (free) restantes dans le mois et la date à laquelle elles se remettent à zéro (le 1er), l'subscription (reste, taille, renouvellement), les packs actifs un par un avec ce qu'il en reste (ils n'expirent pas) et combien vous en avez achetés, l'auto_topup (active, taille, plafond et dépense du mois en euros), l'utilisation (used dans le mois, totaux, dernière utilisation) et surtout le state, parce qu'un zéro tout seul ne dit pas si vous avez tout épuisé ou si vous n'utilisez pas ce service : never_used, free (jamais acheté, vous travaillez dans les gratuites du mois), free_used_up, active, awaiting_renewal, used_up (vous avez acheté par le passé et il ne reste rien : à recharger), avec un warning. En tête, needs_topup énumère les compteurs sur lesquels intervenir et endpoint dit quel compteur consomme chaque endpoint. Il exige le token d'un compte.

curl https://www.radaraddress.com/api/v1/credit -H 'Authorization: Bearer YOUR_TOKEN'
→ { "ok": true, "counters": { "contact": { "available": 48250, "free": { "remaining": 50, "month": 50 },
      "subscription": { "left": 23200, "size": 25000, "renews_on": "2026-10-03" }, "packs": { "left": 25000, "active_packs": [ … ] },
      "state": "active", "warning": "" }, "dedupe": { "state": "never_used", "warning": "Counter never used: zero does not mean used up. …", … },
      "light": { … } }, "needs_topup": [], "endpoint": { "contact": "contact", "email": "light", … } }
Compteur consommé par chaque endpoint
EndpointCompteurOpérations
/contactVérification de contact1 par fiche (adresse, nom et codice fiscale ensemble)
/suggestVérification de contact1 par adresse sélectionnée (taper est gratuit)
/dedupeDédoublonnage1 par fiche (normalisation comprise)
/tax-codeOpérations légères1 par code, au-delà du quota gratuit
/emailOpérations légères1 par e-mail
/phoneOpérations légères1 par numéro
/websiteOpérations légères1 par site
/enrichmentOpérations légères1 par nom

Vous payez par élément vérifié, pas par appel : si un champ contient deux numéros de téléphone ou deux e-mails, nous les vérifions tous (jusqu'à trois par ligne) et chacun paie son prix. Un appel par lot consomme autant que les opérations qu'il contient. Si le crédit est épuisé et que la recharge automatique n'est pas active, l'API répond HTTP 402 (crédit insuffisant) ; au-delà de la limite de requêtes, elle répond HTTP 429 avec retry_after. Vous achetez un pack depuis l'espace personnel, ou activez un abonnement pour payer l'opération moins cher.

Limite de requêtes

60 requêtes par minute sur les appels unitaires, 10 par minute sur ceux par lot, 300 par minute sur l'autocomplétion.

Performances mesurées sur l'API de production avec vingt appels en parallèle : environ 200 vérifications par seconde, médiane sous les 60 millisecondes.

Un seul décompte

L'API, le site et les traitements par lots puisent dans les mêmes compteurs : un pack vaut partout.

Gestion des versions

Les endpoints sont versionnés (/api/v1/) : quand une nouvelle version sort, l'ancienne reste en place et la date de son arrêt est annoncée à l'avance.

Prêt à intégrer ?

Créez votre compte, générez votre token, achetez les opérations dont vous avez besoin et faites le premier appel en moins d'une minute.

Créez votre token

Voir les tarifs