> This page is optimized for agents. Use the linked Markdown pages and llms.txt indexes for related API content.

# Fetch one iron

> Fetch by stable club ID or slug. A historical slug redirects to the current slug with 301. Core is the default unless view or fields selects another permitted document. Read Golfapi-View for the document served.

- Product: Irons
- Section: irons
- Snapshot: Current
- Method: `GET`
- Path: `/irons/{ref}`
- Availability: generally-available

## Path parameters

### `ref`

Type: `string`  
Required: yes  

A returned clb_ id or a current or historical iron slug.

## Query parameters

### `view`

Type: `string`  
Required: no  
Allowed values: `core`, `expanded`, `market`  

Response document: core, expanded or market. Core is the default unless fields selects another document. The legacy token basic is accepted as core. Expanded requires club-builder (Enterprise); Market requires market (Pro plan). Missing access returns 403. Read Golfapi-View for the document served.

### `fields`

Type: `string`  
Required: no  

Comma-separated top-level fields from one response document. id is always returned. Without an explicit view, a Club-builder field selects expanded and intro_price selects market. Missing club-builder or market access returns 403; market (intro_price) needs the Pro plan. An unknown field, a field outside an explicit view, or a selection mixing Club-builder and Market fields returns 400.

### `variants`

Type: `string`  
Required: no  
Default: `all`  

Filter `variants` by hand or nominal loft in Core or Club-builder documents. Market carries no variants.

## Execute with curl

```bash
curl -H "Authorization: Bearer $GOLFDEV_API_KEY" "https://api.golfapi.dev/irons/$REF"
```

## Execute with JavaScript

```javascript
const response = await fetch(`https://api.golfapi.dev/irons/${ref}`, {
  headers: { Authorization: `Bearer ${process.env.GOLFDEV_API_KEY}` },
});
const body = await response.json();
```

## Execute with Python

```python
import os
import requests

