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

# Fetch a driver's hosel context

> Read the club’s hosel connection and applicable setting charts. Requires the club resource and club-builder entitlements. Returns 503 when no hosel context or signed hosel catalog is published. Unknown query parameters are ignored on this route.

- Product: Drivers
- Section: drivers
- Snapshot: Current
- Method: `GET`
- Path: `/drivers/{ref}/hosel`
- Availability: generally-available

## Path parameters

### `ref`

Type: `string`  
Required: yes  

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

## Query parameters

### `hand`

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

Narrow to one hand.

### `market`

Type: `string`  
Required: no  

Narrow scopes to one market.

## Execute with curl

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

## Execute with JavaScript

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

## Responses

### Response `200`

Category: success  

The club's hosel context, narrowed to the requested scope.

#### `application/json`

##### Generated example

```json
{
  "club_id": "club_id",
  "slug": "slug",
  "resource": "drivers",
  "connection_type": "adapter",
  "scopes": [
    {
      "hands": [
        "rh"
      ],
      "markets": [
        "markets"
      ],
      "chart_codes": [
        "chart_codes"
      ],
      "limitations": [
        "limitations"
      ]
    }
  ],
  "url": "url",
  "_links": {
    "self": "self",
    "club": "club",
    "system": "system"
  },
  "system_id": "system_id",
  "adjustable": true,
  "charts": [
    {
      "code": "code",
      "name": "name",
      "family_slugs": [
        "family_slugs"
      ],
      "settings": [
        {
          "code": "code",
          "label": "label",
          "loft_delta_deg": 0,
          "lie_delta_deg": 0,
          "face_angle_delta_deg": 0
        }
      ],
      "complete": true,
      "hands": [
        "rh"
      ],
      "applicability_note": "applicability_note",
      "reference_basis": {
        "loft": "loft",
        "lie": "lie",
        "face_angle": "face_angle"
      }
    }
  ],
  "standard_setting": {
    "rh": "rh",
    "lh": "lh"
  }
}
```

##### Schema

###### HoselContext

Type: `HoselContext`  

A club's hosel applicability. system_id, adjustable, charts, standard_setting and _links.system are present for connection_type 'adapter' and absent for 'bonded'. charts carries only the charts the selected scopes name.

###### `club_id`

Type: `string`  
Required: yes  

###### `slug`

Type: `string`  
Required: yes  

###### `resource`

Type: `string`  
Required: yes  
Allowed values: `drivers`, `mini-drivers`, `fairway-woods`, `hybrids`  

###### `connection_type`

Type: `string`  
Required: yes  
Allowed values: `adapter`, `bonded`  

###### `scopes`

Type: `HoselScope[]`  
Required: yes  

###### HoselScope

Type: `HoselScope`  

One block of applicability. A request narrowed by hand or market returns scopes already narrowed to it.

###### `hands`

Type: `string[]`  
Required: yes  

###### string

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

###### `markets`

Type: `string[]`  
Required: yes  

###### string

Type: `string`  

###### `chart_codes`

Type: `string[]`  
Required: no  

###### string

Type: `string`  

###### `limitations`

Type: `string[]`  
Required: no  

###### string

Type: `string`  

###### `url`

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

###### `_links`

Type: `object`  
Required: yes  

###### `self`

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

###### `club`

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

###### `system`

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

###### `system_id`

Type: `string`  
Required: no  

###### `adjustable`

Type: `boolean`  
Required: no  

###### `charts`

Type: `HoselChart[]`  
Required: no  

###### HoselChart

Type: `HoselChart`  

complete=false means the published chart does not cover every setting the system offers; it is never extrapolated.

###### `code`

Type: `string`  
Required: yes  

###### `name`

Type: `string`  
Required: yes  

###### `hands`

Type: `string[]`  
Required: no  

###### string

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

###### `family_slugs`

Type: `string[]`  
Required: yes  

###### string

Type: `string`  

###### `settings`

Type: `HoselSetting[]`  
Required: yes  

###### HoselSetting

Type: `HoselSetting`  

###### `code`

Type: `string`  
Required: yes  

###### `label`

Type: `string`  
Required: yes  

###### `loft_delta_deg`

Type: `number`  
Required: no  

###### `lie_delta_deg`

Type: `number`  
Required: no  

###### `face_angle_delta_deg`

Type: `number`  
Required: no  

###### `complete`

Type: `boolean`  
Required: yes  

###### `applicability_note`

Type: `string`  
Required: no  

###### `reference_basis`

Type: `ReferenceBasis`  
Required: no  

###### `loft`

Type: `string`  
Required: no  

###### `lie`

Type: `string`  
Required: no  

###### `face_angle`

Type: `string`  
Required: no  

###### `standard_setting`

Type: `object`  
Required: no  

###### `rh`

Type: `string`  
Required: no  

###### `lh`

Type: `string`  
Required: no  

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