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

# List wedges

> Filters combine with AND. No matches returns data: []. Unknown or repeated query parameters return 400. Results are ordered by release_year descending, then club ID descending; q orders by relevance first. Core is the default unless view or fields selects another permitted document.

- Product: Wedges
- Section: wedges
- Snapshot: Current
- Method: `GET`
- Path: `/wedges`
- Availability: generally-available

## Query parameters

### `view`

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

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.

### `limit`

Type: `number`  
Required: no  
Default: `20`  

Page size.

### `cursor`

Type: `string`  
Required: no  

Opaque pagination token from page.next. Send it unchanged on the same resource, with the same filters, served version and key access. Page size may change between requests. On a cursor 400, restart the scan.

### `manufacturer`

Type: `string`  
Required: no  

Manufacturer slug.

### `family`

Type: `string`  
Required: no  

Family slug.

### `hand`

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

Offered hand.

### `designation`

Type: `string`  
Required: no  
Allowed values: `womens`, `junior`  

Heads whose designations includes this value. Each model is returned once. An empty result means no matching published record; an omitted designations field has no published classification.

### `loft`

Type: `string`  
Required: no  

Nominal loft in degrees. The value must occur in the requested collection; otherwise the API returns 400 with that collection’s published lofts. A loft available only in another collection is invalid here. With hand, both must match the same variant: hand=lh&loft=10.5 returns clubs sold left-handed at 10.5 degrees.

### `adjustable_hosel`

Type: `string`  
Required: no  
Allowed values: `true`, `false`  

Whether the hosel adjusts.

### `release_year`

Type: `number`  
Required: no  

Release year, four digits.

### `release_year_after`

Type: `number`  
Required: no  

Inclusive earliest release year, four digits.

### `release_year_before`

Type: `number`  
Required: no  

Inclusive latest release year, four digits.

### `released_after`

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

Inclusive earliest exact retail date. Matches only records with an exact `released` date; a record that carries only `release_year` never matches. A window whose start is later than released_before is 400: the two parameters contradict each other, which is not the same answer as a window that merely matches nothing.

### `released_before`

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

Inclusive latest exact retail date. Matches only records with an exact `released` date. Equal bounds are a legal one-day window.

### `msrp_min`

Type: `number`  
Required: no  

Inclusive lowest launch MSRP in the market `msrp_market` names (US when absent), in that currency's minor units: 50000 is $500 in the US and Y50,000 in JP, since JPY has no minor unit. A club with no launch price in that market never matches. Pro plan: needs the 'market' entitlement (403 without it), on any view. Greater than msrp_max is 400.

### `msrp_max`

Type: `number`  
Required: no  

Inclusive highest launch MSRP in the market `msrp_market` names (US when absent), in that currency's minor units: 50000 is $500 in the US and Y50,000 in JP. A club with no launch price in that market never matches. Pro plan: needs the 'market' entitlement (403 without it), on any view.

### `msrp_market`

Type: `string`  
Required: no  

ISO 3166-1 alpha-2 market whose `intro_price` entry msrp_min and msrp_max compare, in its own currency; US when absent. Prices are never converted between currencies. Alone, it keeps the clubs with a launch price in that market. A market the published catalog has no price in is 400, naming the markets it prices. Pro plan: needs the 'market' entitlement (403 without it).

### `q`

Type: `string`  
Required: no  

Search names, manufacturers, families, and generated aliases. Case and accents are folded. The full-text branch combines tokens with AND, while prefix, alias, and similarity matches can add rows that do not contain every token. A non-empty page does not identify a club; fetch a chosen hit with GET /{resource}/{id-or-slug}. Control characters are invalid.

## Execute with curl

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

## Execute with JavaScript

