This page is available in English. Switch to English

Dezelfde engine,
in je eigen app.

Eén endpoint per dienst, één aanroep, het antwoord veld voor veld gedocumenteerd: contactverificatie, ontdubbelen, e-mail, telefoon, website, Italiaanse fiscale code, autocomplete. Per stuk of in batches; voor grote bestanden gaat de opdracht in de wachtrij en haal je hem op als hij klaar is.

OpenAPI-specificatie: openapi.json, om de client te genereren of te importeren in je eigen tool.

Eén endpoint per dienst, met dezelfde naam die de dienst op deze site heeft: /contact, /dedupe, /email, /phone, /website, /tax-code, /enrichment. Elk accepteert één element in de body van het verzoek of een lijst in items, tot 500 per aanroep (100 voor websites, die één voor één benaderd moeten worden). Het ontdubbelen is de uitzondering en wil altijd een lijst: het vergelijkt de records met elkaar. Apart staan /suggest, de autocomplete voor formulieren (werkt per sessie terwijl de gebruiker typt, niet in batches), en /credit, dat zegt hoeveel bewerkingen er nog over zijn en in welke staat elke teller is, zonder er een te verbruiken.

Authenticatie

De API-host is www.radaraddress.com. Veldnamen, endpointnamen en waarden zijn Engelse identifiers, in elke taal hetzelfde; labels, redenen en berichten volgen de taal van het verzoek ("language": "de" of ?language=de, of de header Accept-Language, of de taal van het account). De header Content-Language zegt in welke taal het antwoord is gekomen.

De toegang tot de API verloopt via een Bearer-token. Het account is gratis: je maakt het token aan in je account en stuurt het mee in de header van elk verzoek, in deze vorm:

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

Bij het aanmaken kun je het token een optionele vervaldatum geven: na die datum krijgen verzoeken HTTP 401 met code token_expired; zonder vervaldatum blijft het token geldig tot je het intrekt. Je kunt het op elk moment intrekken of opnieuw genereren in je account, waar je ook het laatste gebruik en het aantal afgehandelde verzoeken ziet. Een verzoek zonder token of met een ongeldig token geeft HTTP 401 terug.

De Italiaanse namen, voor wie ze al gebruikt

De API heeft één versie, in het Engels. Wie met de Italiaanse namen heeft geïntegreerd hoeft niets te veranderen: Italiaanse velden worden in elk verzoek geaccepteerd, de endpoints antwoorden ook onder hun Italiaanse naam (/contatto, /deduplica, /codicefiscale, /arricchimento, /telefono, /sito, /suggerisci, /nazioni, /credito), en het antwoord komt met de Italiaanse sleutels en codes voor wie erom vraagt met "language": "it" of www.radaraddress.it aanroept zonder een taal op te geven.

De volledige tabel van de velden: Engels → Italiaans
EngelsItaliaansEngelsItaliaans
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

Ook de optiewaarden hebben een Italiaanse naam: format nazionale/internazionale, action genera/valida/estrai/confronta/seleziona, foreign dichiarati/rileva, min_level certo/probabile/ambiguo; met "language": "it" komen zo ook level, confidence, state, de codes van outcome en de kolomkoppen van de bestanden. Bij invoer worden ook gangbare synoniemen geaccepteerd (zip, surname, phone_number, date_of_birth…) en dezelfde koppen in de bestanden van bulkopdrachten.

Endpoint contactverificatie

POST /api/v1/contact

Zet het hele contact recht: het adres volgens de poststandaard van zijn land — in Italië en in de landen waarvan het register in dienst is, worden straat en huisnummer in het nationale adressenregister geverifieerd; elders komt het adres in de postvorm van het land terug —, de naam en — als het verzoek die bevat — de Italiaanse fiscale code, die wordt opgeschoond, aangevuld als alleen het controleteken ontbreekt en vergeleken met achternaam, voornaam, geslacht en geboortedatum. Eén contact per keer, of tot 500 in items: het schema is hetzelfde als bij alle andere endpoints.

