Référence API

Endpoints simples. CORS activé. Pas d'authentification. Entièrement multilingue — chaque champ, clé et valeur, est traduit en plus de 10 langues.

URL de base

https://ipto.to

Démarrage rapide

# Detect your own IP curl https://ipto.to/v1/ip # Look up any IP curl https://ipto.to/v1/ip/8.8.8.8 # Bulk lookup (up to 100 IPs, Pro/Enterprise only) curl -X POST https://ipto.to/v1/ip/bulk \ -H "Content-Type: application/json" \ --data '["1.1.1.1","8.8.8.8","9.9.9.9"]'

Raccourci terminal : curl ipto.to ou curl ipto.to/8.8.8.8 (pas besoin de https:// ni de /v1/ip/) fonctionne aussi lorsque la requête provient de curl, Wget ou HTTPie — détecté via le User-Agent. Cela renvoie un ensemble de champs plus court, façon ipinfo.io (ip, country, city, asn, org, ...), et non le schéma complet ci-dessous — utilisez directement les chemins /v1/ip pour la réponse complète documentée sur cette page.

Juste l'IP : curl ipto.to/ip (ou ouvrez-le dans un navigateur) ne renvoie que votre propre adresse IP en texte brut — 73.9.114.155, sans JSON, sans habillage de page. Équivalent direct de ipinfo.io/ip. Voir GET /ip ci-dessous.

Multilingue par défaut : Définissez ?lang= sur un code pris en charge et chaque clé et valeur JSON de la réponse revient traduite — pas seulement pays/continent. Voir Localisation ci-dessous pour la liste complète des langues et l'option de désactivation &localize=0.

curl "https://ipto.to/v1/ip/8.8.8.8?lang=de" # "landesname":"Vereinigte Staaten","ist_vpn":false, ... # every key & value comes back translated -- add &localize=0 for the legacy English-keys shape

Lookup Lab

Construisez n’importe quelle requête ipto, copiez-la en code prêt à l’emploi dans votre langage, ou envoyez-la ici et lisez la réponse en direct. Aucune clé n’est nécessaire pour l’offre gratuite.

Serveur MCP

ipto est également accessible en tant que serveur d'outils MCP (Model Context Protocol) — pointez Claude Desktop, Cursor, ou tout client compatible MCP vers l'endpoint ci-dessous : il expose 14 outils appelables : ip_lookup, bulk_ip_lookup (Pro/Enterprise), asn_lookup, country_lookup, reverse_dns_lookup, user_agent_parse, phone_lookup, email_lookup, fraud_score, language_detect, currency_convert, weather_lookup, trademark_lookup, et patent_lookup. JSON-RPC 2.0 via Streamable HTTP — POST uniquement, aucune session/SSE nécessaire. Authentification identique à celle de l'API REST : omettez-la pour le niveau gratuit (1 000 req/jour par IP), ou ajoutez ?api_key= à l'URL de l'endpoint.

{ "mcpServers": { "ipto": { "url": "https://ipto.to/mcp" } } }

Pour les clients stdio uniquement, faites le pont : npx mcp-remote https://ipto.to/mcp

curl -X POST https://ipto.to/mcp \ -H "Content-Type: application/json" \ --data '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"ip_lookup","arguments":{"ip":"8.8.8.8"}}}'

Points de terminaison

GET/ip

Ne renvoie que la propre adresse IP publique du client à l'origine de la requête, en texte brut (Content-Type: text/plain) — ex. 73.9.114.155. Équivalent direct de ipinfo.io/ip : fonctionne à l'identique depuis curl, Wget, HTTPie, ou une simple visite dans un navigateur (pas de détection du User-Agent, contrairement au raccourci curl ipto.to ci-dessus), et s'affiche comme une IP nue sans habillage de page lorsqu'il est ouvert dans un navigateur.

Aucun paramètre, aucune chaîne de requête. Pour l'objet complet de géolocalisation/renseignement sur les menaces, utilisez plutôt GET /v1/ip ci-dessous. Cette route lit directement l'IP de connexion (sans recherche D1/KV) et n'est pas comptabilisée dans le quota de requêtes quotidien — voir Limites de débit.

curl https://ipto.to/ip # 203.0.113.7
GET/v1/ip

Renvoie la géolocalisation et le renseignement sur les menaces pour l'IP à l'origine de la requête, y compris des données au niveau de la ville via l'objet edge de CF.

Aucun paramètre requis. Accepte ?lang=, ?fields=, ?format= — voir Localisation et Formats de sortie ci-dessous.

curl https://ipto.to/v1/ip # the lookup for the calling IP: same shape as /v1/ip/:ip below
GET/v1/ip/:ip

Recherchez n'importe quelle adresse IPv4. Les champs de niveau ville (city, state, postal_code, latitude, longitude, timezone) sont renseignés lorsque l'IP appartient à l'un des deux jeux de données géo fusionnés, IP2Location ou MaxMind — vérifiez geo_precision dans la réponse pour savoir si vous avez obtenu des données au niveau ville ou pays. Le format de timezone dépend de la source ayant fourni la correspondance (une chaîne de décalage UTC pour IP2Location, un nom IANA pour MaxMind). Les recherches IPv6 ne renvoient actuellement que des données au niveau pays.

ParameterInDescription
ippathRequis. Toute adresse IPv4 ou IPv6 valide.
langqueryOptionnel. Localise country_name et continent : en (par défaut), pt, fr, de, zh-TW, ko, zh-CN, ja-JP, es-ES, ar-SA, hi-IN.
fieldsqueryOptionnel. Liste de champs à inclure, séparés par des virgules. Ex. ?fields=ip,country_code,is_vpn
formatqueryOptionnel. Format de réponse : json (par défaut), csv, text, xml, yaml.
curl https://ipto.to/v1/ip/8.8.8.8 # only the fields you want: curl "https://ipto.to/v1/ip/8.8.8.8?fields=ip,asn,country_code,city" # {"ip":"8.8.8.8","asn":15169,"country_code":"US","city":"Mountain View"}
GET/v1/search/:query

L'endpoint de recherche unifié derrière la barre de recherche de la page d'accueil. Détecte si :query est une IP, un ASN (AS15169 ou 15169), un code pays à 2 lettres, un e-mail, ou un numéro de téléphone, puis agrège chaque vérification pertinente en une seule réponse. Pour une requête IP, cela se répartit — en parallèle, côté serveur — sur la recherche IP principale plus RPKI, IP-vers-entreprise, opérateur mobile, domaines hébergés et lieux, de sorte qu'une seule recherche ne consomme qu'une seule requête sur votre quota quotidien de débit, au lieu d'une par fonctionnalité.

ParameterInDescription
querypathRequis. Une IP, un ASN, un code pays, un e-mail, ou un numéro de téléphone.
FieldTypeDescription
querystringL'entrée décodée telle que reçue.
detected_typestring"ip", "asn", "country", "email", ou "phone".
ipobject|nullPrésent lorsque detected_type vaut "ip" — même forme que GET /v1/ip/:ip.
rpkiobject|nullPrésent pour les requêtes IP — même forme que GET /v1/ip/:ip/rpki.
companyobject|nullPrésent pour les requêtes IP — même forme que GET /v1/ip/:ip/company.
whoisobject|nullPrésent pour les requêtes IP — même forme que GET /v1/ip/:ip/whois.
carrierobject|nullPrésent pour les requêtes IP — même forme que GET /v1/ip/:ip/carrier.
asn / country / email / phoneobject|nullPrésent à la place des six champs ci-dessus lorsque detected_type correspond — même forme que l'endpoint dédié de ce type.

Chaque sous-champ se dégrade indépendamment — un service amont lent ou en échec (RIPEstat, un serveur RDAP, crt.sh) se traduit par ce seul champ à null, jamais par l'échec de la recherche entière. Seule une requête principale invalide (par ex. une IP malformée) renvoie un statut d'erreur pour la requête dans son ensemble.

curl https://ipto.to/v1/search/8.8.8.8
GET/v1/ip/:ip/hostname

DNS inversé — une seule recherche PTR en direct via DNS-over-HTTPS, pas une base de données d'énumération de domaines. Renvoie null si l'IP n'a pas d'enregistrement PTR.

ParameterInDescription
ippathRequis. Toute adresse IPv4 ou IPv6 valide.
curl https://ipto.to/v1/ip/8.8.8.8/hostname # {"ip":"8.8.8.8","hostname":"dns.google"}
GET/v1/ip/:ip/rpki

Validation RPKI de l'origine de route pour la route actuellement annoncée d'une IP, résolue en direct via RIPEstat (aucune base de données ROA ingérée ou synchronisée localement). status vaut uniquement "valid", "invalid", ou "unknown" — jamais synthétisé à partir d'un autre signal ; tout échec ou dépassement de délai de RIPEstat renvoie "unknown" accompagné d'une chaîne reason, jamais une erreur.

ParameterInDescription
ippathRequis. Toute adresse IPv4 ou IPv6 valide.
FieldTypeDescription
asninteger|nullL'ASN annonçant actuellement la route, résolu en direct — non dérivé du propre jeu de données ASN du site.
prefixstring|nullLe préfixe CIDR actuellement annoncé.
statusstring"valid", "invalid", ou "unknown".
validating_roasarrayLe ou les ROA spécifiques trouvés par RIPEstat, chacun avec origin/prefix/max_length/validity.
validatorstring|nullLe validateur RPKI utilisé par RIPEstat (par ex. "routinator").
reasonstring|nullExplique un résultat "unknown" — par ex. aucun ROA couvrant n'existe, ou RIPEstat était injoignable.
curl https://ipto.to/v1/ip/8.8.8.8/rpki # {"ip":"8.8.8.8","asn":15169,"prefix":"8.8.8.0/24","status":"valid",...}
GET/v1/rpki

Validation RPKI explicite (ASN, préfixe) — pour lorsque vous connaissez déjà la route exacte à vérifier, plutôt que la commodité dérivée de l'IP ci-dessus.

ParameterInDescription
asnqueryRequis. Numéro d'ASN, avec ou sans le préfixe AS. Ex. 15169 ou AS15169.
prefixqueryRequis. Préfixe CIDR, ex. 8.8.8.0/24.
curl "https://ipto.to/v1/rpki?asn=15169&prefix=8.8.8.0/24"
GET/v1/ip/:ip/company

Identifie l'organisation à laquelle une IP est enregistrée en combinant les données du titulaire RDAP (WHOIS structuré) avec le nom d'organisation propre de l'ASN, pour obtenir une confiance catégorielle, jamais un score numérique.

ParameterInDescription
ippathRequis. Toute adresse IPv4 ou IPv6 valide.
FieldTypeDescription
company_namestring|nullLe nom d'entreprise résolu — null lorsque confidence vaut "low" (les deux sources sont en désaccord, donc aucune n'est présentée comme faisant autorité) ou "none".
rdap_org_namestring|nullLe nom du titulaire RDAP, indépendant de company_name.
asn_org_namestring|nullLe nom d'organisation propre de l'ASN, indépendant de company_name.
confidencestring"high" (les sources concordent), "medium" (une seule source disponible), "low" (les sources sont en désaccord — les deux sont affichées), ou "none".
reasonstringExplication en langage clair du niveau de confidence.
curl https://ipto.to/v1/ip/1.1.1.1/company # {"ip":"1.1.1.1","company_name":null,"rdap_org_name":"APNIC Research and Development","asn_org_name":"Cloudflare, Inc.","confidence":"low",...}
GET/v1/ip/:ip/whois

