---
title: "List eSIM offers"
canonical: "https://bird.com/docs/api/reference/list-esim-offers"
---

# List eSIM offers

`GET /v1/esim/offers`

Returns the eSIM offers your workspace can order as a cursor-paginated list. Filter by `country` to find offers covering a destination (the zone's country list is the guarantee), or by `zone_id` for one coverage footprint. Retired offers are excluded unless requested via `status`.

## Code samples

**CLI**

```sh
bird esim offers list
```

Examples: [CLI](/docs/api/reference/list-esim-offers.cli.md) · [MCP](/docs/api/reference/list-esim-offers.mcp.md) · [cURL](/docs/api/reference/list-esim-offers.curl.md)

## Example response `200`

```json
{
  "data": [
    {
      "id": "eof_01krdgeqcxet5s7t44vh8rt9mg",
      "name": "Europe 10 GB / 30 days",
      "zone_id": "ezn_01krdgeqcxet5s7t44vh8rt9mg",
      "speed": "full",
      "phone": {
        "included": "always",
        "voice_inbound": false,
        "voice_outbound": false,
        "sms_inbound": true,
        "sms_outbound": false
      },
      "pricing": {
        "data": {
          "amount_bytes": 10737418240
        },
        "validity": {
          "type": "one_time",
          "unit": "day",
          "value": 30
        },
        "price": {
          "amount": "0.00995",
          "currency_code": "USD"
        }
      },
      "product": "email_sends",
      "status": "draft"
    }
  ],
  "next_cursor": "eyJ2IjoxLCJzIjoiXCIyMDI2LTA1LTI1VDE0OjAzOjEwWlwiIiwiaSI6IjAxOTJmM2IxLTRjN2UtN2EyYi05ZDYxLThmM2E1YzJlN2I0MCJ9",
  "prev_cursor": null,
  "refresh_cursor": "eyJ2IjoxLCJzIjoiXCIyMDI2LTA1LTI1VDE2OjQyOjAxWlwiIiwiaSI6IjAxOTJmM2IxLTllMDQtN2NkMy1iODE3LTJhNmY0ZDFjOGUwOSJ9"
}
```

## Query parameters

- `sort` (string)

  Field to sort by. Possible values: created_at.

  Possible values: `created_at`
- `order` (string)

  Sort direction. Defaults to `desc`, which sorts from newest to oldest or largest to smallest, depending on the selected sort field.

  Possible values: `asc`, `desc`
- `limit` (integer): Maximum number of items to return per page.
- `starting_after` (string): Cursor from the `next_cursor` field of a previous list response. Returns items immediately after the cursor position in the current sort order.
- `ending_before` (string): Cursor from the `prev_cursor` or `refresh_cursor` field of a previous list response. Returns items immediately before the cursor position in the current sort order. `prev_cursor` returns the preceding page. `refresh_cursor` anchors at the first row of that response, which on a newest-first sort is how to fetch the items that have appeared since.
- `include_total` (boolean): When true, the response includes a `total` field with the total number of items matching the request's filters across all pages.
- `country` (string): Keep only offers whose coverage zone includes this country (ISO 3166-1 alpha-2).
- `zone_id` (string): Keep only offers selling this coverage zone.
- `status` (string)

  Filter by offer availability. Omitted, only active offers are returned.

  Possible values: `draft`, `active`, `retired`

## Response body

- `data` (array of object, required): Offers, newest first.
- `data.id` (string, required)
- `data.name` (string, required): Display name of the offer.
- `data.revision` (integer, required): Increments whenever the offer's terms change. Orders lock the revision they were quoted at.
- `data.zone_id` (string, required): Coverage zone the offer sells. Offers for the same footprint share one zone.
- `data.speed` (string, required): Speed class. For reduced-speed offers, the bundle's data.throttled_after_bytes carries the full-speed allowance.
- `data.stackable` (boolean, required): Whether packages from this offer can be held alongside packages from other zones on the same eSIM, subject to the eSIM's package_limit.
- `data.phone` (nullable object, required): Phone service that comes with the plan, or null when the plan includes no phone number. When present, `included` says how the number is provided and the flags state which call and text directions work.
- `data.phone.included` (string, required)

  How the plan provides a phone number.

  - `always`: a phone number is included with each eSIM purchased from the offer.
  - `on_request`: reserved for offers with an optional phone number; currently unavailable.

  Possible values: `always`, `on_request`
- `data.phone.voice_inbound` (boolean, required): The eSIM can receive calls on its phone number.
- `data.phone.voice_outbound` (boolean, required): The eSIM can place calls.
- `data.phone.sms_inbound` (boolean, required): The eSIM can receive text messages on its phone number.
- `data.phone.sms_outbound` (boolean, required): The eSIM can send text messages.
- `data.pricing` (object, required): Commercial terms of the offer. Every offer in the current catalog is a bundle: a fixed allowance with a validity period for a fixed price. Match on the pricing type; treat an unrecognized type as an offer your integration cannot order yet.
- `data.pricing.type` (string, required)

  Pricing type.

  Value: `bundle`
- `data.pricing.data` (object, required)
- `data.pricing.data.amount_bytes` (integer, required): Total data allowance in bytes.
- `data.pricing.data.throttled_after_bytes` (nullable integer): Data amount in bytes after which speed is reduced instead of cut off. Null when the allowance is a hard cap.
- `data.pricing.validity` (object, required): Validity of packages created from this offer. The period starts at activation, which happens on first use in the coverage zone. The effective validity is capped by the eSIM's service period: see the package's expires_at for the real expiry.
- `data.pricing.validity.type` (string, required)
- `data.pricing.validity.unit` (string, required)
- `data.pricing.validity.value` (integer, required): Number of units per period.
- `data.pricing.validity.minimum_periods` (nullable integer): For recurring offers, the minimum number of periods committed. Null when there is no minimum, and for one_time offers.
- `data.pricing.price` (object, required): What your workspace is billed per package provisioned from this offer.
- `data.pricing.price.amount` (string, required): Decimal amount as a string, in major currency units.
- `data.pricing.price.currency_code` (string, required): ISO 4217 currency code.
- `data.product` (string, required): Billing product the offer's charges post under, as it appears on your invoice line items.
- `data.status` (string, required)
- `data.created_at` (string, required)
- `next_cursor` (nullable string, required): Cursor for the next page. Pass back as `starting_after` to advance forward. `null` when no next page exists.
- `prev_cursor` (nullable string, required): Cursor for the previous page. Pass back as `ending_before` to step backward. `null` when no previous page exists.
- `refresh_cursor` (nullable string, required): Refresh anchor, the first row of this response. Pass back as `ending_before` to fetch what precedes it in the current sort order. On a newest-first sort those are the items that have appeared since; on any other sort they are the items that sort earlier, so refreshing such a list means re-fetching it instead. Non-`null` whenever `data` is non-empty; `null` only on an empty page. Distinct from `prev_cursor`.
- `total` (nullable integer): Total number of items matching the request's filters across all pages. Present only when `include_total=true` was passed; otherwise `null`.

## Related resources

- [Should I use a Bird SDK or call the API directly?](/explained/platform/should-i-use-an-sdk-or-call-the-api-directly) (answer)
- [Build your first integration](/learn/paths/integration) (course)
- [Send your first email](/docs/get-started/send-your-first-email) (docs)

[Get an implementation brief](/learn/workspace?topic=api-basics)