Het land geef je op met country_code (ISO 3166-1: IT, DE, FR…) of met country, geschreven zoals het komt: “Germania”, “Germany”, “Deutschland”, “Bondsrepubliek Duitsland”, “UK”, “Holland”. Ontbreekt het, dan wordt Italië verondersteld. In de landen waarvan het register in dienst is — vandaag Frankrijk, Duitsland, Spanje, Nederland, België, Finland, Tsjechië, Portugal, Denemarken, Noorwegen, Oostenrijk, Zwitserland, Slowakije, Kroatië, Roemenië, Hongarije, Slovenië, Ierland, IJsland, Luxemburg, Liechtenstein, San Marino, Monaco, Andorra, Vaticaanstad, de actuele lijst staat onder Landen — worden straat en huisnummer net als in Italië geverifieerd in het nationale adressenregister: postcode bevestigd of aangevuld, coördinaten van het huisnummer in geo, wijk of arrondissement in district waar de stad die heeft (Hamburg-Altstadt, Paris 4e Arrondissement), gemeentecode in territory.municipality_code. In het Italiaans draagt de uitkomst FOREIGN gevolgd door de wijzigingen, in de andere talen alleen de wijzigingen; bestaat de straat maar het nummer niet, dan HOUSE_NUMBER_NOT_FOUND. In de andere landen werken we aan de vorm, en het bericht zegt dat: postcode in het formaat van het land, straatafkortingen uitgeschreven, hoofdletters en plaatsnaam zoals de post van dat land ze schrijft (Hauptstr. 5, München → Hauptstraße 5, MÜNCHEN), met de landregel. In beide gevallen komt address_key terug, de vorm waarmee de ontdubbeling dezelfde straat in twee schrijfwijzen herkent. Met "foreign": "detect" wordt een record zonder land dat in Italië niet gevonden wordt als buitenlands herkend wanneer de tekst dat duidelijk zegt; de standaard declared laat alleen buitenlands wat dat zelf aangeeft. De volledige landencatalogus, met korte en officiële naam, in het Engels en in de taal van het land, is beschikbaar met GET /api/v1/countries en is te bevragen met ?q=Germania, ?q=Deutschland of ?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"}'

Voor de batch: dezelfde velden binnen items; het antwoord is { count, results: [ { id, result } ] } in dezelfde volgorde als verzonden.

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"}]}'

Hetzelfde endpoint voor een adres in een ander land: country_code volstaat. Hier Hamburg, geverifieerd in het Duitse register, met de wijk en de coördinaten van het huisnummer.

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" } }

Opties die gelden voor de hele aanroep: postal_form (dwingt ook normalized in de postvorm), preserve_original (houdt de naam zoals de gebruiker hem schreef en geeft de canonieke vorm apart), precision 1–5 (standaard 3; boven 3 is de match benaderend en zal de betrouwbaarheid niet high zijn).

Samen met het adres komt city_type, dat zegt of het bezorgadres in een provinciehoofdstad ligt of in een gemeente van de provincie — het verschil dat telt voor wie een campagne per stad opdeelt. provincial_capital is true, false of null als we geen elementen hebben om het te zeggen — en in dat geval gokken we niet.

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

Naast de postcode komt postcode_check: waar hij vandaan komt (source) en hoe precies (precision: house_number het nummer zelf, interpolated de buurnummers van dezelfde straat, street de meerderheid van de straat, locality, municipality), hoeveel huisnummers het zeggen (house_numbers) en met welke overeenstemming (agreement, van 0 tot 1). Ontbreekt een bevestiging voor dat nummer, dan draagt de uitkomst POSTCODE_UNCONFIRMED en is confirmed false: de postcode blijft zoals opgegeven, als hij bij de stad hoort, en moet gecontroleerd worden.

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

Ook de coördinaten komen terug, in geo (breedte- en lengtegraad WGS84), en de territoriale identificatoren in territory: in Italië de ISTAT-code en de kadastrale code van de gemeente, de CAB en de nationale identificator van de straat; in de andere landen country en de gemeentecode uit het nationale register (municipality_code). Het veld precision zegt tot welk niveau we zijn gekomen: house_number als het huisnummer gegeorefereerd is, interpolated als het exacte nummer ontbreekt en het punt geschat is, street als we het punt van de straat hebben, municipality als we alleen het centrum van de gemeente hebben. source zegt waar het punt vandaan komt: anncsu is het Italiaanse nationale register, inspire het nationale register van het land, osm OpenStreetMap: in dat geval zijn de gegevens © OpenStreetMap contributors, ODbL-licentie, en moet de bronvermelding worden overgenomen als je ze publiceert. Waar het register van een land een bronvermelding vereist, staat die in het bericht. In de CSV van bulkopdrachten zijn het de kolommen latitude, longitude, geo_precision, istat_code en 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" } }