L'enregistrement RDAP sous-jacent lui-même — bloc réseau, dates d'enregistrement/de dernière modification, et tous les contacts que RDAP a en fichier. Distinct de /company ci-dessus, qui réconcilie ces mêmes données de titulaire avec le nom d'organisation de l'ASN en une seule réponse assortie d'un score de confidence ; cet endpoint renvoie l'enregistrement brut tel quel, plus proche d'une sortie WHOIS classique. Les adresses IPv6 sont également prises en charge.

ParameterInDescription
ippathRequis. Toute adresse IPv4 ou IPv6 valide.
FieldTypeDescription
availablebooleanfalse si aucun enregistrement RDAP n'a pu être résolu — voir reason.
reasonstring|nullExplique un résultat available: false.
startAddress / endAddress / cidrstring|nullLe bloc réseau enregistré.
netName / netHandle / parentHandlestring|nullIdentifiants attribués par le RIR pour l'objet réseau.
countrystring|nullPays du titulaire, selon RDAP.
allocationTypestring|nullpar ex. "direct allocation", "reassigned".
registeredDate / lastChangedDatestring|nullHorodatages ISO issus de l'enregistrement RDAP.
rirstring|nullQuel registre régional (ARIN, RIPE, APNIC, LACNIC, AFRINIC) a fourni l'enregistrement.
contactsarrayTous les contacts que RDAP a en fichier, chacun avec ses rôles, nom, e-mail, et handle — pas seulement la première correspondance.
curl https://ipto.to/v1/ip/8.8.8.8/whois # {"ip":"8.8.8.8","available":true,"cidr":"8.8.8.0/24","netName":"LVLT-GOGL-8-8-8","rir":"ARIN","contacts":[...],...}
GET/v1/ip/:ip/carrier

Identification de l'opérateur mobile au mieux pour les IP classées comme réseaux mobiles, croisée avec un annuaire d'opérateurs MCC/MNC. N'a délibérément pas de champ carrier unique — voir matched_carrier_entries et note ci-dessous — car un simple nom d'opérateur se lirait comme une affirmation en direct au niveau de l'abonné, ce que ces données ne peuvent pas honnêtement garantir.

ParameterInDescription
ippathRequis. Toute adresse IPv4 ou IPv6 valide.
FieldTypeDescription
is_mobile_networkbooleanfalse s'arrête ici avec un annuaire vide — aucune supposition pour un ASN non mobile.
asn_organizationstring|nullLe nom d'organisation propre de l'ASN.
matched_carrier_entriesarrayLes entrées de l'annuaire MCC/MNC dont le nom d'opérateur correspond approximativement à asn_organization, limitées au pays propre de l'IP.
notestringExplique ce que ce champ peut et ne peut pas affirmer.
curl https://ipto.to/v1/ip/8.8.8.8/carrier # {"ip":"8.8.8.8","is_mobile_network":false,"asn_organization":null,"matched_carrier_entries":[],...}
GET/v1/ip/:ip/hosted-domains

Trouve les domaines associés à une IP via son nom d'hôte DNS inversé (PTR) et les journaux de transparence des certificats (crt.sh) — pas une recherche IP inversée générale. Le champ limitations de la réponse précise exactement ce que cela peut et ne peut pas trouver.

ParameterInDescription
ippathRequis. Toute adresse IPv4 ou IPv6 valide.
FieldTypeDescription
ptr_hostnamestring|nullLe nom d'hôte DNS inversé de l'IP, ou null s'il n'a pas d'enregistrement PTR.
root_domainstring|nullLe domaine enregistrable dérivé de ptr_hostname.
subdomains_seenarray|nullSous-domaines trouvés via la transparence des certificats. null signifie que la recherche crt.sh elle-même n'a pas pu être menée à bien — à distinguer d'un tableau vide, qui signifie qu'elle s'est exécutée sans rien trouver.
limitationsstringExplique ce que cette fonctionnalité ne peut structurellement pas détecter (pas de PTR, hébergement mutualisé, domaines non certifiés).
curl https://ipto.to/v1/ip/8.8.8.8/hosted-domains # {"ip":"8.8.8.8","ptr_hostname":"dns.google","root_domain":"dns.google","subdomains_seen":["dns.google","dns.google.com",...],...}
POST/v1/ip/bulk

Recherche par lot — jusqu'à 100 IP par requête, réservé Pro/Enterprise. Renvoie un objet indexé avec chaque IP comme clé. Plus rapide que des appels séquentiels grâce aux lectures parallèles du cache et de la base de données. Chaque IP du lot compte dans votre quota de requêtes quotidien, comme une recherche individuelle. Les requêtes du niveau gratuit reçoivent un 403 — voir tarifs.

ParameterInDescription
bodybody (JSON)Tableau JSON de chaînes IP. Ex. ["1.1.1.1","8.8.8.8"]
curl -X POST https://ipto.to/v1/ip/bulk \ -H "Content-Type: application/json" \ --data '["1.1.1.1","8.8.8.8"]'
GET/v1/asn/:asn

Recherchez un système autonome par son numéro. Renvoie le nom de l'organisation, le pays, le continent, le nombre de plages IP, le type de classification, le taux de change, et des données de référence locales (langues, tld, capitale, frontières).

ParameterInDescription
asnpathNuméro d'ASN sans le préfixe AS. Ex. 15169 pour Google.
langqueryOptionnel. Localise country_name et continent : en (par défaut), pt, fr, de, zh-TW, ko, zh-CN, ja-JP, es-ES, ar-SA, hi-IN.
formatqueryOptionnel. Format de réponse : json (par défaut), csv, text, xml, yaml.
curl https://ipto.to/v1/asn/15169
GET/v1/places/:ip

Géocode inversement la localisation existante au niveau ville d'une IP, puis renvoie les points d'intérêt à proximité (restaurants, parcs, écoles, transports, sites remarquables), des données de criminalité locales lorsqu'une source existe (Royaume-Uni et États-Unis uniquement), et une estimation de trajet en voiture optionnelle et à la demande.

ParameterInDescription
ippathRequis. Toute adresse IPv4 valide. L'IPv6 n'est pas encore pris en charge.
dest_latqueryOptionnel. Latitude de destination pour une estimation de trajet — à associer avec dest_lon.
dest_lonqueryOptionnel. Longitude de destination pour une estimation de trajet — à associer avec dest_lat.
dest_addressqueryOptionnel. Adresse de destination en texte libre pour une estimation de trajet, géocodée automatiquement. Ignorée si dest_lat/dest_lon sont également fournis.
FieldTypeDescription
geocodeobject|nullcountry, countryCode, region, city, neighbourhood, displayName — null si l'IP n'a pas de localisation au niveau ville à partir de laquelle géocoder.
locality.restaurants / .parks / .schools / .transitarrayJusqu'à 4 entrées les plus proches par catégorie, chacune avec name et distanceMeters.
locality.notablearraySites remarquables à proximité avec une courte description, via Wikidata.
locality.usCrimeobject|nullTotaux de criminalité violente/contre les biens de l'agence la plus proche — États-Unis uniquement, nécessite une FBI_CRIME_API_KEY sur le déploiement. null partout ailleurs.
locality.ukCrimeobject|nullRésumé des incidents au niveau de la rue dans un rayon de 1 mile — Royaume-Uni uniquement.
locality.caCrimenullToujours null — aucune source de criminalité couvrant tout le Canada n'est intégrée (voir docs/places.md).
commuteobject|nulldurationMinutes et distanceKm, uniquement lorsqu'une destination a été fournie et qu'OpenRouteService a renvoyé un itinéraire. null sinon — jamais calculé de manière spéculative.
curl https://ipto.to/v1/places/8.8.8.8 curl "https://ipto.to/v1/places/8.8.8.8?dest_address=Space+Needle,+Seattle"
GET/v1/country/:code

