API 參考

簡單一致的端點。CORS 已開放。無需驗證。完整多語言支援 —— 每個欄位的鍵與值都會翻譯成 10 種以上的語言。

基礎 URL

https://ipto.to

快速開始

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

終端機捷徑:當請求來自 curl、Wget 或 HTTPie 時(透過 User-Agent 偵測),curl ipto.to 或 curl ipto.to/8.8.8.8(不需要 https:// 或 /v1/ip/)也同樣有效。它回傳的是較精簡、類似 ipinfo.io 風格的欄位集合(ip、country、city、asn、org 等),並非下方完整的結構描述 — 若需要本頁記載的完整回應,請直接使用 /v1/ip 路徑。

純 IP:curl ipto.to/ip(或直接在瀏覽器開啟)只會以純文字回傳您自己的 IP 地址 — 73.9.114.155,沒有 JSON,也沒有頁面外觀。與 ipinfo.io/ip 完全對應。詳見下方 GET /ip。

預設支援多語言:將 ?lang= 設為任何支援的代碼,回應中的每個 JSON 鍵與值都會翻譯回來 — 不只是國家/大陸。完整語言列表與 &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

建構任何 ipto 請求,複製成你所用語言可直接執行的程式碼,或直接在此送出並查看即時回應。免費方案不需要金鑰。

MCP 伺服器

ipto 也可作為 MCP(Model Context Protocol)工具伺服器使用 — 將 Claude Desktop、Cursor 或任何支援 MCP 的用戶端指向下方端點,即可取得 14 個可呼叫的工具: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,以及 patent_lookup。採用 JSON-RPC 2.0 over Streamable HTTP — 僅支援 POST,不需要 session 或 SSE。驗證方式與 REST API 相同:免費方案可省略(每日依 IP 限 1,000 次請求),或在端點 URL 後方加上 ?api_key=。

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

若用戶端僅支援 stdio,可透過以下方式橋接: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"}}}'

端點

GET/ip

只會以純文字(Content-Type: text/plain)回傳發出請求的客戶端本身的公開 IP 地址 — 例如 73.9.114.155。與 ipinfo.io/ip 完全對應:無論透過 curl、Wget、HTTPie,或直接以瀏覽器造訪都行為一致(不像上方的 curl ipto.to 捷徑,此路徑不做 User-Agent 偵測),在瀏覽器中開啟時只會顯示純粹的 IP,沒有任何頁面外觀。

沒有參數,也沒有查詢字串。若需要完整的地理位置/威脅情報物件,請改用下方的 GET /v1/ip。此路由會直接讀取連線的 IP(不經過 D1/KV 查詢),且不計入每日請求額度 — 詳見 請求頻率限制。

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

回傳發出請求之 IP 的地理位置與威脅情報,並透過 CF edge 物件提供城市級別的資料。

沒有必填參數。支援 ?lang=、?fields=、?format= — 詳見下方的在地化與輸出格式。

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

查詢任意 IPv4 地址。當該 IP 落在 IP2Location 或 MaxMind 這兩個合併地理資料集之一時,會填入城市級別欄位(city、state、postal_code、latitude、longitude、timezone) — 請檢查回應中的 geo_precision,以確認取得的是城市級別還是國家級別的資料。timezone 的格式取決於相符的資料來源(IP2Location 提供 UTC 偏移字串,MaxMind 提供 IANA 名稱)。IPv6 查詢目前僅回傳國家級別的資料。

ParameterInDescription
ippath必填。任何有效的 IPv4 或 IPv6 地址。
langquery選填。將 country_name 與 continent 在地化:en(預設)、pt, fr, de, zh-TW, ko, zh-CN, ja-JP, es-ES, ar-SA, hi-IN。
fieldsquery選填。以逗號分隔要包含的欄位清單。例如 ?fields=ip,country_code,is_vpn
formatquery選填。回應格式:json(預設)、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

首頁搜尋列背後所使用的統一搜尋端點。會自動偵測 :query 是 IP、ASN(AS15169 或 15169)、兩碼國家代碼、電子郵件,還是電話號碼,然後將所有相關檢查彙整成單一回應。若查詢對象是 IP,伺服器端會平行展開,同時執行主要的 IP 查詢,以及 RPKI、IP-to-company、行動業者、關聯網域與地點等查詢 — 因此單次搜尋只會消耗您每日請求額度中的一次,而不是每項功能各算一次。

ParameterInDescription
querypath必填。可以是 IP、ASN、國家代碼、電子郵件或電話號碼。
FieldTypeDescription
querystring解碼後收到的原始輸入。
detected_typestring"ip"、"asn"、"country"、"email" 或 "phone" 其中之一。
ipobject|null當 detected_type 為 "ip" 時才會出現 — 結構與 GET /v1/ip/:ip 相同。
rpkiobject|nullIP 查詢時才會出現 — 結構與 GET /v1/ip/:ip/rpki 相同。
companyobject|nullIP 查詢時才會出現 — 結構與 GET /v1/ip/:ip/company 相同。
whoisobject|nullIP 查詢時才會出現 — 結構與 GET /v1/ip/:ip/whois 相同。
carrierobject|nullIP 查詢時才會出現 — 結構與 GET /v1/ip/:ip/carrier 相同。
asn / country / email / phoneobject|null當 detected_type 相符時,會取代上方六個欄位出現 — 結構與該類型專屬端點相同。

每個子欄位皆獨立降級 — 若上游服務(RIPEstat、某個 RDAP 伺服器、crt.sh)緩慢或失敗,只會使該欄位變成 null,而不會導致整個搜尋失敗。只有主要查詢本身無效(例如格式錯誤的 IP)時,整個請求才會回傳錯誤狀態。

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

反向 DNS — 透過 DNS-over-HTTPS 進行單次即時 PTR 查詢,並非網域列舉資料庫。若該 IP 沒有 PTR 紀錄,則回傳 null。

ParameterInDescription
ippath必填。任何有效的 IPv4 或 IPv6 地址。
curl https://ipto.to/v1/ip/8.8.8.8/hostname # {"ip":"8.8.8.8","hostname":"dns.google"}
GET/v1/ip/:ip/rpki

針對某 IP 目前公告路由的 RPKI 路由來源驗證,透過 RIPEstat 即時解析(本地端不會匯入或同步任何 ROA 資料庫)。status 只會是 "valid"、"invalid" 或 "unknown" 其中之一 — 絕不會從其他訊號合成推論;只要 RIPEstat 失敗或逾時,就會回傳 "unknown" 並附上原因字串,而非錯誤。

ParameterInDescription
ippath必填。任何有效的 IPv4 或 IPv6 地址。
FieldTypeDescription
asninteger|null目前公告該路由的 ASN,即時解析取得 — 並非源自本站自有的 ASN 資料集。
prefixstring|null目前公告的 CIDR 前綴。
statusstring"valid"、"invalid" 或 "unknown" 其中之一。
validating_roasarrayRIPEstat 比對到的具體 ROA,每筆皆包含 origin/prefix/max_length/validity。
validatorstring|nullRIPEstat 所使用的 RPKI 驗證器(例如 "routinator")。
reasonstring|null說明為何結果為 "unknown" — 例如不存在涵蓋該路由的 ROA,或 RIPEstat 無法連線。
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

明確指定 (ASN, prefix) 的 RPKI 驗證 — 適用於您已經知道確切要檢查的路由,而不需要依賴上方由 IP 推導出路由的便捷方式。

ParameterInDescription
asnquery必填。ASN 編號,可加或不加 AS 前綴。例如 15169 或 AS15169。
prefixquery必填。CIDR 前綴,例如 8.8.8.0/24。
curl "https://ipto.to/v1/rpki?asn=15169&prefix=8.8.8.0/24"
GET/v1/ip/:ip/company

結合 RDAP(結構化 WHOIS)的註冊人資料與 ASN 本身的組織名稱,判斷某 IP 註冊登記的組織,並以分類式的信心等級呈現,而非數值分數。

ParameterInDescription
ippath必填。任何有效的 IPv4 或 IPv6 地址。
FieldTypeDescription
company_namestring|null解析出的公司名稱 — 當 confidence 為 "low"(兩個來源意見不一致,因此不會將任一方視為權威)或 "none" 時為 null。
rdap_org_namestring|nullRDAP 的註冊人名稱,與 company_name 相互獨立。
asn_org_namestring|nullASN 本身的組織名稱,與 company_name 相互獨立。
confidencestring"high"(來源一致)、"medium"(僅有一個來源可用)、"low"(來源不一致 — 兩者皆會顯示),或 "none"。
reasonstring以白話文字說明信心等級的判斷依據。
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

底層的 RDAP 註冊紀錄本身 — 包含網路區塊、註冊/最後異動日期,以及 RDAP 存檔中的每一位聯絡人。這與上方的 /company 不同:後者會將同一份註冊人資料與 ASN 組織名稱互相比對,整合成單一信心評分的答案;本端點則是原封不動地回傳原始紀錄,較接近傳統 WHOIS 的輸出。同樣支援 IPv6 位址。

ParameterInDescription
ippath必填。任何有效的 IPv4 或 IPv6 地址。
FieldTypeDescription
availableboolean若無法解析出 RDAP 紀錄則為 false — 詳見 reason。
reasonstring|null說明 available: false 的原因。
startAddress / endAddress / cidrstring|null已註冊的網路區塊。
netName / netHandle / parentHandlestring|nullRIR 指派給該網路物件的識別碼。
countrystring|null依 RDAP 資料所示的註冊人所在國家。
allocationTypestring|null例如 "direct allocation"、"reassigned"。
registeredDate / lastChangedDatestring|null取自 RDAP 紀錄的 ISO 時間戳記。
rirstring|null提供此紀錄的區域網路註冊機構(ARIN、RIPE、APNIC、LACNIC、AFRINIC)。
contactsarrayRDAP 存檔中的每一位聯絡人,各自附有角色、姓名、電子郵件與 handle — 並非只回傳第一筆相符的資料。
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

針對被歸類為行動網路的 IP,盡力進行電信業者識別,並與 MCC/MNC 業者目錄交叉比對。刻意不提供單一的 carrier 欄位 — 詳見下方的 matched_carrier_entries 與 note — 因為單一業者名稱會讓人誤以為是針對個別用戶的即時判斷,而這份資料無法誠實地支撐這種說法。

ParameterInDescription
ippath必填。任何有效的 IPv4 或 IPv6 地址。
FieldTypeDescription
is_mobile_networkboolean若為 false,就到此為止,目錄會是空的 — 對非行動網路的 ASN 不做任何猜測。
asn_organizationstring|nullASN 本身的組織名稱。
matched_carrier_entriesarrayMCC/MNC 目錄中,業者名稱與 asn_organization 模糊比對相符的項目,範圍限定於該 IP 所在國家。
notestring說明此欄位可以以及不能佐證的範圍。
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

透過 IP 的反向 DNS(PTR)主機名稱與憑證透明度日誌(crt.sh),找出與該 IP 相關聯的網域 — 並非一般性的反向 IP 查詢。回應本身的 limitations 欄位會明確列出此功能能找到與找不到的內容。

ParameterInDescription
ippath必填。任何有效的 IPv4 或 IPv6 地址。
FieldTypeDescription
ptr_hostnamestring|null該 IP 的反向 DNS 主機名稱;若無 PTR 紀錄則為 null。
root_domainstring|null由 ptr_hostname 推導出的可註冊網域。
subdomains_seenarray|null透過憑證透明度找到的子網域。null 代表 crt.sh 查詢本身未能完成 — 這與空陣列不同,空陣列代表查詢確實執行過,但沒有找到任何結果。
limitationsstring說明此功能在架構上偵測不到的情況(無 PTR、共用主機、未申請憑證的網域)。
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

批次查詢 — 每次請求最多 100 個 IP,僅限 Pro/Enterprise 方案。回傳的物件會以每個 IP 作為鍵值。由於採平行讀取快取與資料庫,速度比依序個別呼叫更快。批次中的每個 IP 都會計入您的每日請求額度,與個別查詢的計算方式相同。免費方案的請求會收到 403 — 詳見 pricing。

ParameterInDescription
bodybody (JSON)IP 字串組成的 JSON 陣列。例如 ["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

依編號查詢自治系統。回傳組織名稱、國家、洲別、IP 範圍數量、分類類型、匯率,以及地區參考資料(語言、tld、首都、鄰國)。

ParameterInDescription
asnpathASN 編號,不含 AS 前綴。例如 Google 的 15169。
langquery選填。將 country_name 與 continent 在地化:en(預設)、pt, fr, de, zh-TW, ko, zh-CN, ja-JP, es-ES, ar-SA, hi-IN。
formatquery選填。回應格式:json(預設)、csv、text、xml、yaml。
curl https://ipto.to/v1/asn/15169
GET/v1/places/:ip

對某 IP 既有的城市級別位置進行反向地理編碼,接著回傳附近的興趣點(餐廳、公園、學校、交通、知名地標)、若有資料來源可用的當地犯罪資料(僅限英國與美國),以及可選的即時開車通勤時間估算。

ParameterInDescription
ippath必填。任何有效的 IPv4 地址。目前尚不支援 IPv6。
dest_latquery選填。用於通勤估算的目的地緯度 — 須與 dest_lon 搭配使用。
dest_lonquery選填。用於通勤估算的目的地經度 — 須與 dest_lat 搭配使用。
dest_addressquery選填。用於通勤估算的自由格式目的地地址,會自動進行正向地理編碼。若同時提供 dest_lat/dest_lon,此參數會被忽略。
FieldTypeDescription
geocodeobject|nullcountry、countryCode、region、city、neighbourhood、displayName — 若該 IP 沒有可供地理編碼的城市級別位置,則為 null。
locality.restaurants / .parks / .schools / .transitarray每個類別最多列出 4 筆最近的項目,各自附有 name 與 distanceMeters。
locality.notablearray透過 Wikidata 取得的附近知名地標,並附上簡短說明。
locality.usCrimeobject|null最近轄區的暴力/財產犯罪總計 — 僅限美國,且該部署環境須設定 FBI_CRIME_API_KEY。其餘地區一律為 null。
locality.ukCrimeobject|null方圓 1 英里內的街道層級案件摘要 — 僅限英國。
locality.caCrimenull一律為 null — 目前尚未串接任何全加拿大的犯罪資料來源(詳見 docs/places.md)。
commuteobject|nulldurationMinutes 與 distanceKm,僅在提供目的地且 OpenRouteService 成功回傳路線時才會出現。其餘情況一律為 null — 絕不會進行推測性計算。
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

國家層級的彙整統計資料,加上地區參考資料(貨幣、匯率、語言、tld、首都、鄰國)。

ParameterInDescription
codepathISO 3166-1 alpha-2 國家代碼。例如 US、DE、JP。
langquery選填。將 country_name 與 continent 在地化:en(預設)、pt, fr, de, zh-TW, ko, zh-CN, ja-JP, es-ES, ar-SA, hi-IN。
formatquery選填。回應格式:json(預設)、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

解析 User-Agent 字串。回傳瀏覽器、作業系統、裝置類型,以及機器人偵測結果。預設會讀取呼叫端自身的 User-Agent 標頭,也可透過 ?ua= 傳入任意字串。

ParameterInDescription
uaquery選填。要解析的 URL 編碼 User-Agent 字串。預設使用該請求本身的 User-Agent 標頭。
curl "https://ipto.to/v1/ua?ua=Mozilla%2F5.0+%28iPhone%3B+CPU+iPhone+OS+17_0%29"
GET/v1/phone/:number

一律免費驗證並格式化電話號碼:透過自架解析器提供地區、線路類型,以及 E.164/國內/國際格式,不呼叫任何服務商。當每個 IP/金鑰的月度進階額度可用時(Free 方案每月 100 次,付費方案更多 — 請參閱價格),同一請求還會從即時電信業者查詢服務回傳即時電信業者名稱、攜碼狀態,以及服務商分類的電話類型 — 請參閱 source 及下方欄位。不論方案為何,一律會附上已在地化的 country_name,以及 lang/lang_source — 請參閱在地化。進階額度用盡,或上游發生任何問題時,會無縫回退到上方的免費欄位;請求不會因此而失敗。若需要國家層級的網路業者參考資料,而非逐號查詢,請改用 GET /v1/carriers。

ParameterInDescription
numberpath必填。任何電話號碼,建議使用 E.164 格式(例如 +14155552671)。開頭的 + 需進行 URL 編碼。
countryquery選填。用於解析格式不明確之國內號碼的兩碼國家代碼提示,例如 ?country=US。
modequery選填。當進階層級可用時,?mode=current 會要求取得號碼的即時(而非 SIM 卡發行時的)電信業者。若請求回退到免費方案,此參數會被忽略。
FieldTypeDescription
validboolean若該號碼符合其所屬地區有效的編號規則格式,則為 true。
country_codestring|null該號碼所屬地區的 ISO 3166-1 alpha-2 代碼。
national_formatstring|null依該地區自身的國內慣例格式化。
international_formatstring|null附上國碼並加上空格的格式,例如 "+1 415 555 2671"。
e164string|null標準 E.164 格式,例如 "+14155552671"。
line_typestring|nullFIXED_LINE、MOBILE、FIXED_LINE_OR_MOBILE、VOIP、TOLL_FREE、PREMIUM_RATE 或類似值。許多編號規則(包括北美)光憑號碼本身無法區分市話與行動門號。
sourcestring如果此請求有可用的即時電信業者查詢額度,則為"premium";如果回退到上方的免費解析器,則為"local"。下方的 carrier、phone_type、original_carrier、is_ported、phone_region 與 country_prefix 只有在 source 為"premium"時才會有值 — 再往下的 country_name 與 lang/lang_source 則不論方案一律有值。
phone_typestring|null即時電信業者查詢服務商自有的分類之一:mobile、fixed_line、voip、toll_free、premium_rate、shared_cost、personal_number、pager、uan、voicemail 或 unknown — 並不僅限於前四項,那些只是最常見的範例。當 source 為"local"時為 null — 與上方的 line_type(來自本機解析器,採用另一套分類)不同。
carrierstring|null號碼目前所屬網路業者的名稱。當 source 為"local"時為 null。
original_carrierstring|null如果號碼已攜碼轉出,則為其最初發行所屬的網路業者。當 source 為"local"或號碼未攜碼時為 null。
is_portedboolean|null如果號碼已從原電信業者攜出,則為 true。當 source 為"local"時為 null。
phone_regionstring|null此號碼的所在地/州省層級詳細資訊(例如「California」),比上方的 country_code 更細緻。當 source 為"local"時為 null。
country_prefixstring|null此號碼的國碼,不含開頭的「+」(例如德國為「49」)。當 source 為"local"時為 null。
country_namestring|null完整的國家顯示名稱(例如「Germany」)— 上方的 country_code 僅為 ISO alpha-2 代碼(「DE」),並非顯示名稱。與上方僅限進階方案的欄位不同,此欄位只要有 country_code 就一律會有值,並會透過 ?lang=/Accept-Language 在地化,方式與其他端點的 country_name 欄位相同 — 請參閱下方的 lang/lang_source。
langstring實際套用於上方 country_name 的語言 — 也就是解析後的 ?lang= 值,若未請求或請求的語言不受支援則為「en」。
lang_sourcestring若請求中帶有 ?lang= 則為"param";若改用 Accept-Language 則為"header";若兩者皆無而採用英文則為"default"。與 GET /v1/asn/:asn 及 GET /v1/country/:code 上同名欄位意義相同。
curl "https://ipto.to/v1/phone/+14155552671"
POST/v1/phone/bulk

批次驗證。每個方案都能使用批次功能(與 /v1/ip/bulk 不同) — 免費方案是靠各方案自身的批次上限來限制,而不是回傳 403。免費方案:每次請求 10 筆,每日 100 筆。Pro:每次請求 100 筆,每日 1,000 筆。Enterprise:每次請求 1,000 筆,每日 10,000 筆。此額度與您一般的每日請求限制分開計算 — 詳見 Rate limits。

ParameterInDescription
bodybody (JSON)電話號碼字串組成的 JSON 陣列。
curl -X POST https://ipto.to/v1/phone/bulk \ -H "Content-Type: application/json" \ --data '["+14155552671","+442071838750"]'
GET/v1/carriers

參考資料查詢:列出某個國家已知的行動網路業者(MCC/MNC) — 不對應任何特定電話號碼。資料來自社群維護的 MCC/MNC 彙整表(MIT 授權,最近一次同步於 2026 年 — 詳見 docs 儲存庫),屬於靜態參考表,而非即時資料流,因為編號規則的指派變動並不頻繁,不需要即時更新。

ParameterInDescription
countryquery必填。兩碼國家代碼,例如 ?country=US。
curl "https://ipto.to/v1/carriers?country=US"
GET/v1/email/:email

電子郵件語法驗證、透過 DNS-over-HTTPS 進行的即時 MX 紀錄檢查,以及依社群維護的封鎖清單(CC0 授權,每日同步)偵測拋棄式/臨時網域。不會驗證信箱本身是否確實存在 — 那需要進行本 API 不執行的 SMTP 交握(詳見下方欄位參考,了解 has_mx 究竟能證明與不能證明什麼)。

ParameterInDescription
emailpath必填。任何電子郵件地址,須經 URL 編碼(@ 必須編碼為 %40)。
FieldTypeDescription
valid_syntaxboolean若該地址符合標準電子郵件語法格式,則為 true。不會驗證信箱是否確實存在。
domainstring|null網域部分,已轉為小寫。若 valid_syntax 為 false,則為 null。
has_mxboolean|null若該網域目前至少有一筆 MX 紀錄,則為 true。若語法無效,或 DNS 查詢本身失敗/逾時,則為 null — 請將 null 視為「未知」,而非 false。
disposableboolean|null若該網域符合已知的拋棄式/臨時電子郵件服務商,則為 true。在與 has_mx 相同的情況下為 null。
source"premium"|"local"若本次請求執行了即時檢測,則為 "premium";否則為 "local"(已達到限額,或功能未啟用)— 無論哪種情況,上述欄位(從 valid_syntax 到 disposable)皆會被填入內容。
is_reachablestring|null可選即時檢測給出的整體結論:"safe"(可送達)、"invalid"(遭拒絕)、"risky"(不確定)或 "unknown"(無法確定 — 請重試)。若本次請求未執行即時檢測,則為 null(見下方 source)。
is_catch_allboolean|null若該網域會接收寄往任何地址的郵件,代表無法確認這個特定信箱是否存在,則為 true。未執行即時檢測時為 null。
mailbox_fullboolean|null若即時檢測發現該信箱已滿,則為 true。未執行即時檢測時為 null。
is_role_accountboolean|null若該地址看起來像角色帳戶(例如 support@、admin@)而非個人信箱,則為 true。未執行即時檢測時為 null。
is_disabledboolean|null若即時檢測發現該信箱已被明確停用,則為 true。未執行即時檢測時為 null。
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

將您提供的 IP、電子郵件、電話號碼、User-Agent(任意組合)整合成單一 0–100 分的分數 — 這是 ip-api.com、ipapi.co、ipgeolocation.io、ipify.org、ipregistry.co、ip2location.io、AbstractAPI、IPLocate.io、BigDataCloud(皆經直接查核)都沒有提供的單一融合訊號。四項輸入皆為選填且彼此獨立 — 可任意傳入其中幾項。若省略 ip 則預設為您自己的 IP,若省略 ua 則預設為您自己的 User-Agent 標頭,慣例與 GET /v1/ip 及 GET /v1/ua 相同。未傳入的訊號只是不會出現在回應中,而不會被視為「乾淨」計分 — 其權重會重新分配給您實際提供的訊號。

ParameterInDescription
ipquery選填。預設為您自己的 IP。IPv6 目前尚未納入評分(與本 API 其餘威脅資料部分有相同限制)。
emailquery選填。任何電子郵件地址。
phonequery選填。任何電話號碼。
uaquery選填。預設為您自己的 User-Agent 標頭。
FieldTypeDescription
scoreinteger依所提供訊號計算出的 0-100 加權綜合分數。
risk_tierstring"low"(<20)、"medium"(20-44)、"high"(45-69),或 "critical"(70 以上)。
signalsobject依各輸入項目分列的細項 — 只有您實際提供的輸入才會出現對應的鍵:ip、email、phone、user_agent。每一項都包含自身的組成分數,以及 GET /v1/ip/:ip、/v1/email/:email、/v1/phone/:number 與 /v1/ua 針對該輸入原本就會回傳的相同欄位。
curl "https://ipto.to/v1/fraud-score?ip=1.2.3.4&email=test%40mailinator.com"
GET/v1/screenshot

在真實的無頭 Chrome 實例中(Cloudflare Browser Rendering,並非第三方截圖服務商)渲染指定 URL,並回傳 PNG。內部/私有目標(localhost、RFC 1918 範圍、link-local/雲端中繼資料位址)會在瀏覽器啟動前就被拒絕。此功能受限於 Browser Rendering 自身的平台層級限制,比本 API 其餘部分嚴格許多 — 在較低階的 Cloudflare 方案上,這項限制很可能會比您一般的每日請求額度更早觸發節流。

ParameterInDescription
urlquery必填。必須是 http 或 https。
curl "https://ipto.to/v1/screenshot?url=https://example.com" --output screenshot.png
GET/v1/language

透過本地端的三連字元頻率分析識別文字的語言 — 不呼叫外部服務商、不使用 AI 模型推論、不記錄任何資訊。輸入少於 10 個字元會回傳 null 語言;少於約 30 個字元時仍可能回傳最佳猜測,但 reliable 會是 false。

ParameterInDescription
textquery必填。最多 5,000 個字元 — 超過長度的輸入會被截斷,而非拒絕。
FieldTypeDescription
languageobject|null最佳相符結果的 code(ISO 639-1)、iso639_3、name 與 local_name。若文字過短或無法辨識("und"),則為 null。
reliableboolean輸入過短時為 false — 請將結果視為猜測,而非有把握的判斷。
candidatesarray最多列出 5 個次要候選語言及其相對分數,適用於相近語言的判斷。
curl "https://ipto.to/v1/language?text=Bonjour%2C+comment+allez-vous%3F"
GET/v1/currency/convert

在兩種貨幣之間換算金額(支援 154 種貨幣),使用與每筆 IP、ASN、國家查詢中 currency_code/exchange_rate_usd 相同的每日參考匯率資料 — 在此以獨立的換算端點呈現,而非內嵌於地理位置回應之中。

ParameterInDescription
fromquery必填。三碼 ISO 4217 貨幣代碼。
toquery必填。三碼 ISO 4217 貨幣代碼。
amountquery選填。預設為 1。
FieldTypeDescription
resultnumber換算後的金額。
ratenumber每 1 單位 from 對應的 to 單位數。
updatedstring此次換算所使用之參考匯率同步時間的 ISO 時間戳記。
curl "https://ipto.to/v1/currency/convert?from=USD&to=EUR&amount=100"
GET/v1/currency/rates

完整匯率表(154 種貨幣),可以任何支援的貨幣為基準重新計算,不限於美元。

ParameterInDescription
basequery選填。預設為 USD。
FieldTypeDescription
ratesobject貨幣代碼 → 相對於 base 之匯率的對照表。
curl "https://ipto.to/v1/currency/rates?base=EUR"
GET/v1/currency/history

單一貨幣對最長 90 天的每日參考匯率歷史紀錄 — 即 the currency converter tool 匯率趨勢圖背後的資料。資料先一次性回補,之後由更新 GET /v1/currency/convert 的同一個排程工作每日追加。這是隨時間變化的單一每日參考匯率,而非買賣價差。

ParameterInDescription
targetquery必填。要繪製圖表的三碼 ISO 4217 貨幣代碼。
basequery選填。預設為 USD。
daysquery選填。可為 30、60、90 其中之一。預設為 30。
FieldTypeDescription
seriesarray依日期遞增排列的 { date, rate } 資料點陣列。
statsobject回傳資料序列中的 min、avg、max 與 current。
curl "https://ipto.to/v1/currency/history?base=USD&target=EUR&days=90"
GET/v1/weather

針對地名、郵遞區號、"lat,lon" 座標組合,或 lat + lon、ip,提供目前天氣狀況 — 若加上 detail=1,還會提供逐小時展望與多日預報。美國地點由美國國家氣象局(National Weather Service)提供,其他地區由 MET Norway 提供。加上 include= 可取得完整文件,包含單位選擇、最多 9 天、太陽與月亮、官方警報等 — 請見下方的 include 卡片。weather-lookup 工具還會在明確呼叫此端點之前,先於用戶端自動偵測呼叫者本身的位置。

ParameterInDescription
qquery城市名稱、郵遞區號,或 "lat,lon"(最多 100 個字元)。也可改為傳入 lat 與 lon,或 ip。三者擇一為必填。
detailquery選填。"1" 會在 weather 中加入 pressure_mb/visibility_km/dewpoint_c/sunrise/sunset 等欄位,並附上 forecast 物件(hourly + daily)。預設省略。
FieldTypeDescription
conditionstring|null簡短文字說明。
temp_c / temp_fnumber|null目前氣溫。
feels_like_cnumber|null攝氏「體感溫度」。
humidity_pctnumber|null相對濕度。
wind_kmph / wind_dirnumber|null / string|null風速與 16 方位羅盤方向。
uv_indexnumber|null紫外線指數。
locationobject|null查詢地點解析後的名稱、地區、國家與經緯度 — 而非僅是原始輸入內容。
forecast.hourly[]array僅在 detail=1 時提供。未來 24 小時,以 3 小時為間隔:hour_label、temp_c/temp_f、weather_code、chance_of_rain_pct。
forecast.daily[]array僅在 detail=1 時提供。3 天展望: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

即時代理 USPTO 的 Trademark Status & Document Retrieval(TSDR)系統,依 8 碼流水序號查詢案件狀態 — 每次請求皆直接呼叫,並非快取或轉售的副本。案件狀態資料屬於美國政府著作,依 USPTO 自身的使用條款屬於公共領域,因此每則回應都會附上 source/attribution 欄位,而不會靜默地快取或轉售。商標圖樣/圖片資料刻意排除在範圍之外 — USPTO 的條款將圖片授權與本端點回傳的案件狀態文字資料分開處理。目前尚不支援以註冊號碼查詢;USPTO 目前僅記載序號查詢路徑。歡迎在 Trademark Lookup 工具上試用。

ParameterInDescription
serialpath必填。恰為 8 碼數字,例如 98267877。
FieldTypeDescription
sourcestring固定為 "USPTO TSDR"。
attributionstring依 USPTO 使用條款所要求的必要標示文字。
dataobjectUSPTO 回傳的原始案件狀態資料,直接透傳而未重新塑形 — 已於 2026-08-12 確認可正常運作。在 data.trademarks[0] 之下:status(申請/註冊日期、markElement、descOfMark、tm5StatusDesc)、parties.ownerGroups(依角色列出的所有人姓名/地址)、gsList[](商品/服務說明與類別),以及 prosecutionHistory[](完整案件時間軸)。欄位是否存在會依申請狀態而異 — 例如尚在審查中的申請案尚無 usRegistrationNumber。
curl "https://ipto.to/v1/trademark/98267877" # ANTHROPIC, Reg. No. 8296420
GET/v1/patent/:number

即時代理 USPTO 的 Patent File Wrapper API(Open Data Portal),依 7 至 8 碼發明專利號碼查詢核准狀態 — 每次請求皆直接呼叫,並非快取或轉售的副本。原先鎖定的資料來源(PatentsView 的 Search API)已確認於 2026-03-20 關閉;本端點改為代理其後繼的即時服務。Patent File Wrapper 資料屬於美國政府著作,依 USPTO 自身的使用條款屬於公共領域,因此每則回應都會附上 source/attribution 欄位。涵蓋範圍以申請/審查程序為中心 — 不包含引用關係圖、專利家族、法律狀態欄位或圖片,不像 Lens.org、Espacenet 或 Google Patents 那樣提供。涵蓋範圍自 2001 年申請的案件起算。目前尚不支援設計專利、植物專利與再領證專利;僅支援以核准的發明專利號碼查詢。歡迎在 Patent Lookup 工具上試用。

ParameterInDescription
numberpath必填。7 至 8 碼數字,例如 12393227。僅限已核准的發明專利號碼,不接受申請號碼。
FieldTypeDescription
sourcestring固定為 "USPTO Patent File Wrapper"。
attributionstring依 USPTO 使用條款所要求的必要標示文字。
dataobjectUSPTO 回傳的原始審查紀錄資料,直接透傳而未重新塑形 — 已於 2026-08-12 針對真實專利(12393227、9935534)確認可正常運作。主要欄位:applicationMetaData(inventionTitle、filingDate、applicationStatusDescriptionText、applicationStatusDate、patentNumber、inventorBag[])、recordAttorney.attorneyBag[]、applicationNumberText,以及 eventDataBag[](完整審查時間軸)。若該號碼不存在、屬於設計/植物/再領證專利,或早於 2001 年涵蓋範圍,則回傳 404。
curl "https://ipto.to/v1/patent/12393227" # WEARABLE COMPUTING DEVICE, granted 2025
GET/v1/feeds

分頁呈現的 VPN、Tor 與威脅情報資料流。每頁 200 筆。每筆項目皆包含 IP/CIDR、來源提供者標示、ISP、國家與分類類型。

ParameterInDescription
pagequery頁碼,從 0 起算。預設值:0。
typequery依類型篩選:VPN、Tor Exit Node、Tor Node、High-Risk Threat Intel。
qquery依 IP 或 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

僅提供中繼資料 — 總項目數、各來源筆數,以及最後同步時間。不會回傳 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

分頁呈現的濫用網路範圍。依跨資料源的交叉佐證評分為 1-10 分。風險等級:critical(8-10)、high(5-7)、medium(3-4)。

ParameterInDescription
pagequery頁碼,從 0 起算。預設值:0。
tierquery依風險等級篩選:critical、high、medium。
qquery依網路範圍子字串篩選。
sourcequery選填。依來源摘要名稱篩選,須與 source_feed 回傳的名稱完全一致,例如 'Spamhaus DROP' 或 '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

僅提供中繼資料 — 總網路數、各來源筆數、風險等級分佈,以及最後同步時間。

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

可下載本 API 所使用之開放資料集的 CSV 匯出檔 — 資料相同,且不涉及新的授權條款。asn 與 ranges 一律可用;在特定部署環境中,若該來源的資料集尚未啟用,geo-city 會回傳 503。geo-city 每次僅匯出單一地理資料來源的原始資料列,而非合併檢視 — 可傳入 ?source=primary(預設)或 ?source=secondary。

ParameterInDescription
kindpathasn、ranges、geo-city 其中之一。
sourcequery僅適用於 geo-city。primary(預設)或 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

立即發放 API 金鑰 — 不需要電子郵件,也不需要註冊。每把金鑰起始皆為免費方案(每日 1,000 次請求;不含批次查詢)。Pro 與 Enterprise 金鑰可解鎖更高的每日額度與批次查詢(每次請求最多 100 個 IP) — 詳見 pricing。請妥善保存金鑰 — 之後將無法再次取得。

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

查詢某把金鑰已發出的請求次數。在任何 /v1/* 請求中,透過 X-API-Key 標頭或 ?api_key= 傳入金鑰,即可計入用量。

ParameterInDescription
keyquery必填。由 POST /v1/keys 回傳的金鑰。
curl "https://ipto.to/v1/keys/usage?key=ipto_xxxxxxxx"
GET/v1/ip/:ip/abuse

擁有某個 IP 的網路的濫用檢舉聯絡方式,來自 RDAP:RIR、網路代號、所屬 CIDR 以及濫用檢舉信箱。用於得知檢舉應寄往何處。

ParameterInDescription
ippathIPv4 或 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,並在 failure 中提供原因。

GET/v1/asn/:asn/ranges

某個 ASN 實際公告的 IP 範圍,分頁回傳,每個範圍包含國家以及代管 / 行動 / 住宅 / 機器人 / 黑名單標記。

ParameterInDescription
asnpath不含 AS 前綴的 ASN 編號,例如 15169。
limitquery每頁的 IP 範圍數。預設 50,上限 200。
offsetquery要略過的 IP 範圍數。預設 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

ASN 的註冊機構(RDAP)紀錄:代號、名稱、國家、配置類型、註冊日期、RIR 及其聯絡人。

ParameterInDescription
asnpath不含 AS 前綴的 ASN 編號,例如 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 並附上 reason。

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

ASN 實際所在位置:根據其最大 IP 範圍的樣本取得的城市層級定位點,以及最常見的城市。用於 ASN 頁面的分布地圖。

ParameterInDescription
asnpath不含 AS 前綴的 ASN 編號,例如 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":[...]}

這是樣本,並非完整的 IP 範圍清單。要取得所有範圍,請使用 /v1/asn/:asn/ranges。

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

代管於某個 ASN 的網域,透過對其部分位址樣本進行反向 DNS(PTR)查詢取得。每筆資料包含根網域、PTR 主機名稱與取樣的 IP。

ParameterInDescription
asnpath不含 AS 前綴的 ASN 編號,例如 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"}, ...]}

基於取樣,只能大致反映該 ASN 代管的內容,並非完整清單。針對單一 IP 請使用 /v1/ip/:ip/hosted-domains。

GET/v1/asn/:asn/relationships

ASN 的 BGP 關係:對等方、上游供應商與下游客戶,並附上數量。

ParameterInDescription
asnpath不含 AS 前綴的 ASN 編號,例如 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}

無法連線至 BGP 資料來源時,available 為 false。available: true 且陣列為空,表示該 ASN 沒有回報任何關係。

GET/v1/ip-ranges

IPv4 位址空間目錄:每個 /8 區塊一筆,包含其 IP 範圍、國家與 ASN 的數量以及占比最高的國家。由此開始,再透過 /v1/ip-ranges/:a 與 /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

某個 /8(例如 8.0.0.0/8)內的 /16 區塊,同樣包含每個區塊的 IP 範圍、國家與 ASN 數量。

ParameterInDescription
apath第一個八位元組,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

某個 /16(例如 8.8.0.0/16)內已配置的 IP 範圍,每個範圍附上所屬 ASN,以及每個區塊的數量。

ParameterInDescription
apath第一個八位元組,0-255。
bpath第二個八位元組,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

針對某個座標的 Nearby 資料的一部分,讓用戶端能在每個部分送達時立即呈現:反向地理編碼、周邊興趣點或當地犯罪統計。

ParameterInDescription
latquery緯度,必填。
lonquery經度,必填。
partquery要取得的部分:geocode、poi 或 crime。未知的值會回傳 400。
countryquery僅限 part=crime:ISO 國家代碼。US 與 GB 有犯罪資料。
regionquery僅限 part=crime:州或地區名稱,例如 Utah。
cityquery僅限 part=crime:城市名稱,例如 Orem。
langquery選填。在地化地點標籤(與上方在地化表中的代碼相同)。
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

兩點之間的開車時間與距離。快速路徑:略過 /v1/places/:ip 所做的反向地理編碼與興趣點查詢。

ParameterInDescription
from_latquery起點緯度,必填。
from_lonquery起點經度,必填。
dest_latquery終點緯度。搭配 dest_lon 使用,或改為傳入 dest_address。
dest_lonquery終點經度。
dest_addressquery自由文字形式的終點,由我們為您進行地理編碼。在缺少 dest_lat/dest_lon 時使用。
curl "https://ipto.to/v1/commute?from_lat=40.2969&from_lon=-111.6948&dest_lat=40.7608&dest_lon=-111.8910" # {"from":{"lat":40.2969,"lon":-111.6948},"to":{"lat":40.7608,"lon":-111.891}, # "commute":{"durationMinutes":44,"distanceKm":63.5}}

無法解析出終點時,回應中 to 為 null、commute 為 null,並附上 reason 字串。

GET/v1/address-lookup

以輸入的街道地址而非 IP 為基準的 /v1/places/:ip 資料:地理編碼、地點資訊以及可選的通勤時間估算。

ParameterInDescription
qquery自由文字地址,必填。
dest_latquery選填的終點緯度,用於包含通勤時間估算(需搭配 dest_lon)。
dest_lonquery選填的終點經度。
dest_addressquery選填的自由文字終點,用來取代 dest_lat/dest_lon。
partquerypart=geo 只回傳標籤與座標,讓首次繪製更快。
langquery選填。在地化地點標籤(與上方在地化表中的代碼相同)。
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。

GET/v1/address-suggest

地址自動完成:針對不完整的地址回傳數個符合的地點,可選擇偏向某個位置。

ParameterInDescription
qquery不完整的地址文字,必填。
near_latquery選填緯度,結果會偏向該位置。
near_lonquery選填經度,結果會偏向該位置。
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=

完整的天氣文件,適用於地名、郵遞區號、座標或 IP。用 include 選擇所需區塊:current、hourly、daily、astro(太陽與月亮)、solar、indicators、alerts、marine、air_quality、nowcast,或 all。美國地點來自美國國家氣象局(National Weather Service),其他地區來自 MET Norway;meta.source 會標明來源。省略 include 時,會回傳上文所述的簡易格式 { query, weather }。

ParameterInDescription
q / lat+lon / ipquery位置:q(城市、郵遞區號或 "lat,lon"),或 lat 與 lon,或 ip。三者擇一為必填。
countryquery選填。用於釐清有歧義的 q 的 ISO 代碼或國家名稱,例如郵遞區號 75001 搭配 country=FR。
includequery此格式必填。以逗號分隔:current、hourly、daily、astro、solar、indicators、alerts、marine、air_quality、nowcast,或 all。
unitsquerymetric(預設)或 imperial。欄位名稱會隨單位變化:temp_c 變成 temp_f,wind_kmph 變成 wind_mph,precip_mm 變成 precip_in。
wind_unitquerykmh、ms、mph 或 kn。只變更風速單位。
hoursquery要回傳的逐時項目數,1-240。預設 48。近期為每小時,之後為每 6 小時,可由 step_hours 判斷。
daysquery要回傳的逐日項目數,1-9。預設 7。美國資料涵蓋 7 天。
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 會說明該地點有哪些欄位:降雨機率、陣風與雷暴機率僅適用於美國與北歐,其他地區為 null(不是 0)。alerts 是美國與挪威的官方警報;marine、air_quality 與 nowcast 僅涵蓋挪威及鄰近海域,其他地區會回傳 available: false。meta.derived 中的內容是 ipto.to 的估算值,indicators 是推導出的標示,並非官方警報。顯示資料時請保留 meta.attribution(MET Norway 的資料採用 CC BY 4.0)。

GET/v1/weather/history

ipto.to 為已被查詢過的地點自行記錄的每日資料:當天預報快照中出現過的最高高溫、最低低溫與最大降水量。只有已被請求過的地點才有資料,且會隨時間累積。

ParameterInDescription
q / lat+lon / ipquery位置:q(城市、郵遞區號或 "lat,lon"),或 lat 與 lon,或 ip。三者擇一為必填。
daysquery要回傳的最近天數,1-400。預設 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."}

這些是預報快照,不是測站觀測值或再分析資料,因此請勿當作實測歷史使用。404 表示該地點尚未記錄任何快照。

GET/v1/weather/radar/frames

可用的雷達動畫影格,依時間由舊到新排列,每個影格包含 Unix 時間戳記與用於雷達圖磚 URL 的影格 id。

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

某一影格在標準網頁地圖 z/x/y 位置的雷達地圖圖磚(PNG)。透過同源代理提供,地圖無需發出第三方請求即可載入。

ParameterInDescription
framepath來自 /v1/weather/radar/frames 的影格 id(小寫十六進位)。
zpath縮放層級。
xpath圖磚欄。
ypath圖磚列。
# 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

標準網頁地圖 z/x/y 位置的衛星影像地圖圖磚,透過同源代理提供。

ParameterInDescription
zpath縮放層級。
xpath圖磚欄。
ypath圖磚列。
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

/v1/email/:email 的機器可讀 OpenAPI 3.1 規格,方便 LLM 與 MCP 代理無需閱讀本文件即可呼叫電子郵件端點。

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

IP 查詢欄位參考

FieldTypeDescription
ipstring查詢的 IP 地址。
versionstring"v4" 或 "v6"。
bogonboolean若為私有、保留,或不可路由的地址,則為 true。
bogon_typestring|null若為 bogon 時的原因代碼:"loopback"、"private"、"link-local"、"multicast"、"reserved"、"documentation"、"unspecified"。
asninteger|null公告此 IP 的自治系統編號。
asn_namestring|nullASN 的簡稱(例如 "GOOGLE")。
asn_orgstring|null該 ASN 註冊的組織(例如 "Google LLC")。
asn_typestring|nullASN 分類:"hosting"、"isp"、"business"、"education"、"government"、"mobile"、"residential"。
continentstring|null完整洲別名稱(例如 "North America")。
continent_codestring|null兩碼洲別代碼:AF AS EU NA SA OC AN。
country_codestring|nullIP 實際所在國家的 ISO 3166-1 alpha-2 國家代碼(例如 "US"),與城市和經緯度使用相同的地理定位資料。若沒有地理定位比對結果,則回退為 ASN 的註冊國家(asn_country_code)。國家名稱、國旗、貨幣等欄位由此衍生。
country_namestring|null完整英文國家名稱(例如 "United States")。
country_flagstring|null國家 emoji 旗幟(例如 "🇺🇸")。
is_euboolean若該國為歐盟成員國(共 27 個成員),則為 true。
citystring|null城市名稱。在自身查詢時會提供,在明確查詢時若兩個合併地理資料來源(IP2Location 或 MaxMind)中有任一相符,亦會提供 — 請檢查 geo_precision。
statestring|null行政區域/次級行政區。可用性與 city 相同。
postal_codestring|null郵遞區號。在自身查詢時會提供,在明確查詢時若 IP2Location(優先)或 MaxMind 相符,亦會提供 — 可用性與 city 相同。
latitudenumber|null十進位緯度。可用性與 city 相同。
longitudenumber|null十進位經度。可用性與 city 相同。
timezonestring|null時區 — 可用性與 city 相同。自身查詢時為 IANA 識別碼(例如 "America/New_York")。明確查詢時的格式取決於相符的來源:IP2Location 提供如 "-08:00" 的 UTC 偏移字串,MaxMind 提供 IANA 名稱。
geo_precisionstring位置資料的精確程度:"city"、"country"(城市級別查詢無相符結果),或 "none"。
geo_country_codestring|nullIP 實際所在的國家(依地理定位資料,ISO 3166-1 alpha-2)。只要有值,就與 country_code 相同。若沒有地理定位比對結果則為 null。
asn_country_codestring|nullASN 持有者的註冊國家(ISO 3166-1 alpha-2)。對於從持有者註冊國以外的國家發布路由的 CDN、VPN、代管或 anycast 網路,可能與 country_code 不同。IP 沒有 ASN 紀錄時為 null。
currency_codestring|null該國家的 ISO 4217 貨幣代碼(例如 "USD")。
exchange_rate_usdnumber|null每 1 美元對應的當地貨幣單位數,來自每日同步、涵蓋 154 種貨幣的參考匯率資料。不在此範圍內的貨幣則為 null。
calling_codestring|null含 + 前綴的國家撥號代碼(例如 "+1")。
languagesstring[]該國家的官方/認可語言,以英文表示。
tldstring[]國碼頂級網域,例如 [".us"]。
capitalstring|null首都名稱。
bordersstring[]相鄰國家的 ISO alpha-2 代碼。
is_datacenterboolean若該 IP 屬於主機或雲端服務商,則為 true。
is_mobileboolean若該 IP 註冊於行動電信業者,則為 true。
is_residentialboolean若該 IP 被歸類為住宅寬頻,則為 true。
connection_typestring"mobile"、"datacenter" 或 "unknown" — 依與 is_mobile/is_datacenter 相同的分類推導而來。刻意不嘗試區分住宅與企業用途:光憑 ASN 組織名稱文字並無法可靠地推導出這項區別,因此若某個 ASN 無法有把握地歸類為 mobile 或 datacenter,就會維持 "unknown",而不會用猜測的方式判定。
is_botboolean若該 IP 與已知的機器人基礎設施相關聯,則為 true。
is_proxyboolean若該 IP 為已知的代理出口節點,則為 true。
is_vpnboolean若該 IP 落在威脅資料流中已知的 VPN 伺服器範圍內,則為 true。
is_torboolean若該 IP 為已確認的 Tor 出口節點,則為 true。
is_abuserboolean若該 IP 落在多個濫用情資來源標記的網路範圍內,則為 true。
abuse_scoreinteger|null當 is_abuser 為 true 時,依跨資料源交叉佐證得出的 1-10 分嚴重程度分數。其餘情況為 null。
risk_tierstring|null"critical"(8-10)、"high"(5-7)或 "medium"(3-4) — 由 abuse_score 推導而來。若未被標記則為 null。
threat_typestring|null當 is_tor/is_vpn/is_abuser 同時相符時,回傳最具行動參考價值的單一分類:"tor_exit" > "abuser" > "vpn"。若皆不相符則為 null。
flagsobject為向下相容而鏡射 is_* 欄位的物件。鍵值:hosting、mobile、residential、bot、blacklisted、vpn、tor、abuser。
meta.data_versionstring本次查詢所使用之資料集日期(YYYY-MM-DD)。自身查詢為 "cf-edge"。私有範圍為 "bogon"。
meta.cachedboolean若此回應來自快取層,則為 true。
meta.langstring此回應實際使用的語言 — 若有提供 ?lang= 則與其相符,否則為從 Accept-Language 解析出的值,或為 "en"。
meta.lang_source"param"|"header"|"default"lang 是如何決定的:"param"(傳入了 ?lang=)、"header"(從 Accept-Language 解析)、或 "default"(兩者皆未提供)。

輸出格式

IP、ASN 與國家查詢皆支援 ?format=。

FormatContent-TypeUsage
jsonapplication/json預設值。完整結構化回應。
csvtext/csv扁平的 key,value 配對。省略巢狀物件。
texttext/plainkey: value 形式的每行資料,每行一個欄位。
xmlapplication/xml完整巢狀結構,陣列會重複相同標籤。
yamlapplication/x-yaml完整巢狀結構。
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"

在地化

在 /v1/ip、/v1/asn/:asn 或 /v1/country/:code 傳入 ?lang=,即可將 country_name 與 continent 在地化。其餘欄位(ASN 組織名稱、城市名稱、貨幣代碼)皆維持原始形式 — 這些屬於識別碼與專有名詞,而非介面文字。不支援的語言代碼會退回英文,而非回傳錯誤。

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

沒有 ?lang=?改傳 Accept-Language 標頭即可 — 相同的端點也會讀取它,因此只要下 curl -H "Accept-Language: es" https://ipto.to/v1/ip/8.8.8.8,不需要查詢字串也能在地化回應。若兩者同時存在,明確指定的 ?lang= 永遠優先。注意:shell 的 LANG/LC_ALL 環境變數(例如 LANG=es_ES.UTF-8 curl ...)只會設定 curl 自身的地區設定 — curl 從不讀取它,也不會把它轉成標頭送出,因此對回應語言完全沒有影響。真正有效的只有 Accept-Language 或 ?lang= 這兩種方式。

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

每個 /v1/ip、/v1/asn/:asn 與 /v1/country/:code 的回應都包含 lang 與 lang_source(在 /v1/ip 中巢狀於 meta 下;在另外兩者中則為頂層欄位),讓你隨時能準確知道實際套用了哪種語言、以及它是透過 "param"、"header" 還是 "default" 決定的 — 不必從你送出的請求去猜測。

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

只要設定非英文的 lang,完整的鍵與值在地化就是預設行為 — 每個欄位(包含巢狀的 flags 與 meta 鍵)都會以目標語言重新命名回傳,固定的列舉值(risk_tier、threat_type、connection_type、geo_precision、bogon_type、asn_type)也會一併翻譯。需要改回舊有的英文鍵格式嗎?在 /v1/ip 加上 &localize=0 即可退出。

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

程式碼範例

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)

請求頻率限制

限制以每日(UTC)為單位計算,免費方案依 IP 地址計數,Pro/Enterprise 則依金鑰計數。超過額度時會回傳 HTTP 429,並附上 Retry-After 標頭。若為正式環境的用量,詳見 pricing。

適用於每一個 /v1/* 端點、/mcp 伺服器,以及 curl ipto.to / curl ipto.to/:ip 捷徑。唯一的例外是 GET /ip — 它只是單純回傳標頭內容,沒有查詢成本,因此完全不會消耗任何額度。

TierRequests / dayAuth
Free1,000無
Pro100,000API 金鑰(標頭)
EnterpriseUnlimitedAPI 金鑰 + 專屬端點

錯誤代碼

StatusMeaning
200OK。回應包含資料。
202資料流正在同步中。請於 45 秒後重試。
400請求錯誤。IP、ASN 或國家代碼無效。
404資料集中找不到該 ASN 或國家。
503資料集尚未就緒。可能正在進行初始匯入。