# Quick start

## 1. Complete KYC (one-time)

ISP is gated behind ID verification. **Dashboard → Account → KYC** — typically approved within 1 business day. See [ID verification](/account-and-billing/kyc.md).

## 2. Order ISP IPs

1. Open **Dashboard → ISP → Order**.
2. Pick **country** (and **city** if the country supports it).
3. Pick **quantity** — minimum 5 IPs, max 5,000 per order.
4. Pick **billing period** — monthly or annual (10% discount).
5. Click **Order**. IPs are provisioned within 1–5 minutes for tier-1 countries, up to 24 hours for long-tail.

You'll receive an email when the batch is ready.

## 3. Download the list

1. Open **Dashboard → ISP → My IPs → {Batch}**.
2. Click **Download** and pick a format:
   * **`ip:port:user:pass`** (default) — one IP per line
   * **CSV** — columns `ip,port,user,pass,country,city,asn`
   * **JSON** — full metadata including ASN and city
   * **Proxifier / FoxyProxy / SwitchyOmega** — ready-to-import files

Or grab the list via API:

```bash
curl -H "Authorization: Bearer API_KEY" \
     "https://api.helodata.com/v1/isp/batches/{batch_id}/ips?format=plain"
```

Full reference: [Proxy list format](/products/overview-2/proxy-list-format.md).

## 4. Send a request

Use any single IP from your list:

### curl

```bash
curl -x http://helo_s1a2b3c4d5e:PASSWORD@198.51.100.42:8000 \
     https://ipv4.icanhazip.com
```

The response should be exactly `198.51.100.42` — it's a static IP.

### Python (requests)

```python
import requests

PROXY = "http://helo_s1a2b3c4d5e:PASSWORD@198.51.100.42:8000"

r = requests.get(
    "https://ipv4.icanhazip.com",
    proxies={"http": PROXY, "https": PROXY},
    timeout=30,
)
print(r.text.strip())
```

### Node.js (undici)

```js
import { fetch, ProxyAgent } from "undici";

const agent = new ProxyAgent(
  "http://helo_s1a2b3c4d5e:PASSWORD@198.51.100.42:8000"
);
const res = await fetch("https://ipv4.icanhazip.com", { dispatcher: agent });
console.log((await res.text()).trim());
```

### Go (net/http)

```go
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
)

func main() {
    proxyURL, _ := url.Parse("http://helo_s1a2b3c4d5e:PASSWORD@198.51.100.42:8000")
    client := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyURL)}}
    resp, _ := client.Get("https://ipv4.icanhazip.com")
    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
```

### PHP (cURL)

```php
<?php
$ch = curl_init('https://ipv4.icanhazip.com');
curl_setopt_array($ch, [
    CURLOPT_PROXY          => 'http://198.51.100.42:8000',
    CURLOPT_PROXYUSERPWD   => 'helo_s1a2b3c4d5e:PASSWORD',
    CURLOPT_RETURNTRANSFER => true,
]);
echo trim(curl_exec($ch));
curl_close($ch);
```

## 5. Use the whole batch (rotation)

Load the list and pick the next IP per request. Simple round-robin:

```python
import itertools, requests

with open("isp.txt") as f:
    proxies = [line.strip() for line in f if line.strip()]

pool = itertools.cycle(proxies)                                  # ip:port:user:pass lines

def get(url):
    line = next(pool)
    ip, port, user, password = line.split(":", 3)
    p = f"http://{user}:{password}@{ip}:{port}"
    return requests.get(url, proxies={"http": p, "https": p}, timeout=30)
```

See [Client-side rotation](/products/overview-2/rotation.md) for more robust patterns.

## What's next

* [Proxy list format](/products/overview-2/proxy-list-format.md) — every format variant
* [Authentication](/products/overview-2/authentication.md) — switch to IP whitelist
* [IP management](/products/overview-2/ip-management.md) — replace dead IPs, refresh batches


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.helodata.com/products/overview-2/quick-start.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
