ISP proxies are discrete, static IP:port credentials assigned to your account — a fundamentally different model from the residential gateway. Where residential proxies share a single rotating gateway host (gate.proxyhat.com) and meter a byte pool across many sub-users, an ISP proxy is a dedicated fixed endpoint with its own IP, login and password that you connect to directly over HTTP or SOCKS5. These endpoints return the standard {success, payload, meta, errors, description} envelope.
Every endpoint on this page requires ISP proxy access, with one exception. They are only available to accounts with the has_isp_proxy_access flag enabled (check the has_isp_proxy_access field on GET /v1/auth/user). Without it every call returns 403 in the standard envelope: { "success": false, "payload": null, "errors": { "access": "ISP proxy access is not enabled for your account." }, "description": "Access denied" }. The single exception is Cancel Auto-Renew, which is deliberately reachable regardless of the flag — it only ever stops future spend, so it stays available even where the rest of this surface is closed.
List My ISP Proxies
GET/v1/isp-proxiesRequires Auth
List My ISP Proxies
List My ISP Proxies
Return every ISP proxy assigned to the authenticated account, ordered by country then IP. The payload is a mixed array of two row kinds: live "proxy" rows (ready-to-use credentials) and "provisioning" rows (orders still being fulfilled). Distinguish them by the "kind" field. No cost or balance data is ever included.
req, _ := http.NewRequest("GET", "https://api.proxyhat.com/v1/isp-proxies", nil)
req.Header.Set("Authorization", "Bearer __API_KEY__")
req.Header.Set("Accept", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
var out struct {
Payload []map[string]interface{} `json:"payload"`
}
json.NewDecoder(resp.Body).Decode(&out)
for _, row := range out.Payload {
fmt.Printf("%v %v\n", row["kind"], row["isp_name"])
}
Two row kinds. A "proxy" row carries the full live credentials (ip, port, login, password) plus both ready-to-paste connection URLs (http_url, socks5_url). A "provisioning" row represents an order still being fulfilled (pending / provisioning / needs-attention) and carries only isp_name, country_code, category, an eta_hours estimate and queued_at — poll this endpoint until it flips to a "proxy" row. subscription_status is null when the proxy is not tied to a subscription.
Get a Single ISP Proxy
GET/v1/isp-proxies/{id}Requires Auth
Get a Single ISP Proxy
Get a Single ISP Proxy
The same row shape List My ISP Proxies returns, for exactly one proxy — useful when you already track the id and do not want to pull the whole listing. 404 for a proxy that belongs to another account or a malformed (non-UUID) id.
Write a free-text label on one of your own proxies (the same field the dashboard's inline-edit uses). Send "" or null to clear it — both are equivalent, and it always reads back as null, never "". Rate-limited to 60 requests/minute.
Example request:id
Path Parameters
Name
Type
Required
Description
id
string (uuid)
Required
The proxy id.
Request Body
Name
Type
Required
Description
notes
string
Required
Max 255 characters. Must be present in the request (may be "" or null to clear).
Live server-side connectivity probe of one proxy on every protocol it serves. Shares the same prober as the dashboard's own test button, so the two surfaces never disagree about the same IP. Rate-limited to 30 requests/minute.
An expired proxy still answers with HTTP 200, not an error status.{ "success": false, "payload": null, "meta": null, "error_code": "proxy_expired", "description": "This proxy has expired. Renew it or buy a new one to keep using it." } — no network request is made to a dead IP, but the HTTP status is 200. Branch on the JSON body's success field, never on the status code, when reading this endpoint's result. This response also omits the errors key entirely (it uses error_code instead), unlike every other envelope response on this page. This is a different shape and status from the Reseller API's equivalent endpoint, which returns a real 422 for the same condition.
ISP Proxy History
GET/v1/isp-proxies/historyRequires Auth
ISP Proxy History
ISP Proxy History
Your expired proxies plus your renewal ledger — the read-only "what happened to my ISP proxies" view. There is no purchase or renewal endpoint here; the only money path for ISP proxies is the Reseller API.
Capped at 50 rows each, with no pagination cursor. Both payload.proxies and payload.renewals are hard-limited to the 50 most recent rows (by expires_at and created_at respectively). There is no page/per_page parameter and no cursor to fetch older rows — a 51st expired proxy or renewal is simply not returned. Do not rely on this endpoint as a complete historical export.
Stop future auto-renewal on one of your ISP subscriptions — it only ever stops future spend, never the proxy itself, so it stays available even where purchase/renewal is not. Cancels any underlying card subscription too, and flips auto_renew off on every proxy tied to this subscription.
Example request:
Path Parameters
Name
Type
Required
Description
id
string (uuid)
Required
The isp_subscription_id from a proxy row (List My ISP Proxies), not the proxy id itself.
Return the purchasable ISP-proxy catalog — every active plan, ordered by country then ISP name. Each item is annotated with an "affordable" boolean computed against your account balance (cost figures themselves are never exposed). The payload is cached for 90 seconds.
req, _ := http.NewRequest("GET", "https://api.proxyhat.com/v1/isp-store/catalog", nil)
req.Header.Set("Authorization", "Bearer __API_KEY__")
req.Header.Set("Accept", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
var out struct {
Payload []map[string]interface{} `json:"payload"`
Meta struct {
MaxBuyQty int `json:"max_buy_qty"`
RequestGate bool `json:"request_gate"`
} `json:"meta"`
}
json.NewDecoder(resp.Body).Decode(&out)
fmt.Println("max per order:", out.Meta.MaxBuyQty)
for _, item := range out.Payload {
fmt.Printf("%v (%v) $%v affordable=%v\n", item["isp_name"], item["country_code"], item["price"], item["affordable"])
}
Catalog fields.price is the sell price in currency; days is the subscription term; traffic_limit of 0 means the ISP proxy is unmetered. affordable tells you whether the plan can be bought outright right now — when it is false, open a top-up request with the tariff-request endpoint below instead. meta.max_buy_qty caps how many units may be bought in a single order, and meta.request_gate indicates whether direct purchase is gated behind the request flow.
Request a Tariff (Top-Up)
POST/v1/isp-store/tariff-requestRequires Auth
Request a Tariff
Request a Tariff
Open a top-up request for an ISP plan you cannot yet afford. This posts a tagged message into your support conversation and alerts an admin to add balance. Deduplicated within a 24-hour window (a repeat call inside the window returns 200 without re-posting or re-notifying). Rate-limited to 10 requests per minute.
Example request:plan_id
Request Body
Name
Type
Required
Description
plan_id
string (uuid)
Required
The UUID of the ISP plan (the "id" from a catalog item) you want to request.
This endpoint is only for plans you cannot afford. If the plan is already affordable the server returns 422 with { "success": false, "errors": { "plan": "This tariff is available — buy it directly." }, "description": "Plan is affordable" } — buy it directly instead. An unknown or inactive plan_id returns 404 { "message": "Not found" }, and a malformed (non-UUID) plan_id returns 422 validation error.
Get ISP Plan
GET/v1/plans/isp/{id}Requires Auth
Get ISP Plan
Get ISP Plan
Retrieve a single active ISP plan by its UUID, for a checkout / order-summary screen. Internal cost and markup fields are stripped from the response, and a "name" alias (equal to "isp_name") is added for convenience. Returns a flat plan object (NOT wrapped in the envelope); 404 if the plan does not exist or is inactive.
We filled these in for you:id
Tweak any value if you like — or just press Try.
Path Parameters
Name
Type
Required
Description
id
string (uuid)
Required
The UUID of the ISP plan (the "id" from a catalog item).