---
title: "Extra option suboption model"
description: "An ExtraOptionSuboption is a selectable choice that belongs to one ExtraOption through extra_option_id."
canonical: https://docs.ordering.co/api-reference/guides/extra-option-suboption-model/
---

# Extra option suboption model

An `ExtraOptionSuboption` is a selectable choice that belongs to one `ExtraOption` through `extra_option_id`. The enclosing route also identifies the business and parent extra; those IDs are not interchangeable.

## Operations

| Action | Method          | Resource                                                                                  |
| ------ | --------------- | ----------------------------------------------------------------------------------------- |
| List   | `GET`           | `/business/{business_id}/extras/{extra_id}/options/{option_id}/suboptions`                |
| Find   | `GET`           | `/business/{business_id}/extras/{extra_id}/options/{option_id}/suboptions/{suboption_id}` |
| Create | `POST`          | `/business/{business_id}/extras/{extra_id}/options/{option_id}/suboptions`                |
| Update | `PUT` or `POST` | `/business/{business_id}/extras/{extra_id}/options/{option_id}/suboptions/{suboption_id}` |
| Delete | `DELETE`        | `/business/{business_id}/extras/{extra_id}/options/{option_id}/suboptions/{suboption_id}` |

List and item reads may be public, while mutations may require administrator or business-manager access. Match the business, extra, and option IDs in nested routes; read and mutation permissions can differ.

## Shared concepts

The model includes fields such as `id`, `extra_option_id`, `name`, `price`, `image`, `sku`, `rank`, `description`, `max`, `half_price`, `enabled`, `external_id`, `preselected`, `is_alcohol`, and `snooze_until`. Its parent relation is `option`; its metadata relation is `metafields`.

### Half-option price

`half_price` is the configured amount for this suboption when it is placed on half of a product. It is not calculated as a percentage of `price`. In backend order processing, a null `half_price` falls back to the full `price`; numeric zero is a distinct backend value. The reviewed client UI handles zero differently, so do not assume it is displayed as free in every client. See [Special data types](https://docs.ordering.co/api-reference/guides/special-data-types/) for the order input and placement behavior.

For the Dashboard setup, see [Configure product options](https://docs.ordering.co/docs/products/dashboard/stores/create-edit-product/product-options/); for the Website flow, see [Customize and add a product](https://docs.ordering.co/docs/products/website/browse/customize-product/).

See [load the parent option](https://docs.ordering.co/api-reference/guides/extra-option-suboptions-special-request/) and the [extra suboption metafield operations](https://docs.ordering.co/api-reference/guides/get-extra-suboption-metafields/).

## Schema properties

**Schema:** `ExtraOptionSuboption`

| Name              | Type            | Description |
| ----------------- | --------------- | ----------- |
| `created_at`      | string \| null  | —           |
| `deleted_at`      | string \| null  | —           |
| `description`     | string \| null  | —           |
| `enabled`         | boolean \| null | —           |
| `external_id`     | string \| null  | —           |
| `extra_option_id` | integer \| null | —           |
| `half_price`      | number \| null  | —           |
| `id`              | integer \| null | —           |
| `image`           | string \| null  | —           |
| `is_alcohol`      | boolean \| null | —           |
| `max`             | integer \| null | —           |
| `name`            | string \| null  | —           |
| `preselected`     | boolean \| null | —           |
| `price`           | number \| null  | —           |
| `rank`            | number \| null  | —           |
| `sku`             | string \| null  | —           |
| `snooze_until`    | any             | —           |
| `updated_at`      | string \| null  | —           |
