Products
The Product object
idstringoptionalPublic identifier of the product.
namestringoptionalProduct name.
descriptionstringoptionalProduct description.
skustringoptionalStock keeping unit.
primary_image_urlstringoptionalPrimary product image URL.
priceintegeroptionalProduct price.
sale_priceintegeroptionalSale price when the product is on sale.
currencycurrencyoptionalProduct currency code.
is_availablebooleanoptionalWhether the product is available for purchase.
track_inventorybooleanoptionalWhether the store tracks stock for this product. Off by default; products that don't track stock are never limited by it.
inventoryobjectoptionalStock as clients show it: \{ tracked, in_stock, available_total, low, locations \}. Untracked products return \{ "tracked": false, "in_stock": true, "available_total": null, "low": false, "locations": [] \}. Each location is \{ id, location, location_type, quantity, reserved, available, low_stock_threshold, allow_backorder, low \}: location is the store location or food truck public ID and location_type is store_location or food_truck; quantity is on hand, reserved is held by checkouts in progress (for 15 minutes), available is what can still be sold, and low is true while some stock is available but no more than low_stock_threshold. in_stock is true when any location has stock available or allows backorders.
in_stockbooleanoptionalWhether the product can be sold now: false when is_available is false, or when it tracks stock and no location has any available (or allows backorders). Use it for out of stock labels; inventory.available_total for "only N left".
tagsarray of stringsoptionalProduct tags.
statusstringoptionalProduct status.
metaobjectoptionalArbitrary metadata stored with the product.
addon_categoriesarray of objectsoptionalAddon categories available for the product: id, name, description, is_required (the customer must choose at least one), max_selectable (most add-ons that can be chosen, or null for no limit), excluded_addons and addons.
variantsarray of objectsoptionalProduct variants and options.
imagesarray of stringsoptionalProduct image URLs.
videosarray of stringsoptionalProduct video URLs.
hoursarray of objectsoptionalProduct availability hours.
created_attimestampoptionalTime the product was created.
updated_attimestampoptionalTime the product was last updated.
{
"id": "product_9Lb2mQ1",
"name": "Cold Brew",
"description": "Bottled cold brew coffee.",
"sku": "CB-12",
"primary_image_url": "https://files.example.com/cold-brew.png",
"price": 450,
"sale_price": null,
"currency": "USD",
"is_on_sale": false,
"is_recommended": true,
"is_service": false,
"is_bookable": false,
"is_available": true,
"track_inventory": true,
"inventory": {
"tracked": true,
"in_stock": true,
"available_total": 3,
"low": true,
"locations": [
{
"id": "inventory_4Kd9wP2",
"location": "store_location_7Nx2bQ5",
"location_type": "store_location",
"quantity": 5,
"reserved": 2,
"available": 3,
"low_stock_threshold": 5,
"allow_backorder": false,
"low": true
}
]
},
"in_stock": true,
"tags": [
"coffee"
],
"status": "published",
"meta": {},
"slug": "cold-brew",
"translations": [],
"addon_categories": [
{
"id": "category_2Fd8kL1",
"name": "Extras",
"description": null,
"is_required": false,
"max_selectable": 2,
"excluded_addons": [],
"addons": [
{
"id": "product_addon_5Gh7jK2",
"name": "Oat milk",
"description": null,
"price": 80,
"sale_price": null,
"is_on_sale": false
}
]
}
],
"variants": [],
"images": [],
"videos": [],
"hours": [],
"youtube_urls": [],
"created_at": "2026-05-07T09:30:00Z",
"updated_at": "2026-05-07T09:30:00Z"
}/v1/productsQuery Products
Returns published, available products for the authenticated store or network. With a network key, products are restricted to active network members and can be scoped to a member store or one of that store's categories.
querystringoptionalSearch published products available through the current store or network.
storestringoptionalNetwork member store public ID. Ignored for store-scoped keys.
categorystringoptionalProduct category public ID belonging to the selected store scope.
with_storebooleanoptionalInclude the product's hydrated member store and media.
limitintegeroptionalMaximum number of products to return.
offsetintegeroptionalNumber of matching products to skip.
/v1/productscurl https://api.fleetbase.io/v1/products?query=&store=&category=&with_store=true&limit=&offset= \
-H "Authorization: Bearer flb_live_…"/v1/productsCreate Product
Create Product
namestringrequiredDisplay name for the resource.
descriptionstringoptionalHuman-readable description of the resource.
priceintegeroptionalPrice for the item or entity.
/v1/productscurl -X POST https://api.fleetbase.io/v1/products \
-H "Authorization: Bearer flb_live_…" \
-H "Content-Type: application/json" \
-d '{
"name": "Example Product",
"description": "Example storefront product",
"price": 1000
}'/v1/productsRetrieve a Product
Retrieves a single storefront product by ID, with its details, pricing, variants and add-on categories (is_required, max_selectable). With a network key, only published, available products of active member stores are found. A product outside the storefront returns 404.
/v1/productscurl https://api.fleetbase.io/v1/products \
-H "Authorization: Bearer flb_live_…"/v1/products/slotsList Product Booking Slots
Returns the times a bookable service can be booked on a day. Slots are the service's hours for that weekday (else the store's first location's hours), cut into slots of the service's length, each with how many places are left. Times are in the store's time zone (else the company's, else the server's). Bookings of the service take quantity places in their slot; canceled, expired and failed orders give their places back.
Response: { date, service: { duration_minutes, capacity, deposit_percent, travel_fee, provider_tag }, slots: [{ start, end, time, past, available, remaining, providers, capacity }] }. start and end are ISO 8601 with the store's offset and time is the store's local HH:mm. past is true once the slot has started; available is true when the slot is still ahead and has places left; remaining (also reported as providers) is the places left out of capacity. duration_minutes defaults to 60 and capacity to 1. deposit_percent and travel_fee are reported as configured on the service but are not charged at checkout.
Book a slot by adding the service to the cart with its start as the line's scheduled_at. If a slot the service's hours define fills up before checkout, initializing the checkout returns 422 with "code": "booking_slot_unavailable".
Errors: 404 (Bookable service not found.) when the product isn't bookable or isn't in this store or network; 422 when date is missing or not YYYY-MM-DD.
In a contract run this addresses {{service_product_id}} when the environment sets one (a bookable service with hours). Otherwise it addresses the run's product, which isn't bookable, and asserts the 404.
datestringrequiredThe day to list, YYYY-MM-DD, in the store's time zone.
/v1/products/slotscurl https://api.fleetbase.io/v1/products/slots?date={{slot_date}} \
-H "Authorization: Bearer flb_live_…"/v1/productsUpdate Product
Update Product
namestringoptionalDisplay name for the resource.
descriptionstringoptionalHuman-readable description of the resource.
priceintegeroptionalPrice for the item or entity.
/v1/productscurl -X PUT https://api.fleetbase.io/v1/products \
-H "Authorization: Bearer flb_live_…" \
-H "Content-Type: application/json" \
-d '{
"name": "Updated Product",
"description": "Updated storefront product",
"price": 1000
}'