Verdieping, trap en woning uit het adres komen ook terug als eigen gegevens in sub_address: een lijst van paren type en value, gelezen volgens de postregels van het land (in Duitsland na “//”, in Frankrijk op een eigen regel, in Portugal “3º Esq”). De typen zijn unit (woning), staircase (trap), floor (verdieping), block, building, building_number en block_number. De adresregel blijft in de vorm van het land. Wat we niet herkennen, blijft staan zoals het geschreven was en komt niet in de lijst: we raden niet. Staat de opgegeven eenheid bekend op dat huisnummer, dan is sub_address_confirmed true; anders null, nooit false: dat we haar niet vinden, betekent niet dat ze fout is.

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

Endpoint ontdubbelen

POST /api/v1/dedupe

Herkent de records die naar dezelfde persoon op hetzelfde adres verwijzen, ook als ze anders geschreven zijn: verkleinvormen en gelijkwaardige namen (Dany ≈ Daniela), achternaam en voornaam omgewisseld, afkortingen ("V. Roma" ≈ "Via Roma"), typefouten. De vergelijking van de adressen loopt via de normalisatie-engine: twee schrijfwijzen van dezelfde straat vallen samen op de canonieke vorm vóór de vergelijking. Maximaal 500 contacten per aanroep (records + referentie); voor grotere lijsten gebruik je de bulkopdracht vanuit je account.

Adresboeken. Een contact in een adresboek (Contacten van Apple, Google, Outlook: het vCard-model) heeft meerdere adressen, telefoonnummers en e-mailadressen, elk met een label. Het endpoint accepteert ze zo, zonder limiet: addresses is een lijst van objecten met type en de gebruikelijke velden; phones en emails zijn lijsten waarin elk element alleen het gegeven is ("340 7491386") of {"type": "work", "value": "02 66710423"}, ook gemengd; de gebruikelijke platte velden blijven geldig en gelden als eerste adres en eerste contactgegeven. Twee contacten zijn dezelfde persoon als een willekeurig paar van hun adressen overeenkomt (het kantoor van de een met het enige adres van de ander), of als ze dezelfde naam hebben en een telefoonnummer of e-mailadres gemeen hebben, op welke positie en met welk label dan ook. Het label weegt niet mee in de match: het komt terug zoals het binnenkwam, plus type_normalized in het vCard-vocabulaire (home, work, cell…), zodat de app weet waar ze moet terugschrijven. Eén contact is één bewerking, hoeveel adressen en contactgegevens het ook heeft.

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" }
    ]
  }'

Het antwoord groepeert de dubbelen in groups: elke groep somt de id's van haar members op, geeft aan welke je bewaart (main_record) en stelt het geconsolideerde record voor: de beste naam en de vereniging van adressen en contactgegevens (addresses, phones, emails), elk met zijn type, met provenance (uit welke contacten het komt) en ontdubbeld: dezelfde straat in twee schrijfwijzen is één adres, hetzelfde nummer met twee labels één nummer. Contacten zonder overeenkomst staan in singles, als objecten {id, outcome}: met outcome INTERNAL_DUPLICATE heeft het contact geen dubbelen met andere, maar wel binnen zichzelf (adres twee keer geschreven, nummer herhaald), en draagt het zijn samengevoegde record. Het herkent dezelfde straat op verschillende manieren geschreven ("V. Leopardi 4" ≈ "Via Giacomo Leopardi 4"), de automatisch herstelde postcode en achternaam en voornaam omgewisseld.

Parameters van het ontdubbelen
ParameterTypeBeschrijving
recordsarrayVerplicht. Records met last_name, first_name, address, postcode, city, province en optioneel id, gender, email, phone, country. Buitenlandse records (veld country, of provincie EE) worden ook herkend als ze anders geschreven zijn (‘Hauptstr. 5’ en ‘Hauptstraße 5’); twee verschillende landen zijn nooit hetzelfde record. Een gemeenschappelijk telefoonnummer of e-mailadres brengt twee records bij elkaar, ook met een ander adres: hoogstens probable als het contactgegeven persoonlijk is, alleen ambiguous als het bij een gedeelde plek hoort (een vast nummer, een algemeen e-mailadres)
addresses, phones, emailsarrayOptioneel, binnen elk record: de lijsten van het adresboek, zonder limiet (zie hierboven). phone en email accepteren dezelfde drie vormen: alleen het gegeven, een lijst van gegevens, een lijst van {type, value}
tax_codestringOptioneel, binnen elk record. Als de code geldig is en klopt met de naam van het record, zijn twee records met dezelfde code dezelfde persoon, ook op verschillende adressen (certain, reden ‘dezelfde fiscale code’); met twee geldige, verschillende codes zijn ze nooit certain of probable. Een code die niet klopt met de naam weegt niet mee
referencearrayOptioneel: modus met twee lijsten. Elk record wordt opgezocht in de referentie; antwoord met matches en not_found
min_levelstringcertain | probable (standaard) | ambiguous: hoe rekbaar de match is. certain = straat en huisnummer moeten samenvallen; ambiguous negeert het huisnummer. Twee records zonder adres en zonder plaats zijn nooit certain
foreignstringdeclared (standaard: buitenlands is alleen het record dat het land opgeeft) | detect (ook op basis van expliciete signalen in de tekst: naam van het land, bekende buitenlandse stad, postcode in een niet-Italiaanse vorm)
saveboolStandaard true: het resultaat blijft 30 dagen leesbaar met GET /api/v1/dedupe?job=<code>; de code komt in het veld job. Met POST {"job", "group", "processed": true} markeer je een groep als beoordeeld

Endpoint Italiaanse fiscale code

POST /api/v1/tax-code

