Hubby Partner API (5.20.0)

Every response of a matched route carries the header X-Hubby-Call-Id, the id of the call in Hubby's records. A request refused before it reaches a route carries no call id: an unknown path (404, code not_found), a method the path does not take (405, code method_not_allowed), or a query string PHP cannot parse whole (400, code malformed_query_string). Those two refusals, 405 and 400, can answer any path and are not listed per operation. Every 4xx refusal body carries a message and a code to branch on. A 5xx can carry a message alone: the issue call's 500 (POST /v1/bookings/{booking}/items/{item}/package) has no code; retry it with the same Idempotency-Key.

Download OpenAPI description
Languages
Servers
Production
https://core.hubbyesim.com/api/
Staging
https://core-staging.hubbyesim.com/api/

Analytics

Operations

Booking

Operations

BookingItemPackage

Operations

Bundle

Operations

List the bundles you sell for one destination

Request

The bundles of one destination, in the same shape and with the same ETag behaviour as GET /v1/bundles. Only sellable bundles: active, visible and with a retail price on your price list. prices.net can still be null on one of them (see Bundle.prices.net).

Path
destinationstringrequired

The destination: its id (a ULID), an ISO 3166-1 alpha-2 or alpha-3 code, a region's code, or its English name, in any letter case. A translated name is not accepted here. Only a destination you can sell resolves: when your account has a destination list, a destination outside it answers 404 not_found, like an unknown value.

Headers
If-None-Matchstring

The ETag of the catalog you hold. When the catalog has not changed since, the answer is 304 with no body.

curl -i -X GET \
  'https://core.hubbyesim.com/api/v1/destinations/{destination}/bundles' \
  -H 'If-None-Match: string' \
  -H 'X-Api-Key: YOUR_API_KEY_HERE' \
  -H 'X-Signature: YOUR_API_KEY_HERE' \
  -H 'X-Timestamp: YOUR_API_KEY_HERE'

Responses

Array of Bundle

Headers
ETagstringrequired

A weak validator for this exact body. It changes whenever any bundle or price in the answer changes. Send it back as If-None-Match.

X-Hubby-Call-Idstringrequired

The id of this call in Hubby's records. Quote it when you ask Hubby about a call.

Bodyapplication/json
dataArray of objects(Bundle)required
data[].​idstringrequired

The bundle's id. Stable: name it as bundle_id to book exactly this bundle.

data[].​destinationobject(DestinationSummary)required

The destination the bundle is sold for. A region carries its code in iso2 or in iso3.

data[].​destination.​idstringrequired

The destination's id: the id of GET /v1/destinations/{destination}.

data[].​destination.​namestring or nullrequired

The destination's English name, for example Spain or Europe.

data[].​destination.​typestring(DestinationKind)required

country or region.

Enum"country""region"
data[].​destination.​iso2string or nullrequired

The country's ISO 3166-1 alpha-2 code, or the region's code when the region keeps it here (for example EU). Null when the region keeps its code in iso3.

data[].​destination.​iso3string or nullrequired

The country's ISO 3166-1 alpha-3 code, or the region's code when the region keeps it here (for example XCA). Null when the region keeps its code in iso2.

data[].​typestring(PackageType)required

The package type: data_limited, starter or unlimited. Send it back as package_type when you specify by dimensions.

Enum"data_limited""starter""unlimited"
data[].​labelstringrequired

Internal; not for Partner use; do not build on it.

data[].​providerstringrequired

Internal; not for Partner use; do not build on it.

data[].​size_bytesinteger or nullrequired
data[].​duration_secondsinteger or nullrequired
data[].​duration_daysinteger or nullrequired

The validity in whole days, counted from first use: duration_seconds / 86400, rounded to the nearest whole day. Unlimited bundles are listed once for every day count that has a price.

data[].​package_templateobjectrequired

Internal; not for Partner use; do not build on it.

data[].​package_template.​idstringrequired
data[].​package_template.​namestringrequired
data[].​partnerobject or nullrequired

Internal; not for Partner use; do not build on it.

data[].​partner.​idstringrequired
data[].​partner.​namestringrequired
data[].​traffic_policyobject or nullrequired

Internal; not for Partner use; do not build on it.

data[].​traffic_policy.​descriptionstring or nullrequired
data[].​fair_use_throttleFairUseThrottle (object) or nullrequired

The Fair-use throttle of an unlimited bundle: after throttle_after_bytes in one day the speed drops to throttled_kbps until the day resets. Show it to the traveller before purchase. Null on a bundle that is not unlimited.