Statistiques agrégées au niveau pays plus des données de référence locales (devise, taux de change, langues, tld, capitale, frontières).

ParameterInDescription
codepathCode pays ISO 3166-1 alpha-2. Ex. US, DE, JP.
langqueryOptionnel. Localise country_name et continent : en (par défaut), pt, fr, de, zh-TW, ko, zh-CN, ja-JP, es-ES, ar-SA, hi-IN.
formatqueryOptionnel. Format de réponse : json (par défaut), csv, text, xml, yaml.
curl https://ipto.to/v1/country/US # {"country_code":"US","country_name":"United States","continent":"North America","currency_code":"USD", # "calling_code":"+1","languages":["English"],"tld":[".us"],"capital":"Washington D.C.","borders":["CA","MX"], # "is_eu":false,"ip_range_count":151633,"ip_range_count_v6":30329,"asn_count":18243, ...}
GET/v1/ua

Analyse une chaîne User-Agent. Renvoie le navigateur, l'OS, le type d'appareil, et la détection de bot. Lit par défaut l'en-tête User-Agent de l'appelant, ou transmettez n'importe quelle chaîne via ?ua=.

ParameterInDescription
uaqueryOptionnel. Chaîne User-Agent encodée en URL à analyser. Par défaut, l'en-tête User-Agent de la requête.
curl "https://ipto.to/v1/ua?ua=Mozilla%2F5.0+%28iPhone%3B+CPU+iPhone+OS+17_0%29"
GET/v1/phone/:number

Valide et formate un numéro de téléphone gratuitement, toujours : région, type de ligne, et formatage E.164/national/international via un analyseur auto-hébergé, sans appel à un fournisseur. Lorsqu'un budget premium mensuel par IP/clé est disponible (100/mois sur Free, plus sur les plans payants — voir tarifs), la même requête renvoie en plus un nom d'opérateur en direct, le statut de portabilité, et un type de téléphone classifié par le fournisseur, depuis un service de recherche d'opérateur en temps réel — voir source et les champs ci-dessous. Un country_name localisé ainsi que lang/lang_source sont toujours inclus, quel que soit le niveau — voir Localisation. L'épuisement du budget premium, ou tout problème en amont, entraîne un retour sans accroc aux champs gratuits ci-dessus ; la requête n'échoue jamais pour cette raison. Pour une référence des opérateurs réseau au niveau pays plutôt qu'une recherche par numéro, voir GET /v1/carriers.