Drie acties op de Italiaanse fiscale code van natuurlijke personen: generate uit de persoonsgegevens, validate een bestaande code (formaat, controleteken en omocodia), extract de informatie die erin zit — geboortedatum, leeftijd, geslacht, gemeente of buitenlands land van geboorte. Daarnaast controleert compare of een code overeenkomt met de opgegeven persoonsgegevens. Dekt de kadastrale codes van alle Italiaanse gemeenten en van de buitenlandse landen. Achternaam en voornaam moeten in Latijnse tekens worden doorgegeven: voor wie een naam in een ander alfabet heeft, wordt de code berekend op de transliteratie op het document, die niet uniek is (Dmitrij/Dmitry); een niet-Latijnse naam geeft cognome_non_latino of nome_non_latino terug, en bij compare krijgt een verschil in de naam van iemand die in het buitenland geboren is een opmerking over een mogelijk andere transliteratie.

De eerste 500 lichte bewerkingen per maand zijn gratis (fiscale code inbegrepen), en het gratis tegoed is één en hetzelfde in elke gebruiksvorm: wat je hier, op de website en in bulkbestanden doet, telt op hetzelfde tegoed. Daarboven betaal je de prijs van de lichte bewerkingen (zie prijzen).

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" }

Voor volumes: { "action": "validate", "items": [ … ] } verwerkt tot 500 elementen per aanroep, elk met zijn eigen correlatie-id. De extractie markeert met ambiguous_year de gevallen waarin de twee cijfers van het jaar de eeuw niet onderscheiden (1926 of 2026).

Elk antwoord draagt outcome, reason, notes en comments in de taal van het verzoek: GENERATED bij generate, leeg bij een geldige code in validate, MATCH of MISMATCH bij compare (met differences: de afwijkende velden). Als de code de controles niet doorstaat is de uitkomst een van de TAX_CODE_*-codes hieronder en geeft error de korte vorm (check_digit, length, format, homocode, month, date, place, empty); bij generate zegt het welk gegeven ontbreekt of niet oplosbaar is (last_name, first_name, gender, birth_date, birth_place, ambiguous_place met options, last_name_non_latin). suggestion draagt de juiste code als de controle hem kan reconstrueren.

Endpoint verrijking

POST /api/v1/enrichment

Verrijkt een naam: geslacht afgeleid uit de voornaam, soort subject (natuurlijke of rechtspersoon), genormaliseerde titel (Dott.ssa, Avv., …) en aanhefvormen klaar voor correspondentie — "Egregio Sig. Rossi", "Gentile Dott.ssa Bianchi", "Spett.le" voor bedrijven, "Gentile Famiglia" voor gezinnen, "Caro/Cara" voor het informele register. Herkent ook de huwelijksvorm in de achternaam ("Rossi in Verdi" → vrouw, met de details van de twee achternamen). Het veld gender accepteert ook geschreven vormen (‘maschio’, ‘donna’, ‘Sig.ra’, ‘male’); X staat voor een organisatie en G voor een gezin of een stel. Ontbreekt de titel, dan leiden we hem af uit profession (het beroep) of uit education, als die zijn opgegeven. De woordenboeken zijn Italiaans.

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", … }

In batches: { "items": [ … ] }, tot 500 per aanroep. De uitkomst is ENRICHED (geslacht en aanhef ingesteld), LEGAL_PERSON (bedrijf of organisatie: behandeld als bedrijfsnaam) of PARTIAL (voornaam ontbreekt, of geslacht niet af te leiden): reason zegt waarom, comments wat toe te voegen om het af te maken.

Endpoint e-mailverificatie

POST /api/v1/email

Controleert een e-mailadres: syntaxis, bestaan van het domein (MX/A-records), typefouten in veelgebruikte domeinen met een voorgestelde correctie (gmial.com → gmail.com), wegwerpdomeinen, algemene adressen (info@, administratie@: niet van een persoon). We doen geen SMTP-verificatie van de afzonderlijke mailbox: een opdringerige en onbetrouwbare praktijk. Batch items tot 500; "dns": false slaat de domeinlookup over.

Een zekere typefout wordt meteen gecorrigeerd: als het adres zoals geschreven niet eens een adres is (naam@domein,nl met een komma) of als de correctie bij een bekende provider uitkomt (gmai.com → gmail.com, ook op één letter afstand als het geschreven domein geen mail ontvangt), komt email gecorrigeerd terug, bevat corrected_from wat er stond en is de uitkomst MODIFIED EMAIL_DOMAIN. Een mogelijke typefout op een willekeurig domein (rossi.con) blijft een voorstel: EMAIL_TYPO met de correctie in suggestion, en de controles (domain_exists, domain_checked) worden daarop uitgevoerd; het adres zoals geschreven wordt niet gecontroleerd.

Endpoint telefoonverificatie

POST /api/v1/phone

