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
Inicio rápido
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.
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.
Para clientes que solo admiten stdio, haz de puente con: npx mcp-remote https://ipto.to/mcp
Endpoints
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.
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.
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.
| Parameter | In | Description |
|---|---|---|
ip | path | Obligatorio. Cualquier dirección IPv4 o IPv6 válida. |
lang | query | Opcional. Localiza country_name y continent: en (por defecto), pt, fr, de, zh-TW, ko, zh-CN, ja-JP, es-ES, ar-SA, hi-IN. |
fields | query | Opcional. Lista de campos a incluir, separados por comas. P. ej. ?fields=ip,country_code,is_vpn |
format | query | Opcional. Formato de la respuesta: json (por defecto), csv, text, xml, yaml. |
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.
| Parameter | In | Description |
|---|---|---|
query | path | Obligatorio. Una IP, un ASN, un código de país, un correo electrónico o un número de teléfono. |
| Field | Type | Description |
|---|---|---|
query | string | La entrada decodificada tal como se recibió. |
detected_type | string | "ip", "asn", "country", "email" o "phone". |
ip | object|null | Presente cuando detected_type es "ip" — misma estructura que GET /v1/ip/:ip. |
rpki | object|null | Presente en consultas de IP — misma estructura que GET /v1/ip/:ip/rpki. |
company | object|null | Presente en consultas de IP — misma estructura que GET /v1/ip/:ip/company. |
whois | object|null | Presente en consultas de IP — misma estructura que GET /v1/ip/:ip/whois. |
carrier | object|null | Presente en consultas de IP — misma estructura que GET /v1/ip/:ip/carrier. |
asn / country / email / phone | object|null | Presente 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.
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.
| Parameter | In | Description |
|---|---|---|
ip | path | Obligatorio. Cualquier dirección IPv4 o IPv6 válida. |
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.
| Parameter | In | Description |
|---|---|---|
ip | path | Obligatorio. Cualquier dirección IPv4 o IPv6 válida. |
| Field | Type | Description |
|---|---|---|
asn | integer|null | El ASN que anuncia actualmente la ruta, resuelto en vivo — no derivado del propio conjunto de datos de ASN de este sitio. |
prefix | string|null | El prefijo CIDR anunciado actualmente. |
status | string | "valid", "invalid" o "unknown". |
validating_roas | array | El/los ROA concretos que ha encontrado RIPEstat, cada uno con origin/prefix/max_length/validity. |
validator | string|null | Qué validador RPKI ha usado RIPEstat (p. ej. "routinator"). |
reason | string|null | Explica un resultado "unknown" — p. ej. no existe ningún ROA que lo cubra, o RIPEstat no estaba disponible. |
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.
| Parameter | In | Description |
|---|---|---|
asn | query | Obligatorio. Número de ASN, con o sin el prefijo AS. P. ej. 15169 o AS15169. |
prefix | query | Obligatorio. Prefijo CIDR, p. ej. 8.8.8.0/24. |
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.
| Parameter | In | Description |
|---|---|---|
ip | path | Obligatorio. Cualquier dirección IPv4 o IPv6 válida. |
| Field | Type | Description |
|---|---|---|
company_name | string|null | El 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_name | string|null | El nombre del titular según RDAP, independiente de company_name. |
asn_org_name | string|null | El nombre de organización propio del ASN, independiente de company_name. |
confidence | string | "high" (las fuentes coinciden), "medium" (solo hay una fuente disponible), "low" (las fuentes no coinciden — se muestran ambas) o "none". |
reason | string | Explicación en lenguaje sencillo del nivel de confianza. |
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.
| Parameter | In | Description |
|---|---|---|
ip | path | Obligatorio. Cualquier dirección IPv4 o IPv6 válida. |
| Field | Type | Description |
|---|---|---|
available | boolean | false si no se ha podido resolver ningún registro RDAP — consulta reason. |
reason | string|null | Explica un resultado available: false. |
startAddress / endAddress / cidr | string|null | El bloque de red registrado. |
netName / netHandle / parentHandle | string|null | Identificadores asignados por el RIR para el objeto de red. |
country | string|null | País del titular, según RDAP. |
allocationType | string|null | p. ej. "direct allocation", "reassigned". |
registeredDate / lastChangedDate | string|null | Marcas de tiempo ISO del registro RDAP. |
rir | string|null | Qué registro regional (ARIN, RIPE, APNIC, LACNIC, AFRINIC) ha servido el registro. |
contacts | array | Todos los contactos que RDAP tiene archivados, cada uno con roles, name, email y handle — no solo la primera coincidencia. |
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.
| Parameter | In | Description |
|---|---|---|
ip | path | Obligatorio. Cualquier dirección IPv4 o IPv6 válida. |
| Field | Type | Description |
|---|---|---|
is_mobile_network | boolean | false detiene el proceso aquí con un directorio vacío — no se aventura ninguna suposición para un ASN no móvil. |
asn_organization | string|null | El nombre de organización propio del ASN. |
matched_carrier_entries | array | Filas del directorio MCC/MNC cuyo nombre de operador coincide de forma aproximada con asn_organization, limitadas al propio país de la IP. |
note | string | Explica lo que este campo puede y no puede afirmar. |
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.
| Parameter | In | Description |
|---|---|---|
ip | path | Obligatorio. Cualquier dirección IPv4 o IPv6 válida. |
| Field | Type | Description |
|---|---|---|
ptr_hostname | string|null | El nombre de host de DNS inverso de la IP, o null si no tiene registro PTR. |
root_domain | string|null | El dominio registrable derivado de ptr_hostname. |
subdomains_seen | array|null | Subdominios 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. |
limitations | string | Explica qué no puede detectar esta función por su propia naturaleza (sin PTR, hosting compartido, dominios sin certificado). |
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.
| Parameter | In | Description |
|---|---|---|
body | body (JSON) | Array JSON de cadenas de IP. P. ej. ["1.1.1.1","8.8.8.8"] |
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).
| Parameter | In | Description |
|---|---|---|
asn | path | Número de ASN sin el prefijo AS. P. ej. 15169 para Google. |
lang | query | Opcional. Localiza country_name y continent: en (por defecto), pt, fr, de, zh-TW, ko, zh-CN, ja-JP, es-ES, ar-SA, hi-IN. |
format | query | Opcional. Formato de la respuesta: json (por defecto), csv, text, xml, yaml. |
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.
| Parameter | In | Description |
|---|---|---|
ip | path | Obligatorio. Cualquier dirección IPv4 válida. IPv6 aún no es compatible. |
dest_lat | query | Opcional. Latitud de destino para una estimación de trayecto — combínalo con dest_lon. |
dest_lon | query | Opcional. Longitud de destino para una estimación de trayecto — combínalo con dest_lat. |
dest_address | query | Opcional. 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. |
| Field | Type | Description |
|---|---|---|
geocode | object|null | country, 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 / .transit | array | Hasta 4 entradas más cercanas por categoría, cada una con name y distanceMeters. |
locality.notable | array | Lugares emblemáticos cercanos destacados, con una breve descripción, a través de Wikidata. |
locality.usCrime | object|null | Totales 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.ukCrime | object|null | Resumen de incidentes a nivel de calle en un radio de 1 milla — solo Reino Unido. |
locality.caCrime | null | Siempre null — no hay ninguna fuente de criminalidad a nivel de Canadá integrada (consulta docs/places.md). |
commute | object|null | durationMinutes y distanceKm, solo cuando se ha proporcionado un destino y OpenRouteService ha devuelto una ruta. null en caso contrario — nunca se calcula especulativamente. |
Estadísticas agregadas a nivel de país, más datos de referencia regionales (moneda, tipo de cambio, idiomas, TLD, capital, fronteras).
| Parameter | In | Description |
|---|---|---|
code | path | Código de país ISO 3166-1 alfa-2. P. ej. US, DE, JP. |
lang | query | Opcional. Localiza country_name y continent: en (por defecto), pt, fr, de, zh-TW, ko, zh-CN, ja-JP, es-ES, ar-SA, hi-IN. |
format | query | Opcional. Formato de la respuesta: json (por defecto), csv, text, xml, yaml. |
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=.
| Parameter | In | Description |
|---|---|---|
ua | query | Opcional. Cadena de User-Agent codificada en URL para analizar. Por defecto usa la cabecera User-Agent de la petición. |
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.
| Parameter | In | Description |
|---|---|---|
number | path | Obligatorio. Cualquier número de teléfono, idealmente en formato E.164 (p. ej. +14155552671). Codifica en URL el signo + inicial. |
country | query | Opcional. Pista de código de país de 2 letras para analizar números en formato nacional ambiguos, p. ej. ?country=US. |
mode | query | Opcional. ?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. |
| Field | Type | Description |
|---|---|---|
valid | boolean | true si el número coincide con un patrón de plan de numeración válido para su región. |
country_code | string|null | Región ISO 3166-1 alfa-2 a la que pertenece el número. |
national_format | string|null | Formateado según la propia convención nacional de la región. |
international_format | string|null | Formateado con código de país y espaciado, p. ej. "+1 415 555 2671". |
e164 | string|null | Forma canónica E.164, p. ej. "+14155552671". |
line_type | string|null | FIXED_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. |
source | string | "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_type | string|null | Una 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. |
carrier | string|null | El nombre del operador de red actual del número. null cuando source es "local". |
original_carrier | string|null | El 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_ported | boolean|null | true si el número se ha portado fuera de su operador original. null cuando source es "local". |
phone_region | string|null | Detalle 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_prefix | string|null | El código de llamada del número sin el "+" inicial (p. ej. "49" para Alemania). null cuando source es "local". |
country_name | string|null | Nombre 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. |
lang | string | El 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_source | string | "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. |
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.
| Parameter | In | Description |
|---|---|---|
body | body (JSON) | Array JSON de cadenas de números de teléfono. |
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.
| Parameter | In | Description |
|---|---|---|
country | query | Obligatorio. Código de país de 2 letras, p. ej. ?country=US. |
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).
| Parameter | In | Description |
|---|---|---|
email | path | Obligatorio. Cualquier dirección de correo electrónico, codificada en URL (el @ debe codificarse como %40). |
| Field | Type | Description |
|---|---|---|
valid_syntax | boolean | true si la dirección coincide con un patrón de sintaxis de correo estándar. No verifica que el buzón exista. |
domain | string|null | La parte del dominio, en minúsculas. null si valid_syntax es false. |
has_mx | boolean|null | true 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. |
disposable | boolean|null | true 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_reachable | string|null | El 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_all | boolean|null | true 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_full | boolean|null | true 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_account | boolean|null | true 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_disabled | boolean|null | true si la verificación en vivo encontró el buzón explícitamente deshabilitado. null cuando la verificación en vivo no se ejecutó. |
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.
| Parameter | In | Description |
|---|---|---|
ip | query | Opcional. 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). |
email | query | Opcional. Cualquier dirección de correo electrónico. |
phone | query | Opcional. Cualquier número de teléfono. |
ua | query | Opcional. Por defecto, tu propia cabecera User-Agent. |
| Field | Type | Description |
|---|---|---|
score | integer | Compuesto ponderado de 0 a 100 entre las señales que se hayan proporcionado. |
risk_tier | string | "low" (<20), "medium" (20-44), "high" (45-69) o "critical" (70+). |
signals | object | Desglose 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. |
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.
| Parameter | In | Description |
|---|---|---|
url | query | Obligatorio. Debe ser http o https. |
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.
| Parameter | In | Description |
|---|---|---|
text | query | Obligatorio. Hasta 5.000 caracteres — una entrada más larga se trunca, no se rechaza. |
| Field | Type | Description |
|---|---|---|
language | object|null | code (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"). |
reliable | boolean | false para entradas cortas — trata el resultado como una estimación, no como una coincidencia fiable. |
candidates | array | Hasta 5 idiomas alternativos con puntuaciones relativas, para pares de idiomas estrechamente relacionados. |
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.
| Parameter | In | Description |
|---|---|---|
from | query | Obligatorio. Código de moneda ISO 4217 de 3 letras. |
to | query | Obligatorio. Código de moneda ISO 4217 de 3 letras. |
amount | query | Opcional. Por defecto, 1. |
| Field | Type | Description |
|---|---|---|
result | number | Importe convertido. |
rate | number | Unidades de to por cada 1 de from. |
updated | string | Marca de tiempo ISO de la sincronización de tipos de cambio de referencia que ha usado esta conversión. |
Tabla completa de tipos de cambio (154 monedas) rebasada respecto a cualquier moneda admitida, no solo USD.
| Parameter | In | Description |
|---|---|---|
base | query | Opcional. Por defecto, USD. |
| Field | Type | Description |
|---|---|---|
rates | object | Mapa de código de moneda → tipo respecto a base. |
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.
| Parameter | In | Description |
|---|---|---|
target | query | Obligatorio. Código de moneda ISO 4217 de 3 letras para graficar. |
base | query | Opcional. Por defecto, USD. |
days | query | Opcional. Uno de 30, 60, 90. Por defecto, 30. |
| Field | Type | Description |
|---|---|---|
series | array | Array de puntos { date, rate } en orden ascendente de fecha. |
stats | object | min, avg, max y current de la serie devuelta. |
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.
| Parameter | In | Description |
|---|---|---|
q | query | Nombre 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. |
detail | query | Opcional. "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. |
| Field | Type | Description |
|---|---|---|
condition | string|null | Breve descripción en texto. |
temp_c / temp_f | number|null | Temperatura actual. |
feels_like_c | number|null | Sensación térmica en grados Celsius. |
humidity_pct | number|null | Humedad relativa. |
wind_kmph / wind_dir | number|null / string|null | Velocidad del viento y dirección en rosa de 16 puntos. |
uv_index | number|null | Índice UV. |
location | object|null | Nombre, región, país y lat/lon resueltos para el lugar consultado — no solo la entrada tal cual. |
forecast.hourly[] | array | Solo 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[] | array | Solo 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. |
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.
| Parameter | In | Description |
|---|---|---|
serial | path | Obligatorio. Exactamente 8 dígitos, p. ej. 98267877. |
| Field | Type | Description |
|---|---|---|
source | string | Siempre "USPTO TSDR". |
attribution | string | Línea de atribución obligatoria según los términos de uso de la USPTO. |
data | object | Payload 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. |
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.
| Parameter | In | Description |
|---|---|---|
number | path | Obligatorio. 7-8 dígitos, p. ej. 12393227. Solo número de patente de utilidad concedida, no un número de solicitud. |
| Field | Type | Description |
|---|---|---|
source | string | Siempre "USPTO Patent File Wrapper". |
attribution | string | Línea de atribución obligatoria según los términos de uso de la USPTO. |
data | object | Payload 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. |
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.
| Parameter | In | Description |
|---|---|---|
page | query | Número de página indexado desde 0. Por defecto: 0. |
type | query | Filtra por tipo: VPN, Tor Exit Node, Tor Node, High-Risk Threat Intel. |
q | query | Filtra por subcadena de IP o CIDR. |
Solo metadatos — recuento total de entradas, recuentos por fuente y hora de la última sincronización. No devuelve datos de IP.
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).
| Parameter | In | Description |
|---|---|---|
page | query | Número de página indexado desde 0. Por defecto: 0. |
tier | query | Filtra por nivel de riesgo: critical, high, medium. |
q | query | Filtra por subcadena de rango de red. |
source | query | Opcional. Filtra por el nombre del feed de origen exactamente como se devuelve en source_feed, p. ej. 'Spamhaus DROP' o 'IPsum Threat Intel'. |
Solo metadatos — recuento total de redes, recuentos por fuente, desglose por nivel de riesgo y hora de la última sincronización.
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.
| Parameter | In | Description |
|---|---|---|
kind | path | Uno de: asn, ranges, geo-city. |
source | query | Solo para geo-city. primary (por defecto) o secondary. |
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.
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.
| Parameter | In | Description |
|---|---|---|
key | query | Obligatorio. Una clave devuelta por POST /v1/keys. |
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.
| Parameter | In | Description |
|---|---|---|
ip | path | Dirección IPv4 o IPv6. |
available es false (con un motivo en failure) cuando no se pudo contactar con el registro.
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.
| Parameter | In | Description |
|---|---|---|
asn | path | Número de ASN sin el prefijo AS, p. ej. 15169. |
limit | query | Rangos por página. Por defecto 50, máximo 200. |
offset | query | Rangos que se omiten. Por defecto 0. |
Registro (RDAP) de un ASN: identificador, nombre, país, tipo de asignación, fechas de registro, el RIR y sus contactos.
| Parameter | In | Description |
|---|---|---|
asn | path | Número de ASN sin el prefijo AS, p. ej. 15169. |
available es false con un reason cuando el registro no está disponible.
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.
| Parameter | In | Description |
|---|---|---|
asn | path | Número de ASN sin el prefijo AS, p. ej. 15169. |
Una muestra, no la lista completa de rangos. Use /v1/asn/:asn/ranges para todos los rangos.
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.
| Parameter | In | Description |
|---|---|---|
asn | path | Número de ASN sin el prefijo AS, p. ej. 15169. |
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.
Relaciones BGP de un ASN: pares, proveedores upstream y clientes downstream, con sus recuentos.
| Parameter | In | Description |
|---|---|---|
asn | path | Número de ASN sin el prefijo AS, p. ej. 15169. |
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.
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.
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.
| Parameter | In | Description |
|---|---|---|
a | path | Primer octeto, 0-255. |
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.
| Parameter | In | Description |
|---|---|---|
a | path | Primer octeto, 0-255. |
b | path | Segundo octeto, 0-255. |
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.
| Parameter | In | Description |
|---|---|---|
lat | query | Latitud, obligatorio. |
lon | query | Longitud, obligatorio. |
part | query | Qué porción: geocode, poi o crime. Un valor desconocido devuelve 400. |
country | query | Solo part=crime: código de país ISO. Hay datos de criminalidad para US y GB. |
region | query | Solo part=crime: nombre del estado o región, p. ej. Utah. |
city | query | Solo part=crime: nombre de la ciudad, p. ej. Orem. |
lang | query | Opcional. Localiza las etiquetas de lugares (mismos códigos que la tabla de localización de arriba). |
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.
| Parameter | In | Description |
|---|---|---|
from_lat | query | Latitud de origen, obligatorio. |
from_lon | query | Longitud de origen, obligatorio. |
dest_lat | query | Latitud de destino. Úsela con dest_lon o pase dest_address en su lugar. |
dest_lon | query | Longitud de destino. |
dest_address | query | Destino en texto libre, geocodificado por nosotros. Se usa cuando faltan dest_lat/dest_lon. |
Cuando no se puede resolver ningún destino, la respuesta incluye to: null, commute: null y una cadena reason.
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.
| Parameter | In | Description |
|---|---|---|
q | query | Dirección en texto libre, obligatorio. |
dest_lat | query | Latitud de destino opcional, para incluir una estimación del trayecto (con dest_lon). |
dest_lon | query | Longitud de destino opcional. |
dest_address | query | Destino opcional en texto libre, en lugar de dest_lat/dest_lon. |
part | query | part=geo devuelve solo la etiqueta y las coordenadas, para un primer pintado más rápido. |
lang | query | Opcional. Localiza las etiquetas de lugares (mismos códigos que la tabla de localización de arriba). |
found es false cuando no se pudo geocodificar la dirección.
Autocompletado de direcciones: unos pocos lugares que coinciden con una dirección parcial, con preferencia opcional por un punto.
| Parameter | In | Description |
|---|---|---|
q | query | Texto parcial de la dirección, obligatorio. |
near_lat | query | Latitud opcional hacia la que orientar los resultados. |
near_lon | query | Longitud opcional hacia la que orientar los resultados. |
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.
| Parameter | In | Description |
|---|---|---|
q / lat+lon / ip | query | Dónde: q (ciudad, código postal o "lat,lon"), o lat y lon, o ip. Se requiere uno de los tres. |
country | query | Opcional. Código ISO o nombre del país para resolver un q ambiguo, por ejemplo country=FR para el código postal 75001. |
include | query | Obligatorio para este formato. Separados por comas: current, hourly, daily, astro, solar, indicators, alerts, marine, air_quality, nowcast o all. |
units | query | metric (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_unit | query | kmh, ms, mph o kn. Solo cambia la unidad del viento. |
hours | query | Entradas horarias a devolver, 1-240. Por defecto 48. Las primeras son horarias y las posteriores cada 6 horas; step_hours lo indica. |
days | query | Entradas diarias a devolver, 1-9. Por defecto 7. Los datos de EE. UU. cubren 7 días. |
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).
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.
| Parameter | In | Description |
|---|---|---|
q / lat+lon / ip | query | Dónde: q (ciudad, código postal o "lat,lon"), o lat y lon, o ip. Se requiere uno de los tres. |
days | query | Días recientes a devolver, 1-400. Por defecto 30. |
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.
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.
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.
| Parameter | In | Description |
|---|---|---|
frame | path | Id de fotograma de /v1/weather/radar/frames (hexadecimal en minúsculas). |
z | path | Nivel de zoom. |
x | path | Columna del tile. |
y | path | Fila del tile. |
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.
| Parameter | In | Description |
|---|---|---|
z | path | Nivel de zoom. |
x | path | Columna del tile. |
y | path | Fila del tile. |
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.
Referencia de campos de búsqueda de IP
| Field | Type | Description |
|---|---|---|
ip | string | La dirección IP consultada. |
version | string | "v4" o "v6". |
bogon | boolean | true si se trata de una dirección privada, reservada o no enrutable. |
bogon_type | string|null | Código de motivo si bogon: "loopback", "private", "link-local", "multicast", "reserved", "documentation", "unspecified". |
asn | integer|null | Número de Sistema Autónomo que anuncia esta IP. |
asn_name | string|null | Nombre corto del ASN (p. ej. "GOOGLE"). |
asn_org | string|null | Organización registrada del ASN (p. ej. "Google LLC"). |
asn_type | string|null | Categoría del ASN: "hosting", "isp", "business", "education", "government", "mobile", "residential". |
continent | string|null | Nombre completo del continente (p. ej. "North America"). |
continent_code | string|null | Código de continente de dos letras: AF AS EU NA SA OC AN. |
country_code | string|null | Có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_name | string|null | Nombre completo del país en inglés (p. ej. "United States"). |
country_flag | string|null | Emoji de bandera del país (p. ej. "🇺🇸"). |
is_eu | boolean | true si el país es un estado miembro de la UE (27 miembros). |
city | string|null | Nombre 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. |
state | string|null | Región/subdivisión administrativa. Misma disponibilidad que city. |
postal_code | string|null | Có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. |
latitude | number|null | Latitud decimal. Misma disponibilidad que city. |
longitude | number|null | Longitud decimal. Misma disponibilidad que city. |
timezone | string|null | Zona 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_precision | string | Cuán precisos son los datos de ubicación: "city", "country" (la búsqueda a nivel de ciudad no tuvo coincidencia) o "none". |
geo_country_code | string|null | Paí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_code | string|null | Paí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_code | string|null | Código de moneda ISO 4217 del país (p. ej. "USD"). |
exchange_rate_usd | number|null | Unidades 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_code | string|null | Código de llamada del país, incluido el prefijo + (p. ej. "+1"). |
languages | string[] | Idiomas oficiales/reconocidos del país, en inglés. |
tld | string[] | Dominio(s) de nivel superior del código de país, p. ej. [".us"]. |
capital | string|null | Nombre de la ciudad capital. |
borders | string[] | Códigos ISO alfa-2 de los países fronterizos. |
is_datacenter | boolean | true si la IP pertenece a un proveedor de hosting o de nube. |
is_mobile | boolean | true si la IP está registrada a un operador móvil. |
is_residential | boolean | true si la IP está clasificada como banda ancha residencial. |
connection_type | string | "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_bot | boolean | true si la IP está asociada a infraestructura de bots conocida. |
is_proxy | boolean | true si la IP es un punto de salida de proxy conocido. |
is_vpn | boolean | true si la IP está dentro de un rango de servidor VPN conocido del feed de amenazas. |
is_tor | boolean | true si la IP es un nodo de salida de Tor confirmado. |
is_abuser | boolean | true si la IP está dentro de un rango de red señalado por varios feeds de inteligencia de abuso. |
abuse_score | integer|null | Puntuación de gravedad de 1 a 10 cuando is_abuser es true, obtenida por corroboración cruzada de feeds. null en caso contrario. |
risk_tier | string|null | "critical" (8-10), "high" (5-7) o "medium" (3-4) — derivado de abuse_score. null si no está señalada. |
threat_type | string|null | La única categoría coincidente más procesable cuando is_tor/is_vpn/is_abuser se solapan: "tor_exit" > "abuser" > "vpn". null si ninguna coincide. |
flags | object | Objeto retrocompatible que refleja los campos is_*. Claves: hosting, mobile, residential, bot, blacklisted, vpn, tor, abuser. |
meta.data_version | string | Fecha del conjunto de datos usado para la búsqueda (YYYY-MM-DD). "cf-edge" para autobúsqueda. "bogon" para rangos privados. |
meta.cached | boolean | true si la respuesta se ha servido desde la capa de caché. |
meta.lang | string | El 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=.
| Format | Content-Type | Usage |
|---|---|---|
json | application/json | Por defecto. Respuesta estructurada completa. |
csv | text/csv | Pares clave,valor planos. Se omiten los objetos anidados. |
text | text/plain | Líneas key: value. Un campo por línea. |
xml | application/xml | Estructura anidada completa, los arrays repiten la etiqueta. |
yaml | application/x-yaml | Estructura anidada completa. |
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.
| Code | Language |
|---|---|
en | English (default) |
pt | Português |
fr | Français |
de | Deutsch |
zh-TW | 繁體中文 |
ko | 한국어 |
zh-CN | 简体中文 |
ja-JP | 日本語 |
es-ES | Español |
ar-SA | العربية |
hi-IN | हिन्दी |
¿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.
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.
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.
Ejemplos de código
JavaScript
Python
PHP
Go
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.
| Tier | Requests / day | Auth |
|---|---|---|
| Free | 1,000 | Ninguna |
| Pro | 100,000 | Clave de API (cabecera) |
| Enterprise | Unlimited | Clave de API + endpoints dedicados |
Códigos de error
| Status | Meaning |
|---|---|
200 | OK. La respuesta incluye los datos. |
202 | Los datos del feed se están sincronizando. Reinténtalo en 45 segundos. |
400 | Petición incorrecta. IP, ASN o código de país no válidos. |
404 | ASN o país no encontrados en el conjunto de datos. |
503 | Conjunto de datos aún no disponible. Es posible que la ingesta inicial esté en curso. |