> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to IPinfo

The IPinfo connector lets your AI agent act in each user's IPinfo account. Each user connects their own IPinfo access token once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 13 tools.

**Authentication:** Bearer Token
**Categories:** Developer Tools, Analytics
**Tools:** 13: 12 read, 1 write, 0 destructive
**Users sign in with:** Access token
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=IPINFO)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the IPinfo connection

   In **AgentKit > Connections**, create an IPinfo connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'ipinfo'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize IPinfo:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'ipinfo_get_token_info',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "ipinfo"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize IPinfo:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="ipinfo_get_token_info",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their IPinfo credentials there. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'ipinfo_get_abuse_contact',
  toolInput: {
    ip: '<ip>',
  },
  connector: 'ipinfo',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="ipinfo_get_abuse_contact",
    tool_input={
        "ip": "<ip>",
    },
    connection_name="ipinfo",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `ipinfo_get_abuse_contact`

Get Abuse Contact · Read-only

Get the abuse contact registered for the network that holds an IP address.
Returns the contact's name, email, phone, address, country and the network (CIDR) it covers.
Use this to find where to report malicious traffic from an address. Needs an IPinfo plan with Abuse Contact API access.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ip` (`string`, required): The IPv4 or IPv6 address to look up. Always pass the address you want details for. Never pass "me" or an empty value: IPinfo would then describe the caller's own address, which is the Scalekit server, not your user. Example: 1.1.1.1

Example input: `{"ip":"<ip>"}`

### `ipinfo_get_asn`

Get ASN Details · Read-only

Get details of an autonomous system (ASN) from IPinfo.
Returns the ASN, organization name, country, allocation date, registry, domain, number of IPs, type (isp, hosting, business, education), announced IPv4 and IPv6 prefixes, and peer, upstream and downstream ASNs.
Use this to see who operates a network and which ranges it announces. Use ipinfo_get_ip_ranges to find the ranges of a company by domain, and ipinfo_lookup_ip to find the ASN of an address. Needs an IPinfo plan with ASN API access.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `asn` (`string`, required): The autonomous system number, digits only, without the AS prefix. Example: 15169

Example input: `{"asn":"<asn>"}`

### `ipinfo_get_carrier`

Get Mobile Carrier · Read-only

Get the mobile carrier that an IP address belongs to, if it is on a mobile network.
Returns the carrier name, mobile country code (mcc) and mobile network code (mnc); an address that is not on a mobile carrier network returns no carrier data.
Use this to tell mobile users apart from fixed-line ones. Use ipinfo_lookup_ip on a Plus or Max token to get carrier data together with geolocation. Needs an IPinfo plan with Carrier API access.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ip` (`string`, required): The IPv4 or IPv6 address to look up. Always pass the address you want details for. Never pass "me" or an empty value: IPinfo would then describe the caller's own address, which is the Scalekit server, not your user. Example: 66.87.125.72

Example input: `{"ip":"<ip>"}`

### `ipinfo_get_company`

Get Company for IP · Read-only

Get the company that operates or is assigned an IP address.
Returns the company name, domain and type (isp, business, education, government or hosting).
Use this to identify the organization behind traffic, for example for B2B lead enrichment. Use ipinfo_get_asn for the network operator of a whole ASN. Needs an IPinfo plan with IP to Company API access.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ip` (`string`, required): The IPv4 or IPv6 address to look up. Always pass the address you want details for. Never pass "me" or an empty value: IPinfo would then describe the caller's own address, which is the Scalekit server, not your user. Example: 8.8.8.8

Example input: `{"ip":"<ip>"}`

### `ipinfo_get_ip_ranges`

Get IP Ranges for Domain · Read-only

List the IP address ranges assigned to or operated by the company behind a domain.
Returns the domain, redirects_to (the company domain it resolved to, or null), num_ranges and the IPv4 and IPv6 ranges in CIDR notation.
Use this to map a company's network from its domain. Use ipinfo_get_asn for the prefixes one ASN announces. Needs an IPinfo plan with IP Ranges API access.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `domain` (`string`, required): The company's domain name, without protocol or path. A domain that redirects resolves to the company domain, reported in redirects_to. Example: nytimes.com

Example input: `{"domain":"<domain>"}`

### `ipinfo_get_place`

Get Place for IP · Read-only

Get the physical venue, such as a hotel, airport, museum or stadium, whose Wi-Fi network uses an IP address.
Returns ip, name (venue name), category (one of 58 place types such as hotel or airport), ssid (the venue Wi-Fi network name), latitude and longitude.
Use this for building-level location of venue Wi-Fi traffic. Use ipinfo_lookup_ip for ordinary city-level geolocation. Needs an IPinfo plan with Places API access.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ip` (`string`, required): The IPv4 or IPv6 address to look up. Always pass the address you want details for. Never pass "me" or an empty value: IPinfo would then describe the caller's own address, which is the Scalekit server, not your user. Example: 65.144.40.106