Controleert een nummer zonder iemand te bellen: vorm, klasse en type, lengte volgens het nummerplan, netnummergebied van het vaste nummer en de operator aan wie het blok oorspronkelijk is toegewezen. De class is de lezing die je nodig hebt om een lijst te bewerken: mobile (je kunt er een sms naar sturen), landline (je belt het tijdens kantooruren), special (geen nummer van een persoon: noodnummers, openbaar nut, gratis en betaalde servicenummers), foreign voor nummers met een internationale landcode. Als we ook de precieze dienst herkennen, zegt type dat (gratis nummer, betaald servicenummer, gedeelde kosten, openbaar nut). De Italiaanse landcode zonder + (39347…, een klassieke fout in exports) halen we weg als de cijfers geen twijfel laten — 3934567890 blijft het mobiele nummer dat het is. Staan er meerdere nummers in hetzelfde veld (‘347… - 338…’), dan splitsen we ze: ze komen terug als phone, phone2, phone3, en phone is nooit leeg als er minstens één nummer is. Met "format": "international" komt het Italiaanse nummer eruit als +39…; de standaard national laat het kaal en zet de landcode alleen bij buitenlandse nummers. Voor buitenlandse nummers krijg je ook e164, het land van de landcode in country_code, en de netnul na de landcode wordt weggehaald (‘+44 (0)20…’ en ‘+44 20…’ geven hetzelfde nummer). Met country_code (of country) in de aanroep of in het element wordt een nummer zonder landcode gelezen als nationaal nummer van dat land: ‘020 7946 0958’ in een Brits record is Londen, niet Milaan. Zonder land blijft het Italiaans. Batch items tot 500.

Een nummer uit het land van het record is niet „buitenlands”: waar we het nummerplan kennen krijgt het zijn class (mobile, landline, special), met format national blijft het zonder landcode in de vorm van zijn land (netnummer-nul inbegrepen), en naast e164 komt national_number terug. PHONE_FOREIGN en class foreign blijven voor nummers uit een ander land dan dat van het record.

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 websiteverificatie

POST /api/v1/website

Controleert of het adres goed geschreven is en of de site echt reageert: bestaan van het domein, HTTP-verzoek met gevolgde redirects, eindcode, geldigheid van het certificaat. Geen oordeel over de inhoud. Ook hier komen meerdere adressen in hetzelfde veld terug als website, website2, website3. Met "network": false controleren we alleen de vorm, zonder de site te benaderen. Batch items tot 100: elke controle opent een verbinding, dus de batch is kleiner dan bij de andere 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 adres-autocomplete

POST /api/v1/suggest

Begin je van nul? De widget ra-suggerisci.js en een kleine proxy op je server zijn genoeg: het token komt nooit in de browser.

Suggesties terwijl de gebruiker typt in het adresveld van je formulier: het hele Italiaanse stratenregister, met de naam aangevuld (‘via verdi’ → ‘Via Giuseppe Verdi’), gemeente en provincie; de postcode komt met de selectie, in de grote steden met postzones de juiste van het huisnummer. Het werkt per sessie: de client genereert een UUID voor elk adres dat wordt ingevuld, de suggestiequery's zijn gratis, en je betaalt één contactverificatie wanneer de gebruiker kiest en de velden gevuld worden (actie select, die het record teruggeeft zoals de engine het al genormaliseerd heeft). De velden die al in het formulier zijn ingevuld — ook gedeeltelijk — reizen mee als context en verfijnen de suggesties.

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"}'

Is de straat gekozen, dan wordt het huisnummer aangevuld: door street_id mee te geven met het gedeeltelijke huisnummer krijg je de bestaande huisnummers van die straat, met exists waar/onwaar om het getypte nummer te valideren — en de selectie kan met het huisnummer herhaald worden zonder nieuwe afschrijving: de afschrijving is per sessie en per straat, niet per klik; een andere straat in dezelfde sessie is een nieuwe afschrijving. Huisnummers worden alleen aangevuld in de sessie die die straat heeft geselecteerd. In steden met postzones bepaalt het huisnummer de exacte postcode.

Het API-token komt nooit in de browser: de kant-en-klare widget (ra-suggerisci.js) roept een kleine proxy op je server aan, die het token toevoegt en doorstuurt. Elke sessie staat tot 30 aanroepen toe en duurt 10 minuten; sessies zonder selectie zijn gratis tot 200 per dag per token, plus vijf per selectie. Widget, kant-en-klare proxy en voorbeeldform staan in de kit van Je eigen form.