response = requests.get(
    f"https://api.golfapi.dev/irons/{ref}",
    headers={"Authorization": f"Bearer {os.environ['GOLFDEV_API_KEY']}"},
    timeout=10,
)
response.raise_for_status()
body = response.json()
```

## Responses

### Response `200`

Category: success  

One iron.

#### `application/json`

##### Generated example

```json
{
  "id": "id",
  "slug": "slug",
  "name": "name",
  "club_type": "driver",
  "summary": "summary",
  "manufacturer": {
    "slug": "slug",
    "name": "name"
  },
  "family": {
    "slug": "slug",
    "name": "name"
  },
  "release_year": 1900,
  "released": "released",
  "hands": [
    "rh"
  ],
  "irons": [
    {
      "designation": "1",
      "loft_deg": 0,
      "lie_deg": 0
    }
  ],
  "variants": [
    {
      "id": "id",
      "designation": "1",
      "hand": "rh",
      "market": "market"
    }
  ],
  "url": "url",
  "updated_at": "updated_at"
}
```

##### Schema

###### IronCore | IronExpanded | MarketClub

Type: `IronCore | IronExpanded | MarketClub`  

###### IronCore

Type: `IronCore`  

The Core iron document: a model's identity and its per-iron loft and lie.

###### `id`

Type: `string`  
Required: yes  

###### `slug`

Type: `string`  
Required: no  

###### `name`

Type: `string`  
Required: no  

###### `club_type`

Type: `string`  
Required: no  
Allowed values: `driver`, `mini-driver`, `fairway-wood`, `hybrid`, `iron`, `wedge`, `putter`  

The resource this club belongs to: driver, mini-driver, fairway-wood, hybrid, iron (a set), wedge or putter.

###### `summary`

Type: `string`  
Required: no  

One sentence naming the club, its maker, introduction year, club type and family. Built from this document's fields at each catalog build. Contains no specifications and no performance or suitability claims.

###### `manufacturer`

Type: `NamedEntity`  
Required: no  

###### `slug`

Type: `string`  
Required: yes  

###### `name`

Type: `string`  
Required: yes  

###### `family`

Type: `NamedEntity`  
Required: no  

###### `slug`

Type: `string`  
Required: yes  

###### `name`

Type: `string`  
Required: yes  

###### `release_year`

Type: `number`  
Required: no  

The year the manufacturer released this head. Present on every club.

###### `released`

Type: `string`  
Format: `date`  
Required: no  

First US retail availability, as an exact date. Absent when only `release_year` is known.

###### `hands`

Type: `string[]`  
Required: no  

Available hands, ordered rh then lh.

###### string

Type: `string`  
Allowed values: `rh`, `lh`  

###### `irons`

Type: `IronHeadCore[]`  
Required: no  

Per-iron loft and lie.

###### IronHeadCore

Type: `IronHeadCore`  

One iron of the set, by designation: `4` to `9`, `pw`, `aw`, `gw`, `sw`, `lw`. A partial set lists only the irons the record states.

###### `designation`

Type: `string`  
Required: yes  
Allowed values: `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`, `pw`, `aw`, `gw`, `sw`, `lw`  

###### `loft_deg`

Type: `number`  
Required: no  

###### `lie_deg`

Type: `number`  
Required: no  

###### `variants`

Type: `IronVariant[]`  
Required: no  

One entry per designation, hand and market the record names.

###### IronVariant

Type: `IronVariant`  

One iron in one hand and market, as the record states it. A combination the record does not name is not listed.

###### `id`

Type: `string`  
Required: yes  

###### `designation`

Type: `string`  
Required: yes  
Allowed values: `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`, `pw`, `aw`, `gw`, `sw`, `lw`  

###### `hand`

Type: `string`  
Required: yes  
Allowed values: `rh`, `lh`  

###### `market`

Type: `string`  
Required: yes  

###### `url`

Type: `string`  
Format: `uri`  
Required: no  

Canonical club URL.

###### `updated_at`

Type: `string`  
Format: `date-time`  
Required: no  

When this response document last changed. Compare within the same view when refreshing a stored catalog; there is no updated_after filter.

###### IronExpanded

Type: `IronExpanded`  

The Club-builder iron document, served for `view=expanded`: Core plus each iron's length and offset.

###### `id`

Type: `string`  
Required: yes  

###### `slug`

Type: `string`  
Required: no  

###### `name`

Type: `string`  
Required: no  

###### `club_type`

Type: `string`  
Required: no  
Allowed values: `driver`, `mini-driver`, `fairway-wood`, `hybrid`, `iron`, `wedge`, `putter`  

The resource this club belongs to: driver, mini-driver, fairway-wood, hybrid, iron (a set), wedge or putter.

###### `summary`

Type: `string`  
Required: no  

One sentence naming the club, its maker, introduction year, club type and family. Built from this document's fields at each catalog build. Contains no specifications and no performance or suitability claims.

###### `manufacturer`

Type: `NamedEntity`  
Required: no  

###### `slug`

Type: `string`  
Required: yes  

###### `name`

Type: `string`  
Required: yes  

###### `family`

Type: `NamedEntity`  
Required: no  

###### `slug`

Type: `string`  
Required: yes  

###### `name`

Type: `string`  
Required: yes  

###### `release_year`

Type: `number`  
Required: no  

The year the manufacturer released this head. Present on every club.

###### `released`

Type: `string`  
Format: `date`  
Required: no  

First US retail availability, as an exact date. Absent when only `release_year` is known.

###### `hands`

Type: `string[]`  
Required: no  

Available hands, ordered rh then lh.

###### string

Type: `string`  
Allowed values: `rh`, `lh`  

###### `irons`

Type: `IronHead[]`  
Required: no  

Per-iron loft, lie, length and offset.

###### IronHead

Type: `IronHead`  

One iron of the set with its stock build length and offset.

###### `designation`

Type: `string`  
Required: yes  
Allowed values: `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`, `pw`, `aw`, `gw`, `sw`, `lw`  

###### `loft_deg`

Type: `number`  
Required: no  

###### `lie_deg`

Type: `number`  
Required: no  

###### `length_in`

Type: `number`  
Required: no  

###### `offset_in`

Type: `number`  
Required: no  

###### `offset_mm`

Type: `number`  
Required: no  

Offset in millimetres, present when the maker prints the offset in millimetres. Never converted from offset_in.

###### `variants`

Type: `IronVariant[]`  
Required: no  

One entry per designation, hand and market the record names.

###### IronVariant

Type: `IronVariant`  

One iron in one hand and market, as the record states it. A combination the record does not name is not listed.

###### `id`

Type: `string`  
Required: yes  

###### `designation`

Type: `string`  
Required: yes  
Allowed values: `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`, `pw`, `aw`, `gw`, `sw`, `lw`  

###### `hand`

Type: `string`  
Required: yes  
Allowed values: `rh`, `lh`  

###### `market`

Type: `string`  
Required: yes  

###### `url`

Type: `string`  
Format: `uri`  
Required: no  

Canonical club URL.

###### `updated_at`

Type: `string`  
Format: `date-time`  
Required: no  

When this response document last changed. Compare within the same view when refreshing a stored catalog; there is no updated_after filter.

###### `_links`

Type: `object`  
Required: no  

###### `self`

Type: `string`  
Format: `uri`  
Required: yes  

###### MarketClub

Type: `MarketClub`  

The Market document, served by `view=market` to a key holding the 'market' entitlement (Pro plan), on every club type: the club's identity and its Market fields, with no specifications. Join it to a spec document on `id`. Only `id` is guaranteed, because `fields=` may project any subset; `intro_price` is absent when no launch price is published, never empty. `updated_at` moves when this document changes, independently of the spec documents.

###### `id`

Type: `string`  
Required: yes  

###### `slug`

Type: `string`  
Required: no  

###### `name`

Type: `string`  
Required: no  

###### `club_type`

Type: `string`  
Required: no  
Allowed values: `driver`, `mini-driver`, `fairway-wood`, `hybrid`, `iron`, `wedge`, `putter`  

The resource this club belongs to: driver, mini-driver, fairway-wood, hybrid, iron (a set), wedge or putter.

###### `manufacturer`

Type: `NamedEntity`  
Required: no  

###### `slug`

Type: `string`  
Required: yes  

###### `name`

Type: `string`  
Required: yes  

###### `family`

Type: `NamedEntity`  
Required: no  

###### `slug`

Type: `string`  
Required: yes  

###### `name`

Type: `string`  
Required: yes  

###### `release_year`

Type: `number`  
Required: no  

The year the manufacturer released this head. Present on every club.

###### `released`

Type: `string`  
Format: `date`  
Required: no  

Exact first retail availability date for the recorded launch market. Omitted when only release_year is published.

###### `intro_price`

Type: `IntroPrice[]`  
Required: no  

Pro. The launch MSRP, one entry per market. Absent when no launch price is published.

###### IntroPrice

Type: `IntroPrice`  

###### `market`

Type: `string`  
Required: yes  

ISO 3166-1 alpha-2 market the price was stated for.

###### `msrp_minor`

Type: `number`  
Required: yes  

The launch MSRP in the minor units of `currency` (ISO 4217), exactly as stated: $649 is 64900, and Y41,800 is 41800 because JPY has no minor unit. Never converted, so prices in different currencies are not comparable.

###### `currency`

Type: `string`  
Required: yes  

###### `tax_included`

Type: `boolean`  
Required: yes  

Whether the price includes sales tax or VAT, as the source states it. Always false for US; Japanese, UK and EU retail prices usually include it.

###### `url`

Type: `string`  
Format: `uri`  
Required: no  

Canonical club URL.

###### `updated_at`

Type: `string`  
Format: `date-time`  
Required: no  

When this response document last changed. Compare within the same view when refreshing a stored catalog; there is no updated_after filter.

### Response `301`

Category: redirect  

A historical slug redirects to the canonical URL. Retain the query string and the same-origin auth and version headers. Live example: GET /drivers/g440-max-2025-driver redirects to /drivers/g440-max-driver.

### Response `304`

Category: redirect  

Unchanged representation, no response body. Quota refunded after response.

### Response `400`

Category: client-error  

Invalid recognized input or projected field.

#### `application/json`

##### Generated example

```json
{
  "error": {
    "type": "invalid_request",
    "message": "message",
    "status": 400,
    "request_id": "request_id",
    "param": "param"
  }
}
```

##### Schema

###### Error

Type: `Error`  

###### `error`

Type: `object`  
Required: yes  

###### `type`

Type: `string`  
Required: yes  
Allowed values: `invalid_request`, `invalid_auth`, `forbidden`, `not_found`, `rate_limited`, `method_not_allowed`, `server_error`, `service_unavailable`, `account_inactive`, `quota_exceeded`  

###### `message`

Type: `string`  
Required: yes  

###### `status`

Type: `number`  
Required: yes  
Allowed values: `400`, `401`, `403`, `404`, `405`, `429`, `500`, `503`  

###### `request_id`

Type: `string`  
Required: yes  

###### `param`

Type: `string`  
Required: no  

### Response `401`

Category: client-error  

Missing, malformed, unknown, or revoked key.

#### `application/json`

##### Generated example

```json
{
  "error": {
    "type": "invalid_request",
    "message": "message",
    "status": 400,
    "request_id": "request_id",
    "param": "param"
  }
}
```

##### Schema

###### Error

Type: `Error`  

###### `error`

Type: `object`  
Required: yes  

###### `type`

Type: `string`  
Required: yes  
Allowed values: `invalid_request`, `invalid_auth`, `forbidden`, `not_found`, `rate_limited`, `method_not_allowed`, `server_error`, `service_unavailable`, `account_inactive`, `quota_exceeded`  

###### `message`

Type: `string`  
Required: yes  

###### `status`

Type: `number`  
Required: yes  
Allowed values: `400`, `401`, `403`, `404`, `405`, `429`, `500`, `503`  

###### `request_id`

Type: `string`  
Required: yes  

###### `param`

Type: `string`  
Required: no  

### Response `403`

Category: client-error  

Resource/capability not granted.

#### `application/json`

##### Generated example

```json
{
  "error": {
    "type": "invalid_request",
    "message": "message",
    "status": 400,
    "request_id": "request_id",
    "param": "param"
  }
}
```

##### Schema

###### Error

Type: `Error`  

###### `error`

Type: `object`  
Required: yes  

###### `type`

Type: `string`  
Required: yes  
Allowed values: `invalid_request`, `invalid_auth`, `forbidden`, `not_found`, `rate_limited`, `method_not_allowed`, `server_error`, `service_unavailable`, `account_inactive`, `quota_exceeded`  

###### `message`

Type: `string`  
Required: yes  

###### `status`

Type: `number`  
Required: yes  
Allowed values: `400`, `401`, `403`, `404`, `405`, `429`, `500`, `503`  

###### `request_id`

Type: `string`  
Required: yes  

###### `param`

Type: `string`  
Required: no  

### Response `404`

Category: client-error  

Referenced record not found.

#### `application/json`

##### Generated example

```json
{
  "error": {
    "type": "invalid_request",
    "message": "message",
    "status": 400,
    "request_id": "request_id",
    "param": "param"
  }
}
```

##### Schema

###### Error

Type: `Error`  

###### `error`

Type: `object`  
Required: yes  

###### `type`

Type: `string`  
Required: yes  
Allowed values: `invalid_request`, `invalid_auth`, `forbidden`, `not_found`, `rate_limited`, `method_not_allowed`, `server_error`, `service_unavailable`, `account_inactive`, `quota_exceeded`  

###### `message`

Type: `string`  
Required: yes  

###### `status`

Type: `number`  
Required: yes  
Allowed values: `400`, `401`, `403`, `404`, `405`, `429`, `500`, `503`  

###### `request_id`

Type: `string`  
Required: yes  

###### `param`

Type: `string`  
Required: no  

### Response `405`

Category: client-error  

A routed path reached by a method other than GET or OPTIONS.

#### `application/json`

##### Generated example

```json
{
  "error": {
    "type": "invalid_request",
    "message": "message",
    "status": 400,
    "request_id": "request_id",
    "param": "param"
  }
}
```

##### Schema

###### Error

Type: `Error`  

###### `error`

Type: `object`  
Required: yes  

###### `type`

Type: `string`  
Required: yes  
Allowed values: `invalid_request`, `invalid_auth`, `forbidden`, `not_found`, `rate_limited`, `method_not_allowed`, `server_error`, `service_unavailable`, `account_inactive`, `quota_exceeded`  

###### `message`

Type: `string`  
Required: yes  

###### `status`

Type: `number`  
Required: yes  
Allowed values: `400`, `401`, `403`, `404`, `405`, `429`, `500`, `503`  

###### `request_id`

Type: `string`  
Required: yes  

###### `param`

Type: `string`  
Required: no  

### Response `429`

Category: client-error  

Rate limit reached. 60 requests per 60-second wall-clock window by default; RateLimit-Limit carries this key's actual cap. Honor Retry-After, which equals RateLimit-Reset.

#### `application/json`

##### Generated example

```json
{
  "error": {
    "type": "invalid_request",
    "message": "message",
    "status": 400,
    "request_id": "request_id",
    "param": "param"
  }
}
```

##### Schema

###### Error

Type: `Error`  

###### `error`

Type: `object`  
Required: yes  

###### `type`

Type: `string`  
Required: yes  
Allowed values: `invalid_request`, `invalid_auth`, `forbidden`, `not_found`, `rate_limited`, `method_not_allowed`, `server_error`, `service_unavailable`, `account_inactive`, `quota_exceeded`  

###### `message`

Type: `string`  
Required: yes  

###### `status`

Type: `number`  
Required: yes  
Allowed values: `400`, `401`, `403`, `404`, `405`, `429`, `500`, `503`  

###### `request_id`

Type: `string`  
Required: yes  

###### `param`

Type: `string`  
Required: no  

### Response `500`

Category: server-error  

Server fault.

#### `application/json`

##### Generated example

```json
{
  "error": {
    "type": "invalid_request",
    "message": "message",
    "status": 400,
    "request_id": "request_id",
    "param": "param"
  }
}
```

##### Schema

###### Error

Type: `Error`  

###### `error`

Type: `object`  
Required: yes  

###### `type`

Type: `string`  
Required: yes  
Allowed values: `invalid_request`, `invalid_auth`, `forbidden`, `not_found`, `rate_limited`, `method_not_allowed`, `server_error`, `service_unavailable`, `account_inactive`, `quota_exceeded`  

###### `message`

Type: `string`  
Required: yes  

###### `status`

Type: `number`  
Required: yes  
Allowed values: `400`, `401`, `403`, `404`, `405`, `429`, `500`, `503`  

###### `request_id`

Type: `string`  
Required: yes  

###### `param`

Type: `string`  
Required: no  

### Response `503`

Category: server-error  

Required representation or schema unavailable; honor Retry-After.

#### `application/json`

##### Generated example

```json
{
  "error": {
    "type": "invalid_request",
    "message": "message",
    "status": 400,
    "request_id": "request_id",
    "param": "param"
  }
}
```

##### Schema

###### Error

Type: `Error`  

###### `error`

Type: `object`  
Required: yes  

###### `type`

Type: `string`  
Required: yes  
Allowed values: `invalid_request`, `invalid_auth`, `forbidden`, `not_found`, `rate_limited`, `method_not_allowed`, `server_error`, `service_unavailable`, `account_inactive`, `quota_exceeded`  

###### `message`

Type: `string`  
Required: yes  

###### `status`

Type: `number`  
Required: yes  
Allowed values: `400`, `401`, `403`, `404`, `405`, `429`, `500`, `503`  

###### `request_id`

Type: `string`  
Required: yes  

###### `param`

Type: `string`  
Required: no  

## Related representations

- [Human documentation](/api/irons/methods/get/)
- [curl Markdown](/api/irons/curl/methods/get.md)
- [JavaScript Markdown](/api/irons/javascript/methods/get.md)
- [Python Markdown](/api/irons/python/methods/get.md)
- [product llms.txt](/api/irons/llms.txt)
