Sign inGet Started

List eSIM offers

GET
/v1/esim/offers
bird esim offers list
Response200
{
  "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"
}

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.

Query Parameters

sortstring

Field to sort by. Possible values: created_at.

Possible values: created_at

orderstring

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

limitinteger

Maximum number of items to return per page.

starting_afterstring

Cursor from the next_cursor field of a previous list response. Returns items immediately after the cursor position in the current sort order.

ending_beforestring

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_totalboolean

When true, the response includes a total field with the total number of items matching the request's filters across all pages.

countrystring

Keep only offers whose coverage zone includes this country (ISO 3166-1 alpha-2).

zone_idstring

Keep only offers selling this coverage zone.

statusstring

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

Possible values: draft, active, retired

Response Payload

data
array of object
required

Offers, newest first.

Show child attributes
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.

Show child attributes
data.phone.included
string
required

How a plan's phone number is provided. always means every eSIM sold from the offer carries a number. on_request is declared ahead of the plans that attach one per order, so its arrival is not a breaking change; no current offer answers it.

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.

Show child attributes
data.pricing.type
string
required

Pricing type.

Value: bundle

data.pricing.data
object
required
Show child attributes
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.

Show child attributes
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.

Show child attributes
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.

Continue with the documentation, guides and examples for this topic.