Werkt in elk land in dienst (vandaag Frankrijk, Duitsland, Spanje, Nederland, België, Finland, Tsjechië, Portugal, Denemarken, Noorwegen, Oostenrijk, Zwitserland, Slowakije, Kroatië, Roemenië, Hongarije, Slovenië, Ierland, IJsland, Luxemburg, Liechtenstein, San Marino, Monaco, Andorra, Vaticaanstad; de actuele lijst staat onder Landen): met country_code of country komen de suggesties uit het register van dat land, en de tekst schrijf je zoals men het daar schrijft — straat, huisnummer, postcode en plaats desnoods in één veld: «kalverstraat 92 amst», «92 rue de rivoli paris», in Nederland «1012PH 92». Elk antwoord bevat parsed, dus hoe de server straat (street), huisnummer (house_number) en postcode (postcode) heeft gelezen: je formulier weet waar het nummer staat zonder de regels van het land te kennen. Suggesties bevatten straat, plaats, eventueel de woonkern en source (registry, of osm waar het nationale register niets publiceert); postcode en huisnummers staan nooit in de suggesties: die komen met de selectie, die door de engine gaat en hetzelfde record teruggeeft als /contact (postcode bevestigd door het register, geo op huisnummer). Bij de selectie kun je ook postcode meegeven, die in het formulier is ingevuld. attribution is de bronvermelding die naast de suggesties moet staan: de licentie van het register vereist dat. Ontbreekt het land, dan wordt IT aangenomen; voor een land buiten dienst blijft het antwoord HTTP 200 met supported:false en hints:[], zonder sessie en zonder afboeking. Een sessie hoort bij één land: verandert dat, dan maakt de client een nieuwe UUID (anders 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"}

Grote volumes: de asynchrone opdracht

Normale aanroepen antwoorden direct, en daarom hebben ze een limiet op het aantal elementen — aan een HTTP-verzoek dat minuten duurt, heeft niemand iets. De limieten volgen hoe zwaar de bewerking is:

Limieten per aanroep
EndpointElementen per aanroepWaarom
/phone5.000directe controle
/tax-code, /enrichment2.000snelle controle
/contact, /email, /dedupe500volledige controle
/website100één verbinding met de site per adres

Boven die aantallen hoef je de lijst niet met de hand op te knippen: je voegt "async": true toe en de aanroep komt direct terug met een code, terwijl de verwerking in dezelfde wachtrij gaat als de bestandsuploads. Tot 100.000 elementen per aanroep, en in Mijn opdrachten verschijnt er maar één.

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}

Daarna lees je het terug wanneer je wilt, en het resultaat komt als JSON of als 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

Onder de 5.000 rijen komt het resultaat ook terug in results binnen de JSON; daarboven download je het als CSV. De afschrijving gebeurt wanneer de opdracht in de wachtrij komt, en het niet-verwerkte deel gaat terug naar je tegoed als de opdracht stopt. Het token moet aan een account gekoppeld zijn: de opdracht komt in jouw wachtrij terecht.

Uitkomstcodes

Elk antwoord bevat het veld outcome: een lijst van sleutelwoorden, leeg als er niets te melden is. Het patroon is altijd <conditions> [MODIFIED <types>] — de voorwaarden vooraan, de wijzigingen achteraan — en geldt voor alle diensten. Daarnaast vind je outcome_label (of kind) met ok, modified, warning, error, en reason met de uitleg in één regel. De codes zijn identifiers: ze worden vergeleken, niet vertaald; met "language": "it" komen de Italiaanse codes (LOCALITA_NON_TROVATA MODIFICATO CAP INDIRIZZO), woord voor woord dezelfde.

Adres (contactverificatie)

Uitkomstcodes — adres (contactverificatie)
CodeBetekenis
OKGeen wijziging nodig, adres al correct (lege uitkomst)
MODIFIEDAdres genormaliseerd, gevolgd door de gewijzigde velden: POSTCODE, PROVINCE, CITY/CITY_FORM, STREET/STREET_FORM, BUILDING (het achtervoegsel _FORM = alleen opmaak/accenten, de waarde was al correct). Het schema van het veld is <condities> [MODIFIED <types>]: eventuele condities komen eerst, MODIFIED en zijn types achteraan
PO_BOXBezorging op een postbus herkend (geen straat): vorm CASELLA POSTALE n
LOCALITY_WITHOUT_STREETHet adres is een woonkern zonder straatnaam; bezorging is toch mogelijk
CITY_NOT_FOUNDGemeente niet herkend
CITY_AMBIGUOUSGemeentenaam komt in meer dan één provincie voor
STREET_NOT_FOUNDStraat niet geregistreerd voor deze plaats
STREET_AMBIGUOUSStraatnaam komt in meer dan één deel van de gemeente voor
STREET_TYPE_MISSINGStraattype niet herkenbaar (Via/Corso/Piazza… ontbreekt)
HOUSE_NUMBER_MISSINGHuisnummer ontbreekt of is ongeldig
HOUSE_NUMBER_INVALID_FORMATHuisnummer in een niet-herkende vorm
POSTCODE_UNCONFIRMEDDe straat bestaat, maar voor dat nummer is er geen bevestiging van de postcode: de opgegeven blijft, als hij bij de stad hoort
POSTCODE_PRESUMEDDe straat bestaat en de postcode hebben wij gezet zonder bevestiging door het huisnummer: de straat heeft er meer dan één en het nummer beslist niet, of er was geen opgegeven en hij komt van de naburige huisnummers
INCOMPLETE_DATAOnvoldoende informatie om te normaliseren
FOREIGNNiet-Italiaans adres, in de postvorm van zijn land; waar het nationale register in dienst is, zijn straat en huisnummer geverifieerd, en het bericht zegt dat (alleen in het Italiaans)
HOUSE_NUMBER_NOT_FOUNDBuitenland: de straat staat in het nationale register, het opgegeven huisnummer niet (alleen waar het register alle huisnummers heeft: uit een onvolledige bron of uit OpenStreetMap is een ontbrekend nummer geen oordeel)
POSTCODE_INVALID_FORMATBuitenland: de postcode heeft niet de vorm die in het opgegeven land gebruikt wordt
COUNTRY_UNRESOLVEDBuitenland: het land in het adres staat niet in de ISO 3166-1-lijst

