Dependency-free, TypeScript-friendly module and CLI tool to quickly retrieve your real public IPv4 or IPv6 address.
Module installation
Use your favorite package manager to install GIP as a dependency in your project:
# with NPM
npm install gip
# with PNPM
pnpm add gip
# with Bun
bun add gip
# with Deno
deno add npm:gipModule usage
import gip from "gip";
try {
const ip = await gip();
console.log(ip);
} catch (error) {
console.log(`Can't get your IP. Reason: ${error}`);
}Usage with options
import gip from "gip";
const options = {
services: ["ipv4.icanhazip.com", "ifconfig.me/ip"],
ensure: 10,
verbose: true,
type: "ipv4",
};
try {
const ip = await gip(options);
console.log(ip);
} catch (error) {
console.log(`Can't get your IP. Reason: ${error}`);
}CLI installation
# with NPM
npm install -g gip
# with PNPM
pnpm add -g gip
# with Bun
bun install -g gip
# with Deno
deno install -g npm:gipCLI usage
gip
# 133.74.20.69
gip --ensure 10
# 133.74.20.69
gip --type ipv6
# 2001:0db8:85a3:0000:0000:8a2e:0370:7334
gip --services "https://ipv4.icanhazip.com/" "https://ifconfig.me/ip"
# 133.74.20.69CLI usage without installation
# with NPM
npx gip
# with PNPM
pnx gip
# with Bun
bunx gip
# with Deno
deno run --allow-net npm:gip- Passing your own services will not prioritize them. You will get the answer from the fastest responding service anyway.
- If you pass a service without a specified protocol, HTTPS will be used.
- IP family enforcement (
family: 4/family: 6) is applied at the DNS-resolution level vianode:http/node:https. This means even dual-stack (IPv4 + IPv6) domains are forced to resolve using the correct address family. - Lists of built-in services are located in services.mjs. If you know any reliable services, feel free to contribute.