Example input: `{"ip":"<ip>"}`

### `ipinfo_get_privacy`

Get Privacy Detection · Read-only

Check whether an IP address is a VPN, proxy, Tor exit node, relay or hosting provider.
Returns vpn, proxy, tor, relay and hosting booleans and service (the VPN or proxy name, if known); a Privacy Extended plan adds confidence, coverage, first_seen, last_seen and detection-method fields.
Use this for anonymous-traffic and fraud checks on one address. Use ipinfo_get_residential_proxy for residential proxy networks, and ipinfo_lookup_ip on a Plus or Max token to get these signals with geolocation in one call. Needs an IPinfo plan with Privacy Detection API access.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ip` (`string`, required): The IPv4 or IPv6 address to look up. Always pass the address you want details for. Never pass "me" or an empty value: IPinfo would then describe the caller's own address, which is the Scalekit server, not your user. Example: 193.42.96.221

Example input: `{"ip":"<ip>"}`

### `ipinfo_get_residential_proxy`

Get Residential Proxy Detection · Read-only

Check whether an IP address has been seen in a residential, mobile or datacenter proxy network.
Returns ip, last_seen (date the address was last seen as a proxy), percent_days_seen (share of the last 7 days it was active) and service (proxy provider name, suffixed _mobile or _datacenter for those networks); an address never seen as a residential proxy returns no proxy data.
Use this to catch residential proxy traffic that ordinary VPN checks miss. Use ipinfo_get_privacy for VPN, Tor, relay and hosting detection. Needs an IPinfo plan with Residential Proxy API access.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ip` (`string`, required): The IPv4 or IPv6 address to look up. Always pass the address you want details for. Never pass "me" or an empty value: IPinfo would then describe the caller's own address, which is the Scalekit server, not your user. Example: 175.107.211.204

Example input: `{"ip":"<ip>"}`

### `ipinfo_get_token_info`

Get Token Usage and Limits · Read-only

Get the request limits, usage and API access of the connected IPinfo token.
Returns token, requests (day, month, limit, remaining) and features (daily and monthly limits for each API the token can call, such as core, asn, abuse, ranges, carrier, company and domains).
Use this to check remaining quota or which IPinfo APIs this connection can call before using them.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `ipinfo_list_hosted_domains`

List Hosted Domains · Read-only

List the domains hosted on an IP address (reverse IP lookup).
Returns ip, total (the number of hosted domains found), page when requested, and a domains array of up to limit names.
Use this to see which websites share a server. Page through results with page and limit. Needs an IPinfo plan with Hosted Domains API access.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ip` (`string`, required): The IPv4 or IPv6 address to look up. Always pass the address you want details for. Never pass "me" or an empty value: IPinfo would then describe the caller's own address, which is the Scalekit server, not your user. Example: 198.35.26.96
- `limit` (`integer`, optional): Number of domains per page, from 1 to 1000. IPinfo uses 100 when empty. Example: 100
- `page` (`integer`, optional): Zero-based page of results to return. Leave empty for the first page. Example: 1

Example input: `{"ip":"<ip>"}`

### `ipinfo_lookup_ip`

Look Up IP Address · Read-only

Look up the geolocation and network details of one IP address with IPinfo's Core, Plus or Max API.
Returns the IP, hostname, geo (city, region, country, continent, latitude, longitude, time zone, postal code), as (ASN, name, domain, type) and is_anonymous, is_anycast, is_hosting, is_mobile and is_satellite flags; Plus and Max tokens also get mobile carrier, anonymous (VPN, proxy, Tor, relay) and place details.
Use this for full IP geolocation on a paid Core, Plus or Max token. Use ipinfo_lookup_ip_lite on a free token, and ipinfo_batch_lookup for many addresses at once or for a token on an older IPinfo plan (endpoint batch/legacy).

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ip` (`string`, required): The IPv4 or IPv6 address to look up. Always pass the address you want details for. Never pass "me" or an empty value: IPinfo would then describe the caller's own address, which is the Scalekit server, not your user. Example: 8.8.8.8