Italiaanse fiscale code

Uitkomstcodes — Italiaanse fiscale code
CodeBetekenis
TAX_CODE_INVALIDDe code komt niet door de controles; reason zegt welke (controleteken, lengte, maand, datum, gemeente) en suggestion stelt de juiste vorm voor als die te reconstrueren is
TAX_CODE_MISMATCHDe code is geldig, maar komt niet overeen met achternaam, voornaam, geslacht of datum in het verzoek
MODIFIED TAX_CODEHet controleteken ontbrak: opnieuw berekend uit de eerste 15
MODIFIED TAX_CODE_FORMAlleen de vorm is opgeschoond (hoofdletters, spaties)
GENERATEDEndpoint /tax-code, actie generate: code berekend uit de persoonsgegevens
MATCH / MISMATCHEndpoint /tax-code, actie compare: de code komt wel of niet overeen met de gegevens; differences noemt de afwijkende velden

Op het endpoint /tax-code hebben dezelfde controles eigen 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 — omdat de fiscale code daar het onderwerp van de controle is, niet een veld van het record.

Verrijking

Uitkomstcodes — verrijking
CodeBetekenis
ENRICHEDNatuurlijke persoon: geslacht afgeleid of bevestigd, titel en aanhef ingesteld
LEGAL_PERSONBedrijf of organisatie: kop behandeld als bedrijfsnaam (Spett.le)
PARTIALVoornaam ontbreekt, of geslacht niet af te leiden uit de naam: neutrale aanhef

E-mail

Uitkomstcodes — e-mail
CodeBetekenis
EMAIL_INVALIDOngeldige syntaxis
EMAIL_DOMAIN_NOT_FOUNDHet domein ontvangt geen e-mail (geen MX/A-record)
EMAIL_TYPOMogelijke typefout in het domein: de correctie is een voorstel, in suggestion en in het genormaliseerde veld
MODIFIED EMAIL_DOMAINZekere typefout in het domein, gecorrigeerd: corrected_from bevat wat er stond
EMAIL_DISPOSABLEWegwerp-e-maildomein
EMAIL_ROLE_BASEDAdres van de organisatie (info@, bestellingen@), niet van een persoon. Het is een melding, geen fout
EMAIL_EMPTYGeen adres in het veld
MODIFIED EMAIL_FORMAlleen de vorm is opgeschoond (spaties, hoofdletters)

Telefoon

Uitkomstcodes — telefoon
CodeBetekenis
PHONE_INVALIDGeen herkenbaar nummer
PHONE_LENGTH_ANOMALOUSAantal cijfers past niet bij het nummerplan
PHONE_OUT_OF_PLANBegint niet met 0 (vast) en niet met 3 (mobiel)
PHONE_FOREIGNNummer met een niet-Italiaanse landcode (of nationaal nummer van een buitenlands record): we controleren alleen de vorm, in E.164
PHONE_SPECIALGratis of betaald servicenummer: geen persoonlijk contactgegeven
PHONE_SERVICENummer van openbaar nut (112, 118…)
PHONE_WITH_EXTENSIONHet veld bevatte ook een toestelnummer of een opmerking: we controleren alleen het nummer
PHONE_EMPTYGeen nummer in het veld
MODIFIED PHONE_FORMAlleen de vorm is opgeschoond (spaties, punten, landcode)

Website