Any of:

The Fair-use throttle of an unlimited bundle: after throttle_after_bytes in one day the speed drops to throttled_kbps until the day resets. Show it to the traveller before purchase. Null on a bundle that is not unlimited.

data[].​fair_use_throttle.​throttle_after_bytesintegerrequired

The daily threshold, in bytes: the data a traveller can use in one day at full speed. The threshold applies per day, not to the whole package.

data[].​fair_use_throttle.​throttled_kbpsintegerrequired

The speed after the daily threshold is passed, in kbps (decimal: 1 Mbps is 1000 kbps). It applies until the threshold resets.

data[].​fair_use_throttle.​resetsstring(FairUseThrottleReset)required

When the threshold resets and the full speed comes back.

daily
Each day: the threshold applies to the data used in one day.
Value"daily"
data[].​is_activebooleanrequired

Internal; not for Partner use; do not build on it.

data[].​is_visiblebooleanrequired

Internal; not for Partner use; do not build on it.

data[].​priorityintegerrequired

Internal; not for Partner use; do not build on it.

data[].​created_atstring or null(date-time)required
data[].​updated_atstring or null(date-time)required

When anything on the bundle last changed. A price change does not move it: compare prices too, or watch the catalog ETag.

data[].​deleted_atstring or null(date-time)required

Internal; not for Partner use; do not build on it.

data[].​created_bystring or nullrequired

Internal; not for Partner use; do not build on it.

data[].​updated_bystring or nullrequired

Internal; not for Partner use; do not build on it.

data[].​pricing_infoobjectrequired

The recommended retail price in EUR major units. Kept for older integrations; read prices instead.

data[].​pricing_info.​final_pricenumberrequired
data[].​pricing_info.​original_pricenumberrequired
data[].​pricing_info.​currencystringrequired
data[].​pricing_info.​currency_symbolstringrequired
data[].​pricing_info.​discount_appliedbooleanrequired
data[].​pricing_info.​discount_percentageintegerrequired
data[].​pricesobjectrequired

Both prices of the bundle, in EUR cents.

data[].​prices.​retailobjectrequired

The recommended retail price: what a traveller pays in Hubby's own shop.

data[].​prices.​retail.​amountintegerrequired
data[].​prices.​retail.​currencystringrequired
Value "EUR"
data[].​prices.​netobject or nullrequired

Your price under your agreement: the amount Hubby invoices you. Null when your price list gives the bundle a retail price but no net price. The bundle is still listed, and you can still book it: your agreement with Hubby, not the API, sets what you pay for it.

data[].​prices.​net.​amountintegerrequired
data[].​prices.​net.​currencystringrequired
Value "EUR"
Response
application/json
{ "data": [ { … } ] }

List every bundle you sell, with your prices

Request

Every bundle of every destination you may sell, with both prices. Only sellable bundles: active, visible and with a retail price on your price list. prices.net can still be null on one of them (see Bundle.prices.net). When your account has a destination list, only the bundles of the destinations on it, the same set your bookings accept. Sync it once a day and send the ETag back as If-None-Match: an unchanged catalog answers 304 with no body.

Headers
If-None-Matchstring

The ETag of the catalog you hold. When the catalog has not changed since, the answer is 304 with no body.

curl -i -X GET \
  https://core.hubbyesim.com/api/v1/bundles \
  -H 'If-None-Match: string' \
  -H 'X-Api-Key: YOUR_API_KEY_HERE' \
  -H 'X-Signature: YOUR_API_KEY_HERE' \
  -H 'X-Timestamp: YOUR_API_KEY_HERE'

Responses

Array of Bundle

Headers
ETagstringrequired

A weak validator for this exact body. It changes whenever any bundle or price in the answer changes. Send it back as If-None-Match.

X-Hubby-Call-Idstringrequired

The id of this call in Hubby's records. Quote it when you ask Hubby about a call.

Bodyapplication/json
dataArray of objects(Bundle)required
data[].​idstringrequired

The bundle's id. Stable: name it as bundle_id to book exactly this bundle.

data[].​destinationobject(DestinationSummary)required

The destination the bundle is sold for. A region carries its code in iso2 or in iso3.

data[].​destination.​idstringrequired

The destination's id: the id of GET /v1/destinations/{destination}.

data[].​destination.​namestring or nullrequired

The destination's English name, for example Spain or Europe.

data[].​destination.​typestring(DestinationKind)required

country or region.

Enum"country""region"
data[].​destination.​iso2string or nullrequired