```javascript
const response = await fetch(`https://api.golfapi.dev/wedges`, {
  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/wedges",
    headers={"Authorization": f"Bearer {os.environ['GOLFDEV_API_KEY']}"},
    timeout=10,
)
response.raise_for_status()
body = response.json()
```

## Responses

### Response `200`

Category: success  

A page of wedges.

#### `application/json`

##### Generated example

```json
{
  "data": [
    {
      "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",
      "lofts_deg": [
        0
      ],
      "hands": [
        "rh"
      ],
      "variants": [
        {
          "id": "id",
          "hand": "rh",
          "market": "market",
          "loft_deg": 0,
          "bounce_deg": 0,
          "grind": "grind",
          "lie_deg": 0
        }
      ],
      "url": "url",
      "updated_at": "updated_at"
    }
  ],
  "page": {
    "limit": 1,
    "has_more": true,
    "catalog_complete": true,
    "next": "next"
  }
}
```

##### Schema

###### one of 3

Type: `one of 3`  

###### WedgeCoreList

Type: `WedgeCoreList`  

###### `data`

Type: `WedgeCore[]`  
Required: yes  

###### WedgeCore

Type: `WedgeCore`  

The Core wedge document.

###### `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.

###### `lofts_deg`

Type: `number[]`  
Required: no  

Sorted union of offered nominal lofts.

###### number

Type: `number`  

###### `hands`

Type: `string[]`  
Required: no  

Available hands, ordered rh then lh.

###### string

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

###### `variants`

Type: `WedgeVariantCore[]`  
Required: no  

###### WedgeVariantCore

Type: `WedgeVariantCore`  

One loft, bounce, grind, hand and market. `grind` is the manufacturer's grind or sole-profile label as given; an absent bounce or grind is unknown.

###### `id`

Type: `string`  
Required: yes  

###### `hand`

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

###### `market`

Type: `string`  
Required: yes  

###### `loft_deg`

Type: `number`  
Required: yes  

###### `bounce_deg`

Type: `number`  
Required: no  

###### `grind`

Type: `string`  
Required: no  

###### `lie_deg`

Type: `number`  
Required: no  

###### `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.

###### `page`

Type: `Page`  
Required: yes  

###### `limit`

Type: `number`  
Required: yes  

###### `has_more`

Type: `boolean`  
Required: yes  

###### `catalog_complete`

Type: `boolean`  
Required: yes  

False for this published catalog. An empty page means no match in this build; it does not establish that a club does not exist.

###### `next`

Type: `string`  
Required: no  

###### WedgeExpandedList

Type: `WedgeExpandedList`  

###### `data`

Type: `WedgeExpanded[]`  
Required: yes  

###### WedgeExpanded

Type: `WedgeExpanded`  

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

###### `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.

###### `lofts_deg`

Type: `number[]`  
Required: no  

Sorted union of offered nominal lofts.

###### number

Type: `number`  

###### `hands`

Type: `string[]`  
Required: no  

Available hands, ordered rh then lh.

###### string

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

###### `variants`

Type: `WedgeVariant[]`  
Required: no  

###### WedgeVariant

Type: `WedgeVariant`  

A wedge variant with its stock build length.

###### `id`

Type: `string`  
Required: yes  

###### `hand`

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

###### `market`

Type: `string`  
Required: yes  

###### `loft_deg`

Type: `number`  
Required: yes  

###### `bounce_deg`

Type: `number`  
Required: no  

###### `grind`

Type: `string`  
Required: no  

###### `lie_deg`

Type: `number`  
Required: no  

###### `length_in`

Type: `number`  
Required: no  

###### `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  

###### `page`

Type: `Page`  
Required: yes  

###### `limit`

Type: `number`  
Required: yes  

###### `has_more`

Type: `boolean`  
Required: yes  

###### `catalog_complete`

Type: `boolean`  
Required: yes  

False for this published catalog. An empty page means no match in this build; it does not establish that a club does not exist.

###### `next`

Type: `string`  
Required: no  

###### MarketClubList

Type: `MarketClubList`  

###### `data`

Type: `MarketClub[]`  
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.

###### `page`

Type: `Page`  
Required: yes  

###### `limit`

Type: `number`  
Required: yes  

###### `has_more`

Type: `boolean`  
Required: yes  

###### `catalog_complete`

Type: `boolean`  
Required: yes  

False for this published catalog. An empty page means no match in this build; it does not establish that a club does not exist.

###### `next`

Type: `string`  
Required: no  

### 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 `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/wedges/methods/list/)
- [curl Markdown](/api/wedges/curl/methods/list.md)
- [JavaScript Markdown](/api/wedges/javascript/methods/list.md)
- [Python Markdown](/api/wedges/python/methods/list.md)
- [product llms.txt](/api/wedges/llms.txt)