ParameterInDescription
numberpathRequis. Tout numéro de téléphone, idéalement au format E.164 (ex. +14155552671). Encodez le + initial en URL.
countryqueryOptionnel. Indice de code pays à 2 lettres pour analyser des numéros au format national ambigu, ex. ?country=US.
modequeryOptionnel. ?mode=current demande l'opérateur en temps réel (plutôt que celui émis par la SIM) du numéro, lorsque le niveau premium est disponible. Ignoré si la requête revient au plan gratuit.
FieldTypeDescription
validbooleantrue si le numéro correspond à un schéma de plan de numérotation valide pour sa région.
country_codestring|nullRégion ISO 3166-1 alpha-2 à laquelle appartient le numéro.
national_formatstring|nullFormaté selon la convention nationale propre à la région.
international_formatstring|nullFormaté avec le code pays et des espaces, ex. "+1 415 555 2671".
e164string|nullForme E.164 canonique, ex. "+14155552671".
line_typestring|nullFIXED_LINE, MOBILE, FIXED_LINE_OR_MOBILE, VOIP, TOLL_FREE, PREMIUM_RATE, ou similaire. De nombreux plans de numérotation (y compris celui de l'Amérique du Nord) ne permettent pas de distinguer une ligne fixe d'une ligne mobile à partir du seul numéro.
sourcestring"premium" si un budget de recherche d'opérateur en direct était disponible pour cette requête, "local" si elle est revenue à l'analyseur gratuit ci-dessus. carrier, phone_type, original_carrier, is_ported, phone_region et country_prefix ci-dessous ne sont renseignés que lorsque source vaut "premium" — country_name et lang/lang_source plus bas sont toujours renseignés, quel que soit le niveau.
phone_typestring|nullL'une des propres catégories du fournisseur de recherche d'opérateur en temps réel : mobile, fixed_line, voip, toll_free, premium_rate, shared_cost, personal_number, pager, uan, voicemail, ou unknown — pas seulement les quatre premières, qui ne sont que les exemples les plus courants. null lorsque source vaut "local" — distinct de line_type ci-dessus, qui provient de l'analyseur local et utilise un ensemble de catégories différent.
carrierstring|nullLe nom de l'opérateur réseau actuel du numéro. null lorsque source vaut "local".
original_carrierstring|nullL'opérateur réseau sur lequel le numéro a été émis à l'origine, s'il a été porté depuis. null lorsque source vaut "local" ou que le numéro n'a pas été porté.
is_portedboolean|nulltrue si le numéro a été porté hors de son opérateur d'origine. null lorsque source vaut "local".
phone_regionstring|nullDétail au niveau localité/état pour le numéro (par ex. "California"), plus précis que country_code ci-dessus. null lorsque source vaut "local".
country_prefixstring|nullL'indicatif d'appel du numéro sans le "+" initial (par ex. "49" pour l'Allemagne). null lorsque source vaut "local".
country_namestring|nullNom complet du pays (par ex. "Germany") — country_code ci-dessus n'est que la forme ISO alpha-2 ("DE"), pas un nom d'affichage. Contrairement aux champs premium ci-dessus, celui-ci est toujours renseigné (dès que country_code l'est) et est localisé via ?lang=/Accept-Language de la même façon que le champ country_name de tous les autres endpoints — voir lang/lang_source ci-dessous.
langstringLa langue effectivement appliquée à country_name ci-dessus — la valeur résolue de ?lang=, ou "en" si aucune n'a été demandée ou si celle demandée n'est pas prise en charge.
lang_sourcestring"param" si ?lang= était présent sur la requête, "header" si Accept-Language a été utilisé à la place, ou "default" si aucun des deux et que l'anglais a été utilisé. Même signification que le champ portant le même nom sur GET /v1/asn/:asn et GET /v1/country/:code.
curl "https://ipto.to/v1/phone/+14155552671"
POST/v1/phone/bulk

Validation par lot. Chaque niveau a accès au traitement par lot (contrairement à /v1/ip/bulk) — c'est le plafond de lot par niveau qui limite le niveau gratuit, pas un 403. Gratuit : 10/requête, 100/jour. Pro : 100/requête, 1 000/jour. Enterprise : 1 000/requête, 10 000/jour. Ce quota est distinct de votre limite de requêtes quotidienne générale — voir Limites de débit.

ParameterInDescription
bodybody (JSON)Tableau JSON de chaînes de numéros de téléphone.
curl -X POST https://ipto.to/v1/phone/bulk \ -H "Content-Type: application/json" \ --data '["+14155552671","+442071838750"]'
GET/v1/carriers

Recherche de référence : quels opérateurs de réseau mobile (MCC/MNC) sont connus pour un pays donné — sans lien avec un numéro de téléphone spécifique. Provient d'une compilation MCC/MNC maintenue par la communauté (sous licence MIT, dernière synchronisation en 2026 — voir le dépôt docs pour plus de détails) ; une table de référence statique, pas un flux en direct, car les attributions de plans de numérotation ne changent pas assez souvent pour en justifier un.

ParameterInDescription
countryqueryRequis. Code pays à 2 lettres, ex. ?country=US.
curl "https://ipto.to/v1/carriers?country=US"
GET/v1/email/:email

Validation de la syntaxe d'un e-mail, vérification en direct de l'enregistrement MX via DNS-over-HTTPS, et détection de domaine jetable/temporaire par rapport à une liste noire maintenue par la communauté (sous licence CC0, synchronisée quotidiennement). Ne vérifie pas que la boîte aux lettres elle-même existe — cela nécessiterait une négociation SMTP que cette API n'effectue pas (voir la référence des champs ci-dessous pour savoir exactement ce que has_mx prouve et ne prouve pas).

ParameterInDescription
emailpathRequis. Toute adresse e-mail, encodée en URL (le @ doit être encodé en %40).
FieldTypeDescription
valid_syntaxbooleantrue si l'adresse correspond à un schéma de syntaxe e-mail standard. Ne vérifie pas que la boîte aux lettres existe.
domainstring|nullLa partie domaine, en minuscules. null si valid_syntax vaut false.
has_mxboolean|nulltrue si le domaine possède au moins un enregistrement MX à l'instant présent. null si la syntaxe était invalide ou si la requête DNS elle-même a échoué/expiré — traitez null comme inconnu, pas comme false.
disposableboolean|nulltrue si le domaine correspond à un fournisseur d'e-mail jetable/temporaire connu. null dans les mêmes conditions que has_mx.
source"premium"|"local""premium" si une vérification en direct a été effectuée pour cette requête, "local" sinon (limite atteinte, ou fonctionnalité non activée) — les champs ci-dessus (valid_syntax à disposable) sont toujours renseignés dans les deux cas.
is_reachablestring|nullLe verdict global d'une vérification en direct optionnelle : "safe" (livrable), "invalid" (rejeté), "risky" (incertain) ou "unknown" (non concluant — réessayez). null lorsque la vérification en direct n'a pas été effectuée pour cette requête (voir source ci-dessous).
is_catch_allboolean|nulltrue si le domaine accepte les e-mails pour n'importe quelle adresse, ce qui signifie que l'existence de cette boîte spécifique n'a pas pu être confirmée. null lorsque la vérification en direct n'a pas été effectuée.
mailbox_fullboolean|nulltrue si la vérification en direct a détecté une boîte pleine. null lorsque la vérification en direct n'a pas été effectuée.
is_role_accountboolean|nulltrue si l'adresse ressemble à une adresse de fonction (par ex. support@, admin@) plutôt qu'à la boîte d'un individu. null lorsque la vérification en direct n'a pas été effectuée.
is_disabledboolean|nulltrue si la vérification en direct a détecté une boîte explicitement désactivée. null lorsque la vérification en direct n'a pas été effectuée.
curl "https://ipto.to/v1/email/user%40example.com" # When the live-verification budget allows, the same response also includes the # source/is_reachable/is_catch_all/mailbox_full/is_role_account/is_disabled fields above: # {"email":"user@example.com","valid_syntax":true,"domain":"example.com","has_mx":true, # "disposable":false,"source":"premium","is_reachable":"safe","is_catch_all":false, # "mailbox_full":false,"is_role_account":false,"is_disabled":false}
GET/v1/fraud-score

Combine ceux que vous fournissez parmi IP, e-mail, téléphone, et User-Agent en un seul score de 0 à 100 — la seule chose qu'aucun de ip-api.com, ipapi.co, ipgeolocation.io, ipify.org, ipregistry.co, ip2location.io, AbstractAPI, IPLocate.io, ou BigDataCloud n'offre comme signal unique fusionné (vérifié directement). Les quatre entrées sont optionnelles et indépendantes — transmettez n'importe quel sous-ensemble. ip prend par défaut votre propre IP et ua votre propre en-tête User-Agent si omis, même convention que GET /v1/ip et GET /v1/ua. Un signal que vous ne transmettez pas est simplement absent de la réponse, il n'est pas noté comme propre — son poids est redistribué entre les signaux que vous avez effectivement fournis.

ParameterInDescription
ipqueryOptionnel. Par défaut, votre propre IP. L'IPv6 n'est pas encore noté (même limitation que le reste de l'API de renseignement sur les menaces).
emailqueryOptionnel. Toute adresse e-mail.
phonequeryOptionnel. Tout numéro de téléphone.
uaqueryOptionnel. Par défaut, votre propre en-tête User-Agent.
FieldTypeDescription
scoreintegerComposite pondéré de 0 à 100 sur l'ensemble des signaux fournis.
risk_tierstring"low" (<20), "medium" (20-44), "high" (45-69), ou "critical" (70+).
signalsobjectDétail par entrée — seules les clés correspondant aux entrées que vous avez réellement fournies sont présentes : ip, email, phone, user_agent. Chacune inclut son propre score de composant plus les mêmes champs déjà renvoyés par GET /v1/ip/:ip, /v1/email/:email, /v1/phone/:number, et /v1/ua pour cette entrée.
curl "https://ipto.to/v1/fraud-score?ip=1.2.3.4&email=test%40mailinator.com"
GET/v1/screenshot

Restitue une URL dans une véritable instance Chrome headless (Cloudflare Browser Rendering, pas un fournisseur tiers de captures d'écran) et renvoie un PNG. Les cibles internes/privées (localhost, plages RFC 1918, adresses link-local/métadonnées cloud) sont rejetées avant même le lancement du navigateur. Soumis aux propres limites, au niveau plateforme, de Browser Rendering, bien plus strictes que le reste de cette API — attendez-vous à une limitation bien avant que votre quota de requêtes quotidien habituel ne soit atteint sur les plans Cloudflare inférieurs.

ParameterInDescription
urlqueryRequis. Doit être http ou https.
curl "https://ipto.to/v1/screenshot?url=https://example.com" --output screenshot.png
GET/v1/language

Identifie la langue d'un texte via une analyse locale de fréquence de trigrammes — aucun appel à un fournisseur externe, aucune inférence par modèle d'IA, aucune journalisation. Une entrée de moins de 10 caractères renvoie une langue à null ; en dessous d'environ 30 caractères, une meilleure estimation peut encore être renvoyée mais reliable vaudra false.

ParameterInDescription
textqueryRequis. Jusqu&#39;à 5 000 caractères — une entrée plus longue est tronquée, pas rejetée.
FieldTypeDescription
languageobject|nullcode (ISO 639-1), iso639_3, name, et local_name pour la meilleure correspondance. null si le texte est trop court ou non reconnu ("und").
reliablebooleanfalse pour une entrée courte — considérez le résultat comme une estimation, pas une correspondance fiable.
candidatesarrayJusqu'à 5 langues finalistes avec des scores relatifs, pour les paires de langues proches.
curl "https://ipto.to/v1/language?text=Bonjour%2C+comment+allez-vous%3F"
GET/v1/currency/convert

Convertit un montant entre deux devises (154 prises en charge) en utilisant le même flux quotidien de taux de référence qui alimente déjà currency_code/exchange_rate_usd sur chaque recherche IP, ASN, et pays — exposé ici comme un endpoint de conversion autonome plutôt qu'imbriqué dans une réponse de géolocalisation.

ParameterInDescription
fromqueryRequis. Code devise ISO 4217 à 3 lettres.
toqueryRequis. Code devise ISO 4217 à 3 lettres.
amountqueryOptionnel. Par défaut : 1.
FieldTypeDescription
resultnumberMontant converti.
ratenumberUnités de to pour 1 from.
updatedstringHorodatage ISO de la synchronisation du taux de référence utilisée par cette conversion.
curl "https://ipto.to/v1/currency/convert?from=USD&to=EUR&amount=100"
GET/v1/currency/rates

Table complète des taux de change (154 devises) rebasée sur n'importe quelle devise prise en charge, pas seulement l'USD.

ParameterInDescription
basequeryOptionnel. Par défaut : USD.
FieldTypeDescription
ratesobjectCorrespondance code devise → taux par rapport à base.
curl "https://ipto.to/v1/currency/rates?base=EUR"
GET/v1/currency/history

Historique quotidien des taux de référence pour une paire de devises, jusqu'à 90 jours en arrière — les données derrière le graphique de tendance des taux sur l'outil de conversion de devises. Rempli une fois rétroactivement, puis complété quotidiennement par le même cron qui met à jour GET /v1/currency/convert. Il s'agit d'un unique taux de référence quotidien dans le temps, pas d'un écart de cours acheteur/vendeur.

ParameterInDescription
targetqueryRequis. Code devise ISO 4217 à 3 lettres à représenter graphiquement.
basequeryOptionnel. Par défaut : USD.
daysqueryOptionnel. Une valeur parmi 30, 60, 90. Par défaut : 30.
FieldTypeDescription
seriesarrayTableau de points { date, rate } trié par date croissante.
statsobjectmin, avg, max, et current sur la série renvoyée.
curl "https://ipto.to/v1/currency/history?base=USD&target=EUR&days=90"
GET/v1/weather

Conditions actuelles — et, avec detail=1, des prévisions horaires et sur plusieurs jours — pour un nom de lieu, un code postal ou une paire "lat,lon", ou pour lat + lon ou une ip. Les lieux américains sont servis par le National Weather Service, le reste du monde par MET Norway. Ajoutez include= pour le document complet avec unités, jusqu'à 9 jours, soleil et lune, alertes officielles et plus — voir la carte include ci-dessous. L'outil weather-lookup détecte en outre automatiquement la position de l'appelant côté navigateur avant tout appel explicite à ce point de terminaison.

ParameterInDescription
qqueryNom de ville, code postal ou "lat,lon" (100 caractères maximum). Ou transmettez lat et lon, ou ip, à la place. L&#39;un des trois est obligatoire.
detailqueryOptionnel. "1" ajoute pressure_mb/visibility_km/dewpoint_c/sunrise/sunset/etc. à weather, plus un objet forecast (hourly + daily). Omis par défaut.
FieldTypeDescription
conditionstring|nullCourte description textuelle.
temp_c / temp_fnumber|nullTempérature actuelle.
feels_like_cnumber|nullTempérature ressentie en Celsius.
humidity_pctnumber|nullHumidité relative.
wind_kmph / wind_dirnumber|null / string|nullVitesse du vent et direction sur une rose des vents à 16 points.
uv_indexnumber|nullIndice UV.
locationobject|nullNom résolu, région, pays, et lat/lon pour le lieu recherché — pas seulement l'entrée brute.
forecast.hourly[]arraydetail=1 uniquement. Prochaines 24h par pas de 3 heures : hour_label, temp_c/temp_f, weather_code, chance_of_rain_pct.
forecast.daily[]arraydetail=1 uniquement. Prévisions sur 3 jours : date, day_label, weather_code, condition, chance_of_rain_pct, max/min temp_c/temp_f.
curl "https://ipto.to/v1/weather?q=Tokyo"
curl "https://ipto.to/v1/weather?q=Tokyo&detail=1"
GET/v1/trademark/:serial

Proxy en direct vers le système Trademark Status & Document Retrieval (TSDR) de l'USPTO pour le statut d'un dossier via un numéro de série à 8 chiffres — un appel direct par requête, pas une copie mise en cache ou revendue. Les données de statut de dossier constituent une œuvre du gouvernement américain et relèvent du domaine public selon les propres conditions d'utilisation de l'USPTO ; chaque réponse comporte donc un champ source/attribution plutôt que d'être mise en cache ou revendue silencieusement. Les données de logo/image de marque sont délibérément hors périmètre — les conditions de l'USPTO isolent les licences d'image séparément des données textuelles de statut de dossier renvoyées par cet endpoint. La recherche par numéro d'enregistrement n'est pas encore prise en charge ; seul le chemin par numéro de série est documenté par l'USPTO à ce jour. Essayez-le sur l'outil Recherche de marque.

ParameterInDescription
serialpathRequis. Exactement 8 chiffres, ex. 98267877.
FieldTypeDescription
sourcestringToujours "USPTO TSDR".
attributionstringLigne d'attribution requise selon les conditions d'utilisation de l'USPTO.
dataobjectCharge utile brute du statut de dossier telle que renvoyée par l'USPTO, transmise telle quelle plutôt que remodelée — confirmée en service le 2026-08-12. Sous data.trademarks[0] : status (dates de dépôt/enregistrement, markElement, descOfMark, tm5StatusDesc), parties.ownerGroups (nom/adresse du titulaire par rôle), gsList[] (description des produits/services et classes), et prosecutionHistory[] (historique complet du dossier). La présence des champs varie selon le statut de la demande — par ex. une demande en attente n'a pas encore de usRegistrationNumber.
curl "https://ipto.to/v1/trademark/98267877" # ANTHROPIC, Reg. No. 8296420
GET/v1/patent/:number

Proxy en direct vers l'API Patent File Wrapper (Open Data Portal) de l'USPTO pour le statut de délivrance via un numéro de brevet d'utilité à 7-8 chiffres — un appel direct par requête, pas une copie mise en cache ou revendue. La source initialement visée (l'API de recherche de PatentsView) a été confirmée fermée le 2026-03-20 ; ceci fait plutôt proxy vers son successeur en direct. Les données Patent File Wrapper constituent une œuvre du gouvernement américain et relèvent du domaine public selon les propres conditions d'utilisation de l'USPTO, chaque réponse comportant donc un champ source/attribution. Le périmètre est centré sur la demande/procédure — aucun graphe de citations, famille de brevets, champ de statut juridique, ou images comme le montrent Lens.org, Espacenet, ou Google Patents. La couverture démarre avec les demandes déposées en 2001. Les brevets de dessin, de plante, et de réémission ne sont pas encore pris en charge ; seuls les brevets d'utilité par numéro de brevet délivré. Essayez-le sur l'outil Recherche de brevet.

ParameterInDescription
numberpathRequis. 7 à 8 chiffres, ex. 12393227. Numéro de brevet d&#39;utilité délivré uniquement, pas un numéro de demande.
FieldTypeDescription
sourcestringToujours "USPTO Patent File Wrapper".
attributionstringLigne d'attribution requise selon les conditions d'utilisation de l'USPTO.
dataobjectCharge utile brute du dossier de procédure telle que renvoyée par l'USPTO, transmise telle quelle plutôt que remodelée — confirmée en service le 2026-08-12 sur des brevets réels (12393227, 9935534). Champs clés : applicationMetaData (inventionTitle, filingDate, applicationStatusDescriptionText, applicationStatusDate, patentNumber, inventorBag[]), recordAttorney.attorneyBag[], applicationNumberText, et eventDataBag[] (historique complet de la procédure). Renvoie 404 si le numéro n'existe pas, s'il s'agit d'un brevet de dessin/plante/réémission, ou s'il est antérieur à la couverture de 2001.
curl "https://ipto.to/v1/patent/12393227" # WEARABLE COMPUTING DEVICE, granted 2025
GET/v1/feeds

Flux paginé de VPN, Tor, et renseignement sur les menaces. 200 entrées par page. Chaque entrée inclut IP/CIDR, attribution du fournisseur, FAI, pays, et type de classification.

ParameterInDescription
pagequeryNuméro de page indexé à partir de 0. Par défaut : 0.
typequeryFiltrer par type : VPN, Tor Exit Node, Tor Node, High-Risk Threat Intel.
qqueryFiltrer par sous-chaîne d&#39;IP ou de CIDR.
curl "https://ipto.to/v1/feeds?page=0&type=VPN" # {"metadata":{...},"pagination":{"page":0,"page_size":200,"total":11200,"total_pages":56,"has_next":true}, # "ranges":[{"ip":"2.26.157.0/24","type":"VPN","provider":"Datacamp Limited","isp":"Datacamp Limited","country":"GB"}, ...]}
GET/v1/feeds/stats

Métadonnées uniquement — nombre total d'entrées, nombre par source, et heure de dernière synchronisation. Ne renvoie pas de données IP.

curl https://ipto.to/v1/feeds/stats # {"total_tracked_ranges":34561,"last_updated":"2026-10-06T18:00:44.321Z", # "sources":[{"name":"X4BNet VPN Ranges","type":"VPN","count":11200}, ...]}
GET/v1/abuse

Plages réseau abusives paginées. Notées de 1 à 10 par corroboration croisée des flux. Niveaux de risque : critical (8-10), high (5-7), medium (3-4).

ParameterInDescription
pagequeryNuméro de page indexé à partir de 0. Par défaut : 0.
tierqueryFiltrer par niveau de risque : critical, high, medium.
qqueryFiltrer par sous-chaîne de plage réseau.
sourcequeryFacultatif. Filtre par nom de flux source exactement tel que renvoyé dans source_feed, p. ex. 'Spamhaus DROP' ou 'IPsum Threat Intel'.
curl "https://ipto.to/v1/abuse?page=0&tier=critical&source=Spamhaus%20DROP" # {"metadata":{...},"pagination":{"page":0,"page_size":200,"total":1640,"total_pages":9,"has_next":true}, # "networks":[{"network_range":"1.10.16.0/20","abuse_score":10,"risk_tier":"critical","source_feed":"Spamhaus DROP"}, ...]}
GET/v1/abuse/stats

Métadonnées uniquement — nombre total de réseaux, nombre par source, répartition des niveaux de risque, et heure de dernière synchronisation.

curl https://ipto.to/v1/abuse/stats # {"total_networks_tracked":18300,"last_updated":"2026-10-06T18:00:15.762Z", # "classification":{"ipsum_threat_intel":16660,"spamhaus_drop":1641,"spamhaus_edrop":0}, # "sources":[{"name":"IPsum Threat Intel","count":16660}, ...]}
GET/v1/datasets/:kind

Export CSV téléchargeable des jeux de données ouverts sur lesquels l'API est déjà construite — mêmes données, aucune nouvelle licence. asn et ranges sont toujours disponibles ; geo-city renvoie 503 tant que le jeu de données de cette source n'est pas actif sur un déploiement donné. geo-city exporte les lignes brutes d'une seule source géo à la fois, pas une vue fusionnée — transmettez ?source=primary (par défaut) ou ?source=secondary.

ParameterInDescription
kindpathUne valeur parmi : asn, ranges, geo-city.
sourcequerygeo-city uniquement. primary (par défaut) ou secondary.
curl -OJ https://ipto.to/v1/datasets/asn curl -OJ https://ipto.to/v1/datasets/ranges curl -OJ "https://ipto.to/v1/datasets/geo-city?source=secondary"
POST/v1/keys

Délivre une clé API instantanément — aucun e-mail, aucune inscription. Chaque clé démarre sur le niveau gratuit (1 000 requêtes/jour ; recherche en masse non incluse). Les clés Pro et Enterprise débloquent des limites quotidiennes plus élevées et la recherche en masse (jusqu'à 100 IP/requête) — voir tarifs. Conservez la clé — elle ne pourra pas être récupérée ultérieurement.

curl -X POST https://ipto.to/v1/keys
GET/v1/keys/usage

Vérifiez combien de requêtes une clé a effectuées. Transmettez la clé sur n'importe quelle requête /v1/* via l'en-tête X-API-Key ou ?api_key= pour qu'elle soit comptabilisée.

ParameterInDescription
keyqueryRequis. Une clé renvoyée par POST /v1/keys.
curl "https://ipto.to/v1/keys/usage?key=ipto_xxxxxxxx"
GET/v1/ip/:ip/abuse

Contact de signalement d'abus du réseau propriétaire d'une IP, d'après RDAP : le RIR, l'identifiant du réseau, le CIDR qui le couvre et la ou les adresses e-mail d'abus. Utile pour savoir où envoyer un signalement.

ParameterInDescription
ippathAdresse IPv4 ou IPv6.
curl https://ipto.to/v1/ip/8.8.8.8/abuse # {"available":true,"failure":null,"ip":"8.8.8.8","rir":"arin","network":"GOGL","cidr":"8.8.8.0/24", # "contacts":[{"name":"Abuse","email":"network-abuse@google.com","handle":"ABUSE5250-ARIN"}]}

available vaut false (avec un motif dans failure) lorsque le registre n'a pas pu être joint.

GET/v1/asn/:asn/ranges

Les plages d'IP réellement annoncées par un ASN, paginées, chacune avec son pays et les indicateurs hébergement / mobile / résidentiel / bot / liste noire.

ParameterInDescription
asnpathNuméro d'ASN sans le préfixe AS, p. ex. 15169.
limitqueryPlages par page. Par défaut 50, plafonné à 200.
offsetqueryPlages à ignorer. Par défaut 0.
curl "https://ipto.to/v1/asn/15169/ranges?limit=1&offset=0" # {"asn":15169,"total":153,"limit":1,"offset":0,"ranges":[{"start_ip":"8.8.4.0","end_ip":"8.8.4.255", # "country_code":"US","is_hosting":false,"is_mobile":false,"is_residential":false,"is_bot":false,"is_blacklisted":false}]}
GET/v1/asn/:asn/whois

Enregistrement du registre (RDAP) d'un ASN : identifiant, nom, pays, type d'allocation, dates d'enregistrement, le RIR et ses contacts.

ParameterInDescription
asnpathNuméro d'ASN sans le préfixe AS, p. ex. 15169.
curl https://ipto.to/v1/asn/15169/whois # {"asn":15169,"available":true,"reason":null,"handle":"AS15169","name":"GOOGLE","country":"US", # "allocationType":"...","registeredDate":"...","lastChangedDate":"...","rir":"arin","contacts":[...]}

available vaut false avec un reason lorsque le registre est injoignable.

GET/v1/asn/:asn/geo-sample

Où se trouve réellement un ASN : des points au niveau de la ville, géolocalisés à partir d'un échantillon de ses plus grandes plages, plus les villes les plus fréquentes. Alimente la carte de répartition de la page ASN.

ParameterInDescription
asnpathNuméro d'ASN sans le préfixe AS, p. ex. 15169.
curl https://ipto.to/v1/asn/15169/geo-sample # {"asn":15169,"sampled":true,"sample_size":30,"points":[{"city":"Council Bluffs","state":"Iowa", # "country_code":"US","latitude":41.2591,"longitude":-95.8517}, ...],"top_cities":[...]}

Un échantillon, pas la liste complète des plages. Utilisez /v1/asn/:asn/ranges pour toutes les plages.

GET/v1/asn/:asn/hosted-domains

Domaines hébergés dans un ASN, trouvés par DNS inverse (PTR) sur un échantillon de ses adresses. Chaque entrée contient le domaine racine, le nom d'hôte PTR et l'IP échantillonnée.

ParameterInDescription
asnpathNuméro d'ASN sans le préfixe AS, p. ex. 15169.
curl https://ipto.to/v1/asn/15169/hosted-domains # {"asn":15169,"sampled":true,"sample_size":5,"domains":[{"root_domain":"googleusercontent.com", # "ptr_hostname":"0.0.214.35.bc.googleusercontent.com","sample_ip":"35.214.0.0"}, ...]}

Échantillonné : c'est un indice de ce que l'ASN héberge, pas une liste complète. Pour une seule IP, utilisez /v1/ip/:ip/hosted-domains.

GET/v1/asn/:asn/relationships

Relations BGP d'un ASN : pairs, fournisseurs amont et clients aval, avec leur nombre.

ParameterInDescription
asnpathNuméro d'ASN sans le préfixe AS, p. ex. 15169.
curl https://ipto.to/v1/asn/15169/relationships # {"asn":15169,"available":true,"peers":[],"upstreams":[],"downstreams":[], # "peer_count":0,"upstream_count":0,"downstream_count":0}

available vaut false lorsque la source de données BGP n'a pas pu être jointe. Des tableaux vides avec available: true signifient que rien n'a été signalé pour cet ASN.

GET/v1/ip-ranges

Annuaire de l'espace IPv4 : une entrée par bloc /8 avec le nombre de plages, de pays et d'ASN qu'il contient et son pays principal. Commencez ici, puis descendez avec /v1/ip-ranges/:a et /v1/ip-ranges/:a/:b.

curl https://ipto.to/v1/ip-ranges # {"blocks":[{"octet":1,"range_count":814,"country_count":15,"asn_count":182,"top_country":"KR", # "top_country_share":35,"top_country_name":"South Korea"}, ...],"data_version":"2026-10-06"}
GET/v1/ip-ranges/:a

Les blocs /16 d'un /8 (par exemple 8.0.0.0/8), avec les mêmes nombres de plages, de pays et d'ASN par bloc.

ParameterInDescription
apathPremier octet, 0-255.
curl https://ipto.to/v1/ip-ranges/8 # {"octet1":8,"cidr":"8.0.0.0/8","blocks":[{"octet":8,"range_count":...,"country_count":...,"asn_count":..., # "top_country":"US", ...}, ...]}
GET/v1/ip-ranges/:a/:b

Les plages attribuées dans un /16 (par exemple 8.8.0.0/16), chacune avec l'ASN auquel elle appartient, plus les nombres par bloc.

ParameterInDescription
apathPremier octet, 0-255.
bpathDeuxième octet, 0-255.
curl https://ipto.to/v1/ip-ranges/8/8 # {"octet1":8,"octet2":8,"cidr":"8.8.0.0/16","blocks":[{"octet":1,"range_count":1,"country_count":1,"asn_count":1, # "top_country":"US", ...}, ...],"ranges_total":30,"ranges":[...]}
GET/v1/nearby

Une tranche de la charge Nearby pour une coordonnée, afin qu'un client affiche chaque partie à mesure qu'elle arrive : géocodage inverse, points d'intérêt ou statistiques locales de criminalité.

ParameterInDescription
latqueryLatitude, obligatoire.
lonqueryLongitude, obligatoire.
partqueryQuelle tranche : geocode, poi ou crime. Une valeur inconnue renvoie 400.
countryquerypart=crime uniquement : code pays ISO. Des données de criminalité existent pour US et GB.
regionquerypart=crime uniquement : nom de l'État ou de la région, p. ex. Utah.
cityquerypart=crime uniquement : nom de la ville, p. ex. Orem.
langqueryFacultatif. Localise les libellés de lieux (mêmes codes que le tableau de localisation ci-dessus).
curl "https://ipto.to/v1/nearby?lat=40.2969&lon=-111.6948&part=geocode" # {"geocode":{...reverse-geocoded place...}} curl "https://ipto.to/v1/nearby?lat=40.2969&lon=-111.6948&part=poi" # {"locality":{...nearby points of interest...}} curl "https://ipto.to/v1/nearby?lat=40.2969&lon=-111.6948&part=crime&country=US&region=Utah&city=Orem" # {"locality":{"ukCrime":null,"usCrime":{"agencyName":"Orem Police Department","agencyType":"City", # "distanceKm":4.4,"year":2025,"categories":[{"category":"violent-crime","label":"Violent crime","totalOffenses":129}, ...]}}}
GET/v1/commute

Durée et distance en voiture entre deux points. Un chemin rapide : il évite le géocodage inverse et la recherche de points d'intérêt de /v1/places/:ip.

ParameterInDescription
from_latqueryLatitude d'origine, obligatoire.
from_lonqueryLongitude d'origine, obligatoire.
dest_latqueryLatitude de destination. À utiliser avec dest_lon, ou passez dest_address à la place.
dest_lonqueryLongitude de destination.
dest_addressqueryDestination en texte libre, géocodée pour vous. Utilisée quand dest_lat/dest_lon sont absents.
curl "https://ipto.to/v1/commute?from_lat=40.2969&from_lon=-111.6948&dest_lat=40.7608&dest_lon=-111.8910" # {"from":{"lat":40.2969,"lon":-111.6948},"to":{"lat":40.7608,"lon":-111.891}, # "commute":{"durationMinutes":44,"distanceKm":63.5}}

Lorsqu'aucune destination ne peut être résolue, la réponse contient to: null, commute: null et une chaîne reason.

GET/v1/address-lookup

La charge de /v1/places/:ip ancrée sur une adresse postale saisie au lieu d'une IP : géocodage, localité et estimation de trajet facultative.

ParameterInDescription
qqueryAdresse en texte libre, obligatoire.
dest_latqueryLatitude de destination facultative, pour inclure une estimation de trajet (avec dest_lon).
dest_lonqueryLongitude de destination facultative.
dest_addressqueryDestination facultative en texte libre, à la place de dest_lat/dest_lon.
partquerypart=geo renvoie seulement le libellé et les coordonnées, pour un premier affichage plus rapide.
langqueryFacultatif. Localise les libellés de lieux (mêmes codes que le tableau de localisation ci-dessus).
curl "https://ipto.to/v1/address-lookup?q=1600+Pennsylvania+Ave+NW+Washington+DC" # {"query":"1600 Pennsylvania Ave NW Washington DC","found":true,"label":"...","latitude":38.89, # "longitude":-77.03,"geocode":{...},"commute":null,"locality":{...}} curl "https://ipto.to/v1/address-lookup?q=1600+Pennsylvania+Ave+NW+Washington+DC&part=geo" # {"query":"...","found":true,"label":"...","latitude":38.89,"longitude":-77.03}

found vaut false lorsque l'adresse n'a pas pu être géocodée.

GET/v1/address-suggest

Autocomplétion d'adresses : quelques lieux correspondant à une adresse partielle, avec une préférence facultative pour un point.

ParameterInDescription
qqueryTexte partiel de l'adresse, obligatoire.
near_latqueryLatitude facultative vers laquelle orienter les résultats.
near_lonqueryLongitude facultative vers laquelle orienter les résultats.
curl "https://ipto.to/v1/address-suggest?q=1600+Penn&near_lat=38.9&near_lon=-77.0" # {"suggestions":[{"label":"Penn Quarter, Ward 2, Washington, District of Columbia, United States", # "lat":38.8949563,"lon":-77.0224592}, ...]}
GET/v1/weather?include=

Le document météo complet, pour un nom de lieu, un code postal, des coordonnées ou une IP. Choisissez les blocs voulus avec include : current, hourly, daily, astro (soleil et lune), solar, indicators, alerts, marine, air_quality, nowcast, ou all. Les lieux américains viennent du National Weather Service, le reste du monde de MET Norway ; meta.source indique lequel. Sans include, vous obtenez le format simple { query, weather } décrit plus haut.

ParameterInDescription
q / lat+lon / ipqueryOù : q (ville, code postal ou "lat,lon"), ou lat et lon, ou ip. L'un des trois est obligatoire.
countryqueryFacultatif. Code ISO ou nom du pays pour lever l'ambiguïté d'un q, par exemple country=FR pour le code postal 75001.
includequeryObligatoire pour ce format. Valeurs séparées par des virgules : current, hourly, daily, astro, solar, indicators, alerts, marine, air_quality, nowcast, ou all.
unitsquerymetric (par défaut) ou imperial. Les noms de champs suivent l'unité : temp_c devient temp_f, wind_kmph devient wind_mph, precip_mm devient precip_in.
wind_unitquerykmh, ms, mph ou kn. Ne change que l'unité du vent.
hoursqueryNombre d'entrées horaires à renvoyer, 1-240. Par défaut 48. Les premières sont horaires, les suivantes toutes les 6 heures ; step_hours l'indique.
daysqueryNombre d'entrées quotidiennes à renvoyer, 1-9. Par défaut 7. Les données américaines couvrent 7 jours.
curl "https://ipto.to/v1/weather?lat=38.8977&lon=-77.0365&include=current,daily,alerts&days=1" # {"query":"38.8977,-77.0365","place":{"name":"Washington","region":"DC","country":"United States","country_code":"US", # "lat":38.8977,"lon":-77.0365,"timezone":"America/New_York"}, # "current":{"time":"2026-10-07T12:00-04:00","observed":false,"temp_c":18.9,"feels_like_c":18.9,"humidity_pct":52,"wind_kmph":12.9, # "wind_gust_kmph":24.1,"wind_dir":"S","uv_index":5.4,"condition":"Sunny","weather_code":113,"is_day":true, ...}, # "daily":[{"date":"2026-10-07","tmax_c":22.2,"tmin_c":12.8,"precip_mm":0,"precip_prob_pct":1,"gust_max_kmph":25.9,"uv_index_max":5.4, ...}], # "alerts":{"available":true,"source":"NWS","official":true,"items":[]}, # "meta":{"source":"NOAA National Weather Service","fallback_used":false,"coverage":{"precip_prob":true,"wind_gusts":true, ...}, # "derived":["current.uv_index","current.wet_bulb", ...],"timezone":"America/New_York", ...}} curl "https://ipto.to/v1/weather?q=Oslo&include=marine,air_quality,nowcast&units=imperial" # Norway-only blocks come back with available: true there and available: false everywhere else

meta.coverage indique les champs disponibles pour le lieu : la probabilité de pluie, les rafales et la probabilité d'orage n'existent qu'aux États-Unis et dans les pays nordiques, et valent null (jamais zéro) ailleurs. alerts sont des alertes officielles pour les États-Unis et la Norvège ; marine, air_quality et nowcast ne couvrent que la Norvège et ses eaux proches et renvoient available: false ailleurs. Tout ce qui figure dans meta.derived est une estimation d'ipto.to, et indicators sont des signalements dérivés, pas des alertes officielles. Conservez meta.attribution si vous affichez ces données (les données de MET Norway sont sous licence CC BY 4.0).

GET/v1/weather/history

Le relevé quotidien propre à ipto.to pour les lieux déjà consultés : la température maximale la plus haute, la minimale la plus basse et les plus fortes précipitations vues dans les instantanés de prévision de la journée. Seuls les lieux déjà demandés ont des données, qui s'accumulent avec le temps.

ParameterInDescription
q / lat+lon / ipqueryOù : q (ville, code postal ou "lat,lon"), ou lat et lon, ou ip. L'un des trois est obligatoire.
daysqueryNombre de jours récents à renvoyer, 1-400. Par défaut 30.
curl "https://ipto.to/v1/weather/history?q=Tokyo&days=7" # {"query":"Tokyo","place":{"name":"Tokyo","cc":"JP", ...}, # "days":[{"date":"2026-10-06","tmax_c":24.1,"tmin_c":17.8,"precip_mm":1.2,"condition_code":296,"source":"metno","snapshots":4}, ...], # "note":"Daily envelope of day-0 forecast snapshots (highest high, lowest low, largest precipitation seen), not station observations."}

Ce sont des instantanés de prévision, pas des observations de station ni une réanalyse : ne les utilisez pas comme historique observé. Un 404 signifie qu'aucun instantané n'a encore été enregistré pour ce lieu.

GET/v1/weather/radar/frames

Les images d'animation radar disponibles, de la plus ancienne à la plus récente, chacune avec un horodatage Unix et l'identifiant d'image à utiliser dans l'URL de la tuile radar.

curl https://ipto.to/v1/weather/radar/frames # {"frames":[{"time":1791316200,"id":"fdc753dba723"},{"time":1791316800,"id":"2314000028f2"}, ...]}
GET/v1/weather/radar/:frame/:z/:x/:y.png

Une tuile de carte radar (PNG) pour une image, à une position z/x/y standard de carte web. Servie depuis la même origine pour qu'une carte la charge sans requête tierce.

ParameterInDescription
framepathIdentifiant d'image issu de /v1/weather/radar/frames (hexadécimal en minuscules).
zpathNiveau de zoom.
xpathColonne de la tuile.
ypathLigne de la tuile.
# 1. pick the latest frame id FRAME=$(curl -s https://ipto.to/v1/weather/radar/frames | python3 -c "import sys,json;print(json.load(sys.stdin)['frames'][-1]['id'])") # 2. fetch a tile (image/png) curl -o radar.png "https://ipto.to/v1/weather/radar/$FRAME/5/6/12.png"
GET/v1/weather/satellite/:z/:x/:y.png

Une tuile de carte d'imagerie satellite pour une position z/x/y standard de carte web, servie depuis la même origine.

ParameterInDescription
zpathNiveau de zoom.
xpathColonne de la tuile.
ypathLigne de la tuile.
curl -o satellite.jpg "https://ipto.to/v1/weather/satellite/5/6/12.png" # the response body is the tile image (served as image/jpeg despite the .png path)
GET/v1/openapi/email.json

Contrat OpenAPI 3.1 lisible par machine pour /v1/email/:email, écrit pour que les agents LLM et MCP appellent le point de terminaison e-mail sans lire cette documentation.

curl https://ipto.to/v1/openapi/email.json # {"openapi":"3.1.0","info":{...},"servers":[{"url":"https://ipto.to"}],"paths":{"/v1/email/{email}":{...}}}

Référence des champs de recherche IP

FieldTypeDescription
ipstringL'adresse IP recherchée.
versionstring"v4" ou "v6".
bogonbooleantrue s'il s'agit d'une adresse privée, réservée, ou non routable.
bogon_typestring|nullCode de motif si bogon : "loopback", "private", "link-local", "multicast", "reserved", "documentation", "unspecified".
asninteger|nullNuméro de système autonome qui annonce cette IP.
asn_namestring|nullNom court de l'ASN (ex. "GOOGLE").
asn_orgstring|nullOrganisation enregistrée auprès de l'ASN (ex. "Google LLC").
asn_typestring|nullCatégorie d'ASN : "hosting", "isp", "business", "education", "government", "mobile", "residential".
continentstring|nullNom complet du continent (ex. "North America").
continent_codestring|nullCode continent à deux lettres : AF AS EU NA SA OC AN.
country_codestring|nullCode pays ISO 3166-1 alpha-2 (ex. "US") du pays où se trouve l'IP, issu des mêmes données de géolocalisation que la ville et les coordonnées. Sans correspondance de géolocalisation, c'est le pays d'enregistrement de l'ASN (asn_country_code) qui est utilisé. Le nom du pays, le drapeau, la devise, etc. en sont dérivés.
country_namestring|nullNom complet du pays en anglais (ex. "United States").
country_flagstring|nullEmoji du drapeau du pays (ex. "🇺🇸").
is_eubooleantrue si le pays est un État membre de l'UE (27 membres).
citystring|nullNom de la ville. Renseigné lors d'une recherche sur soi-même, et lors de recherches explicites lorsque l'une des sources géo fusionnées (IP2Location ou MaxMind) trouve une correspondance — vérifiez geo_precision.
statestring|nullRégion/subdivision administrative. Même disponibilité que city.
postal_codestring|nullCode postal. Renseigné lors d'une recherche sur soi-même, et lors de recherches explicites lorsque IP2Location (privilégié) ou MaxMind trouve une correspondance — même disponibilité que city.
latitudenumber|nullLatitude décimale. Même disponibilité que city.
longitudenumber|nullLongitude décimale. Même disponibilité que city.
timezonestring|nullFuseau horaire — même disponibilité que city. Un identifiant IANA (ex. "America/New_York") lors d'une recherche sur soi-même. Pour les recherches explicites, le format dépend de la source ayant fourni la correspondance : une chaîne de décalage UTC comme "-08:00" pour IP2Location, ou un nom IANA pour MaxMind.
geo_precisionstringNiveau de précision des données de localisation : "city", "country" (la recherche au niveau ville n'a trouvé aucune correspondance), ou "none".
geo_country_codestring|nullPays où se trouve l'IP, d'après les données de géolocalisation (ISO 3166-1 alpha-2). Égal à country_code dès qu'il est défini. null si aucune correspondance de géolocalisation.
asn_country_codestring|nullPays d'enregistrement du titulaire de l'ASN (ISO 3166-1 alpha-2). Peut différer de country_code pour les réseaux CDN, VPN, d'hébergement ou anycast annoncés depuis un autre pays que celui où le titulaire est enregistré. null si l'IP n'a pas d'entrée ASN.
currency_codestring|nullCode devise ISO 4217 du pays (ex. "USD").
exchange_rate_usdnumber|nullUnités de devise locale pour 1 USD, issues d'un flux de taux de référence synchronisé quotidiennement couvrant 154 devises. null pour les devises hors de cet ensemble.
calling_codestring|nullIndicatif téléphonique du pays, préfixe + inclus (ex. "+1").
languagesstring[]Langues officielles/reconnues du pays, en anglais.
tldstring[]Domaine(s) de premier niveau national/nationaux, ex. [".us"].
capitalstring|nullNom de la capitale.
bordersstring[]Codes ISO alpha-2 des pays frontaliers.
is_datacenterbooleantrue si l'IP appartient à un fournisseur d'hébergement ou de cloud.
is_mobilebooleantrue si l'IP est enregistrée auprès d'un opérateur mobile.
is_residentialbooleantrue si l'IP est classée comme accès résidentiel à haut débit.
connection_typestring"mobile", "datacenter", ou "unknown" — dérivé de la même classification que is_mobile/is_datacenter. Ne tente délibérément pas de distinguer résidentiel de professionnel : cela n'est pas dérivable de façon fiable à partir du seul texte du nom d'organisation de l'ASN, donc un ASN qui n'est pas classé avec confiance comme mobile ou datacenter reste "unknown" plutôt que deviné.
is_botbooleantrue si l'IP est associée à une infrastructure de bot connue.
is_proxybooleantrue si l'IP est un point de sortie proxy connu.
is_vpnbooleantrue si l'IP appartient à une plage de serveurs VPN connue du flux de menaces.
is_torbooleantrue si l'IP est un nœud de sortie Tor confirmé.
is_abuserbooleantrue si l'IP appartient à une plage réseau signalée par plusieurs flux de renseignement sur les abus.
abuse_scoreinteger|nullScore de gravité de 1 à 10 lorsque is_abuser vaut true, issu de la corroboration croisée des flux. null sinon.
risk_tierstring|null"critical" (8-10), "high" (5-7), ou "medium" (3-4) — dérivé de abuse_score. null si non signalé.
threat_typestring|nullLa catégorie correspondante la plus actionnable lorsque is_tor/is_vpn/is_abuser se chevauchent : "tor_exit" > "abuser" > "vpn". null si aucune correspondance.
flagsobjectObjet rétrocompatible reflétant les champs is_*. Clés : hosting, mobile, residential, bot, blacklisted, vpn, tor, abuser.
meta.data_versionstringDate du jeu de données utilisé pour la recherche (AAAA-MM-JJ). "cf-edge" pour une recherche sur soi-même. "bogon" pour les plages privées.
meta.cachedbooleantrue si la réponse a été servie depuis la couche de cache.
meta.langstringLa langue effectivement utilisée pour cette réponse — correspond à ?lang= si fourni, ou à la valeur résolue à partir d'Accept-Language, ou à "en".
meta.lang_source"param"|"header"|"default"Comment lang a été déterminé : "param" (?lang= a été transmis), "header" (résolu à partir d'Accept-Language), ou "default" (aucun des deux n'était présent).

Formats de sortie

Les recherches IP, ASN, et pays prennent toutes en charge ?format=.

FormatContent-TypeUsage
jsonapplication/jsonPar défaut. Réponse structurée complète.
csvtext/csvPaires clé,valeur à plat. Les objets imbriqués sont omis.
texttext/plainLignes clé : valeur. Un champ par ligne.
xmlapplication/xmlStructure imbriquée complète, les tableaux répètent la balise.
yamlapplication/x-yamlStructure imbriquée complète.
curl "https://ipto.to/v1/ip/8.8.8.8?format=csv" curl "https://ipto.to/v1/ip/8.8.8.8?format=xml" curl "https://ipto.to/v1/ip/8.8.8.8?format=yaml" curl "https://ipto.to/v1/ip/8.8.8.8?fields=ip,country_code,is_vpn,is_tor"

Localisation

Transmettez ?lang= sur /v1/ip, /v1/asn/:asn, ou /v1/country/:code pour localiser country_name et continent. Tout le reste (noms d'organisation ASN, noms de ville, codes devise) reste dans sa forme d'origine — ce sont des identifiants et des noms propres, pas du texte d'interface. Les codes non pris en charge se replient sur l'anglais plutôt que de renvoyer une erreur.

CodeLanguage
enEnglish (default)
ptPortuguês
frFrançais
deDeutsch
zh-TW繁體中文
ko한국어
zh-CN简体中文
ja-JP日本語
es-ESEspañol
ar-SAالعربية
hi-INहिन्दी
curl "https://ipto.to/v1/ip/8.8.8.8?lang=de" # "landesname":"Vereinigte Staaten","kontinent":"Nordamerika","ist_vpn":false, ... # every key is renamed and every enum value translated -- this is the default for any non-English lang

Pas de ?lang= ? Envoyez plutôt un en-tête Accept-Language — les mêmes endpoints le lisent aussi, donc un simple curl -H "Accept-Language: es" https://ipto.to/v1/ip/8.8.8.8 localise la réponse sans avoir besoin de chaîne de requête. Un ?lang= explicite l'emporte toujours lorsque les deux sont présents. Remarque : la variable d'environnement shell LANG/LC_ALL (ex. LANG=es_ES.UTF-8 curl ...) ne fait que définir la locale propre de curl — curl ne la lit jamais et ne la transforme jamais en en-tête, elle n'a donc aucun effet sur la langue de la réponse. Seuls Accept-Language ou ?lang= fonctionnent réellement.

curl -H "Accept-Language: es" https://ipto.to/v1/ip/8.8.8.8 # "nombre_país":"Estados Unidos","continente":"Norteamérica" -- full key+value localization, same as ?lang=es # equivalent, explicit form: curl "https://ipto.to/v1/ip/8.8.8.8?lang=es" # does NOT work -- LANG only sets curl's own locale, never a header: LANG=es_ES.UTF-8 curl https://ipto.to/v1/ip/8.8.8.8

Chaque réponse de /v1/ip, /v1/asn/:asn et /v1/country/:code inclut lang et lang_source (imbriqué dans meta sur /v1/ip ; au niveau racine sur les deux autres), afin que vous sachiez toujours exactement quelle langue a été appliquée et comment elle a été choisie — "param", "header" ou "default" — sans avoir à deviner à partir de la requête envoyée.

curl -s -H "Accept-Language: es" https://ipto.to/v1/ip/8.8.8.8 | python3 -m json.tool # "meta": { "data_version": "...", "cached": true, "lang": "es-ES", "lang_source": "header" }

La localisation complète des clés et des valeurs est le comportement par défaut dès que vous définissez un lang autre que l'anglais — chaque champ, y compris les clés imbriquées flags et meta, revient renommé dans la langue cible, et les valeurs d'énumération fixes (risk_tier, threat_type, connection_type, geo_precision, bogon_type, asn_type) sont également traduites. Besoin de l'ancien format avec des clés en anglais ? Ajoutez &localize=0 à /v1/ip pour le désactiver.

curl -s "https://ipto.to/v1/ip/8.8.8.8?lang=de&localize=0" | python3 -m json.tool # opts back out to the legacy English-keys shape: # "country_name": "Vereinigte Staaten", "geo_precision": "country", "is_vpn": false, # "flags": { "hosting": false, "mobile": false, ... }, # "meta": { "lang": "de", "lang_source": "param", ... }

Exemples de code

JavaScript

const res = await fetch("https://ipto.to/v1/ip/8.8.8.8"); const data = await res.json(); console.log(data.country_name, data.asn_org, data.is_vpn);

Python

import requests r = requests.get("https://ipto.to/v1/ip/8.8.8.8") print(r.json()["country_name"], r.json()["is_vpn"])

PHP

$data = json_decode(file_get_contents("https://ipto.to/v1/ip/8.8.8.8"), true); echo $data["country_name"] . " " . $data["asn_org"];

Go

resp, _ := http.Get("https://ipto.to/v1/ip/8.8.8.8") var data map[string]interface{} json.NewDecoder(resp.Body).Decode(&data)

Limites de débit

Les limites sont appliquées par jour (UTC), comptées par adresse IP sur le niveau gratuit ou par clé sur Pro/Enterprise. Dépasser votre limite renvoie un statut HTTP 429 avec un en-tête Retry-After. Pour des charges de production, voir tarifs.

S'applique à chaque endpoint /v1/*, au serveur /mcp, et aux raccourcis curl ipto.to / curl ipto.to/:ip. GET /ip est la seule exception — un simple écho d'en-tête sans coût de recherche, qui ne consomme donc aucun quota.

TierRequests / dayAuth
Free1,000Aucun
Pro100,000Clé API (en-tête)
EnterpriseUnlimitedClé API + endpoints dédiés

Codes d&#39;erreur

StatusMeaning
200OK. La réponse inclut les données.
202Les données du flux sont en cours de synchronisation. Réessayez dans 45 secondes.
400Requête invalide. IP, ASN, ou code pays invalide.
404ASN ou pays introuvable dans le jeu de données.
503Jeu de données pas encore disponible. L&#39;ingestion initiale est peut-être en cours.