---
title: "Read one product"
method: GET
path: "/api/v1/products/{id}"
tags: ["Products & pricing"]
---

# Read one product

`GET /api/v1/products/{id}`

## Request

- Base URL: `https://hproxy.com`
- URL: `https://hproxy.com/api/v1/products/{id}`
- Auth: API key in header `X-API-Key`

One product by its id, or by any id it used to carry, with its lifecycle. A retired product answers `200` with `state: "retired"` and `successorId`, never a `404`, so a menu built from an old catalog can tell its customer what to buy now. `state` is `active`, `parked` (listed, orders answer `409 product_unavailable` until it is back) or `retired`. `family` names the umbrella (`residential`, `isp`, `mobile`, `ipv4`, `ipv6`) so a storefront groups products without guessing from the name. `shape` says what buying and delivery look like, and it is what to key an integration on, never a list of ids: `gateway_gb` and `gateway_time` are a plan you generate lines from (`delivery` is `lines`), `addresses` and `addresses_mobile` are dedicated IPs that land in [proxies](/docs/proxy-api/proxies) (`delivery` is `addresses`). `renewal` is `topup` (order again, the units land on the plan you hold), `repurchase` (a fresh plan for a fresh period) or `extend` (an extension naming the addresses to keep). `howTo` spells the exact calls for that shape, from the price to the first use, with the targeting fields its network takes. A product we add on a known shape works in your code the day it lands.

## Path parameters

- `id` string, required

## Response `200`

Success

- object

## Other responses

- `400`: Invalid input. The body names the field and the accepted set.
- `401`: Missing or invalid API key.
- `429`: Rate limited. Retry after the delay in the response.

---

[API](https://skmtc.dev/hproxy/apis/hproxy-api.md) · [All operations](https://skmtc.dev/hproxy/apis/hproxy-api/llms.txt) · [OpenAPI document](https://skmtc.dev/hproxy/apis/hproxy-api/revisions/9f6898fe76e2?raw)
