Referencia de la API

Endpoints simples y consistentes. CORS habilitado. No requiere autenticación. Totalmente multilingüe — cada campo, clave y valor se traduce a más de 10 idiomas.

URL base

https://ipto.to

Inicio rápido

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

Atajo de terminal: curl ipto.to o curl ipto.to/8.8.8.8 (no hace falta https:// ni /v1/ip/) también funciona cuando la petición procede de curl, Wget o HTTPie — se detecta por el User-Agent. Devuelve un conjunto de campos más reducido, al estilo de ipinfo.io (ip, country, city, asn, org, ...), no el esquema completo que se documenta más abajo — usa directamente las rutas /v1/ip para obtener la respuesta completa documentada en esta página.

Solo la IP: curl ipto.to/ip (o ábrelo en un navegador) no devuelve más que tu propia dirección IP en texto plano — 73.9.114.155, sin JSON, sin elementos de página. Equivalente directo de ipinfo.io/ip. Consulta GET /ip más abajo.

Multilingüe por defecto: Define ?lang= con cualquier código admitido y cada clave y valor JSON de la respuesta vuelve traducido — no solo país/continente. Consulta Localización más abajo para la lista completa de idiomas y la opción de desactivación &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

Crea cualquier solicitud de ipto, cópiala como código listo para ejecutar en tu lenguaje o envíala aquí mismo y lee la respuesta en vivo. El plan gratuito no necesita clave.

Servidor MCP

ipto también es accesible como servidor de herramientas MCP (Model Context Protocol) — apunta Claude Desktop, Cursor o cualquier cliente compatible con MCP al endpoint indicado más abajo, y expone 14 herramientas invocables: 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 y patent_lookup. JSON-RPC 2.0 sobre Streamable HTTP — solo POST, sin necesidad de sesión ni SSE. Misma autenticación que la API REST: omítela para el plan gratuito (1.000 peticiones/día por IP), o añade ?api_key= a la URL del endpoint.

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

Para clientes que solo admiten stdio, haz de puente con: 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"}}}'

Endpoints

GET/ip

No devuelve más que la propia dirección IP pública del cliente que hace la petición, en texto plano (Content-Type: text/plain) — p. ej. 73.9.114.155. Equivalente directo de ipinfo.io/ip: funciona igual desde curl, Wget, HTTPie o una simple visita desde el navegador (sin detección de User-Agent, a diferencia del atajo curl ipto.to anterior), y se muestra como la IP desnuda, sin elementos de página, al abrirse en un navegador.

Sin parámetros, sin cadena de consulta. Para obtener el objeto completo de geolocalización/inteligencia de amenazas, usa en su lugar GET /v1/ip más abajo. Esta ruta lee directamente la IP de la conexión (sin consulta a D1/KV) y no computa contra el presupuesto diario de peticiones — consulta Límites de peticiones.

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

Devuelve geolocalización e inteligencia de amenazas para la IP que realiza la petición, incluidos datos a nivel de ciudad a través del objeto edge de CF.

Sin parámetros obligatorios. Admite ?lang=, ?fields=, ?format= — consulta Localización y Formatos de salida más abajo.

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

Busca cualquier dirección IPv4. Los campos a nivel de ciudad (city, state, postal_code, latitude, longitude, timezone) se rellenan cuando la IP está dentro de alguno de los dos conjuntos de datos geográficos combinados, IP2Location o MaxMind — comprueba geo_precision en la respuesta para saber si has obtenido datos a nivel de ciudad o de país. El formato de timezone depende de qué fuente ha coincidido (una cadena de desfase UTC en el caso de IP2Location, un nombre IANA en el caso de MaxMind). Las búsquedas de IPv6 actualmente solo devuelven datos a nivel de país.

ParameterInDescription
ippathObligatorio. Cualquier dirección IPv4 o IPv6 válida.
langqueryOpcional. Localiza country_name y continent: en (por defecto), pt, fr, de, zh-TW, ko, zh-CN, ja-JP, es-ES, ar-SA, hi-IN.
fieldsqueryOpcional. Lista de campos a incluir, separados por comas. P. ej. ?fields=ip,country_code,is_vpn
formatqueryOpcional. Formato de la respuesta: json (por defecto), 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

El endpoint de búsqueda unificada que hay detrás de la barra de búsqueda de la página de inicio. Detecta si :query es una IP, un ASN (AS15169 o 15169), un código de país de 2 letras, un correo electrónico o un número de teléfono, y a continuación agrega todas las comprobaciones relevantes en una sola respuesta. Para una consulta de IP, esto se reparte — en paralelo, en el servidor — entre la búsqueda de IP principal más RPKI, IP-to-company, operador móvil, hosted-domains y places, de modo que una sola búsqueda solo consume una petición de tu presupuesto diario de límite de peticiones, en lugar de una por función.

ParameterInDescription
querypathObligatorio. Una IP, un ASN, un código de país, un correo electrónico o un número de teléfono.
FieldTypeDescription
querystringLa entrada decodificada tal como se recibió.
detected_typestring"ip", "asn", "country", "email" o "phone".
ipobject|nullPresente cuando detected_type es "ip" — misma estructura que GET /v1/ip/:ip.
rpkiobject|nullPresente en consultas de IP — misma estructura que GET /v1/ip/:ip/rpki.
companyobject|nullPresente en consultas de IP — misma estructura que GET /v1/ip/:ip/company.
whoisobject|nullPresente en consultas de IP — misma estructura que GET /v1/ip/:ip/whois.
carrierobject|nullPresente en consultas de IP — misma estructura que GET /v1/ip/:ip/carrier.
asn / country / email / phoneobject|nullPresente en lugar de los seis campos anteriores cuando detected_type coincide — misma estructura que el endpoint dedicado propio de ese tipo.

Cada subcampo se degrada de forma independiente — un servicio upstream lento o fallido (RIPEstat, un servidor RDAP, crt.sh) se traduce en que ese campo concreto sea null, nunca en que falle la búsqueda entera. Solo una consulta principal no válida (p. ej. una IP mal formada) devuelve un estado de error para la petición en su conjunto.

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

DNS inverso — una única consulta PTR en vivo a través de DNS-over-HTTPS, no una base de datos de enumeración de dominios. Devuelve null si la IP no tiene registro PTR.

ParameterInDescription
ippathObligatorio. Cualquier dirección IPv4 o IPv6 válida.
curl https://ipto.to/v1/ip/8.8.8.8/hostname # {"ip":"8.8.8.8","hostname":"dns.google"}
GET/v1/ip/:ip/rpki

Validación RPKI del origen de ruta para la ruta actualmente anunciada de una IP, resuelta en vivo a través de RIPEstat (sin ninguna base de datos de ROA ingerida ni sincronizada localmente). status solo puede ser "valid", "invalid" o "unknown" — nunca se sintetiza a partir de otra señal; cualquier fallo o tiempo de espera de RIPEstat devuelve "unknown" con una cadena de motivo, no un error.

ParameterInDescription
ippathObligatorio. Cualquier dirección IPv4 o IPv6 válida.
FieldTypeDescription
asninteger|nullEl ASN que anuncia actualmente la ruta, resuelto en vivo — no derivado del propio conjunto de datos de ASN de este sitio.
prefixstring|nullEl prefijo CIDR anunciado actualmente.
statusstring"valid", "invalid" o "unknown".
validating_roasarrayEl/los ROA concretos que ha encontrado RIPEstat, cada uno con origin/prefix/max_length/validity.
validatorstring|nullQué validador RPKI ha usado RIPEstat (p. ej. "routinator").
reasonstring|nullExplica un resultado "unknown" — p. ej. no existe ningún ROA que lo cubra, o RIPEstat no estaba disponible.
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

Validación RPKI explícita (ASN, prefijo) — para cuando ya conoces la ruta exacta que quieres comprobar, en lugar de la opción derivada de IP anterior.

ParameterInDescription
asnqueryObligatorio. Número de ASN, con o sin el prefijo AS. P. ej. 15169 o AS15169.
prefixqueryObligatorio. Prefijo CIDR, p. ej. 8.8.8.0/24.
curl "https://ipto.to/v1/rpki?asn=15169&prefix=8.8.8.0/24"
GET/v1/ip/:ip/company

Identifica la organización a la que está registrada una IP combinando los datos del titular en RDAP (WHOIS estructurado) con el nombre de organización propio del ASN, en un nivel de confianza categórico, nunca una puntuación numérica.

ParameterInDescription
ippathObligatorio. Cualquier dirección IPv4 o IPv6 válida.
FieldTypeDescription
company_namestring|nullEl nombre de empresa resuelto — null cuando confidence es "low" (las dos fuentes no coinciden, por lo que ninguna se presenta como autoritativa) o "none".
rdap_org_namestring|nullEl nombre del titular según RDAP, independiente de company_name.
asn_org_namestring|nullEl nombre de organización propio del ASN, independiente de company_name.
confidencestring"high" (las fuentes coinciden), "medium" (solo hay una fuente disponible), "low" (las fuentes no coinciden — se muestran ambas) o "none".
reasonstringExplicación en lenguaje sencillo del nivel de confianza.
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

El propio registro RDAP subyacente — bloque de red, fechas de registro/última modificación, y todos los contactos que RDAP tiene archivados. Distinto de /company, que arriba concilia estos mismos datos del titular con el nombre de organización del ASN en una única respuesta puntuada por confianza; este endpoint devuelve el registro en bruto tal cual, más parecido a la salida clásica de WHOIS. Las direcciones IPv6 también son compatibles.

ParameterInDescription
ippathObligatorio. Cualquier dirección IPv4 o IPv6 válida.
FieldTypeDescription
availablebooleanfalse si no se ha podido resolver ningún registro RDAP — consulta reason.
reasonstring|nullExplica un resultado available: false.
startAddress / endAddress / cidrstring|nullEl bloque de red registrado.
netName / netHandle / parentHandlestring|nullIdentificadores asignados por el RIR para el objeto de red.
countrystring|nullPaís del titular, según RDAP.
allocationTypestring|nullp. ej. "direct allocation", "reassigned".
registeredDate / lastChangedDatestring|nullMarcas de tiempo ISO del registro RDAP.
rirstring|nullQué registro regional (ARIN, RIPE, APNIC, LACNIC, AFRINIC) ha servido el registro.
contactsarrayTodos los contactos que RDAP tiene archivados, cada uno con roles, name, email y handle — no solo la primera coincidencia.
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

Identificación de operador móvil hecha en el mejor esfuerzo posible para IPs clasificadas como redes móviles, cruzada con un directorio de operadores MCC/MNC. Deliberadamente no tiene un único campo de operador — consulta matched_carrier_entries y note más abajo — ya que un nombre de operador aislado se interpretaría como una afirmación en vivo por suscriptor, algo que estos datos no pueden respaldar honestamente.

ParameterInDescription
ippathObligatorio. Cualquier dirección IPv4 o IPv6 válida.
FieldTypeDescription
is_mobile_networkbooleanfalse detiene el proceso aquí con un directorio vacío — no se aventura ninguna suposición para un ASN no móvil.
asn_organizationstring|nullEl nombre de organización propio del ASN.
matched_carrier_entriesarrayFilas del directorio MCC/MNC cuyo nombre de operador coincide de forma aproximada con asn_organization, limitadas al propio país de la IP.
notestringExplica lo que este campo puede y no puede afirmar.
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

Encuentra dominios asociados a una IP a través de su nombre de host de DNS inverso (PTR) y de los registros de transparencia de certificados (crt.sh) — no es una búsqueda de IP inversa general. El propio campo limitations de la respuesta detalla exactamente qué puede y qué no puede encontrar.

ParameterInDescription
ippathObligatorio. Cualquier dirección IPv4 o IPv6 válida.
FieldTypeDescription
ptr_hostnamestring|nullEl nombre de host de DNS inverso de la IP, o null si no tiene registro PTR.
root_domainstring|nullEl dominio registrable derivado de ptr_hostname.
subdomains_seenarray|nullSubdominios encontrados mediante transparencia de certificados. null significa que la propia búsqueda en crt.sh no pudo completarse — distinto de un array vacío, que significa que se ejecutó y no encontró nada.
limitationsstringExplica qué no puede detectar esta función por su propia naturaleza (sin PTR, hosting compartido, dominios sin certificado).
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

Búsqueda por lotes — hasta 100 IPs por petición, solo Pro/Enterprise. Devuelve un objeto indexado con cada IP como clave. Más rápida que las llamadas secuenciales gracias a las lecturas en paralelo de caché y base de datos. Cada IP del lote cuenta contra tu presupuesto diario de peticiones, igual que si se consultara individualmente. Las peticiones del plan gratuito reciben un 403 — consulta precios.

ParameterInDescription
bodybody (JSON)Array JSON de cadenas de IP. P. ej. ["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

Busca un Sistema Autónomo por número. Devuelve el nombre de la organización, el país, el continente, el número de rangos de IP, el tipo de clasificación, el tipo de cambio y datos de referencia regionales (idiomas, TLD, capital, fronteras).

ParameterInDescription
asnpathNúmero de ASN sin el prefijo AS. P. ej. 15169 para Google.
langqueryOpcional. Localiza country_name y continent: en (por defecto), pt, fr, de, zh-TW, ko, zh-CN, ja-JP, es-ES, ar-SA, hi-IN.
formatqueryOpcional. Formato de la respuesta: json (por defecto), csv, text, xml, yaml.
curl https://ipto.to/v1/asn/15169
GET/v1/places/:ip

Aplica geocodificación inversa a la ubicación a nivel de ciudad ya disponible de una IP, y a continuación devuelve puntos de interés cercanos (restaurantes, parques, colegios, transporte, lugares emblemáticos), datos locales de criminalidad allí donde existe una fuente (solo Reino Unido y EE. UU.), y una estimación opcional del trayecto en coche calculada bajo demanda.

ParameterInDescription
ippathObligatorio. Cualquier dirección IPv4 válida. IPv6 aún no es compatible.
dest_latqueryOpcional. Latitud de destino para una estimación de trayecto — combínalo con dest_lon.
dest_lonqueryOpcional. Longitud de destino para una estimación de trayecto — combínalo con dest_lat.
dest_addressqueryOpcional. Dirección de destino en texto libre para una estimación de trayecto, geocodificada automáticamente. Se ignora si también se proporcionan dest_lat/dest_lon.
FieldTypeDescription
geocodeobject|nullcountry, countryCode, region, city, neighbourhood, displayName — null si la IP no tiene una ubicación a nivel de ciudad desde la que geocodificar.
locality.restaurants / .parks / .schools / .transitarrayHasta 4 entradas más cercanas por categoría, cada una con name y distanceMeters.
locality.notablearrayLugares emblemáticos cercanos destacados, con una breve descripción, a través de Wikidata.
locality.usCrimeobject|nullTotales de delitos violentos/contra la propiedad de la agencia más cercana — solo EE. UU., requiere una FBI_CRIME_API_KEY en el despliegue. null en cualquier otro caso.
locality.ukCrimeobject|nullResumen de incidentes a nivel de calle en un radio de 1 milla — solo Reino Unido.
locality.caCrimenullSiempre null — no hay ninguna fuente de criminalidad a nivel de Canadá integrada (consulta docs/places.md).
commuteobject|nulldurationMinutes y distanceKm, solo cuando se ha proporcionado un destino y OpenRouteService ha devuelto una ruta. null en caso contrario — nunca se calcula especulativamente.
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

Estadísticas agregadas a nivel de país, más datos de referencia regionales (moneda, tipo de cambio, idiomas, TLD, capital, fronteras).

ParameterInDescription
codepathCódigo de país ISO 3166-1 alfa-2. P. ej. US, DE, JP.
langqueryOpcional. Localiza country_name y continent: en (por defecto), pt, fr, de, zh-TW, ko, zh-CN, ja-JP, es-ES, ar-SA, hi-IN.
formatqueryOpcional. Formato de la respuesta: json (por defecto), 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

Analiza una cadena de User-Agent. Devuelve navegador, sistema operativo, tipo de dispositivo y detección de bots. Por defecto lee la cabecera User-Agent de quien hace la petición, o puedes pasar cualquier cadena mediante ?ua=.

ParameterInDescription
uaqueryOpcional. Cadena de User-Agent codificada en URL para analizar. Por defecto usa la cabecera User-Agent de la petición.
curl "https://ipto.to/v1/ua?ua=Mozilla%2F5.0+%28iPhone%3B+CPU+iPhone+OS+17_0%29"
GET/v1/phone/:number

Valida y formatea un número de teléfono de forma gratuita, siempre: región, tipo de línea y formato E.164/nacional/internacional mediante un analizador propio autoalojado, sin llamada a proveedores. Cuando hay un presupuesto premium mensual disponible por IP/clave (100/mes en Free, más en planes de pago — ver precios), la misma solicitud además devuelve el nombre del operador en tiempo real, el estado de portabilidad y un tipo de teléfono clasificado por el proveedor, desde un servicio de consulta de operadores en tiempo real — ver source y los campos siguientes. Se incluye siempre, independientemente del nivel, un country_name localizado junto con lang/lang_source — ver Localización. Si se agota el presupuesto premium, o hay algún problema con el servicio, la solicitud vuelve sin problemas a los campos gratuitos anteriores; nunca falla por ello. Para una referencia de operadores de red a nivel de país en lugar de una consulta por número, ver GET /v1/carriers.

ParameterInDescription
numberpathObligatorio. Cualquier número de teléfono, idealmente en formato E.164 (p. ej. +14155552671). Codifica en URL el signo + inicial.
countryqueryOpcional. Pista de código de país de 2 letras para analizar números en formato nacional ambiguos, p. ej. ?country=US.
modequeryOpcional. ?mode=current solicita el operador en tiempo real (en lugar del emitido por la SIM) del número, cuando el nivel premium está disponible. Se ignora si la solicitud vuelve al plan gratuito.
FieldTypeDescription
validbooleantrue si el número coincide con un patrón de plan de numeración válido para su región.
country_codestring|nullRegión ISO 3166-1 alfa-2 a la que pertenece el número.
national_formatstring|nullFormateado según la propia convención nacional de la región.
international_formatstring|nullFormateado con código de país y espaciado, p. ej. "+1 415 555 2671".
e164string|nullForma canónica E.164, p. ej. "+14155552671".
line_typestring|nullFIXED_LINE, MOBILE, FIXED_LINE_OR_MOBILE, VOIP, TOLL_FREE, PREMIUM_RATE, o similar. Muchos planes de numeración (incluido el de Norteamérica) no pueden distinguir fijo de móvil solo a partir del número.
sourcestring"premium" si había presupuesto de consulta de operadores en vivo disponible para esta solicitud, "local" si volvió al analizador gratuito anterior. carrier, phone_type, original_carrier, is_ported, phone_region y country_prefix de abajo solo se rellenan cuando source es "premium" — country_name y lang/lang_source, más abajo, siempre se rellenan, independientemente del nivel.
phone_typestring|nullUna de las categorías propias del proveedor de consulta de operadores en tiempo real: mobile, fixed_line, voip, toll_free, premium_rate, shared_cost, personal_number, pager, uan, voicemail, o unknown — no solo las cuatro primeras, que son solo los ejemplos más comunes. null cuando source es "local" — distinto de line_type anterior, que proviene del analizador local y usa un conjunto de categorías diferente.
carrierstring|nullEl nombre del operador de red actual del número. null cuando source es "local".
original_carrierstring|nullEl operador de red en el que se emitió originalmente el número, si desde entonces se ha portado. null cuando source es "local" o el número no se ha portado.
is_portedboolean|nulltrue si el número se ha portado fuera de su operador original. null cuando source es "local".
phone_regionstring|nullDetalle a nivel de localidad/estado para el número (p. ej. "California"), más específico que country_code anterior. null cuando source es "local".
country_prefixstring|nullEl código de llamada del número sin el "+" inicial (p. ej. "49" para Alemania). null cuando source es "local".
country_namestring|nullNombre completo del país (p. ej. "Alemania") — country_code anterior es solo la forma ISO alfa-2 ("DE"), no un nombre para mostrar. A diferencia de los campos exclusivos de premium anteriores, este siempre se rellena (siempre que country_code también lo esté) y está localizado mediante ?lang=/Accept-Language igual que el campo country_name de cualquier otro endpoint — ver lang/lang_source a continuación.
langstringEl idioma realmente aplicado a country_name anterior — el valor resuelto de ?lang=, o "en" si no se solicitó ninguno o el solicitado no está admitido.
lang_sourcestring"param" si ?lang= estaba presente en la solicitud, "header" si en su lugar se usó Accept-Language, o "default" si no se usó ninguno de los dos y se aplicó inglés. Mismo significado que el campo con el mismo nombre en GET /v1/asn/:asn y GET /v1/country/:code.
curl "https://ipto.to/v1/phone/+14155552671"
POST/v1/phone/bulk

Validación por lotes. Todos los planes tienen acceso a la validación por lotes (a diferencia de /v1/ip/bulk) — lo que mantiene acotado el plan Free es el límite de lote por plan, no un 403. Free: 10/petición, 100/día. Pro: 100/petición, 1.000/día. Enterprise: 1.000/petición, 10.000/día. Este presupuesto es independiente de tu límite general de peticiones diarias — consulta Límites de peticiones.

ParameterInDescription
bodybody (JSON)Array JSON de cadenas de números de teléfono.
curl -X POST https://ipto.to/v1/phone/bulk \ -H "Content-Type: application/json" \ --data '["+14155552671","+442071838750"]'
GET/v1/carriers

Consulta de referencia: qué operadores de red móvil (MCC/MNC) se conocen para un país dado — no vinculado a ningún número de teléfono concreto. Procede de una recopilación de MCC/MNC mantenida por la comunidad (con licencia MIT, sincronizada por última vez en 2026 — consulta el repositorio de docs para más detalles); una tabla de referencia estática, no un feed en vivo, ya que las asignaciones de planes de numeración no cambian con la frecuencia suficiente como para justificar uno.

ParameterInDescription
countryqueryObligatorio. Código de país de 2 letras, p. ej. ?country=US.
curl "https://ipto.to/v1/carriers?country=US"
GET/v1/email/:email

Validación de sintaxis de correo electrónico, una comprobación en vivo del registro MX a través de DNS-over-HTTPS, y detección de dominios desechables/temporales frente a una lista de bloqueo mantenida por la comunidad (con licencia CC0, sincronizada a diario). No verifica que el buzón en sí exista — eso requiere un intercambio SMTP que esta API no realiza (consulta la referencia de campos más abajo para ver exactamente qué demuestra y qué no demuestra has_mx).

ParameterInDescription
emailpathObligatorio. Cualquier dirección de correo electrónico, codificada en URL (el @ debe codificarse como %40).
FieldTypeDescription
valid_syntaxbooleantrue si la dirección coincide con un patrón de sintaxis de correo estándar. No verifica que el buzón exista.
domainstring|nullLa parte del dominio, en minúsculas. null si valid_syntax es false.
has_mxboolean|nulltrue si el dominio tiene al menos un registro MX en este momento. null si la sintaxis no era válida o la propia consulta DNS falló o expiró — trata null como desconocido, no como false.
disposableboolean|nulltrue si el dominio coincide con un proveedor de correo desechable/temporal conocido. null bajo las mismas condiciones que has_mx.
source"premium"|"local""premium" si se ejecutó una verificación en vivo para esta solicitud, "local" si no (se alcanzó el límite, o la función no está habilitada) — los campos anteriores (de valid_syntax a disposable) siempre están presentes en ambos casos.
is_reachablestring|nullEl veredicto general de una verificación en vivo opcional: "safe" (entregable), "invalid" (rechazado), "risky" (incierto) o "unknown" (no concluyente — inténtalo de nuevo). null cuando la verificación en vivo no se ejecutó para esta solicitud (consulta source más abajo).
is_catch_allboolean|nulltrue si el dominio acepta correo para cualquier dirección, lo que significa que no se pudo confirmar la existencia de este buzón específico. null cuando la verificación en vivo no se ejecutó.
mailbox_fullboolean|nulltrue si la verificación en vivo encontró que el buzón está lleno. null cuando la verificación en vivo no se ejecutó.
is_role_accountboolean|nulltrue si la dirección parece una cuenta de función (p. ej., support@, admin@) en lugar del buzón de una persona. null cuando la verificación en vivo no se ejecutó.
is_disabledboolean|nulltrue si la verificación en vivo encontró el buzón explícitamente deshabilitado. null cuando la verificación en vivo no se ejecutó.
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

Combina los que proporciones de entre IP, correo electrónico, teléfono y User-Agent en una única puntuación de 0 a 100 — lo único que ninguno de ip-api.com, ipapi.co, ipgeolocation.io, ipify.org, ipregistry.co, ip2location.io, AbstractAPI, IPLocate.io o BigDataCloud ofrece como señal fusionada única (comprobado directamente). Las cuatro entradas son opcionales e independientes — pasa el subconjunto que quieras. ip toma por defecto tu propia IP y ua tu propia cabecera User-Agent si se omiten, la misma convención que GET /v1/ip y GET /v1/ua. Una señal que no envíes simplemente está ausente de la respuesta, no se puntúa como limpia — su peso se redistribuye entre las señales que sí proporcionaste.

ParameterInDescription
ipqueryOpcional. Por defecto, tu propia IP. IPv6 aún no se puntúa (misma limitación que el resto de la API de datos de amenazas).
emailqueryOpcional. Cualquier dirección de correo electrónico.
phonequeryOpcional. Cualquier número de teléfono.
uaqueryOpcional. Por defecto, tu propia cabecera User-Agent.
FieldTypeDescription
scoreintegerCompuesto ponderado de 0 a 100 entre las señales que se hayan proporcionado.
risk_tierstring"low" (<20), "medium" (20-44), "high" (45-69) o "critical" (70+).
signalsobjectDesglose por entrada — solo están presentes las claves de las entradas que realmente proporcionaste: ip, email, phone, user_agent. Cada una incluye su propia puntuación de componente, además de los mismos campos que ya devuelven GET /v1/ip/:ip, /v1/email/:email, /v1/phone/:number y /v1/ua para esa entrada.
curl "https://ipto.to/v1/fraud-score?ip=1.2.3.4&email=test%40mailinator.com"
GET/v1/screenshot

Renderiza una URL en una instancia real de Chrome headless (Cloudflare Browser Rendering, no un proveedor externo de capturas de pantalla) y devuelve un PNG. Los destinos internos/privados (localhost, rangos RFC 1918, direcciones link-local/de metadatos de nube) se rechazan antes incluso de que se llegue a lanzar el navegador. Sujeto a los propios límites a nivel de plataforma de Browser Rendering, que son mucho más estrictos que los del resto de esta API — en los planes de Cloudflare más bajos, es de esperar que esto limite la frecuencia bastante antes de que lo haga tu presupuesto diario habitual de peticiones.

ParameterInDescription
urlqueryObligatorio. Debe ser http o https.
curl "https://ipto.to/v1/screenshot?url=https://example.com" --output screenshot.png
GET/v1/language

Identifica el idioma de un fragmento de texto mediante análisis local de frecuencia de trigramas — sin llamadas a proveedores externos, sin inferencia de modelos de IA, sin registro de datos. Una entrada de menos de 10 caracteres devuelve un idioma null; con menos de ~30 caracteres aún puede devolver una estimación, pero reliable será false.

ParameterInDescription
textqueryObligatorio. Hasta 5.000 caracteres — una entrada más larga se trunca, no se rechaza.
FieldTypeDescription
languageobject|nullcode (ISO 639-1), iso639_3, name y local_name de la mejor coincidencia. null si el texto es demasiado corto o no se reconoce ("und").
reliablebooleanfalse para entradas cortas — trata el resultado como una estimación, no como una coincidencia fiable.
candidatesarrayHasta 5 idiomas alternativos con puntuaciones relativas, para pares de idiomas estrechamente relacionados.
curl "https://ipto.to/v1/language?text=Bonjour%2C+comment+allez-vous%3F"
GET/v1/currency/convert

Convierte un importe entre dos monedas (154 admitidas) usando el mismo feed diario de tipos de cambio de referencia que ya alimenta currency_code/exchange_rate_usd en cada búsqueda de IP, ASN y país — expuesto aquí como un endpoint de conversión independiente en lugar de anidado dentro de una respuesta de geolocalización.

ParameterInDescription
fromqueryObligatorio. Código de moneda ISO 4217 de 3 letras.
toqueryObligatorio. Código de moneda ISO 4217 de 3 letras.
amountqueryOpcional. Por defecto, 1.
FieldTypeDescription
resultnumberImporte convertido.
ratenumberUnidades de to por cada 1 de from.
updatedstringMarca de tiempo ISO de la sincronización de tipos de cambio de referencia que ha usado esta conversión.
curl "https://ipto.to/v1/currency/convert?from=USD&to=EUR&amount=100"
GET/v1/currency/rates

Tabla completa de tipos de cambio (154 monedas) rebasada respecto a cualquier moneda admitida, no solo USD.

ParameterInDescription
basequeryOpcional. Por defecto, USD.
FieldTypeDescription
ratesobjectMapa de código de moneda → tipo respecto a base.
curl "https://ipto.to/v1/currency/rates?base=EUR"
GET/v1/currency/history

Historial diario del tipo de cambio de referencia para un par de monedas, hasta 90 días atrás — los datos que hay detrás del gráfico de tendencia de tipos en la herramienta de conversión de moneda. Se rellena una vez de forma retroactiva y después se añade a diario mediante el mismo cron que actualiza GET /v1/currency/convert. Se trata de un único tipo de cambio de referencia diario a lo largo del tiempo, no un spread de compra/venta de trading.

ParameterInDescription
targetqueryObligatorio. Código de moneda ISO 4217 de 3 letras para graficar.
basequeryOpcional. Por defecto, USD.
daysqueryOpcional. Uno de 30, 60, 90. Por defecto, 30.
FieldTypeDescription
seriesarrayArray de puntos { date, rate } en orden ascendente de fecha.
statsobjectmin, avg, max y current de la serie devuelta.
curl "https://ipto.to/v1/currency/history?base=USD&target=EUR&days=90"
GET/v1/weather

Condiciones actuales — y, con detail=1, una previsión por horas y un pronóstico de varios días — para un nombre de lugar, un código postal o un par "lat,lon", o para lat + lon o una ip. Los lugares de EE. UU. los atiende el National Weather Service y el resto del mundo MET Norway. Añade include= para obtener el documento completo con unidades, hasta 9 días, sol y luna, alertas oficiales y más — consulta la tarjeta include más abajo. La herramienta weather-lookup detecta además automáticamente la ubicación del propio usuario en el navegador antes de llamar a este endpoint de forma explícita.

ParameterInDescription
qqueryNombre de ciudad, código postal o "lat,lon" (máximo 100 caracteres). O pasa lat y lon, o ip, en su lugar. Se requiere uno de los tres.
detailqueryOpcional. "1" añade pressure_mb/visibility_km/dewpoint_c/sunrise/sunset/etc. a weather, además de un objeto forecast (hourly + daily). Se omite por defecto.
FieldTypeDescription
conditionstring|nullBreve descripción en texto.
temp_c / temp_fnumber|nullTemperatura actual.
feels_like_cnumber|nullSensación térmica en grados Celsius.
humidity_pctnumber|nullHumedad relativa.
wind_kmph / wind_dirnumber|null / string|nullVelocidad del viento y dirección en rosa de 16 puntos.
uv_indexnumber|nullÍndice UV.
locationobject|nullNombre, región, país y lat/lon resueltos para el lugar consultado — no solo la entrada tal cual.
forecast.hourly[]arraySolo con detail=1. Próximas 24h en tramos de 3 horas: hour_label, temp_c/temp_f, weather_code, chance_of_rain_pct.
forecast.daily[]arraySolo con detail=1. Pronóstico a 3 días: 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 vivo al sistema Trademark Status & Document Retrieval (TSDR) de la USPTO para el estado de un expediente por número de serie de 8 dígitos — una llamada directa por petición, no una copia almacenada en caché ni revendida. Los datos de estado de expediente son una obra del gobierno de EE. UU. y de dominio público según los propios términos de uso de la USPTO, por lo que cada respuesta incluye un campo source/attribution en lugar de almacenarlos en caché o revenderlos de forma silenciosa. Los datos de logotipo/imagen de la marca quedan deliberadamente fuera de alcance — los términos de la USPTO separan las licencias de imagen de los datos de texto sobre el estado del expediente que devuelve este endpoint. La búsqueda por número de registro aún no es compatible; hoy la USPTO solo documenta la ruta por número de serie. Pruébalo en la herramienta Trademark Lookup.

ParameterInDescription
serialpathObligatorio. Exactamente 8 dígitos, p. ej. 98267877.
FieldTypeDescription
sourcestringSiempre "USPTO TSDR".
attributionstringLínea de atribución obligatoria según los términos de uso de la USPTO.
dataobjectPayload en bruto del estado del expediente tal como lo devuelve la USPTO, retransmitido sin remodelar — verificado en producción el 2026-08-12. Bajo data.trademarks[0]: status (fechas de solicitud/registro, markElement, descOfMark, tm5StatusDesc), parties.ownerGroups (nombre/dirección del titular por rol), gsList[] (descripción de bienes/servicios y clases), y prosecutionHistory[] (línea temporal completa del expediente). La presencia de cada campo varía según el estado de la solicitud — p. ej. una solicitud pendiente aún no tiene usRegistrationNumber.
curl "https://ipto.to/v1/trademark/98267877" # ANTHROPIC, Reg. No. 8296420
GET/v1/patent/:number

Proxy en vivo a la API Patent File Wrapper de la USPTO (Open Data Portal) para el estado de concesión por número de patente de utilidad de 7-8 dígitos — una llamada directa por petición, no una copia almacenada en caché ni revendida. Se confirmó que la fuente originalmente utilizada (la Search API de PatentsView) se cerró el 2026-03-20; esto sirve de proxy a su sucesora en vivo. Los datos de Patent File Wrapper son una obra del gobierno de EE. UU. y de dominio público según los propios términos de uso de la USPTO, por lo que cada respuesta incluye un campo source/attribution. El alcance se centra en la solicitud/tramitación — sin grafo de citas, familia de patentes, campo de estado legal ni imágenes como sí muestran Lens.org, Espacenet o Google Patents. La cobertura empieza en las solicitudes presentadas en 2001. Las patentes de diseño, de planta y las reemisiones aún no son compatibles; solo patentes de utilidad por número de patente concedida. Pruébalo en la herramienta Patent Lookup.

ParameterInDescription
numberpathObligatorio. 7-8 dígitos, p. ej. 12393227. Solo número de patente de utilidad concedida, no un número de solicitud.
FieldTypeDescription
sourcestringSiempre "USPTO Patent File Wrapper".
attributionstringLínea de atribución obligatoria según los términos de uso de la USPTO.
dataobjectPayload en bruto del expediente de tramitación tal como lo devuelve la USPTO, retransmitido sin remodelar — verificado en producción el 2026-08-12 con patentes reales (12393227, 9935534). Campos clave: applicationMetaData (inventionTitle, filingDate, applicationStatusDescriptionText, applicationStatusDate, patentNumber, inventorBag[]), recordAttorney.attorneyBag[], applicationNumberText, y eventDataBag[] (línea temporal completa de la tramitación). Devuelve 404 si el número no existe, es una patente de diseño/planta/reemisión, o es anterior a la cobertura desde 2001.
curl "https://ipto.to/v1/patent/12393227" # WEARABLE COMPUTING DEVICE, granted 2025
GET/v1/feeds

Feed paginado de VPN, Tor e inteligencia de amenazas. 200 entradas por página. Cada entrada incluye IP/CIDR, atribución de proveedor, ISP, país y tipo de clasificación.

ParameterInDescription
pagequeryNúmero de página indexado desde 0. Por defecto: 0.
typequeryFiltra por tipo: VPN, Tor Exit Node, Tor Node, High-Risk Threat Intel.
qqueryFiltra por subcadena de IP o 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

Solo metadatos — recuento total de entradas, recuentos por fuente y hora de la última sincronización. No devuelve datos de 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

Rangos de red abusivos paginados. Puntuados de 1 a 10 mediante corroboración cruzada de feeds. Niveles de riesgo: critical (8-10), high (5-7), medium (3-4).

ParameterInDescription
pagequeryNúmero de página indexado desde 0. Por defecto: 0.
tierqueryFiltra por nivel de riesgo: critical, high, medium.
qqueryFiltra por subcadena de rango de red.
sourcequeryOpcional. Filtra por el nombre del feed de origen exactamente como se devuelve en source_feed, p. ej. 'Spamhaus DROP' o '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

Solo metadatos — recuento total de redes, recuentos por fuente, desglose por nivel de riesgo y hora de la última sincronización.

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

Exportación CSV descargable de los conjuntos de datos abiertos sobre los que ya se construye la API — los mismos datos, sin nueva licencia. asn y ranges están siempre disponibles; geo-city devuelve 503 hasta que el conjunto de datos de esa fuente esté activo en un despliegue concreto. geo-city exporta las filas en bruto de una fuente geográfica cada vez, no una vista combinada — pasa ?source=primary (por defecto) o ?source=secondary.

ParameterInDescription
kindpathUno de: asn, ranges, geo-city.
sourcequerySolo para geo-city. primary (por defecto) o 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

Emite una clave de API al instante — sin correo electrónico, sin registro. Toda clave empieza en el plan Free (1.000 peticiones/día; búsqueda masiva no incluida). Las claves Pro y Enterprise desbloquean límites diarios más altos y búsqueda masiva (hasta 100 IPs/petición) — consulta precios. Guarda la clave — no se podrá recuperar más adelante.

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

Comprueba cuántas peticiones ha hecho una clave. Pasa la clave en cualquier petición /v1/* mediante la cabecera X-API-Key o ?api_key= para que se contabilice.

ParameterInDescription
keyqueryObligatorio. Una clave devuelta por POST /v1/keys.
curl "https://ipto.to/v1/keys/usage?key=ipto_xxxxxxxx"
GET/v1/ip/:ip/abuse

Contacto para denuncias de abuso de la red propietaria de una IP, a partir de RDAP: el RIR, el identificador de la red, el CIDR que la cubre y los buzones de abuso. Sirve para saber a dónde enviar una denuncia.

ParameterInDescription
ippathDirección IPv4 o 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 es false (con un motivo en failure) cuando no se pudo contactar con el registro.

GET/v1/asn/:asn/ranges

Los rangos de IP que un ASN anuncia realmente, paginados, cada uno con su país y los indicadores de alojamiento / móvil / residencial / bot / lista negra.

ParameterInDescription
asnpathNúmero de ASN sin el prefijo AS, p. ej. 15169.
limitqueryRangos por página. Por defecto 50, máximo 200.
offsetqueryRangos que se omiten. Por defecto 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

Registro (RDAP) de un ASN: identificador, nombre, país, tipo de asignación, fechas de registro, el RIR y sus contactos.

ParameterInDescription
asnpathNúmero de ASN sin el prefijo AS, p. ej. 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 es false con un reason cuando el registro no está disponible.

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

Dónde está realmente un ASN: puntos a nivel de ciudad geolocalizados a partir de una muestra de sus rangos más grandes, más las ciudades más frecuentes. Alimenta el mapa de distribución de la página del ASN.

ParameterInDescription
asnpathNúmero de ASN sin el prefijo AS, p. ej. 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":[...]}

Una muestra, no la lista completa de rangos. Use /v1/asn/:asn/ranges para todos los rangos.

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

Dominios alojados en un ASN, hallados mediante DNS inverso (PTR) sobre una muestra de sus direcciones. Cada entrada incluye el dominio raíz, el nombre de host PTR y la IP muestreada.

ParameterInDescription
asnpathNúmero de ASN sin el prefijo AS, p. ej. 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"}, ...]}

Es una muestra, así que orienta sobre lo que aloja el ASN, no es una lista completa. Para una sola IP use /v1/ip/:ip/hosted-domains.

GET/v1/asn/:asn/relationships

Relaciones BGP de un ASN: pares, proveedores upstream y clientes downstream, con sus recuentos.

ParameterInDescription
asnpathNúmero de ASN sin el prefijo AS, p. ej. 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 es false cuando no se pudo contactar con la fuente de datos BGP. Los arrays vacíos con available: true significan que no se informó nada para ese ASN.

GET/v1/ip-ranges

Directorio del espacio IPv4: una entrada por bloque /8 con cuántos rangos, países y ASN contiene y su país principal. Empiece aquí y profundice con /v1/ip-ranges/:a y /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

Los bloques /16 dentro de un /8 (por ejemplo 8.0.0.0/8), con los mismos recuentos de rangos, países y ASN por bloque.

ParameterInDescription
apathPrimer octeto, 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

Los rangos asignados dentro de un /16 (por ejemplo 8.8.0.0/16), cada uno con el ASN al que pertenece, más los recuentos por bloque.

ParameterInDescription
apathPrimer octeto, 0-255.
bpathSegundo octeto, 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

Una porción de la carga de Nearby para una coordenada, para que el cliente muestre cada parte según llega: geocodificación inversa, puntos de interés o estadísticas locales de criminalidad.

ParameterInDescription
latqueryLatitud, obligatorio.
lonqueryLongitud, obligatorio.
partqueryQué porción: geocode, poi o crime. Un valor desconocido devuelve 400.
countryquerySolo part=crime: código de país ISO. Hay datos de criminalidad para US y GB.
regionquerySolo part=crime: nombre del estado o región, p. ej. Utah.
cityquerySolo part=crime: nombre de la ciudad, p. ej. Orem.
langqueryOpcional. Localiza las etiquetas de lugares (mismos códigos que la tabla de localización de arriba).
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

Tiempo y distancia en coche entre dos puntos. Una vía rápida: omite la geocodificación inversa y la búsqueda de puntos de interés que hace /v1/places/:ip.

ParameterInDescription
from_latqueryLatitud de origen, obligatorio.
from_lonqueryLongitud de origen, obligatorio.
dest_latqueryLatitud de destino. Úsela con dest_lon o pase dest_address en su lugar.
dest_lonqueryLongitud de destino.
dest_addressqueryDestino en texto libre, geocodificado por nosotros. Se usa cuando faltan dest_lat/dest_lon.
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}}

Cuando no se puede resolver ningún destino, la respuesta incluye to: null, commute: null y una cadena reason.

GET/v1/address-lookup

La carga de /v1/places/:ip anclada en una dirección escrita en lugar de una IP: geocodificación, localidad y una estimación opcional del trayecto.

ParameterInDescription
qqueryDirección en texto libre, obligatorio.
dest_latqueryLatitud de destino opcional, para incluir una estimación del trayecto (con dest_lon).
dest_lonqueryLongitud de destino opcional.
dest_addressqueryDestino opcional en texto libre, en lugar de dest_lat/dest_lon.
partquerypart=geo devuelve solo la etiqueta y las coordenadas, para un primer pintado más rápido.
langqueryOpcional. Localiza las etiquetas de lugares (mismos códigos que la tabla de localización de arriba).
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 es false cuando no se pudo geocodificar la dirección.

GET/v1/address-suggest

Autocompletado de direcciones: unos pocos lugares que coinciden con una dirección parcial, con preferencia opcional por un punto.

ParameterInDescription
qqueryTexto parcial de la dirección, obligatorio.
near_latqueryLatitud opcional hacia la que orientar los resultados.
near_lonqueryLongitud opcional hacia la que orientar los resultados.
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=

El documento meteorológico completo, para el nombre de un lugar, un código postal, coordenadas o una IP. Elige los bloques que necesites con include: current, hourly, daily, astro (sol y luna), solar, indicators, alerts, marine, air_quality, nowcast o all. Los lugares de EE. UU. proceden del National Weather Service y el resto del mundo de MET Norway; meta.source indica cuál. Sin include recibes el formato simple { query, weather } descrito arriba.

ParameterInDescription
q / lat+lon / ipqueryDónde: q (ciudad, código postal o "lat,lon"), o lat y lon, o ip. Se requiere uno de los tres.
countryqueryOpcional. Código ISO o nombre del país para resolver un q ambiguo, por ejemplo country=FR para el código postal 75001.
includequeryObligatorio para este formato. Separados por comas: current, hourly, daily, astro, solar, indicators, alerts, marine, air_quality, nowcast o all.
unitsquerymetric (por defecto) o imperial. Los nombres de los campos siguen la unidad: temp_c pasa a temp_f, wind_kmph a wind_mph y precip_mm a precip_in.
wind_unitquerykmh, ms, mph o kn. Solo cambia la unidad del viento.
hoursqueryEntradas horarias a devolver, 1-240. Por defecto 48. Las primeras son horarias y las posteriores cada 6 horas; step_hours lo indica.
daysqueryEntradas diarias a devolver, 1-9. Por defecto 7. Los datos de EE. UU. cubren 7 días.
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 indica qué campos existen para el lugar: la probabilidad de lluvia, las ráfagas y la probabilidad de tormenta solo existen en EE. UU. y los países nórdicos, y valen null (nunca cero) en el resto. alerts son avisos oficiales de EE. UU. y Noruega; marine, air_quality y nowcast solo cubren Noruega y aguas cercanas e indican available: false en otros lugares. Todo lo que aparece en meta.derived es una estimación de ipto.to, e indicators son señales derivadas, no avisos oficiales. Conserva meta.attribution si muestras los datos (los datos de MET Norway son CC BY 4.0).

GET/v1/weather/history

El registro diario propio de ipto.to para lugares ya consultados: la máxima más alta, la mínima más baja y la mayor precipitación vistas en las instantáneas de previsión del día. Solo los lugares ya solicitados tienen datos, que se acumulan con el tiempo.

ParameterInDescription
q / lat+lon / ipqueryDónde: q (ciudad, código postal o "lat,lon"), o lat y lon, o ip. Se requiere uno de los tres.
daysqueryDías recientes a devolver, 1-400. Por defecto 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."}

Son instantáneas de previsión, no observaciones de estaciones ni reanálisis, así que no las uses como historial observado. 404 significa que aún no se ha registrado ninguna instantánea para ese lugar.

GET/v1/weather/radar/frames

Los fotogramas de animación de radar disponibles, del más antiguo al más reciente, cada uno con una marca de tiempo Unix y el id de fotograma que se usa en la URL del tile de 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

Un tile de mapa de radar (PNG) para un fotograma, en una posición z/x/y estándar de mapa web. Se sirve desde el mismo origen para que un mapa lo cargue sin una petición a terceros.

ParameterInDescription
framepathId de fotograma de /v1/weather/radar/frames (hexadecimal en minúsculas).
zpathNivel de zoom.
xpathColumna del tile.
ypathFila del tile.
# 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

Un tile de mapa de imágenes de satélite para una posición z/x/y estándar de mapa web, servido desde el mismo origen.

ParameterInDescription
zpathNivel de zoom.
xpathColumna del tile.
ypathFila del tile.
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

Contrato OpenAPI 3.1 legible por máquinas para /v1/email/:email, escrito para que los agentes LLM y MCP llamen al endpoint de correo sin leer esta documentación.

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

Referencia de campos de búsqueda de IP

FieldTypeDescription
ipstringLa dirección IP consultada.
versionstring"v4" o "v6".
bogonbooleantrue si se trata de una dirección privada, reservada o no enrutable.
bogon_typestring|nullCódigo de motivo si bogon: "loopback", "private", "link-local", "multicast", "reserved", "documentation", "unspecified".
asninteger|nullNúmero de Sistema Autónomo que anuncia esta IP.
asn_namestring|nullNombre corto del ASN (p. ej. "GOOGLE").
asn_orgstring|nullOrganización registrada del ASN (p. ej. "Google LLC").
asn_typestring|nullCategoría del ASN: "hosting", "isp", "business", "education", "government", "mobile", "residential".
continentstring|nullNombre completo del continente (p. ej. "North America").
continent_codestring|nullCódigo de continente de dos letras: AF AS EU NA SA OC AN.
country_codestring|nullCódigo de país ISO 3166-1 alfa-2 (p. ej. "US") del país en el que se encuentra la IP, según los mismos datos de geolocalización que la ciudad y las coordenadas. Si no hay coincidencia de geolocalización, se usa el país de registro del ASN (asn_country_code). De él se derivan el nombre del país, la bandera, la moneda, etc.
country_namestring|nullNombre completo del país en inglés (p. ej. "United States").
country_flagstring|nullEmoji de bandera del país (p. ej. "🇺🇸").
is_eubooleantrue si el país es un estado miembro de la UE (27 miembros).
citystring|nullNombre de la ciudad. Se rellena en la autobúsqueda, y en búsquedas explícitas donde alguna de las fuentes geográficas combinadas (IP2Location o MaxMind) tiene coincidencia — comprueba geo_precision.
statestring|nullRegión/subdivisión administrativa. Misma disponibilidad que city.
postal_codestring|nullCódigo postal. Se rellena en la autobúsqueda, y en búsquedas explícitas donde IP2Location (preferida) o MaxMind tiene coincidencia — misma disponibilidad que city.
latitudenumber|nullLatitud decimal. Misma disponibilidad que city.
longitudenumber|nullLongitud decimal. Misma disponibilidad que city.
timezonestring|nullZona horaria — misma disponibilidad que city. Un identificador IANA (p. ej. "America/New_York") en la autobúsqueda. En búsquedas explícitas, el formato depende de qué fuente ha coincidido: una cadena de desfase UTC como "-08:00" de IP2Location, o un nombre IANA de MaxMind.
geo_precisionstringCuán precisos son los datos de ubicación: "city", "country" (la búsqueda a nivel de ciudad no tuvo coincidencia) o "none".
geo_country_codestring|nullPaís en el que se encuentra la IP, según los datos de geolocalización (ISO 3166-1 alfa-2). Es igual a country_code siempre que esté definido. null si no hay coincidencia de geolocalización.
asn_country_codestring|nullPaís de registro del titular del ASN (ISO 3166-1 alfa-2). Puede diferir de country_code en redes CDN, VPN, de alojamiento o anycast anunciadas desde un país distinto de aquel en el que está registrado el titular. null si la IP no tiene entrada ASN.
currency_codestring|nullCódigo de moneda ISO 4217 del país (p. ej. "USD").
exchange_rate_usdnumber|nullUnidades de moneda local por cada 1 USD, procedentes de un feed de tipos de cambio de referencia sincronizado a diario que cubre 154 monedas. null para monedas fuera de ese conjunto.
calling_codestring|nullCódigo de llamada del país, incluido el prefijo + (p. ej. "+1").
languagesstring[]Idiomas oficiales/reconocidos del país, en inglés.
tldstring[]Dominio(s) de nivel superior del código de país, p. ej. [".us"].
capitalstring|nullNombre de la ciudad capital.
bordersstring[]Códigos ISO alfa-2 de los países fronterizos.
is_datacenterbooleantrue si la IP pertenece a un proveedor de hosting o de nube.
is_mobilebooleantrue si la IP está registrada a un operador móvil.
is_residentialbooleantrue si la IP está clasificada como banda ancha residencial.
connection_typestring"mobile", "datacenter" o "unknown" — derivado de la misma clasificación que is_mobile/is_datacenter. Deliberadamente no intenta distinguir entre residencial y corporativo: eso no se puede derivar de forma fiable solo a partir del texto del nombre de organización del ASN, así que un ASN que no se clasifica con confianza como mobile o datacenter se queda en "unknown" en lugar de adivinarse.
is_botbooleantrue si la IP está asociada a infraestructura de bots conocida.
is_proxybooleantrue si la IP es un punto de salida de proxy conocido.
is_vpnbooleantrue si la IP está dentro de un rango de servidor VPN conocido del feed de amenazas.
is_torbooleantrue si la IP es un nodo de salida de Tor confirmado.
is_abuserbooleantrue si la IP está dentro de un rango de red señalado por varios feeds de inteligencia de abuso.
abuse_scoreinteger|nullPuntuación de gravedad de 1 a 10 cuando is_abuser es true, obtenida por corroboración cruzada de feeds. null en caso contrario.
risk_tierstring|null"critical" (8-10), "high" (5-7) o "medium" (3-4) — derivado de abuse_score. null si no está señalada.
threat_typestring|nullLa única categoría coincidente más procesable cuando is_tor/is_vpn/is_abuser se solapan: "tor_exit" > "abuser" > "vpn". null si ninguna coincide.
flagsobjectObjeto retrocompatible que refleja los campos is_*. Claves: hosting, mobile, residential, bot, blacklisted, vpn, tor, abuser.
meta.data_versionstringFecha del conjunto de datos usado para la búsqueda (YYYY-MM-DD). "cf-edge" para autobúsqueda. "bogon" para rangos privados.
meta.cachedbooleantrue si la respuesta se ha servido desde la capa de caché.
meta.langstringEl idioma realmente utilizado en esta respuesta — coincide con ?lang= cuando se proporciona, o con el valor resuelto a partir de Accept-Language, o con "en".
meta.lang_source"param"|"header"|"default"Cómo se determinó lang: "param" (se pasó ?lang=), "header" (resuelto a partir de Accept-Language), o "default" (no se proporcionó ninguno de los dos).

Formatos de salida

Las búsquedas de IP, ASN y país admiten todas ?format=.

FormatContent-TypeUsage
jsonapplication/jsonPor defecto. Respuesta estructurada completa.
csvtext/csvPares clave,valor planos. Se omiten los objetos anidados.
texttext/plainLíneas key: value. Un campo por línea.
xmlapplication/xmlEstructura anidada completa, los arrays repiten la etiqueta.
yamlapplication/x-yamlEstructura anidada completa.
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"

Localización

Pasa ?lang= en /v1/ip, /v1/asn/:asn o /v1/country/:code para localizar country_name y continent. Todo lo demás (nombres de organización del ASN, nombres de ciudad, códigos de moneda) permanece en su forma original — son identificadores y nombres propios, no texto de interfaz. Los códigos no admitidos recurren al inglés en lugar de dar un error.

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

¿Sin ?lang=? Envía en su lugar una cabecera Accept-Language — los mismos endpoints también la leen, así que un simple curl -H "Accept-Language: es" https://ipto.to/v1/ip/8.8.8.8 localiza la respuesta sin necesidad de query string. Un ?lang= explícito siempre tiene prioridad cuando ambos están presentes. Nota: la variable de entorno del shell LANG/LC_ALL (p. ej. LANG=es_ES.UTF-8 curl ...) solo configura el locale del propio curl — curl nunca la lee ni la convierte en una cabecera, así que no tiene ningún efecto en el idioma de la respuesta. Accept-Language o ?lang= son las dos únicas formas que realmente funcionan.

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

Cada respuesta de /v1/ip, /v1/asn/:asn y /v1/country/:code incluye lang y lang_source (anidado dentro de meta en /v1/ip; en el nivel superior en los otros dos), para que siempre sepas exactamente qué idioma se aplicó y cómo se eligió — "param", "header" o "default" — sin tener que adivinarlo a partir de la solicitud que enviaste.

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 localización completa de claves y valores es el comportamiento predeterminado en cuanto defines un lang distinto del inglés — cada campo, incluidas las claves anidadas flags y meta, vuelve renombrado al idioma de destino, y los valores fijos de enumeración (risk_tier, threat_type, connection_type, geo_precision, bogon_type, asn_type) también se traducen. ¿Necesitas el formato antiguo con claves en inglés? Añade &localize=0 a /v1/ip para desactivarlo.

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

Ejemplos de código

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)

Límites de peticiones

Los límites se aplican por día (UTC), contabilizados por dirección IP en el plan gratuito o por clave en Pro/Enterprise. Superar tu límite devuelve HTTP 429 con una cabecera Retry-After. Para cargas de trabajo en producción, consulta precios.

Se aplica a todos los endpoints /v1/*, al servidor /mcp y a los atajos curl ipto.to / curl ipto.to/:ip. GET /ip es la única excepción — un simple eco de cabecera sin coste de búsqueda, por lo que no consume ningún presupuesto.

TierRequests / dayAuth
Free1,000Ninguna
Pro100,000Clave de API (cabecera)
EnterpriseUnlimitedClave de API + endpoints dedicados

Códigos de error

StatusMeaning
200OK. La respuesta incluye los datos.
202Los datos del feed se están sincronizando. Reinténtalo en 45 segundos.
400Petición incorrecta. IP, ASN o código de país no válidos.
404ASN o país no encontrados en el conjunto de datos.
503Conjunto de datos aún no disponible. Es posible que la ingesta inicial esté en curso.