Uitkomstcodes — website
CodeBetekenis
WEBSITE_INVALIDGeen correct geschreven webadres
WEBSITE_DOMAIN_NOT_FOUNDHet domein bestaat niet (geen DNS-record)
WEBSITE_NOT_RESPONDINGHet domein bestaat, maar er antwoordt geen server
WEBSITE_PAGE_NOT_FOUNDDe site antwoordt, maar de pagina bestaat niet (404/410)
WEBSITE_ACCESS_DENIEDDe site weigert de toegang (401/403): vaak een beveiliging tegen bots
WEBSITE_CERTIFICATE_INVALIDDe site antwoordt, maar het certificaat is niet te verifiëren
WEBSITE_RESPONSE_ANOMALOUSOnverwachte antwoordcode
WEBSITE_EMPTYGeen adres in het veld
MODIFIED WEBSITE_FORMAdres aangevuld (schema, www) zonder de inhoud te veranderen

Wat elke aanroep verbruikt

Elke aanroep verbruikt bewerkingen van de teller van de dienst: contactverificatie (/contact, /suggest bij de selectie), ontdubbelen (/dedupe) en lichte bewerkingen (/email, /phone, /website, /enrichment, /tax-code boven het gratis tegoed). Bewerkingen koop je in bundels die blijven, of met een maandabonnement; de prijs per 1.000 daalt met de grootte en staat op de pagina prijzen. Elke maand zijn 50 contactverificaties, 100 records in het ontdubbelen en 500 lichte bewerkingen gratis.

Elk antwoord zegt wat het heeft verbruikt en waarvan: het veld credit van de JSON (counter, charged, free, subscription en packs met de afgeschreven bewerkingen en het restant, available, auto_topup met het aantal automatisch gekochte bundels, note) en de headers X-RA-Charged, X-RA-Available en, wanneer het in werking treedt, X-RA-Auto-Topup. Als de beschikbare bewerkingen de aanroep niet dekken en het automatisch opwaarderen van de teller niet actief is (of mislukt), is het antwoord 402 payment_required en wordt er niets verwerkt.

Om te weten hoeveel bewerkingen er nog over zijn zonder er een te verbruiken is er GET /api/v1/credit. Voor elk van de drie tellers (contact, dedupe, light) geeft het available terug, de gratis bewerkingen (free) die deze maand nog over zijn en de datum waarop ze op nul gaan (de 1e), het subscription (restant, grootte, verlenging), de actieve packs één voor één met wat er nog over is (ze verlopen niet) en hoeveel je er hebt gekocht, de auto_topup (actief, grootte, plafond en uitgegeven deze maand in euro), het gebruik (used deze maand, totalen, laatste gebruik) en vooral de state, want een nul alleen zegt niet of je tegoed op is of dat je die dienst niet gebruikt: never_used, free (nooit gekocht, je werkt binnen de gratis bewerkingen van de maand), free_used_up, active, awaiting_renewal, used_up (je hebt eerder gekocht en er is niets meer over: opwaarderen), met een warning. Bovenaan somt needs_topup de tellers op waar actie nodig is en zegt endpoint welke teller elk endpoint verbruikt. Vereist het token van een account.

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", … } }
Teller die elk endpoint verbruikt
EndpointTellerBewerkingen
/contactContactverificatie1 per record (adres, naam en fiscale code samen)
/suggestContactverificatie1 per geselecteerd adres (typen is gratis)
/dedupeOntdubbelen1 per record (normalisatie inbegrepen)
/tax-codeLichte bewerkingen1 per code, boven het gratis tegoed
/emailLichte bewerkingen1 per e-mailadres
/phoneLichte bewerkingen1 per nummer
/websiteLichte bewerkingen1 per site
/enrichmentLichte bewerkingen1 per naam

Je betaalt per gecontroleerd element, niet per aanroep: staan er in een veld twee telefoonnummers of twee e-mailadressen, dan controleren we ze allemaal (tot drie per rij) en betaalt elk zijn eigen prijs. Een batchaanroep verbruikt zoveel als de bewerkingen die hij bevat. Is het tegoed op en heb je automatisch opwaarderen niet actief, dan antwoordt de API HTTP 402 (onvoldoende tegoed); boven de rate limit antwoordt hij HTTP 429 met retry_after. Je koopt een bundel in je account, of activeert een abonnement om minder per bewerking te betalen.

Rate limit

60 verzoeken per minuut op losse aanroepen, 10 per minuut op batchaanroepen, 300 per minuut op de autocomplete.

Gemeten op de productie-API met twintig parallelle aanroepen: ongeveer 200 verificaties per seconde, mediaan onder de 60 milliseconden.

Eén telling

De API, de website en de bulkopdrachten putten uit dezelfde tellers: een bundel geldt overal.

Versiebeheer

De endpoints hebben een versienummer (/api/v1/): komt er een nieuwe versie uit, dan blijft de oude staan en wordt de datum waarop hij uitgaat tijdig aangekondigd.

Klaar om te integreren?

Registreer het account, maak je token aan, koop de bewerkingen die je nodig hebt en doe de eerste aanroep binnen een minuut.

Maak je token aan

Bekijk de prijzen