---
title: "List add-ons"
description: "What can be bought on top of the plan: today, a dedicated sending IP."
url: "https://openemail.uk/docs/api/billing/add-ons"
area: "API"
category: "Mailbox"
---

# List add-ons

What can be bought on top of the plan: today, a dedicated sending IP.

`GET /billing/add-ons`

**Also documents:** `POST /billing/add-ons/checkout`, `DELETE /billing/add-ons/{addOn}`

## GET /billing/add-ons

What can be bought on top of the plan: today, a dedicated sending IP.

## Example

Needs `billing:read`. `eligibility` says whether the workspace qualifies for a dedicated IP. It takes the Business or Enterprise plan and at least 100,000 emails sent in a month, because below that volume a dedicated IP delivers worse than the shared ones. `reason` names what is missing, `plan` or `volume`.

**curl**

```
curl "$OE/billing/add-ons" -H "$AUTH"
```

**Response**

```
{ "object": "list", "data": [{
  "object": "add_on",
  "addOn": "dedicated-ip",
  "available": true,
  "status": null,
  "priceCents": 3999,
  "endsAt": null,
  "eligibility": {
    "eligible": false,
    "plan": "business",
    "monthlySends": 41200,
    "minimumMonthlySends": 100000,
    "reason": "volume"
  },
  "ips": []
}] }
```

> `status` is null until the workspace has the add-on, then `pending` while it is set up, `warming`, `active`, and `releasing` once it is being taken down.

> Only the owner of the workspace reaches billing: an API key, or an access token the owner connected with every address. A member’s token is a 403 `owner_only`, and a key or token limited to particular addresses or domains is a 422 `capability_unsupported`.

## Buy it

Needs `billing:write`. `POST /billing/add-ons/checkout` returns the link where the person pays. Once it is paid, the IP is set up and warmed up.

**curl**

```
curl -X POST "$OE/billing/add-ons/checkout" -H "$AUTH" -H 'content-type: application/json' \
  -d '{ "addOn": "dedicated-ip" }'
```

**Response**

```
{ "object": "add_on_checkout", "addOn": "dedicated-ip", "url": "https://checkout.example.com/c/9Tn4wRb1xK7pQ2zd" }
```

> A workspace that already has it is a 409 `add_on_already_active`, one that does not qualify is a 409 `add_on_not_eligible`, and when every IP is taken it is a 409 `add_on_sold_out`.

> Nothing is paid through the API. The link opens the billing provider’s page, where the person pays, changes the card or cancels, as they do from the app.

> An OAuth access token needs a verification code for this call. Until the app has verified one in the last 60 minutes, the call answers `403` `step_up_required` and changes nothing. An API key is never asked. The Authentication page shows how to ask for a code and verify it.

## Cancel it

Needs `billing:write`. `DELETE /billing/add-ons/dedicated-ip` cancels it at the end of the month already paid for, which `endsAt` gives. Then the IP is released and mail leaves through the shared IPs again.

**curl**

```
curl -X DELETE "$OE/billing/add-ons/dedicated-ip" -H "$AUTH"
```

**Response**

```
{ "object": "add_on", "addOn": "dedicated-ip", "status": "active", "endsAt": "2026-11-01T00:00:00.000Z" }
```

> A workspace without the add-on is a 409 `add_on_not_active`.

> An OAuth access token needs a verification code for this call. Until the app has verified one in the last 60 minutes, the call answers `403` `step_up_required` and changes nothing. An API key is never asked. The Authentication page shows how to ask for a code and verify it.

## Reference

- [`GET /billing/add-ons`](https://openemail.uk/docs/api/reference/billing#get-billing-add-ons): full reference
- [`POST /billing/add-ons/checkout`](https://openemail.uk/docs/api/reference/billing#post-billing-add-ons-checkout): full reference
- [`DELETE /billing/add-ons/{addOn}`](https://openemail.uk/docs/api/reference/billing#delete-billing-add-ons-addon): full reference
