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

CurrentPartner

Operations

Destination

Operations

DeviceCompatibility

Operations

Check one device

Request

Looks up the brand + device name in Hubby's own Device compatibility list and answers supported, unsupported or unknown, with the Device note and the matched device. Only supported counts as compatible. The answer is about the phone model, not about the traveller's phone.

Headers
Idempotency-Keystring

Optional. A unique key for this request, for example a UUID, reused across every retry of it. A retry with the same key replays the stored success for 24 hours instead of running the request again.

Bodyapplication/jsonrequired
phone_brandstringrequired

The phone's brand, for example Apple or Samsung. Case, spaces and punctuation do not matter.

phone_modelstringrequired

The device name, for example iPhone 15 Pro or Galaxy S24+, as the traveller picks it from the list. Not a model code: a model code answers unknown. Case, spaces and punctuation do not matter, but a variant such as 5G is a different device.

curl -i -X POST \
  https://core.hubbyesim.com/api/v1/device-compatibility \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: string' \
  -H 'X-Api-Key: YOUR_API_KEY_HERE' \
  -H 'X-Signature: YOUR_API_KEY_HERE' \
  -H 'X-Timestamp: YOUR_API_KEY_HERE' \
  -d '{
    "phone_brand": "string",
    "phone_model": "string"
  }'

Responses

DeviceCompatibility

Headers
Idempotent-Replayedstring

Sent as true only when this answer is the stored answer to an earlier request with the same Idempotency-Key, replayed unchanged. Absent on the first answer.

X-Hubby-Call-Idstringrequired

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

Bodyapplication/json
dataobject(DeviceCompatibility)required
data.​phone_brandstringrequired

The brand you sent, as you sent it.

data.​phone_modelstringrequired

The device name you sent, as you sent it.

data.​is_compatiblebooleanrequired

true only when status is supported. false for unsupported and for unknown: a phone that Hubby has no answer for is not known to support eSIM.

data.​statusstring(DeviceCompatibilityStatus)required

Hubby's answer from its own Device compatibility list, matched on brand + device name only (case, spaces and punctuation do not matter; a model code does not match). supported: the model is on the list as eSIM-capable. unsupported: the model is on the list as not eSIM-capable. unknown: the model is not on the list, or Hubby has no answer for it. This is a claim about the phone model, not about this traveller's phone: a supported model can still be carrier-locked, or a regional variant without eSIM. Before checkout, ask the traveller to dial *#06#: a phone that shows an EID has eSIM. In an Android app, prefer EuiccManager.isEnabled() on the device itself.

Enum"supported""unsupported""unknown"
data.​notestring or nullrequired

The Device note: a free-text caveat for the model, for example "US: eSIM only" or "Wi-Fi + Cellular only". Regional limits are here. Show it to the traveller as it is. Null when the list has no note, and always null for unknown.

data.​deviceDeviceCompatibilityDevice (object) or nullrequired

The device on the list that matched. Null when status is unknown.

Any of:

The device on the list that matched. Null when status is unknown.

data.​device.​brandstringrequired

The brand as Hubby's list spells it.

data.​device.​namestringrequired

The device name as Hubby's list spells it. Show this name to the traveller.

data.​device.​modelstring or nullrequired

A model code for the device, for display only. Null when the list has none. One code can name different phones, so do not use it to identify a phone.

data.​device.​yearinteger or nullrequired

The year the model came out. Null when the list does not know.

Response
application/json
{ "data": { "phone_brand": "string", "phone_model": "string", "is_compatible": true, "status": "supported", "note": "string", "device": { … } } }

List Supported devices

Request

Lists the Supported devices on Hubby's own Device compatibility list, ordered by brand then name, so the traveller can pick their phone. Send the picked brand and name to the check. Filter by brand to show one brand only. The list is not paginated.

Query
brandstring or null

Only the devices of this brand answer, for example Samsung. Case, spaces, punctuation and accents do not matter, as in the check. A brand that is not on the list answers an empty devices list.

curl -i -X GET \
  'https://core.hubbyesim.com/api/v1/device-compatibility?brand=string' \
  -H 'X-Api-Key: YOUR_API_KEY_HERE' \
  -H 'X-Signature: YOUR_API_KEY_HERE' \
  -H 'X-Timestamp: YOUR_API_KEY_HERE'

Responses

DeviceCompatibilityList

Headers
X-Hubby-Call-Idstringrequired

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

Bodyapplication/json
dataobject(DeviceCompatibilityList)required
data.​devicesArray of objects(SupportedDevice)required

The Supported devices on Hubby's Device compatibility list, ordered by brand then name. Supported is a claim about the phone model per Hubby's list, not about the traveller's phone. Let the traveller pick a name from this list, then send that name to the check (POST /v1/device-compatibility). Unsupported devices are never in this list.

data.​devices[].​brandstringrequired

The brand as Hubby's list spells it. Send it as phone_brand to the check.

data.​devices[].​namestringrequired

The device name as Hubby's list spells it. Show this name to the traveller to pick from, and send the picked name as phone_model to the check.

data.​devices[].​modelstring or nullrequired

A model code for the device, for display only. Null when the list has none. One code can name different phones, so do not use it to identify a phone.

data.​devices[].​yearinteger or nullrequired

The year the model came out. Null when the list does not know.

data.​devices[].​notestring or nullrequired

The Device note: a free-text caveat for the model, for example "US: eSIM only" or "Wi-Fi + Cellular only". Regional limits are here. Show it to the traveller as it is. Null when the list has no note.

Response
application/json
{ "data": { "devices": [ … ] } }

Esim

Operations

RedirectToken

Operations