Referência da API

Endpoints simples e consistentes. CORS ativado. Sem autenticação. Totalmente multilíngue — cada campo, chave e valor é traduzido em mais de 10 idiomas.

URL base

https://ipto.to

Início 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"]'

Atalho de terminal: curl ipto.to ou curl ipto.to/8.8.8.8 (sem precisar de https:// ou /v1/ip/) também funciona quando a requisição vem do curl, Wget ou HTTPie — detectado pelo User-Agent. Isso retorna um conjunto de campos mais curto, no estilo do ipinfo.io (ip, country, city, asn, org, ...), não o schema completo abaixo — use os caminhos /v1/ip diretamente para a resposta completa documentada nesta página.

Só o IP: curl ipto.to/ip (ou abra no navegador) retorna apenas o seu próprio endereço IP como texto simples — 73.9.114.155, sem JSON, sem elementos de página. Equivalente direto do ipinfo.io/ip. Veja GET /ip abaixo.

Multilíngue por padrão: Defina ?lang= para qualquer código suportado e cada chave e valor JSON da resposta volta traduzido — não só país/continente. Veja Localização abaixo para a lista completa de idiomas e a opção de saída &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

Monte qualquer requisição do ipto, copie-a como código pronto para executar na sua linguagem ou envie aqui mesmo e leia a resposta ao vivo. O plano gratuito não precisa de chave.

Servidor MCP

O ipto também pode ser acessado como um servidor de ferramentas MCP (Model Context Protocol) — aponte o Claude Desktop, o Cursor, ou qualquer cliente compatível com MCP para o endpoint abaixo e ele expõe 14 ferramentas chamáveis: 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 e patent_lookup. JSON-RPC 2.0 sobre Streamable HTTP — apenas POST, sem necessidade de sessão/SSE. Mesma autenticação da API REST: omita para o plano gratuito (1.000 req/dia por IP), ou acrescente ?api_key= à URL do endpoint.

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

Para clientes que só suportam stdio, use uma ponte: 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

Retorna apenas o próprio endereço IP público do cliente que fez a requisição, como texto simples (Content-Type: text/plain) — ex.: 73.9.114.155. Equivalente direto do ipinfo.io/ip: funciona de forma idêntica via curl, Wget, HTTPie ou uma visita simples pelo navegador (sem detecção de User-Agent, diferente do atalho curl ipto.to acima), e é renderizado como apenas o IP puro, sem elementos de página, quando aberto no navegador.

Sem parâmetros, sem query string. Para o objeto completo de geolocalização/inteligência de ameaças, use GET /v1/ip abaixo. Esta rota lê o IP de conexão diretamente (sem consulta a D1/KV) e não é contabilizada no orçamento diário de requisições — veja Limites de taxa.

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

Retorna geolocalização e inteligência de ameaças para o IP da requisição, incluindo dados no nível de cidade via o objeto de borda da CF.

Nenhum parâmetro obrigatório. Aceita ?lang=, ?fields=, ?format= — veja Localização e Formatos de saída abaixo.

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

Consulte qualquer endereço IPv4. Os campos de nível de cidade (city, state, postal_code, latitude, longitude, timezone) são preenchidos quando o IP está presente em um dos dois conjuntos de dados geográficos combinados, IP2Location ou MaxMind — verifique geo_precision na resposta para saber se você recebeu dados de nível de cidade ou de país. O formato de timezone depende de qual fonte deu o match (uma string de UTC-offset do IP2Location, ou um nome IANA do MaxMind). Consultas IPv6 atualmente retornam apenas dados de nível de país.

ParameterInDescription
ippathObrigatório. Qualquer endereço IPv4 ou IPv6 válido.
langqueryOpcional. Localiza country_name e continent: en (padrão), pt, fr, de, zh-TW, ko, zh-CN, ja-JP, es-ES, ar-SA, hi-IN.
fieldsqueryOpcional. Lista de campos a incluir, separados por vírgula. Ex.: ?fields=ip,country_code,is_vpn
formatqueryOpcional. Formato da resposta: json (padrão), 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

O endpoint de busca unificada por trás da barra de pesquisa da página inicial. Detecta se :query é um IP, um ASN (AS15169 ou 15169), um código de país de 2 letras, um e-mail ou um número de telefone, e então agrega todas as verificações relevantes em uma única resposta. Para uma busca por IP, isso dispara — em paralelo, no lado do servidor — a busca de IP principal mais RPKI, IP-para-empresa, operadora móvel, domínios hospedados e locais próximos, de modo que uma única busca consome apenas uma requisição do seu orçamento diário de limite de taxa, em vez de uma por funcionalidade.

ParameterInDescription
querypathObrigatório. Um IP, ASN, código de país, e-mail ou número de telefone.
FieldTypeDescription
querystringA entrada decodificada, como recebida.
detected_typestring"ip", "asn", "country", "email" ou "phone".
ipobject|nullPresente quando detected_type é "ip" — mesmo formato de GET /v1/ip/:ip.
rpkiobject|nullPresente para buscas de IP — mesmo formato de GET /v1/ip/:ip/rpki.
companyobject|nullPresente para buscas de IP — mesmo formato de GET /v1/ip/:ip/company.
whoisobject|nullPresente para buscas de IP — mesmo formato de GET /v1/ip/:ip/whois.
carrierobject|nullPresente para buscas de IP — mesmo formato de GET /v1/ip/:ip/carrier.
asn / country / email / phoneobject|nullPresente no lugar dos seis campos acima quando detected_type corresponde — mesmo formato do endpoint dedicado daquele tipo.

Cada subcampo degrada de forma independente — uma fonte upstream lenta ou com falha (RIPEstat, um servidor RDAP, crt.sh) aparece apenas como aquele campo específico sendo null, nunca como falha da busca inteira. Somente uma consulta principal inválida (ex.: um IP malformado) retorna um status de erro para a requisição como um todo.

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

DNS reverso — uma única consulta PTR ao vivo via DNS-over-HTTPS, não um banco de dados de enumeração de domínios. Retorna null se o IP não tiver registro PTR.

ParameterInDescription
ippathObrigatório. Qualquer endereço IPv4 ou IPv6 válido.
curl https://ipto.to/v1/ip/8.8.8.8/hostname # {"ip":"8.8.8.8","hostname":"dns.google"}
GET/v1/ip/:ip/rpki

Validação de origem de rota RPKI para a rota atualmente anunciada de um IP, resolvida ao vivo via RIPEstat (nenhum banco de dados de ROA é ingerido ou mantido sincronizado localmente). status é sempre "valid", "invalid" ou "unknown" — nunca sintetizado a partir de qualquer outro sinal; qualquer falha ou timeout do RIPEstat retorna "unknown" com uma string de motivo, não um erro.

ParameterInDescription
ippathObrigatório. Qualquer endereço IPv4 ou IPv6 válido.
FieldTypeDescription
asninteger|nullO ASN que está anunciando atualmente, resolvido ao vivo — não derivado do conjunto de dados de ASN próprio deste site.
prefixstring|nullO prefixo CIDR atualmente anunciado.
statusstring"valid", "invalid" ou "unknown".
validating_roasarrayA(s) ROA(s) específica(s) encontrada(s) pelo RIPEstat, cada uma com origin/prefix/max_length/validity.
validatorstring|nullQual validador RPKI o RIPEstat usou (ex.: "routinator").
reasonstring|nullExplica um resultado "unknown" — ex.: não existe ROA de cobertura, ou o RIPEstat estava inacessível.
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

Validação RPKI explícita (ASN, prefix) — para quando você já sabe exatamente qual rota quer verificar, em vez da conveniência derivada de IP acima.

ParameterInDescription
asnqueryObrigatório. Número do ASN, com ou sem o prefixo AS. Ex.: 15169 ou AS15169.
prefixqueryObrigatório. Prefixo CIDR, ex.: 8.8.8.0/24.
curl "https://ipto.to/v1/rpki?asn=15169&prefix=8.8.8.0/24"
GET/v1/ip/:ip/company

Identifica a organização à qual um IP está registrado, combinando dados do registrante RDAP (WHOIS estruturado) com o nome da organização do próprio ASN em uma confiança categórica, nunca uma pontuação numérica.

ParameterInDescription
ippathObrigatório. Qualquer endereço IPv4 ou IPv6 válido.
FieldTypeDescription
company_namestring|nullO nome da empresa resolvido — null quando confidence é "low" (as duas fontes discordam, então nenhuma é apresentada como autoritativa) ou "none".
rdap_org_namestring|nullO nome do registrante segundo o RDAP, independente de company_name.
asn_org_namestring|nullO nome da organização do próprio ASN, independente de company_name.
confidencestring"high" (as fontes concordam), "medium" (apenas uma fonte disponível), "low" (as fontes discordam — ambas mostradas) ou "none".
reasonstringExplicação em linguagem simples do nível de confidence.
curl https://ipto.to/v1/ip/1.1.1.1/company # {"ip":"1.1.1.1","company_name":null,"rdap_org_name":"APNIC Research and Development","asn_org_name":"Cloudflare, Inc.","confidence":"low",...}
GET/v1/ip/:ip/whois

O próprio registro de registro RDAP subjacente — bloco de rede, datas de registro/última alteração, e todos os contatos que o RDAP tem registrados. Diferente do /company acima, que reconcilia esses mesmos dados de registrante com o nome da organização do ASN em uma única resposta com nível de confiança; este endpoint retorna o registro bruto tal como está, mais próximo da saída clássica de WHOIS. Endereços IPv6 também são suportados.

ParameterInDescription
ippathObrigatório. Qualquer endereço IPv4 ou IPv6 válido.
FieldTypeDescription
availablebooleanfalse se nenhum registro RDAP pôde ser resolvido — veja reason.
reasonstring|nullExplica um resultado available: false.
startAddress / endAddress / cidrstring|nullO bloco de rede registrado.
netName / netHandle / parentHandlestring|nullIdentificadores atribuídos pelo RIR para o objeto de rede.
countrystring|nullPaís do registrante, segundo o RDAP.
allocationTypestring|nullex.: "direct allocation", "reassigned".
registeredDate / lastChangedDatestring|nullTimestamps ISO do registro RDAP.
rirstring|nullQual registro regional (ARIN, RIPE, APNIC, LACNIC, AFRINIC) forneceu o registro.
contactsarrayTodos os contatos que o RDAP tem registrados, cada um com roles, name, email e handle — não apenas o primeiro resultado.
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

Identificação de operadora móvel best-effort para IPs classificados como redes móveis, cruzada com um diretório de operadoras MCC/MNC. Deliberadamente não possui um único campo de operadora — veja matched_carrier_entries e note abaixo — já que um nome de operadora isolado seria lido como uma afirmação ao vivo por assinante, o que estes dados não conseguem sustentar com honestidade.

ParameterInDescription
ippathObrigatório. Qualquer endereço IPv4 ou IPv6 válido.
FieldTypeDescription
is_mobile_networkbooleanfalse interrompe aqui com um diretório vazio — nenhum palpite para um ASN não móvel.
asn_organizationstring|nullO nome da organização do próprio ASN.
matched_carrier_entriesarrayLinhas do diretório MCC/MNC cujo nome de operadora corresponde de forma aproximada (fuzzy) a asn_organization, restritas ao país do próprio IP.
notestringExplica o que este campo pode e não pode 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

Encontra domínios associados a um IP através do seu hostname de DNS reverso (PTR) e de logs de transparência de certificados (crt.sh) — não é uma busca reversa de IP genérica. O próprio campo limitations da resposta explica exatamente o que isso consegue e não consegue encontrar.

ParameterInDescription
ippathObrigatório. Qualquer endereço IPv4 ou IPv6 válido.
FieldTypeDescription
ptr_hostnamestring|nullO hostname de DNS reverso do IP, ou null se não houver registro PTR.
root_domainstring|nullO domínio registrável derivado de ptr_hostname.
subdomains_seenarray|nullSubdomínios encontrados via transparência de certificados. null significa que a própria busca no crt.sh não pôde ser concluída — diferente de um array vazio, que significa que ela rodou e não encontrou nada.
limitationsstringExplica o que esta funcionalidade estruturalmente não consegue detectar (sem PTR, hospedagem compartilhada, domínios sem 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

Busca em massa — até 100 IPs por requisição, somente Pro/Enterprise. Retorna um objeto indexado com cada IP como chave. Mais rápido que chamadas sequenciais graças a leituras paralelas de cache e banco de dados. Cada IP no lote conta contra o seu orçamento diário de requisições, assim como consultá-lo individualmente. Requisições do plano gratuito recebem um 403 — veja preços.

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

Consulte um Sistema Autônomo pelo número. Retorna o nome da organização, país, continente, contagem de faixas de IP, tipo de classificação, taxa de câmbio e dados de referência regionais (idiomas, tld, capital, fronteiras).

ParameterInDescription
asnpathNúmero do ASN sem o prefixo AS. Ex.: 15169 para o Google.
langqueryOpcional. Localiza country_name e continent: en (padrão), pt, fr, de, zh-TW, ko, zh-CN, ja-JP, es-ES, ar-SA, hi-IN.
formatqueryOpcional. Formato da resposta: json (padrão), csv, text, xml, yaml.
curl https://ipto.to/v1/asn/15169
GET/v1/places/:ip

Faz a geocodificação reversa da localização de nível de cidade já existente de um IP, e então retorna pontos de interesse próximos (restaurantes, parques, escolas, transporte público, marcos notáveis), dados locais de criminalidade onde há uma fonte disponível (apenas Reino Unido e EUA), e uma estimativa opcional de trajeto de carro sob demanda.

ParameterInDescription
ippathObrigatório. Qualquer endereço IPv4 válido. IPv6 ainda não é suportado.
dest_latqueryOpcional. Latitude do destino para uma estimativa de trajeto — use em conjunto com dest_lon.
dest_lonqueryOpcional. Longitude do destino para uma estimativa de trajeto — use em conjunto com dest_lat.
dest_addressqueryOpcional. Endereço de destino em texto livre para uma estimativa de trajeto, geocodificado automaticamente. Ignorado se dest_lat/dest_lon também forem informados.
FieldTypeDescription
geocodeobject|nullcountry, countryCode, region, city, neighbourhood, displayName — null se o IP não tiver localização de nível de cidade para geocodificar.
locality.restaurants / .parks / .schools / .transitarrayAté 4 entradas mais próximas por categoria, cada uma com name e distanceMeters.
locality.notablearrayMarcos notáveis próximos com uma breve descrição, via Wikidata.
locality.usCrimeobject|nullTotais de crimes violentos/patrimoniais da agência mais próxima — apenas EUA, requer uma FBI_CRIME_API_KEY na implantação. null em qualquer outro lugar.
locality.ukCrimeobject|nullResumo de incidentes em nível de rua dentro de 1 milha — apenas GB.
locality.caCrimenullSempre null — nenhuma fonte de criminalidade abrangendo todo o Canadá está conectada (veja docs/places.md).
commuteobject|nulldurationMinutes e distanceKm, apenas quando um destino foi informado e o OpenRouteService retornou uma rota. null caso contrário — nunca calculado 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

Estatísticas agregadas em nível de país, além de dados de referência regionais (moeda, taxa de câmbio, idiomas, tld, capital, fronteiras).

ParameterInDescription
codepathCódigo de país ISO 3166-1 alpha-2. Ex.: US, DE, JP.
langqueryOpcional. Localiza country_name e continent: en (padrão), pt, fr, de, zh-TW, ko, zh-CN, ja-JP, es-ES, ar-SA, hi-IN.
formatqueryOpcional. Formato da resposta: json (padrão), 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

Analisa uma string de User-Agent. Retorna navegador, sistema operacional, tipo de dispositivo e detecção de bot. Lê o cabeçalho User-Agent do solicitante por padrão, ou passe qualquer string via ?ua=.

ParameterInDescription
uaqueryOpcional. String de User-Agent codificada em URL para analisar. O padrão é o cabeçalho User-Agent da requisição.
curl "https://ipto.to/v1/ua?ua=Mozilla%2F5.0+%28iPhone%3B+CPU+iPhone+OS+17_0%29"
GET/v1/phone/:number

Valida e formata um número de telefone gratuitamente, sempre: região, tipo de linha e formatação E.164/nacional/internacional via um parser auto-hospedado, sem chamada a fornecedor. Quando há orçamento premium mensal disponível por IP/chave (100/mês no Free, mais nos planos pagos — veja preços), a mesma requisição também retorna um nome de operadora ao vivo, status de portabilidade, e um tipo de telefone classificado pelo provedor, de um serviço de consulta de operadoras em tempo real — veja source e os campos abaixo. Um country_name localizado, além de lang/lang_source, é sempre incluído, independentemente do nível — veja Localização. Esgotar o orçamento premium, ou qualquer problema upstream, retorna sem problemas aos campos gratuitos acima; a requisição nunca falha por causa disso. Para uma referência de operadoras de rede em nível de país em vez de uma consulta por número, veja GET /v1/carriers.

ParameterInDescription
numberpathObrigatório. Qualquer número de telefone, idealmente no formato E.164 (ex.: +14155552671). Codifique o + inicial na URL.
countryqueryOpcional. Dica de código de país de 2 letras para analisar números em formato nacional ambíguo, ex.: ?country=US.
modequeryOpcional. ?mode=current solicita a operadora em tempo real (em vez da emitida pelo SIM) do número, quando o nível premium está disponível. Ignorado se a requisição recorrer ao plano gratuito.
FieldTypeDescription
validbooleantrue se o número corresponder a um padrão de plano de numeração válido para sua região.
country_codestring|nullRegião ISO 3166-1 alpha-2 à qual o número pertence.
national_formatstring|nullFormatado na própria convenção nacional da região.
international_formatstring|nullFormatado com código de país e espaçamento, ex.: "+1 415 555 2671".
e164string|nullForma canônica E.164, ex.: "+14155552671".
line_typestring|nullFIXED_LINE, MOBILE, FIXED_LINE_OR_MOBILE, VOIP, TOLL_FREE, PREMIUM_RATE, ou similar. Muitos planos de numeração (incluindo o da América do Norte) não conseguem distinguir linha fixa de móvel apenas pelo número.
sourcestring"premium" se havia orçamento de consulta de operadora ao vivo disponível para esta requisição, "local" se recorreu ao parser gratuito acima. carrier, phone_type, original_carrier, is_ported, phone_region e country_prefix abaixo só são preenchidos quando source é "premium" — country_name e lang/lang_source mais abaixo são sempre preenchidos, independentemente do nível.
phone_typestring|nullUma das próprias categorias do provedor de consulta de operadoras em tempo real: mobile, fixed_line, voip, toll_free, premium_rate, shared_cost, personal_number, pager, uan, voicemail, ou unknown — não apenas as quatro primeiras, que são só os exemplos mais comuns. null quando source é "local" — distinto de line_type acima, que vem do parser local e usa um conjunto diferente de categorias.
carrierstring|nullO nome da operadora de rede atual do número. null quando source é "local".
original_carrierstring|nullA operadora de rede na qual o número foi originalmente emitido, caso tenha sido portado desde então. null quando source é "local" ou o número não foi portado.
is_portedboolean|nulltrue se o número foi portado para fora de sua operadora original. null quando source é "local".
phone_regionstring|nullDetalhe de localidade/estado para o número (ex. "California"), mais granular que country_code acima. null quando source é "local".
country_prefixstring|nullO código de discagem do número sem o "+" inicial (ex. "49" para a Alemanha). null quando source é "local".
country_namestring|nullNome de exibição completo do país (ex. "Germany") — country_code acima é apenas a forma ISO alpha-2 ("DE"), não um nome de exibição. Diferente dos campos exclusivos do premium acima, este é sempre preenchido (sempre que country_code também é) e é localizado via ?lang=/Accept-Language da mesma forma que o campo country_name de qualquer outro endpoint já é — veja lang/lang_source abaixo.
langstringO idioma efetivamente aplicado ao country_name acima — o valor resolvido de ?lang=, ou "en" se nenhum foi solicitado ou o solicitado não é suportado.
lang_sourcestring"param" se ?lang= estava presente na requisição, "header" se Accept-Language foi usado em vez disso, ou "default" se nenhum dos dois e o inglês foi usado. Mesmo significado do campo de mesmo nome em GET /v1/asn/:asn e GET /v1/country/:code.
curl "https://ipto.to/v1/phone/+14155552671"
POST/v1/phone/bulk

Validação em massa. Todos os planos têm acesso ao envio em massa (diferente de /v1/ip/bulk) — o limite de lote por plano é o que mantém o Free limitado, não um 403. Free: 10/requisição, 100/dia. Pro: 100/requisição, 1.000/dia. Enterprise: 1.000/requisição, 10.000/dia. Este orçamento é separado do seu limite geral diário de requisições — veja Limites de taxa.

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

Consulta de referência: quais operadoras de rede móvel (MCC/MNC) são conhecidas para um determinado país — não vinculada a nenhum número de telefone específico. Extraído de uma compilação MCC/MNC mantida pela comunidade (licença MIT, última sincronização em 2026 — veja o repositório de docs para detalhes); uma tabela de referência estática, não um feed ao vivo, já que atribuições de plano de numeração não mudam com frequência suficiente para justificar isso.

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

Validação de sintaxe de e-mail, uma verificação ao vivo de registro MX via DNS-over-HTTPS, e detecção de domínio descartável/temporário contra uma lista de bloqueio mantida pela comunidade (licença CC0, sincronizada diariamente). Não verifica se a caixa de entrada em si existe — isso exigiria um handshake SMTP que esta API não realiza (veja a referência de campos abaixo para saber exatamente o que has_mx prova e não prova).

ParameterInDescription
emailpathObrigatório. Qualquer endereço de e-mail, codificado em URL (o @ deve ser codificado como %40).
FieldTypeDescription
valid_syntaxbooleantrue se o endereço corresponder a um padrão de sintaxe de e-mail padrão. Não verifica se a caixa de entrada existe.
domainstring|nullA parte do domínio, em minúsculas. null se valid_syntax for false.
has_mxboolean|nulltrue se o domínio tiver pelo menos um registro MX no momento. null se a sintaxe era inválida ou a própria consulta DNS falhou/expirou — trate null como desconhecido, não como false.
disposableboolean|nulltrue se o domínio corresponder a um provedor de e-mail descartável/temporário conhecido. null nas mesmas condições que has_mx.
source"premium"|"local""premium" se uma verificação em tempo real foi executada para esta solicitação, "local" se não foi (limite atingido, ou recurso não habilitado) — os campos acima (valid_syntax até disposable) estão sempre preenchidos em ambos os casos.
is_reachablestring|nullO veredito geral de uma verificação em tempo real opcional: "safe" (entregável), "invalid" (rejeitado), "risky" (incerto) ou "unknown" (inconclusivo — tente novamente). null quando a verificação em tempo real não foi executada para esta solicitação (veja source abaixo).
is_catch_allboolean|nulltrue se o domínio aceitar e-mails para qualquer endereço, o que significa que a existência desta caixa específica não pôde ser confirmada. null quando a verificação em tempo real não foi executada.
mailbox_fullboolean|nulltrue se a verificação em tempo real encontrou a caixa reportando estar cheia. null quando a verificação em tempo real não foi executada.
is_role_accountboolean|nulltrue se o endereço parecer uma conta de função (ex.: support@, admin@) em vez da caixa de um indivíduo. null quando a verificação em tempo real não foi executada.
is_disabledboolean|nulltrue se a verificação em tempo real encontrou a caixa explicitamente desativada. null quando a verificação em tempo real não foi executada.
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 qualquer combinação de IP, e-mail, telefone e User-Agent que você fornecer em uma única pontuação de 0–100 — a única coisa que nenhum dos serviços ip-api.com, ipapi.co, ipgeolocation.io, ipify.org, ipregistry.co, ip2location.io, AbstractAPI, IPLocate.io ou BigDataCloud oferece como um sinal único combinado (verificado diretamente). Todas as quatro entradas são opcionais e independentes — passe qualquer subconjunto. ip usa o seu próprio IP e ua usa o seu próprio cabeçalho User-Agent por padrão, se omitidos, a mesma convenção de GET /v1/ip e GET /v1/ua. Um sinal que você não passar simplesmente fica ausente da resposta, não é pontuado como limpo — seu peso é redistribuído entre os sinais que você de fato forneceu.

ParameterInDescription
ipqueryOpcional. Usa o seu próprio IP por padrão. IPv6 ainda não é pontuado (mesma limitação do restante da API de dados de ameaças).
emailqueryOpcional. Qualquer endereço de e-mail.
phonequeryOpcional. Qualquer número de telefone.
uaqueryOpcional. Usa o seu próprio cabeçalho User-Agent por padrão.
FieldTypeDescription
scoreintegerComposto ponderado de 0 a 100 entre os sinais que foram fornecidos.
risk_tierstring"low" (<20), "medium" (20-44), "high" (45-69), ou "critical" (70+).
signalsobjectDetalhamento por entrada — apenas as chaves das entradas que você realmente forneceu estão presentes: ip, email, phone, user_agent. Cada uma inclui sua própria pontuação de componente, além dos mesmos campos que GET /v1/ip/:ip, /v1/email/:email, /v1/phone/:number e /v1/ua já retornam para aquela entrada.
curl "https://ipto.to/v1/fraud-score?ip=1.2.3.4&email=test%40mailinator.com"
GET/v1/screenshot

Renderiza uma URL em uma instância real de Chrome headless (Cloudflare Browser Rendering, não um fornecedor terceirizado de screenshots) e retorna um PNG. Alvos internos/privados (localhost, faixas RFC 1918, endereços link-local/de metadados de nuvem) são rejeitados antes mesmo do navegador ser iniciado. Sujeito aos próprios limites de plataforma do Browser Rendering, que são muito mais restritivos que o resto desta API — espere que isso seja limitado bem antes do seu orçamento diário normal de requisições em planos Cloudflare mais baixos.

ParameterInDescription
urlqueryObrigatório. Deve ser http ou https.
curl "https://ipto.to/v1/screenshot?url=https://example.com" --output screenshot.png
GET/v1/language

Identifica o idioma de um trecho de texto via análise local de frequência de trigramas — sem chamada a fornecedor externo, sem inferência por modelo de IA, sem registro de logs. Entradas com menos de 10 caracteres retornam um idioma null; com menos de ~30 caracteres ainda pode retornar um palpite, mas reliable será false.

ParameterInDescription
textqueryObrigatório. Até 5.000 caracteres — entradas mais longas são truncadas, não rejeitadas.
FieldTypeDescription
languageobject|nullcode (ISO 639-1), iso639_3, name e local_name para a melhor correspondência. null se o texto for muito curto ou não reconhecido ("und").
reliablebooleanfalse para entradas curtas — trate o resultado como um palpite, não uma correspondência confiável.
candidatesarrayAté 5 idiomas concorrentes com pontuações relativas, para pares de idiomas próximos entre si.
curl "https://ipto.to/v1/language?text=Bonjour%2C+comment+allez-vous%3F"
GET/v1/currency/convert

Converte um valor entre duas moedas (154 suportadas) usando o mesmo feed diário de taxas de referência que já alimenta currency_code/exchange_rate_usd em toda busca de IP, ASN e país — exposto aqui como um endpoint de conversão independente, em vez de aninhado dentro de uma resposta de geolocalização.

ParameterInDescription
fromqueryObrigatório. Código de moeda ISO 4217 de 3 letras.
toqueryObrigatório. Código de moeda ISO 4217 de 3 letras.
amountqueryOpcional. O padrão é 1.
FieldTypeDescription
resultnumberValor convertido.
ratenumberUnidades de to por 1 from.
updatedstringTimestamp ISO da sincronização de taxa de referência usada nesta conversão.
curl "https://ipto.to/v1/currency/convert?from=USD&to=EUR&amount=100"
GET/v1/currency/rates

Tabela completa de taxas de câmbio (154 moedas) rebaseada em relação a qualquer moeda suportada, não apenas USD.

ParameterInDescription
basequeryOpcional. O padrão é USD.
FieldTypeDescription
ratesobjectMapa de código de moeda → taxa em relação à base.
curl "https://ipto.to/v1/currency/rates?base=EUR"
GET/v1/currency/history

Histórico diário de taxa de referência para um par de moedas, até 90 dias atrás — os dados por trás do gráfico de tendência de taxa em a ferramenta de conversão de moedas. Preenchido retroativamente uma vez, e depois atualizado diariamente pelo mesmo cron que atualiza GET /v1/currency/convert. Esta é uma única taxa de referência diária ao longo do tempo, não um spread de compra/venda de negociação.

ParameterInDescription
targetqueryObrigatório. Código de moeda ISO 4217 de 3 letras para exibir no gráfico.
basequeryOpcional. O padrão é USD.
daysqueryOpcional. Um de 30, 60, 90. O padrão é 30.
FieldTypeDescription
seriesarrayArray em ordem crescente de data de pontos { date, rate }.
statsobjectmin, avg, max e current ao longo da série retornada.
curl "https://ipto.to/v1/currency/history?base=USD&target=EUR&days=90"
GET/v1/weather

Condições atuais — e, com detail=1, uma previsão horária e para vários dias — para um nome de lugar, CEP ou par "lat,lon", ou para lat + lon ou um ip. Os locais dos EUA são atendidos pelo National Weather Service e o resto do mundo pelo MET Norway. Adicione include= para o documento completo, com unidades, até 9 dias, sol e lua, alertas oficiais e mais — veja o cartão include abaixo. A ferramenta weather-lookup também detecta automaticamente a localização do próprio solicitante no navegador antes de chamar este endpoint explicitamente.

ParameterInDescription
qqueryNome da cidade, CEP ou "lat,lon" (máximo de 100 caracteres). Ou informe lat e lon, ou ip, no lugar. Um dos três é obrigatório.
detailqueryOpcional. "1" adiciona pressure_mb/visibility_km/dewpoint_c/sunrise/sunset/etc. a weather, além de um objeto forecast (hourly + daily). Omitido por padrão.
FieldTypeDescription
conditionstring|nullBreve descrição em texto.
temp_c / temp_fnumber|nullTemperatura atual.
feels_like_cnumber|nullTemperatura de sensação térmica em Celsius.
humidity_pctnumber|nullUmidade relativa.
wind_kmph / wind_dirnumber|null / string|nullVelocidade do vento e direção da bússola de 16 pontos.
uv_indexnumber|nullÍndice UV.
locationobject|nullNome, região, país e lat/lon resolvidos para o lugar consultado — não apenas a entrada bruta.
forecast.hourly[]arrayApenas detail=1. Próximas 24h em passos de 3 horas: hour_label, temp_c/temp_f, weather_code, chance_of_rain_pct.
forecast.daily[]arrayApenas detail=1. Previsão de 3 dias: 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 ao vivo para o sistema TSDR (Trademark Status & Document Retrieval) do USPTO para status de processo por número de série de 8 dígitos — uma chamada direta por requisição, não uma cópia em cache ou revendida. Os dados de status de processo são uma obra do governo dos EUA e de domínio público segundo os próprios termos de uso do USPTO, então toda resposta traz um campo source/attribution, em vez de armazená-los em cache ou revendê-los silenciosamente. Dados de logotipo/imagem de marca estão deliberadamente fora do escopo — os termos do USPTO separam o licenciamento de imagens dos dados textuais de status de processo que este endpoint retorna. A busca por número de registro ainda não é suportada; apenas o caminho por número de série é documentado pelo USPTO atualmente. Experimente na ferramenta Trademark Lookup.

ParameterInDescription
serialpathObrigatório. Exatamente 8 dígitos, ex.: 98267877.
FieldTypeDescription
sourcestringSempre "USPTO TSDR".
attributionstringLinha de atribuição obrigatória segundo os termos de uso do USPTO.
dataobjectPayload bruto de status de processo, como retornado pelo USPTO, repassado sem reestruturação — confirmado ativo em 2026-08-12. Em data.trademarks[0]: status (datas de depósito/registro, markElement, descOfMark, tm5StatusDesc), parties.ownerGroups (nome/endereço do titular por função), gsList[] (descrição de produtos/serviços e classes), e prosecutionHistory[] (linha do tempo completa do processo). A presença de campos varia conforme o status da solicitação — ex.: uma solicitação pendente ainda não tem usRegistrationNumber.
curl "https://ipto.to/v1/trademark/98267877" # ANTHROPIC, Reg. No. 8296420
GET/v1/patent/:number

Proxy ao vivo para a API Patent File Wrapper do USPTO (Open Data Portal) para status de concessão por número de patente de utilidade de 7-8 dígitos — uma chamada direta por requisição, não uma cópia em cache ou revendida. A fonte originalmente utilizada (a Search API do PatentsView) foi confirmada como desativada em 2026-03-20; isso faz proxy para sua sucessora ao vivo. Os dados do Patent File Wrapper são uma obra do governo dos EUA e de domínio público segundo os próprios termos de uso do USPTO, então toda resposta traz um campo source/attribution. O escopo é centrado em solicitação/processo — sem grafo de citações, família de patentes, campo de status jurídico ou imagens como o Lens.org, Espacenet ou Google Patents mostram. A cobertura começa em solicitações depositadas em 2001. Patentes de design, de planta e de reemissão ainda não são suportadas; apenas patentes de utilidade concedidas por número de patente. Experimente na ferramenta Patent Lookup.

ParameterInDescription
numberpathObrigatório. 7-8 dígitos, ex.: 12393227. Apenas número de patente de utilidade concedida, não um número de solicitação.
FieldTypeDescription
sourcestringSempre "USPTO Patent File Wrapper".
attributionstringLinha de atribuição obrigatória segundo os termos de uso do USPTO.
dataobjectPayload bruto do registro de processo, como retornado pelo USPTO, repassado sem reestruturação — confirmado ativo em 2026-08-12 contra patentes reais (12393227, 9935534). Campos principais: applicationMetaData (inventionTitle, filingDate, applicationStatusDescriptionText, applicationStatusDate, patentNumber, inventorBag[]), recordAttorney.attorneyBag[], applicationNumberText, e eventDataBag[] (linha do tempo completa do processo). Retorna 404 se o número não existir, for uma patente de design/planta/reemissão, ou for anterior à cobertura de 2001.
curl "https://ipto.to/v1/patent/12393227" # WEARABLE COMPUTING DEVICE, granted 2025
GET/v1/feeds

Feed paginado de VPN, Tor e inteligência de ameaças. 200 entradas por página. Cada entrada inclui IP/CIDR, atribuição do provedor, ISP, país e tipo de classificação.

ParameterInDescription
pagequeryNúmero de página, indexado a partir de 0. Padrão: 0.
typequeryFiltrar por tipo: VPN, Tor Exit Node, Tor Node, High-Risk Threat Intel.
qqueryFiltrar por substring de IP ou 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

Somente metadados — contagem total de entradas, contagens por fonte e horário da última sincronização. Não retorna dados 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

Faixas de rede abusivas, paginadas. Pontuadas de 1 a 10 por corroboração entre feeds. Níveis de risco: critical (8-10), high (5-7), medium (3-4).

ParameterInDescription
pagequeryNúmero de página, indexado a partir de 0. Padrão: 0.
tierqueryFiltrar por nível de risco: critical, high, medium.
qqueryFiltrar por substring de faixa de rede.
sourcequeryOpcional. Filtra pelo nome do feed de origem exatamente como retornado em source_feed, ex.: 'Spamhaus DROP' ou 'IPsum Threat Intel'.
curl "https://ipto.to/v1/abuse?page=0&tier=critical&source=Spamhaus%20DROP" # {"metadata":{...},"pagination":{"page":0,"page_size":200,"total":1640,"total_pages":9,"has_next":true}, # "networks":[{"network_range":"1.10.16.0/20","abuse_score":10,"risk_tier":"critical","source_feed":"Spamhaus DROP"}, ...]}
GET/v1/abuse/stats

Somente metadados — contagem total de redes, contagens por fonte, detalhamento por nível de risco, e horário da última sincronização.

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

Exportação CSV para download dos datasets abertos sobre os quais a API já é construída — os mesmos dados, sem nova licença. asn e ranges estão sempre disponíveis; geo-city retorna 503 até que o dataset dessa fonte esteja ativo em uma determinada implantação. geo-city exporta as linhas brutas de uma fonte geográfica por vez, não uma visão combinada — passe ?source=primary (padrão) ou ?source=secondary.

ParameterInDescription
kindpathUm de: asn, ranges, geo-city.
sourcequeryApenas geo-city. primary (padrão) ou secondary.
curl -OJ https://ipto.to/v1/datasets/asn curl -OJ https://ipto.to/v1/datasets/ranges curl -OJ "https://ipto.to/v1/datasets/geo-city?source=secondary"
POST/v1/keys

Emite uma chave de API instantaneamente — sem e-mail, sem cadastro. Toda chave começa no plano gratuito (1.000 requisições/dia; busca em massa não incluída). Chaves Pro e Enterprise desbloqueiam limites diários maiores e busca em massa (até 100 IPs/requisição) — veja preços. Guarde a chave — ela não pode ser recuperada depois.

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

Verifique quantas requisições uma chave já fez. Passe a chave em qualquer requisição /v1/* via o cabeçalho X-API-Key ou ?api_key= para que ela seja contabilizada.

ParameterInDescription
keyqueryObrigatório. Uma chave retornada por POST /v1/keys.
curl "https://ipto.to/v1/keys/usage?key=ipto_xxxxxxxx"
GET/v1/ip/:ip/abuse

Contato de denúncia de abuso da rede proprietária de um IP, obtido via RDAP: o RIR, o identificador da rede, o CIDR que a cobre e a(s) caixa(s) de e-mail de abuso. Use para saber para onde enviar uma denúncia.

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

available é false (com um motivo em failure) quando o registro não pôde ser acessado.

GET/v1/asn/:asn/ranges

Os intervalos de IP efetivamente anunciados por um ASN, paginados, cada um com seu país e os indicadores de hospedagem / móvel / residencial / bot / lista negra.

ParameterInDescription
asnpathNúmero do ASN sem o prefixo AS, ex.: 15169.
limitqueryIntervalos por página. Padrão 50, máximo 200.
offsetqueryIntervalos a ignorar. Padrão 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 um ASN: identificador, nome, país, tipo de alocação, datas de registro, o RIR e seus contatos.

ParameterInDescription
asnpathNúmero do ASN sem o prefixo AS, ex.: 15169.
curl https://ipto.to/v1/asn/15169/whois # {"asn":15169,"available":true,"reason":null,"handle":"AS15169","name":"GOOGLE","country":"US", # "allocationType":"...","registeredDate":"...","lastChangedDate":"...","rir":"arin","contacts":[...]}

available é false com um reason quando o registro está inacessível.

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

Onde um ASN realmente está: pontos em nível de cidade geolocalizados a partir de uma amostra dos seus maiores intervalos, mais as cidades mais comuns. Alimenta o mapa de distribuição da página do ASN.

ParameterInDescription
asnpathNúmero do ASN sem o prefixo AS, ex.: 15169.
curl https://ipto.to/v1/asn/15169/geo-sample # {"asn":15169,"sampled":true,"sample_size":30,"points":[{"city":"Council Bluffs","state":"Iowa", # "country_code":"US","latitude":41.2591,"longitude":-95.8517}, ...],"top_cities":[...]}

Uma amostra, não a lista completa de intervalos. Use /v1/asn/:asn/ranges para todos os intervalos.

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

Domínios hospedados em um ASN, encontrados por DNS reverso (PTR) em uma amostra de seus endereços. Cada entrada traz o domínio raiz, o hostname PTR e o IP amostrado.

ParameterInDescription
asnpathNúmero do ASN sem o prefixo AS, ex.: 15169.
curl https://ipto.to/v1/asn/15169/hosted-domains # {"asn":15169,"sampled":true,"sample_size":5,"domains":[{"root_domain":"googleusercontent.com", # "ptr_hostname":"0.0.214.35.bc.googleusercontent.com","sample_ip":"35.214.0.0"}, ...]}

Amostrado, então é uma pista do que o ASN hospeda, não uma lista completa. Para um único IP use /v1/ip/:ip/hosted-domains.

GET/v1/asn/:asn/relationships

Relações BGP de um ASN: pares, provedores upstream e clientes downstream, com contagens.

ParameterInDescription
asnpathNúmero do ASN sem o prefixo AS, ex.: 15169.
curl https://ipto.to/v1/asn/15169/relationships # {"asn":15169,"available":true,"peers":[],"upstreams":[],"downstreams":[], # "peer_count":0,"upstream_count":0,"downstream_count":0}

available é false quando a fonte de dados BGP não pôde ser acessada. Arrays vazios com available: true significam que nada foi informado para esse ASN.

GET/v1/ip-ranges

Diretório do espaço IPv4: uma entrada por bloco /8 com quantos intervalos, países e ASNs ele contém e seu país principal. Comece aqui e aprofunde com /v1/ip-ranges/:a e /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

Os blocos /16 dentro de um /8 (por exemplo 8.0.0.0/8), com as mesmas contagens de intervalos, países e ASNs por bloco.

ParameterInDescription
apathPrimeiro 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

Os intervalos atribuídos dentro de um /16 (por exemplo 8.8.0.0/16), cada um com o ASN ao qual pertence, mais as contagens por bloco.

ParameterInDescription
apathPrimeiro 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

Uma fatia do payload Nearby para uma coordenada, para que o cliente renderize cada parte conforme chega: geocodificação reversa, pontos de interesse ou estatísticas locais de crime.

ParameterInDescription
latqueryLatitude, obrigatório.
lonqueryLongitude, obrigatório.
partqueryQual fatia: geocode, poi ou crime. Um valor desconhecido retorna 400.
countryquerySomente part=crime: código de país ISO. Há dados de crime para US e GB.
regionquerySomente part=crime: nome do estado ou região, ex.: Utah.
cityquerySomente part=crime: nome da cidade, ex.: Orem.
langqueryOpcional. Localiza os rótulos de lugares (mesmos códigos da tabela de localização acima).
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

Tempo e distância de carro entre dois pontos. Um caminho rápido: dispensa a geocodificação reversa e a busca de pontos de interesse que /v1/places/:ip faz.

ParameterInDescription
from_latqueryLatitude de origem, obrigatório.
from_lonqueryLongitude de origem, obrigatório.
dest_latqueryLatitude de destino. Use com dest_lon ou informe dest_address.
dest_lonqueryLongitude de destino.
dest_addressqueryDestino em texto livre, geocodificado para você. Usado quando dest_lat/dest_lon estão ausentes.
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}}

Quando nenhum destino pode ser resolvido, a resposta tem to: null, commute: null e uma string reason.

GET/v1/address-lookup

O payload de /v1/places/:ip ancorado em um endereço digitado em vez de um IP: geocodificação, localidade e uma estimativa opcional de trajeto.

ParameterInDescription
qqueryEndereço em texto livre, obrigatório.
dest_latqueryLatitude de destino opcional, para incluir uma estimativa de trajeto (com dest_lon).
dest_lonqueryLongitude de destino opcional.
dest_addressqueryDestino opcional em texto livre, em vez de dest_lat/dest_lon.
partquerypart=geo retorna apenas o rótulo e as coordenadas, para uma primeira renderização mais rápida.
langqueryOpcional. Localiza os rótulos de lugares (mesmos códigos da tabela de localização acima).
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 é false quando o endereço não pôde ser geocodificado.

GET/v1/address-suggest

Autocompletar de endereços: alguns locais correspondentes a um endereço parcial, opcionalmente priorizando um ponto.

ParameterInDescription
qqueryTexto parcial do endereço, obrigatório.
near_latqueryLatitude opcional para priorizar resultados próximos.
near_lonqueryLongitude opcional para priorizar resultados próximos.
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=

O documento completo de clima, para um nome de lugar, código postal, coordenadas ou IP. Escolha os blocos que precisa com include: current, hourly, daily, astro (sol e lua), solar, indicators, alerts, marine, air_quality, nowcast, ou all. Os locais dos EUA vêm do National Weather Service e o resto do mundo do MET Norway; meta.source informa qual. Sem include você recebe o formato simples { query, weather } descrito acima.

ParameterInDescription
q / lat+lon / ipqueryOnde: q (cidade, código postal ou "lat,lon"), ou lat e lon, ou ip. Um dos três é obrigatório.
countryqueryOpcional. Código ISO ou nome do país para resolver um q ambíguo, por exemplo country=FR para o código postal 75001.
includequeryObrigatório para este formato. Separados por vírgula: current, hourly, daily, astro, solar, indicators, alerts, marine, air_quality, nowcast, ou all.
unitsquerymetric (padrão) ou imperial. Os nomes dos campos acompanham a unidade: temp_c vira temp_f, wind_kmph vira wind_mph, precip_mm vira precip_in.
wind_unitquerykmh, ms, mph ou kn. Altera apenas a unidade do vento.
hoursqueryEntradas horárias a retornar, 1-240. Padrão 48. As próximas são horárias e as seguintes de 6 em 6 horas; step_hours indica qual.
daysqueryEntradas diárias a retornar, 1-9. Padrão 7. Os dados dos EUA cobrem 7 dias.
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 quais campos existem para o local: probabilidade de chuva, rajadas e probabilidade de trovoada existem só nos EUA e nos países nórdicos e são null (nunca zero) nos demais. alerts são avisos oficiais dos EUA e da Noruega; marine, air_quality e nowcast cobrem apenas a Noruega e águas próximas e trazem available: false nos demais lugares. Tudo em meta.derived é uma estimativa do ipto.to, e indicators são sinalizações derivadas, não avisos oficiais. Mantenha meta.attribution ao exibir os dados (os dados do MET Norway são CC BY 4.0).

GET/v1/weather/history

O registro diário do próprio ipto.to para lugares já consultados: a máxima mais alta, a mínima mais baixa e a maior precipitação vistas nos instantâneos de previsão do dia. Só há dados para lugares já solicitados, e o histórico se acumula com o tempo.

ParameterInDescription
q / lat+lon / ipqueryOnde: q (cidade, código postal ou "lat,lon"), ou lat e lon, ou ip. Um dos três é obrigatório.
daysqueryDias recentes a retornar, 1-400. Padrão 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."}

São instantâneos de previsão, não observações de estações nem reanálise; portanto, não os use como histórico observado. 404 significa que ainda não há instantâneos registrados para esse lugar.

GET/v1/weather/radar/frames

Os quadros de animação de radar disponíveis, do mais antigo ao mais recente, cada um com um timestamp Unix e o id do quadro a usar na URL do 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

Um tile de mapa de radar (PNG) para um quadro, em uma posição z/x/y padrão de mapa web. Servido pela mesma origem, para que um mapa o carregue sem requisição a terceiros.

ParameterInDescription
framepathId do quadro de /v1/weather/radar/frames (hexadecimal minúsculo).
zpathNível de zoom.
xpathColuna do tile.
ypathLinha do 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

Um tile de mapa de imagens de satélite para uma posição z/x/y padrão de mapa web, servido pela mesma origem.

ParameterInDescription
zpathNível de zoom.
xpathColuna do tile.
ypathLinha do 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 legível por máquina para /v1/email/:email, escrito para que agentes LLM e MCP chamem o endpoint de e-mail sem ler esta documentação.

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

Referência de campos de busca de IP

FieldTypeDescription
ipstringO endereço IP consultado.
versionstring"v4" ou "v6".
bogonbooleantrue se este for um endereço privado, reservado ou não roteável.
bogon_typestring|nullCódigo do motivo se for bogon: "loopback", "private", "link-local", "multicast", "reserved", "documentation", "unspecified".
asninteger|nullNúmero do Sistema Autônomo que anuncia este IP.
asn_namestring|nullNome curto do ASN (ex.: "GOOGLE").
asn_orgstring|nullOrganização registrada no ASN (ex.: "Google LLC").
asn_typestring|nullCategoria do ASN: "hosting", "isp", "business", "education", "government", "mobile", "residential".
continentstring|nullNome completo do continente (ex.: "North America").
continent_codestring|nullCódigo de continente de duas letras: AF AS EU NA SA OC AN.
country_codestring|nullCódigo de país ISO 3166-1 alpha-2 (ex.: "US") do país onde o IP está localizado, a partir dos mesmos dados de geolocalização da cidade e das coordenadas. Sem correspondência de geolocalização, usa-se o país de registro do ASN (asn_country_code). Nome do país, bandeira, moeda etc. derivam dele.
country_namestring|nullNome completo do país em inglês (ex.: "United States").
country_flagstring|nullEmoji da bandeira do país (ex.: "🇺🇸").
is_eubooleantrue se o país for um estado-membro da UE (27 membros).
citystring|nullNome da cidade. Preenchido em autoconsulta, e em consultas explícitas onde qualquer uma das fontes geográficas combinadas (IP2Location ou MaxMind) tem correspondência — verifique geo_precision.
statestring|nullRegião administrativa/subdivisão. Mesma disponibilidade de city.
postal_codestring|nullCEP/código postal. Preenchido em autoconsulta, e em consultas explícitas onde IP2Location (preferencial) ou MaxMind tem correspondência — mesma disponibilidade de city.
latitudenumber|nullLatitude decimal. Mesma disponibilidade de city.
longitudenumber|nullLongitude decimal. Mesma disponibilidade de city.
timezonestring|nullFuso horário — mesma disponibilidade de city. Um identificador IANA (ex.: "America/New_York") em autoconsulta. Em consultas explícitas o formato depende de qual fonte deu match: uma string de UTC-offset como "-08:00" do IP2Location, ou um nome IANA do MaxMind.
geo_precisionstringQuão precisos são os dados de localização: "city", "country" (a consulta em nível de cidade não teve correspondência) ou "none".
geo_country_codestring|nullPaís onde o IP está localizado, segundo os dados de geolocalização (ISO 3166-1 alfa-2). Igual a country_code sempre que definido. null se não houver correspondência de geolocalização.
asn_country_codestring|nullPaís de registro do titular do ASN (ISO 3166-1 alpha-2). Pode diferir de country_code em redes de CDN, VPN, hospedagem ou anycast anunciadas de um país diferente daquele em que o titular está registrado. null se o IP não tiver entrada de ASN.
currency_codestring|nullCódigo de moeda ISO 4217 do país (ex.: "USD").
exchange_rate_usdnumber|nullUnidades de moeda local por 1 USD, de um feed de taxa de referência sincronizado diariamente cobrindo 154 moedas. null para moedas fora desse conjunto.
calling_codestring|nullCódigo de discagem do país incluindo o prefixo + (ex.: "+1").
languagesstring[]Idiomas oficiais/reconhecidos do país, em inglês.
tldstring[]Domínio(s) de topo de código de país, ex.: [".us"].
capitalstring|nullNome da capital.
bordersstring[]Códigos ISO alpha-2 dos países fronteiriços.
is_datacenterbooleantrue se o IP pertencer a um provedor de hospedagem ou nuvem.
is_mobilebooleantrue se o IP estiver registrado a uma operadora móvel.
is_residentialbooleantrue se o IP for classificado como banda larga residencial.
connection_typestring"mobile", "datacenter" ou "unknown" — derivado da mesma classificação de is_mobile/is_datacenter. Deliberadamente não tenta uma distinção residencial-vs-corporativo: isso não é confiavelmente derivável apenas do texto do nome da organização do ASN, então um ASN que não é classificado com confiança como mobile ou datacenter permanece "unknown" em vez de ser adivinhado.
is_botbooleantrue se o IP estiver associado a infraestrutura de bot conhecida.
is_proxybooleantrue se o IP for um ponto de saída de proxy conhecido.
is_vpnbooleantrue se o IP estiver dentro de uma faixa de servidor VPN conhecida do feed de ameaças.
is_torbooleantrue se o IP for um nó de saída Tor confirmado.
is_abuserbooleantrue se o IP estiver dentro de uma faixa de rede sinalizada por múltiplos feeds de inteligência de abuso.
abuse_scoreinteger|nullPontuação de gravidade de 1 a 10 quando is_abuser é true, a partir de corroboração entre feeds. null caso contrário.
risk_tierstring|null"critical" (8-10), "high" (5-7) ou "medium" (3-4) — derivado de abuse_score. null se não sinalizado.
threat_typestring|nullA categoria correspondente mais acionável quando is_tor/is_vpn/is_abuser se sobrepõem: "tor_exit" > "abuser" > "vpn". null se nenhuma corresponder.
flagsobjectObjeto compatível com versões anteriores que espelha os campos is_*. Chaves: hosting, mobile, residential, bot, blacklisted, vpn, tor, abuser.
meta.data_versionstringData do dataset usado na consulta (YYYY-MM-DD). "cf-edge" para autoconsulta. "bogon" para faixas privadas.
meta.cachedbooleantrue se a resposta foi servida a partir da camada de cache.
meta.langstringO idioma efetivamente usado nesta resposta — corresponde a ?lang= quando informado, ou ao valor resolvido a partir de Accept-Language, ou "en".
meta.lang_source"param"|"header"|"default"Como lang foi determinado: "param" (?lang= foi passado), "header" (resolvido a partir de Accept-Language), ou "default" (nenhum dos dois estava presente).

Formatos de saída

Buscas de IP, ASN e país suportam todas ?format=.

FormatContent-TypeUsage
jsonapplication/jsonPadrão. Resposta estruturada completa.
csvtext/csvPares chave,valor simples. Objetos aninhados omitidos.
texttext/plainLinhas key: value. Um campo por linha.
xmlapplication/xmlEstrutura aninhada completa, arrays repetem a tag.
yamlapplication/x-yamlEstrutura aninhada 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"

Localização

Passe ?lang= em /v1/ip, /v1/asn/:asn ou /v1/country/:code para localizar country_name e continent. Todo o resto (nomes de organização de ASN, nomes de cidade, códigos de moeda) permanece na forma original — são identificadores e nomes próprios, não texto de interface. Códigos não suportados retornam ao inglês em vez de gerar erro.

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

Sem ?lang=? Envie um cabeçalho Accept-Language em vez disso — os mesmos endpoints também o leem, então um simples curl -H "Accept-Language: es" https://ipto.to/v1/ip/8.8.8.8 localiza a resposta sem precisar de query string. Um ?lang= explícito sempre tem prioridade quando ambos estão presentes. Observação: a variável de ambiente do shell LANG/LC_ALL (ex.: LANG=es_ES.UTF-8 curl ...) só define o locale do próprio curl — o curl nunca a lê nem a transforma em cabeçalho, portanto ela não tem efeito no idioma da resposta. Accept-Language ou ?lang= são as duas únicas formas que realmente funcionam.

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

Toda resposta de /v1/ip, /v1/asn/:asn e /v1/country/:code inclui lang e lang_source (aninhado em meta no /v1/ip; no nível superior nos outros dois), para que você sempre saiba exatamente qual idioma foi aplicado e como ele foi escolhido — "param", "header" ou "default" — sem precisar adivinhar a partir da requisição que você enviou.

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

A localização completa de chaves e valores é o comportamento padrão sempre que você define um lang diferente do inglês — todos os campos, incluindo as chaves aninhadas flags e meta, voltam renomeados para o idioma escolhido, e os valores fixos de enumeração (risk_tier, threat_type, connection_type, geo_precision, bogon_type, asn_type) também são traduzidos. Precisa do formato antigo com chaves em inglês? Adicione &localize=0 a /v1/ip para desativar.

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

Exemplos 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)

Limites de taxa

Os limites são aplicados por dia (UTC), contados por endereço IP no plano gratuito ou por chave no Pro/Enterprise. Exceder o seu limite retorna HTTP 429 com um cabeçalho Retry-After. Para cargas de trabalho de produção, veja preços.

Aplica-se a todo endpoint /v1/*, ao servidor /mcp, e aos atalhos curl ipto.to / curl ipto.to/:ip. GET /ip é a única exceção — um simples eco de cabeçalho sem custo de consulta, então não consome nenhum orçamento.

TierRequests / dayAuth
Free1,000Nenhum
Pro100,000Chave de API (cabeçalho)
EnterpriseUnlimitedChave de API + endpoints dedicados

Códigos de erro

StatusMeaning
200OK. A resposta inclui os dados.
202Os dados do feed estão sincronizando. Tente novamente em 45 segundos.
400Requisição inválida. IP, ASN ou código de país inválido.
404ASN ou país não encontrado no dataset.
503Dataset ainda não disponível. A ingestão inicial pode estar em execução.