Brands
Once authenticated, explore the brand catalog. Hubble offers 450+ gift card brands across categories like Food, Fashion, Electronics, Travel, and more.
The Brand Object
id string
Unique identifier for the brand.
status string
Brand status. Values: ACTIVE, INACTIVE
Status values and error handling
| Status | Meaning | What You Should Do |
|---|---|---|
ACTIVE | Vouchers can be generated | Safe to display to end users and accept orders |
INACTIVE | Vouchers CANNOT be generated | Remove from user-facing catalog immediately |
The API intentionally returns both ACTIVE and INACTIVE brands so you can update your local state. You MUST filter on the status field before displaying brands to users.
Brand Errors
| Code | Error | What To Do |
|---|---|---|
E100 | Brand temporarily disabled | Provider failure. Wait and retry later. |
E101 | Brand not enabled for you | Contact Hubble support to enable this brand. |
E102 | Brand not active | Brand is INACTIVE. Do not display to users. |
title string
Display name of the brand.
brandDescription string nullable
Description of the brand.
category string[]
List of categories the brand belongs to.
tags string[]
List of tags associated with the brand.
denominationType string
Type of denomination. Values: FIXED, FLEXIBLE
Denomination type details
| Type | How It Works | What to Validate |
|---|---|---|
FIXED | Only specific denominations in amountRestrictions.denominations are accepted | Order denomination must exactly match one value in the array |
FLEXIBLE | Any amount between minVoucherAmount and maxVoucherAmount | Value must fall within min/max range |
When a brand is FIXED: Read the amountRestrictions.denominations array and only allow users to select from those exact values. For example, if Flipkart has denominations [100, 250, 500, 1000, 2000, 5000], you cannot send 600 or 1500.
When a brand is FLEXIBLE: Allow users to enter any custom amount, but enforce the min/max boundaries.
To order Rs 6,250 for a FIXED brand with denominations [1000, 2000, 5000], you must split: [{denomination:5000,quantity:1},{denomination:1000,quantity:1},{denomination:250,quantity:1}] - but ONLY if 250 is in the denominations list. Always validate against the brand’s current amountRestrictions.
cardType string
Type of card. Values: CARD_NUMBER_SECURED, PIN_NO_SECURED, CARD_AND_PIN_NO_SECURED
Card type details
| Card Type | What Customer Needs | What to Display |
|---|---|---|
CARD_NUMBER_SECURED | Card number only | Show cardNumber. cardPin will be null. |
PIN_NO_SECURED | PIN only | Show cardPin. cardNumber will be null. |
CARD_AND_PIN_NO_SECURED | Both card number AND PIN | Show BOTH fields. |
- Read
cardTypefrom the brand object before placing an order to know what your display UI needs to support. - Handle null values gracefully — for
CARD_NUMBER_SECUREDbrands,cardPinwill be null. - For
CARD_AND_PIN_NO_SECUREDbrands, you MUST display both credentials.
redemptionType string
Redemption type. Values: ONLINE, OFFLINE, ONLINE_AND_OFFLINE
Redemption type details
| Type | Where Voucher Can Be Used | Display Recommendation |
|---|---|---|
ONLINE | Only on the brand's website or app | Show "Online Only" tag |
OFFLINE | Only at physical retail stores | Show "In-Store Only" tag |
ONLINE_AND_OFFLINE | Both online and at physical stores | Show "Online & In-Store" |
- Display the redemption channel clearly to end users
- Use
retailModeNamefor display text (not theretailModeenum) - Include
howToUseInstructionsalongside the voucher to help customers redeem - For
OFFLINEandONLINE_AND_OFFLINEbrands, surfacestoreLocatorUrlwhen present so users can find physical outlets. It isnullfor online-only brands. - Display the brand's terms and conditions: use
termsAndConditionsfor a short summary, ortncDetailedfor the complete, structured T&C grouped into sections with nested items.
amountRestrictions object nullable
Amount restrictions for the brand.
Show child attributes
- amountRestrictions.minAmount
numberdeprecated — UseminOrderAmountinstead. - amountRestrictions.maxAmount
numberdeprecated — UsemaxOrderAmountinstead. - amountRestrictions.minOrderAmount
number— Minimum order amount allowed. - amountRestrictions.maxOrderAmount
number— Maximum order amount allowed. - amountRestrictions.minVoucherAmount
number— Minimum voucher amount. - amountRestrictions.maxVoucherAmount
number— Maximum voucher amount. - amountRestrictions.maxVouchersPerOrder
integer— Maximum number of vouchers per order. - amountRestrictions.maxVouchersPerDenomination
integernullable — Maximum vouchers per denomination. - amountRestrictions.maxDenominationsPerOrder
integernullable — Maximum denominations per order. - amountRestrictions.denominations
number[]nullable — Available denominations.nullfor flexible denomination brands.
Additional Amount Restrictions
maxVouchersPerOrder— Max total vouchers in a single ordermaxVouchersPerDenomination— Max vouchers of same denomination in one ordermaxDenominationsPerOrder— Max distinct denomination values in one orderminOrderAmount/maxOrderAmount— Total order amount boundaries
thumbnailUrl string
URL of the brand thumbnail image.
logoUrl string
URL of the brand logo image.
iconImageUrl string deprecated
Brand image/logo URL. Use thumbnailUrl instead.
tncUrl string
URL to the terms and conditions page.
termsAndConditions string[] nullable
A short, flat list of key terms and conditions.
tncDetailed object nullable
The complete, structured terms and conditions, grouped into sections with nested items. null when structured T&C are unavailable.
Show child attributes
- tncDetailed.sections
object[]— List of T&C sections, each grouping related terms under a heading. - tncDetailed.sections[].title
string— Section heading. - tncDetailed.sections[].items
object[]— List of T&Cs within the section. - tncDetailed.sections[].items[].text
string— The term text. - tncDetailed.sections[].items[].subItems
object[]nullable — Nested terms under this item, using the same{ text, subItems }shape.nullwhen the item has no children.
howToUseInstructions object[] nullable
Instructions for using the voucher.
Show child attributes
- howToUseInstructions[].retailMode
string— Retail mode enum. Values:ONLINE,OFFLINE - howToUseInstructions[].retailModeName
string— Display name for the retail mode. - howToUseInstructions[].instructions
string[]— List of step-by-step instructions.
storeLocatorUrl string nullable
URL to the brand's store locator page, where users can find physical outlets. null for online-only brands.
canBalanceBeFetched boolean
Whether balance can be fetched for this brand's vouchers.
voucherExpiryInMonths integer nullable
Voucher validity period in months.
variantDetails object[] nullable
List of variant details for the brand.
Get Brands
/v1/partners/productsReturns all brands (SKUs) that are enabled for the partner and matching the filter criteria.
Query Parameters
All parameters are optional and work as filters:
| Parameter | Type | Description |
|---|---|---|
q | string | Text search on brand titles and descriptions |
category | string | Category filter (e.g., FOOD, FASHION, ELECTRONICS) |
pageNo | integer | Page number for pagination (starts from 1). Omit to get all brands. |
limit | integer | Size of the page |
Example Request
curl "https://api.dev.myhubble.money/v1/partners/products?category=FOOD&pageNo=1&limit=20" \
-H "Authorization: Bearer <access_token>" \
-H "X-REQUEST-ID: $(uuidgen)"
Response Body
{
"data": [
{
"id": "01GMAW822RPDJ5C50XK24QC2C4",
"status": "ACTIVE",
"title": "Zomato",
"brandDescription": "Zomato connects you with a wide range of restaurants...",
"category": ["POPULAR_BRANDS", "TOP_BRANDS", "FOOD"],
"tags": ["Food", "Food Delivery", "Restaurants"],
"denominationType": "FLEXIBLE",
"cardType": "CARD_AND_PIN_NO_SECURED",
"redemptionType": "ONLINE",
"amountRestrictions": {
"minAmount": 250,
"maxAmount": 10000,
"minOrderAmount": 250,
"maxOrderAmount": 10000,
"minVoucherAmount": 250,
"maxVoucherAmount": 10000,
"maxVouchersPerOrder": 4,
"maxVouchersPerDenomination": null,
"maxDenominationsPerOrder": null,
"denominations": null
},
"thumbnailUrl": "https://assets.myhubble.money/...",
"logoUrl": "https://assets.myhubble.money/...",
"tncUrl": "https://flow.myhubble.money/brands-v6s/zomato-gift-card",
"termsAndConditions": [
"Comes with 1 year validity.",
"The gift card can be used multiple times"
],
"tncDetailed": {
"sections": [
{
"title": "Validity & Usage",
"items": [
{
"text": "Comes with 1 year validity. The gift card can be used multiple times",
"subItems": null
},
{
"text": "Users can add multiple gift cards to Zomato Money at once",
"subItems": null
}
]
},
{
"title": "Wallet Limits",
"items": [
{
"text": "Max. ₹25,000 per month can be loaded into Zomato Money",
"subItems": [
{
"text": "Sometimes gift cards may take up to 24 hours to activate",
"subItems": null
}
]
}
]
},
{
"title": "Terms and Conditions",
"items": [
{
"text": "The gift card is non-refundable and cannot be exchanged for cash",
"subItems": null
},
{
"text": "Hubble is not responsible for lost or stolen gift cards",
"subItems": null
}
]
}
]
},
"howToUseInstructions": [
{
"retailMode": "ONLINE",
"retailModeName": "Online",
"instructions": [
"Open the Zomato app and click on \"Profile\"",
"In the money section, click on \"Claim gift card\""
]
}
],
"storeLocatorUrl": null,
"canBalanceBeFetched": false,
"voucherExpiryInMonths": 12,
"variantDetails": []
}
],
"nextCursor": {
"pageNo": 1,
"limit": 20
}
}
- The fields
minAmountandmaxAmountare deprecated. UseminOrderAmountandmaxOrderAmountinstead. - If
denominationsis null, it's a flexible denomination brand. If it contains values, only those specific denominations are accepted. - Use
retailModeNamefor display purposes instead of theretailModeenum. usageInstructionsis deprecated. UsehowToUseInstructionsinstead.termsAndConditionsis a short, flat list of key conditions.tncDetailedis the complete, structured set of terms grouped into sections with nested items. UsetncDetailedwhen you need to render the full T&C, andtermsAndConditionsfor a quick summary.
Get a Brand
/v1/partners/products/:productIdReturns the full brand object for a specific product. Use this to fetch up-to-date details before placing an order.
Example Request
curl "https://api.dev.myhubble.money/v1/partners/products/01GMMNJECTDZAG2YS61K58HVG8" \
-H "Authorization: Bearer <token>" \
-H "X-REQUEST-ID: $(uuidgen)"
Response Body
{
"id": "brand_id",
"status": "ACTIVE/INACTIVE",
"title": "Brand Title",
"categories": ["Brand Category"],
"tags": ["tag1", "tag2"],
"denominationType": "FIXED/FLEXIBLE",
"cardType": "CARD_NUMBER_SECURED/PIN_NO_SECURED/CARD_AND_PIN_NO_SECURED",
"redemptionType": "OFFLINE/ONLINE/ONLINE_AND_OFFLINE",
"amountRestrictions": {
"minOrderAmount": 100,
"maxOrderAmount": 5000,
"minVoucherAmount": 100,
"maxVoucherAmount": 1000,
"maxVouchersPerOrder": 5,
"maxVouchersPerDenomination": 1,
"maxDenominationsPerOrder": 1,
"denominations": [100, 1000, 5000]
},
"thumbnailUrl": "https://assets.myhubble.money/brand-assets/tile-images-sq-wp/499-swiggy-w024zl.webp",
"termsAndConditions": [
"Comes with 1 year validity",
"Max. ₹10000 per month can be loaded in Swiggy Wallet for users with minimum KYC",
"Max. 1 lac INR per month can be loaded in Swiggy Wallet for users with full KYC"
],
"tncDetailed": {
"sections": [
{
"title": "Validity",
"items": [{ "text": "Comes with 1 year validity", "subItems": null }]
},
{
"title": "Wallet Loading Limits",
"items": [
{
"text": "Monthly load limits depend on KYC status",
"subItems": [
{
"text": "Max. ₹10000 per month for users with minimum KYC",
"subItems": null
},
{
"text": "Max. 1 lac INR per month for users with full KYC",
"subItems": null
}
]
}
]
}
]
},
"howToUseInstructions": [
{
"retailMode": "ONLINE",
"retailModeName": "Offline",
"instructions": [
"Visit the outlet near you.",
"At the billing counter inform cashier that you want to use Gift Card.",
"Show your Gift Card details & pay any balance amount by cash or card."
]
},
{
"retailMode": "OFFLINE",
"retailModeName": "Online",
"instructions": [
"On www.ikea.com add products to you cart",
"Before purchasing GC, please ensure that IKEA delivers to your location",
"Proceed to checkout, in the payment section, select Redeem an IKEA gift card",
"Enter the gift card details, complete checkout."
]
}
],
"storeLocatorUrl": "https://www.ikea.com/in/en/stores/"
}
If a brand is returned in the catalog, it will also be retrievable via this endpoint. This applies regardless of the brand's current operational status, including when:
- The brand is temporarily disabled
- The brand is disabled due to provider failures
- The brand is not enabled for your account
- The brand is marked as INACTIVE
Catalog Sync Best Practices
- Refresh your full catalog at least once per week (daily recommended)
- Subscribe to the Brand Updated webhook for real-time changes
- Categories are NOT communicated via webhooks — rely on periodic sync
- Filter out INACTIVE brands from your user-facing catalog immediately
- Cache brand data locally but always validate denominations before placing orders
If your sync is infrequent, orders will fail with E150 (denomination not available).