The country's ISO 3166-1 alpha-2 code, or the region's code when the region keeps it here (for example EU). Null when the region keeps its code in iso3.

data[].​destination.​iso3string or nullrequired

The country's ISO 3166-1 alpha-3 code, or the region's code when the region keeps it here (for example XCA). Null when the region keeps its code in iso2.

data[].​typestring(PackageType)required

The package type: data_limited, starter or unlimited. Send it back as package_type when you specify by dimensions.

Enum"data_limited""starter""unlimited"
data[].​labelstringrequired

Internal; not for Partner use; do not build on it.

data[].​providerstringrequired

Internal; not for Partner use; do not build on it.

data[].​size_bytesinteger or nullrequired
data[].​duration_secondsinteger or nullrequired
data[].​duration_daysinteger or nullrequired

The validity in whole days, counted from first use: duration_seconds / 86400, rounded to the nearest whole day. Unlimited bundles are listed once for every day count that has a price.

data[].​package_templateobjectrequired

Internal; not for Partner use; do not build on it.

data[].​package_template.​idstringrequired
data[].​package_template.​namestringrequired
data[].​partnerobject or nullrequired

Internal; not for Partner use; do not build on it.

data[].​partner.​idstringrequired
data[].​partner.​namestringrequired
data[].​traffic_policyobject or nullrequired

Internal; not for Partner use; do not build on it.

data[].​traffic_policy.​descriptionstring or nullrequired
data[].​fair_use_throttleFairUseThrottle (object) or nullrequired

The Fair-use throttle of an unlimited bundle: after throttle_after_bytes in one day the speed drops to throttled_kbps until the day resets. Show it to the traveller before purchase. Null on a bundle that is not unlimited.

Any of:

The Fair-use throttle of an unlimited bundle: after throttle_after_bytes in one day the speed drops to throttled_kbps until the day resets. Show it to the traveller before purchase. Null on a bundle that is not unlimited.

data[].​fair_use_throttle.​throttle_after_bytesintegerrequired

The daily threshold, in bytes: the data a traveller can use in one day at full speed. The threshold applies per day, not to the whole package.

data[].​fair_use_throttle.​throttled_kbpsintegerrequired

The speed after the daily threshold is passed, in kbps (decimal: 1 Mbps is 1000 kbps). It applies until the threshold resets.

data[].​fair_use_throttle.​resetsstring(FairUseThrottleReset)required

When the threshold resets and the full speed comes back.

daily
Each day: the threshold applies to the data used in one day.
Value"daily"
data[].​is_activebooleanrequired

Internal; not for Partner use; do not build on it.

data[].​is_visiblebooleanrequired

Internal; not for Partner use; do not build on it.

data[].​priorityintegerrequired

Internal; not for Partner use; do not build on it.

data[].​created_atstring or null(date-time)required
data[].​updated_atstring or null(date-time)required

When anything on the bundle last changed. A price change does not move it: compare prices too, or watch the catalog ETag.

data[].​deleted_atstring or null(date-time)required

Internal; not for Partner use; do not build on it.

data[].​created_bystring or nullrequired

Internal; not for Partner use; do not build on it.

data[].​updated_bystring or nullrequired

Internal; not for Partner use; do not build on it.

data[].​pricing_infoobjectrequired

The recommended retail price in EUR major units. Kept for older integrations; read prices instead.

data[].​pricing_info.​final_pricenumberrequired
data[].​pricing_info.​original_pricenumberrequired
data[].​pricing_info.​currencystringrequired
data[].​pricing_info.​currency_symbolstringrequired
data[].​pricing_info.​discount_appliedbooleanrequired
data[].​pricing_info.​discount_percentageintegerrequired
data[].​pricesobjectrequired

Both prices of the bundle, in EUR cents.

data[].​prices.​retailobjectrequired

The recommended retail price: what a traveller pays in Hubby's own shop.

data[].​prices.​retail.​amountintegerrequired
data[].​prices.​retail.​currencystringrequired
Value "EUR"
data[].​prices.​netobject or nullrequired

Your price under your agreement: the amount Hubby invoices you. Null when your price list gives the bundle a retail price but no net price. The bundle is still listed, and you can still book it: your agreement with Hubby, not the API, sets what you pay for it.

data[].​prices.​net.​amountintegerrequired
data[].​prices.​net.​currencystringrequired
Value "EUR"
Response
application/json
{ "data": [ { … } ] }

CurrentPartner

Operations

Destination

Operations

DeviceCompatibility

Operations

Esim

Operations

RedirectToken

Operations