# Get offering options

Lists what can be ordered from one offering — its locations, its sizes with a price per location, the location and size to preselect, the price of a parked server — and every word the create form shows: the labels, the proposed server name, each choice's summary and button text, and the lines under the button. A client renders these strings as they are and builds none itself. Show the person the price of the location and size they pick, then send that price back as the `quote` of [Create a server](/docs/api-reference/forge-compute/create-host).

**Free sizing (Aitronos servers).** Besides the fixed `sizes`, vCPU and memory can be picked separately from `cpu_choices` and `memory_choices`. The server is then the cheapest one in the location with at least that many vCPUs and at least that much memory; `resolutions` holds that answer for every offered pair, so look it up rather than computing it, and [Resolve a free size](/docs/api-reference/forge-compute/resolve-offering-size) answers any other pair. When no server has both, the entry's `machine_type_id` is `null` and its `note` names the largest server there.

For **Aitronos servers** (`aitronos`) the locations are regions labelled by country, the sizes are Aitronos size classes, and each `hourly` is what your organization is charged per started hour, in CHF, excluding VAT, with your organization's individual agreement already applied. For **your own account** (`byo`) the locations, sizes and prices are the provider's own, in the provider's currency, read with your connected account and cached for 10 minutes; the provider bills you for them. A price that cannot be read right now is `null` with `price_verified: false`, never `0`, and such a size cannot be created until it can.

It acts for a person: it requires a bearer token whose user holds the `use_forge` capability in the acting organization, and Forge cloud compute switched on for the organization.

#### Path Parameters

**`offering_id`** string required

The offering `id` from [List compute offerings](/docs/api-reference/forge-compute/list-offerings): `aitronos`, or a bring-your-own provider such as `hetzner` or `digitalocean`. 1 to 64 characters.

#### Query Parameters

**`organization_id`** string optional

The organization to act in. Defaults to your current organization. You must be an active member of it, or the request is refused with `403 ORGANIZATION_ACCESS_DENIED`.

#### Headers

**`X-Organization-Id`** string optional

The same as `organization_id`, as a header. When both are sent, the query parameter wins.

## Returns

**`catalog_version`** string — send it back inside the `quote` of a create or resume.

**`title`** string — the offering's name to show over the form, e.g. `Aitronos servers`.

**`description`** string or `null` — one line under the title.

**`free_sizing`** boolean — `true` when vCPU and memory can be picked separately (`machine_types` is not empty). Aitronos servers only.

**`fields`** object — every label of the create form: `location`, `size`, `cpu`, `memory`, `name`, `change`, `cancel`, `create`, `creating` (the button while the request runs), `alternatives` (the heading over other choices after a refusal), and `name_max_length` (63).

**`currency`** string — ISO 4217 code of every price in the response: `CHF` for Aitronos servers, the provider's own currency for your own account.

**`price_source`** string — who sets and bills the prices: `aitronos` (billed to your organization), or the offering id of the provider that bills you.