Example input: `{"ip":"<ip>"}`

### `ipinfo_lookup_ip_lite`

Look Up IP Address (Lite) · Read-only

Look up the country and ASN of one IP address with IPinfo's free Lite API.
Returns ip, asn, as_name, as_domain, country_code, country, continent_code and continent; a private or reserved address returns only ip and bogon: true.
Use this on a free IPinfo token or when country-level location is enough. Use ipinfo_lookup_ip for city, coordinates, time zone and network flags on a paid token.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ip` (`string`, required): The IPv4 or IPv6 address to look up. Always pass the address you want details for. Never pass "me" or an empty value: IPinfo would then describe the caller's own address, which is the Scalekit server, not your user. Example: 8.8.8.8

Example input: `{"ip":"<ip>"}`

### `ipinfo_batch_lookup`

Batch Look Up IP Addresses · Write

Look up as many as 1,000 IP addresses or IPinfo lookup paths in one request.
Returns one JSON object keyed by each input string, whose value is that lookup's result: a full record, a sub-object such as geo or anonymous, or a single value such as a country name.
Use this instead of repeated single lookups. Choose the endpoint that matches the token: batch (Core, Plus or Max), batch/lite (free tokens) or batch/legacy (older plans and Privacy Extended data). Entries can also be paths like 8.8.8.8/geo, lite/8.8.8.8/country, AS15169, ranges/nytimes.com, domains/1.1.1.1 or resproxy/1.1.1.1, each billed as one request.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `ips` (`array`, required): The IP addresses or IPinfo lookup paths to resolve, 1 to 1,000 entries. A bare address uses the endpoint's default lookup. A path adds a field or another API: 8.8.8.8/geo, 8.8.8.8/as/asn, lite/8.8.8.8/country_code, AS15169, ranges/nytimes.com, domains/1.1.1.1, resproxy/1.1.1.1, places/65.144.40.106. Every entry must contain an IP address or an ASN (or be a ranges/<domain> lookup); entries such as "me", "lite/me" or a bare field name like "city" are rejected, because IPinfo would describe the Scalekit server's own address. Example: ["8.8.8.8", "1.1.1.1/geo", "AS15169"]
- `endpoint` (`string`, optional): Which batch endpoint to call. batch (default) runs bare addresses through the Core, Plus or Max lookup and needs a paid token. batch/lite runs them through the free Lite API, so use it with a free token. batch/legacy uses the older ipinfo.io response shape and is the only one that returns Privacy Extended fields. Example: batch/lite. One of: `batch`, `batch/lite`, `batch/legacy`. Default: `batch`.
- `filter` (`integer`, optional): Set to 1 to drop entries that have no result (null) from the response, for example addresses with no hostname. Leave empty to keep every entry. Example: 1. One of: `1`.

Example input: `{"ips":["8.8.8.8","1.1.1.1/geo","AS15169"]}`

## Related

Other Developer Tools connectors ([all 123](/agentkit/connectors/?category=developer-tools)):

- [GitHub](/agentkit/connectors/github/): Scalekit connector, OAuth, 217 tools
- [Microsoft Entra ID](/agentkit/connectors/microsoftentraid/): Scalekit connector, OAuth, 82 tools
- [Datadog](/agentkit/connectors/datadog/): Scalekit connector, API key, 105 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