**`locations`** array — where servers can run, each with `id`, `label`, `detail` (a second line, or `null`), `country` (ISO 3166-1 alpha-2), `available` (at least one size can be ordered there now), `order`, `option_label` (the text of the location picker's entry, e.g. `Finland · Not available here`) and `proposed_name` (the server name to propose while this location is selected: the location's name and the lowest number none of your organization's servers uses, e.g. `germany-2`).

**`sizes`** array — smallest first, each with `id`, `label`, `vcpu`, `memory_gb`, `disk_gb` (or `null`), `arch` (`x86_64` or `arm64`), `dedicated_cpu`, `order` and `prices`: one entry per location the size is offered in, with:

- **`location_id`** string — the location the price applies to.
- **`hourly`** string or `null` — price per started hour as a decimal string in `currency`, excluding VAT; `null` when it could not be read.
- **`monthly_cap`** string or `null` — the most one server of this size is charged in a calendar month.
- **`includes_vat`** boolean — always `false`.
- **`available`** boolean — the size can be ordered in this location now.
- **`price_verified`** boolean — `false` when `hourly` could not be read.
- **`summary`** string — the choice in one line, e.g. `16 vCPU · 64 GB · Germany`.
- **`option_label`** string — the text of the size picker's entry, with its price or why it cannot be ordered.
- **`message`** string — why this choice cannot be created right now; present only then.
- **`button_label`** string — the create button for this choice, e.g. `Create · 16 vCPU · 64 GB · Germany · CHF 0.83/h, at most CHF 520.30/month`.
- **`can_create`** boolean — whether the create button is enabled for this choice.


**`machine_types`** array — free sizing: every server that can be picked by vCPU and memory, smallest first, in the same shape as `sizes`. A machine type of the same vCPU and memory as a size has that size's id (`std-16`); the others are named after their shape (`ded-x86-48c-192g`). Empty for a bring-your-own offering.

**`cpu_choices`**, **`memory_choices`** arrays — free sizing: the values to offer, each `{value, label}` (`{"value": 16, "label": "16 vCPU"}`, `{"value": 64, "label": "64 GB"}`).

**`resolutions`** array — free sizing: for every location × `cpu_choices` value × `memory_choices` value, `{location_id, vcpu, memory_gb, machine_type_id, note}`. `machine_type_id` is the `machine_types` entry to create (its price is in that entry), or `null` when no server there has both; `note` is a sentence to show (why a larger server was chosen, or the largest server there), or `null` for an exact match.

**`defaults`** object — `location_id` and `size_id` to preselect (each may be `null`); `name`, the server name to propose for that location; and for free sizing `vcpu`, `memory_gb` and `machine_type_id` to preselect (`null` without free sizing).

**`parked_storage`** object — `per_gb_month` (price per GB of a parked server per month as a decimal string, or `null` when it is not charged this way or unknown) and `note` (how parking works for this offering).

**`notes`** array of strings — sentences to show next to the prices.

**`footer_notes`** array — the lines to show under the create button, in order, each `{id, text}`: `billed_to` (who is billed), `auto_park` (after how many idle hours a server parks itself, from your [compute settings](/docs/api-reference/forge-compute/get-settings); left out when it never does), `park` and `connected_as` (bring-your-own), then `note_1`, `note_2`, … (the `notes`).

Abbreviated: one of the four sizes, one of the six machine types and two of the 72 resolutions.


```json
{
  "catalog_version": "fc-3b8e1f0a9c42",
  "currency": "CHF",
  "price_source": "aitronos",
  "title": "Aitronos servers",
  "description": "Billed to your organization as Forge cloud compute.",
  "free_sizing": true,
  "fields": {
    "location": "Location",
    "size": "Size",
    "cpu": "CPU",
    "memory": "Memory",
    "name": "Name",
    "change": "Change",
    "cancel": "Cancel",
    "create": "Create",
    "creating": "Creating…",
    "alternatives": "Available instead",
    "name_max_length": 63
  },
  "locations": [
    {
      "id": "eu-central",
      "label": "Germany",
      "detail": "Falkenstein or Nuremberg",
      "country": "DE",
      "available": true,
      "order": 0,
      "option_label": "Germany",
      "proposed_name": "germany-1"
    },
    {
      "id": "eu-north",
      "label": "Finland",
      "detail": "Helsinki",
      "country": "FI",
      "available": true,
      "order": 1,
      "option_label": "Finland",
      "proposed_name": "finland-1"
    }
  ],
  "sizes": [
    {
      "id": "std-16",
      "label": "16 vCPU · 64 GB",
      "vcpu": 16,
      "memory_gb": 64,
      "disk_gb": 360,
      "arch": "x86_64",
      "dedicated_cpu": true,
      "order": 2,
      "prices": [
        {
          "location_id": "eu-central",
          "hourly": "0.83",
          "monthly_cap": "520.30",
          "includes_vat": false,
          "available": true,
          "price_verified": true,
          "summary": "16 vCPU · 64 GB · Germany",
          "option_label": "16 vCPU · 64 GB · CHF 0.83/h",
          "button_label": "Create · 16 vCPU · 64 GB · Germany · CHF 0.83/h, at most CHF 520.30/month",
          "can_create": true
        },
        {
          "location_id": "eu-north",
          "hourly": "0.83",
          "monthly_cap": "520.30",
          "includes_vat": false,
          "available": true,
          "price_verified": true,
          "summary": "16 vCPU · 64 GB · Finland",
          "option_label": "16 vCPU · 64 GB · CHF 0.83/h",
          "button_label": "Create · 16 vCPU · 64 GB · Finland · CHF 0.83/h, at most CHF 520.30/month",
          "can_create": true
        }
      ]
    }
  ],
  "machine_types": [
    {
      "id": "ded-x86-48c-192g",
      "label": "48 vCPU · 192 GB",
      "vcpu": 48,
      "memory_gb": 192,
      "disk_gb": 960,
      "arch": "x86_64",
      "dedicated_cpu": true,
      "order": 5,
      "prices": [
        {
          "location_id": "eu-central",
          "hourly": "2.58",
          "monthly_cap": "1607.04",
          "includes_vat": false,
          "available": true,
          "price_verified": true,
          "summary": "48 vCPU · 192 GB · Germany",
          "option_label": "48 vCPU · 192 GB · CHF 2.58/h",
          "button_label": "Create · 48 vCPU · 192 GB · Germany · CHF 2.58/h, at most CHF 1,607.04/month",
          "can_create": true
        },
        {
          "location_id": "eu-north",
          "hourly": "2.58",
          "monthly_cap": "1607.04",
          "includes_vat": false,
          "available": true,
          "price_verified": true,
          "summary": "48 vCPU · 192 GB · Finland",
          "option_label": "48 vCPU · 192 GB · CHF 2.58/h",
          "button_label": "Create · 48 vCPU · 192 GB · Finland · CHF 2.58/h, at most CHF 1,607.04/month",
          "can_create": true
        }
      ]
    }
  ],
  "cpu_choices": [
    {"value": 2, "label": "2 vCPU"},
    {"value": 4, "label": "4 vCPU"},
    {"value": 8, "label": "8 vCPU"},
    {"value": 16, "label": "16 vCPU"},
    {"value": 32, "label": "32 vCPU"},
    {"value": 48, "label": "48 vCPU"}
  ],
  "memory_choices": [
    {"value": 8, "label": "8 GB"},
    {"value": 16, "label": "16 GB"},
    {"value": 32, "label": "32 GB"},
    {"value": 64, "label": "64 GB"},
    {"value": 128, "label": "128 GB"},
    {"value": 192, "label": "192 GB"}
  ],
  "resolutions": [
    {"location_id": "eu-central", "vcpu": 16, "memory_gb": 64, "machine_type_id": "std-16", "note": null},
    {
      "location_id": "eu-central",
      "vcpu": 16,
      "memory_gb": 192,
      "machine_type_id": "ded-x86-48c-192g",
      "note": "No server in Germany has exactly 16 vCPU and 192 GB, so this is the cheapest one with at least that much."
    }
  ],
  "defaults": {
    "location_id": "eu-central",
    "size_id": "std-16",
    "name": "germany-1",
    "vcpu": 16,
    "memory_gb": 64,
    "machine_type_id": "std-16"
  },
  "parked_storage": {"per_gb_month": "0.0269", "note": "A parked server is stored as a snapshot."},
  "notes": ["Billed per started hour, never more than the monthly cap.", "Prices exclude VAT."],
  "footer_notes": [
    {
      "id": "billed_to",
      "text": "Billed to Acme AG as Forge cloud compute. Park keeps your work and stops the compute charge."
    },
    {"id": "auto_park", "text": "Parks on its own after 1 h without use."},
    {"id": "note_1", "text": "Billed per started hour, never more than the monthly cap."},
    {"id": "note_2", "text": "Prices exclude VAT."}
  ]
}
```

## Errors

| Status | Code | When |
|  --- | --- | --- |
| 401 | `AUTHENTICATION_REQUIRED` | No credential, or a credential with no user (an organization API key). |
| 403 | `ORGANIZATION_ACCESS_DENIED` | `organization_id` or `X-Organization-Id` names an organization you are not an active member of. |
| 403 | `INSUFFICIENT_PERMISSIONS` | The user does not hold `use_forge` in the acting organization. |
| 403 | `FORGE_COMPUTE_DISABLED` | Forge cloud compute is not switched on for the organization. |
| 403 | `FORGE_COMPUTE_OFFERING_BLOCKED` | The offering cannot be used in this environment. `message` and `details.blocked_reason` are the catalog's `blocked_reason`. |
| 403 | `FORGE_COMPUTE_OFFERING_NOT_OFFERED` | The offering is not offered to you right now: switched off, switched off for your organization, or offered to Aitronos staff only. `message` names the offering (for example "DigitalOcean is not offered right now.") and `details.offering_id` is its id. |
| 404 | `FORGE_COMPUTE_OFFERING_NOT_FOUND` | No offering has this id. |
| 422 | `FORGE_COMPUTE_CREDENTIAL_MISSING` | A bring-your-own offering whose account is not connected. |
| 422 | `FORGE_COMPUTE_CREDENTIAL_REJECTED` | The provider refused the connected account. Connect it again. |
| 502 | `FORGE_COMPUTE_PROVIDER_UNREACHABLE` | The provider did not answer. Try again in a moment. |



```bash cURL
curl "https://api.aitronos.com/v1/forge/compute/offerings/aitronos/options" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
```


```python Python SDK
# pip install aitronos-sdk
#
# The Python SDK does not expose a typed `forge_compute` namespace yet, so call
# the endpoint directly with the same bearer token you would pass to `Aitronos(...)`.
import httpx

ACCESS_TOKEN = "your-access-token"

options = httpx.get(
    "https://api.aitronos.com/v1/forge/compute/offerings/aitronos/options",
    headers={"Authorization": f"Bearer {ACCESS_TOKEN}"},
).json()
default = options["defaults"]
size = next(s for s in options["sizes"] if s["id"] == default["size_id"])
price = next(p for p in size["prices"] if p["location_id"] == default["location_id"])
print(size["label"], price["hourly"], options["currency"])
```


```python Python
import os
import requests

token = os.environ["AITRONOS_TOKEN"]
response = requests.get(
    "https://api.aitronos.com/v1/forge/compute/offerings/aitronos/options",
    headers={"Authorization": f"Bearer {token}"},
)
options = response.json()
quote = {
    "hourly": options["sizes"][2]["prices"][0]["hourly"],
    "currency": options["currency"],
    "catalog_version": options["catalog_version"],
}
print(quote)
```


```javascript JavaScript
const response = await fetch(
  "https://api.aitronos.com/v1/forge/compute/offerings/aitronos/options",
  { headers: { Authorization: `Bearer ${process.env.AITRONOS_TOKEN}` } },
);
const options = await response.json();
const { location_id, size_id } = options.defaults;
const size = options.sizes.find((s) => s.id === size_id);
const price = size.prices.find((p) => p.location_id === location_id);
console.log(size.label, price.hourly, options.currency);
```

**Response:**

200 OK (own account)

```json
{
  "catalog_version": "fc-3b8e1f0a9c42",
  "currency": "USD",
  "price_source": "digitalocean",
  "title": "DigitalOcean",
  "description": "Runs in your own DigitalOcean team. DigitalOcean bills you directly.",
  "free_sizing": false,
  "fields": {
    "location": "Location",
    "size": "Size",
    "cpu": "CPU",
    "memory": "Memory",
    "name": "Name",
    "change": "Change",
    "cancel": "Cancel",
    "create": "Create",
    "creating": "Creating…",
    "alternatives": "Available instead",
    "name_max_length": 63
  },
  "locations": [
    {
      "id": "ams3",
      "label": "Amsterdam 3",
      "detail": "Amsterdam",
      "country": "NL",
      "available": true,
      "order": 0,
      "option_label": "Amsterdam 3",
      "proposed_name": "amsterdam-3-1"
    },
    {
      "id": "fra1",
      "label": "Frankfurt 1",
      "detail": "Frankfurt",
      "country": "DE",
      "available": true,
      "order": 1,
      "option_label": "Frankfurt 1",
      "proposed_name": "frankfurt-1-1"
    }
  ],
  "sizes": [
    {
      "id": "c-8",
      "label": "c-8 · 8 vCPU · 16 GB",
      "vcpu": 8,
      "memory_gb": 16,
      "disk_gb": 100,
      "arch": "x86_64",
      "dedicated_cpu": true,
      "order": 0,
      "prices": [
        {
          "location_id": "ams3",
          "hourly": "0.2500",
          "monthly_cap": "168.00",
          "includes_vat": false,
          "available": true,
          "price_verified": true,
          "summary": "c-8 · 8 vCPU · 16 GB · Amsterdam 3",
          "option_label": "c-8 · 8 vCPU · 16 GB · USD 0.25/h",
          "button_label": "Create · c-8 · 8 vCPU · 16 GB · Amsterdam 3 · USD 0.25/h (DigitalOcean price)",
          "can_create": true
        },
        {
          "location_id": "fra1",
          "hourly": "0.2500",
          "monthly_cap": "168.00",
          "includes_vat": false,
          "available": true,
          "price_verified": true,
          "summary": "c-8 · 8 vCPU · 16 GB · Frankfurt 1",
          "option_label": "c-8 · 8 vCPU · 16 GB · USD 0.25/h",
          "button_label": "Create · c-8 · 8 vCPU · 16 GB · Frankfurt 1 · USD 0.25/h (DigitalOcean price)",
          "can_create": true
        }
      ]
    }
  ],
  "machine_types": [],
  "cpu_choices": [],
  "memory_choices": [],
  "resolutions": [],
  "defaults": {
    "location_id": "fra1",
    "size_id": "c-8",
    "name": "frankfurt-1-1",
    "vcpu": null,
    "memory_gb": null,
    "machine_type_id": null
  },
  "parked_storage": {"per_gb_month": "0.0600", "note": "A parked server is stored as a snapshot."},
  "notes": ["Prices are DigitalOcean's own, billed by DigitalOcean to your account.", "Prices exclude VAT."],
  "footer_notes": [
    {"id": "billed_to", "text": "DigitalOcean bills you directly; nothing is added to Acme AG's usage."},
    {"id": "park", "text": "Park keeps your work and stops the server's hourly bill."},
    {"id": "connected_as", "text": "Connected as ops@acme.example."},
    {"id": "note_1", "text": "Prices are DigitalOcean's own, billed by DigitalOcean to your account."},
    {"id": "note_2", "text": "Prices exclude VAT."}
  ]
}
```

403 Forbidden

```json
{
  "success": false,
  "error": {
    "code": "FORGE_COMPUTE_DISABLED",
    "message": "Cloud servers are not enabled for this organization.",
    "system_message": "Forge cloud compute is disabled for this organization",
    "type": "authorization_error",
    "status": 403,
    "details": {"feature": "forge_compute_enabled"},
    "trace_id": "3f1c9a52-7d4e-4b8a-9c21-6e0d5f7a8b34",
    "timestamp": "2026-09-28T09:00:00Z"
  }
}
```

404 Not Found

```json
{
  "success": false,
  "error": {
    "code": "FORGE_COMPUTE_OFFERING_NOT_FOUND",
    "message": "This server option does not exist. Refresh the list and choose again.",
    "system_message": "Unknown Forge compute offering: 'acme-cloud'",
    "type": "client_error",
    "status": 404,
    "details": {"offering_id": "acme-cloud"},
    "trace_id": "3f1c9a52-7d4e-4b8a-9c21-6e0d5f7a8b34",
    "timestamp": "2026-09-28T09:00:00Z"
  }
}
```

422 Unprocessable Entity

```json
{
  "success": false,
  "error": {
    "code": "FORGE_COMPUTE_CREDENTIAL_MISSING",
    "message": "Connect your DigitalOcean account before using it.",
    "system_message": "No credential connected for DigitalOcean",
    "type": "validation_error",
    "status": 422,
    "details": {"offering": "DigitalOcean"},
    "trace_id": "3f1c9a52-7d4e-4b8a-9c21-6e0d5f7a8b34",
    "timestamp": "2026-09-28T09:00:00Z"
  }
}
```

502 Bad Gateway

```json
{
  "success": false,
  "error": {
    "code": "FORGE_COMPUTE_PROVIDER_UNREACHABLE",
    "message": "DigitalOcean could not be reached. Try again in a moment.",
    "system_message": "DigitalOcean could not be reached",
    "type": "bad_gateway",
    "status": 502,
    "details": {"offering": "DigitalOcean"},
    "trace_id": "3f1c9a52-7d4e-4b8a-9c21-6e0d5f7a8b34",
    "timestamp": "2026-09-28T09:00:00Z"
  }
}
```

## Related Resources

- [Forge cloud compute overview](/docs/api-reference/forge-compute/introduction)
- [List billing organizations](/docs/api-reference/forge-compute/list-billing-organizations)
- [Choose the default billing organization](/docs/api-reference/forge-compute/choose-billing-organization)
- [List project groups](/docs/api-reference/forge-compute/list-project-groups)
- [Register or update a project group](/docs/api-reference/forge-compute/put-project-group)
- [Delete a project group](/docs/api-reference/forge-compute/delete-project-group)
- [List compute offerings](/docs/api-reference/forge-compute/list-offerings)
- [Get offering options](/docs/api-reference/forge-compute/get-offering-options)
- [Resolve a free size](/docs/api-reference/forge-compute/resolve-offering-size)
- [List connected accounts](/docs/api-reference/forge-compute/list-credentials)
- [Connect a cloud account](/docs/api-reference/forge-compute/put-credential)
- [Disconnect a cloud account](/docs/api-reference/forge-compute/delete-credential)
- [Create a server](/docs/api-reference/forge-compute/create-host)
- [List servers](/docs/api-reference/forge-compute/list-hosts)
- [List your servers in every organization](/docs/api-reference/forge-compute/list-my-hosts)
- [Get a server](/docs/api-reference/forge-compute/get-host)
- [Get a server's daily cost and uptime](/docs/api-reference/forge-compute/get-host-usage)
- [List a server's running intervals](/docs/api-reference/forge-compute/list-host-intervals)
- [List a server's event history](/docs/api-reference/forge-compute/list-host-events)
- [Report a setup step](/docs/api-reference/forge-compute/report-progress)
- [Report the server's host key](/docs/api-reference/forge-compute/report-host-key)
- [Mark a server ready](/docs/api-reference/forge-compute/report-ready)
- [Report activity](/docs/api-reference/forge-compute/report-activity)
- [Park a server](/docs/api-reference/forge-compute/park-host)
- [Resume a server](/docs/api-reference/forge-compute/resume-host)
- [Delete a server](/docs/api-reference/forge-compute/delete-host)
- [Revoke a server](/docs/api-reference/forge-compute/revoke-host)
- [Get compute settings](/docs/api-reference/forge-compute/get-settings)
- [Update compute settings](/docs/api-reference/forge-compute/update-settings)
- [Get spend limits](/docs/api-reference/forge-compute/get-limits)
- [Change the organization's limits](/docs/api-reference/forge-compute/update-organization-limits)
- [Set your own limit](/docs/api-reference/forge-compute/update-my-limit)
- [List member limits](/docs/api-reference/forge-compute/list-member-limits)
- [Set a member's limit](/docs/api-reference/forge-compute/update-member-limit)
- [Delete a leftover resource](/docs/api-reference/forge-compute/delete-orphan)
- [Get pricing sheet](/assets/get-pricing.a1f4a5c69505ff07d8f94ed9588348eade862458c82c1d34e23b1c589add5713.4236153a.md)