The Storefront API provides public, read-only access to your store’s data. It requires no authentication — just your Store ID in the URL. Use it to build custom storefronts, product pages, and category browsing experiences.
Base URL
https://api.pandabase.io/v2/storefront/stores/{storeId}All endpoints are prefixed with /v2/storefront/stores/{storeId}.
Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /v2/storefront/stores/:storeId |
Store info |
| GET | /v2/storefront/stores/:storeId/products |
List products (paginated) |
| GET | /v2/storefront/stores/:storeId/products/:productId |
Product detail |
| GET | /v2/storefront/stores/:storeId/categories |
List categories (paginated) |
| GET | /v2/storefront/stores/:storeId/categories/:categoryId |
Category detail |
Get Store
Returns public store information including branding, description, and social links.
GET /v2/storefront/stores/{storeId}{ "ok": true, "data": { "id": "shp_abc123", "name": "My Store", "handle": "my-store", "slug": "my-store", "description": "We sell digital products.", "summary": "Digital goods marketplace", "logo": "https://cdn.pandabase.io/stores/logo.png", "favicon": "https://cdn.pandabase.io/stores/favicon.png", "accentColor": "#07C983", "primaryColor": "#0b7031", "supportEmail": "support@mystore.com", "category": ["SOFTWARE", "DIGITAL_PRODUCTS"], "twitterUrl": "https://x.com/mystore", "instagramUrl": null, "linkedinUrl": null, "youtubeUrl": null, "tiktokUrl": null }}interface Storefront { id: string; name: string; handle: string; slug: string | null; description: string; summary: string | null; logo: string | null; favicon: string | null; accentColor: string | null; primaryColor: string | null; supportEmail: string | null; category: string[]; twitterUrl: string | null; instagramUrl: string | null; linkedinUrl: string | null; youtubeUrl: string | null; tiktokUrl: string | null;}List Products
Returns a paginated list of active products. Supports filtering, searching, and sorting.
GET /v2/storefront/stores/{storeId}/productsQuery Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
page |
integer | 1 |
Page number (min: 1) |
limit |
integer | 25 |
Items per page (1-100) |
search |
string | — | Full-text search on product title |
categoryId |
string | — | Filter by category ID |
productType |
string | — | Filter by type: SERIAL, SERVICE, ONE_TIME, PHYSICAL, SUBSCRIPTION, DIGITAL_DOWNLOAD, LICENSE_KEY |
pricingModel |
string | — | Filter by pricing: STANDARD, PAY_WHAT_YOU_WANT, FREE |
sortBy |
string | createdAt |
Sort field: title, price, createdAt |
sortOrder |
string | desc |
Sort direction: asc, desc |
curl "https://api.pandabase.io/v2/storefront/stores/shp_abc123/products?limit=10&sortBy=price&sortOrder=asc"{ "ok": true, "data": { "items": [ { "id": "prd_abc123", "title": "Pro Plan", "subtitle": "Everything you need", "handle": "pro-plan", "price": 2999, "compareAtPrice": 4999, "images": ["https://cdn.pandabase.io/products/pro.png"], "inStock": true, "currency": "USD", "productType": "LICENSE_KEY", "pricingModel": "STANDARD", "status": "ACTIVE", "minimumPrice": null, "categories": [ { "id": "ctg_abc123", "name": "Software", "slug": "software" } ] } ], "pagination": { "page": 1, "limit": 10, "total": 42, "totalPages": 5 } }}Only active products are returned. Draft and deleted products are never included in storefront responses.
Get Product
Returns full product details including variants, options, and categories.
GET /v2/storefront/stores/{storeId}/products/{productId}{ "ok": true, "data": { "id": "prd_abc123", "title": "Pro Plan", "subtitle": "Everything you need", "description": "Full access to all features.", "handle": "pro-plan", "price": 2999, "compareAtPrice": 4999, "images": ["https://cdn.pandabase.io/products/pro.png"], "inStock": true, "currency": "USD", "productType": "LICENSE_KEY", "message": "Thanks for purchasing!", "pricingModel": "STANDARD", "status": "ACTIVE", "minimumPrice": null, "maxPerCustomer": 3, "fulfillmentMode": "MANAGED_LICENSE", "availableFrom": null, "availableUntil": null, "billingInterval": null, "billingAnchor": null, "trialDays": null, "options": [ { "id": "opt_abc123", "name": "License Type", "values": ["Personal", "Commercial"], "position": 0 } ], "variants": [ { "id": "var_abc123", "title": "Personal License", "slug": "personal-license", "description": "For individual use", "sku": "PRO-PERSONAL", "options": { "License Type": "Personal" }, "price": 2999, "compareAtPrice": 4999, "images": [], "inStock": true, "quantity": null, "trackStock": false, "position": 0 } ], "categories": [ { "id": "ctg_abc123", "name": "Software", "slug": "software" } ] }}interface StorefrontProduct { id: string; title: string; subtitle: string | null; description: string | null; handle: string; price: number; compareAtPrice: number | null; images: string[]; inStock: boolean; currency: string; productType: string; message: string | null; pricingModel: string; status: string; minimumPrice: number | null; maxPerCustomer: number | null; fulfillmentMode: string | null; availableFrom: string | null; availableUntil: string | null; billingInterval: string | null; billingAnchor: string | null; trialDays: number | null; options: Array<{ id: string; name: string; values: string[]; position: number; }>; variants: Array<{ id: string; title: string; slug: string | null; description: string | null; sku: string | null; options: Record<string, string>; price: number; compareAtPrice: number | null; images: string[]; inStock: boolean; quantity: number | null; trackStock: boolean; position: number; }>; categories: Array<{ id: string; name: string; slug: string; }>;}The product detail response includes fields not shown in the list view:
description, message, fulfillmentMode, maxPerCustomer,
availableFrom/availableUntil, subscription fields, options, and
variants.
List Categories
Returns a paginated list of categories. Supports filtering by featured status and parent category.
GET /v2/storefront/stores/{storeId}/categoriesQuery Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
page |
integer | 1 |
Page number (min: 1) |
limit |
integer | 25 |
Items per page (1-100) |
featured |
boolean | — | Filter by featured status |
parentId |
string | — | Filter by parent category ID (for subcategories) |
curl "https://api.pandabase.io/v2/storefront/stores/shp_abc123/categories?featured=true"{ "ok": true, "data": { "items": [ { "id": "ctg_abc123", "name": "Software", "slug": "software", "description": "Software products and licenses", "icon": "code", "parentId": null, "displayOrder": 0, "featured": true } ], "pagination": { "page": 1, "limit": 25, "total": 5, "totalPages": 1 } }}Get Category
Returns category details including subcategories and up to 50 active products.
GET /v2/storefront/stores/{storeId}/categories/{categoryId}{ "ok": true, "data": { "id": "ctg_abc123", "name": "Software", "slug": "software", "description": "Software products and licenses", "icon": "code", "parentId": null, "displayOrder": 0, "featured": true, "metaTitle": "Software Products", "metaDescription": "Browse our software collection", "showInNavigation": true, "children": [ { "id": "ctg_def456", "name": "Plugins", "slug": "plugins" } ], "products": [ { "id": "prd_abc123", "title": "Pro Plan", "handle": "pro-plan", "price": 2999, "images": ["https://cdn.pandabase.io/products/pro.png"], "inStock": true } ] }}interface StorefrontCategory { id: string; name: string; slug: string; description: string | null; icon: string | null; parentId: string | null; displayOrder: number; featured: boolean; metaTitle: string | null; metaDescription: string | null; showInNavigation: boolean; children: Array<{ id: string; name: string; slug: string }>; products: Array<{ id: string; title: string; handle: string; price: number; images: string[]; inStock: boolean; }>;}The category detail endpoint returns up to 50 products. For full
product listings within a category, use the
List Products endpoint with the categoryId filter.
Error Responses
All error responses follow the standard format:
{ "ok": false, "error": "Store not found"}| Status | Error | When |
|---|---|---|
404 |
Store not found | Invalid or blocked store ID |
404 |
Product not found | Product doesn’t exist, is draft, or is deleted |
404 |
Category not found | Category doesn’t exist in this store |
Example: Building a Product Page
const STORE_ID = "shp_abc123";const API = `https://api.pandabase.io/v2/storefront/stores/${STORE_ID}`;// Fetch store brandingconst store = await fetch(`${API}`).then((r) => r.json());// Fetch featured productsconst products = await fetch( `${API}/products?limit=12&sortBy=createdAt&sortOrder=desc`,).then((r) => r.json());// Fetch a single product with variantsconst product = await fetch(`${API}/products/prd_abc123`).then((r) => r.json(),);// Fetch categories for navigationconst categories = await fetch(`${API}/categories?featured=true`).then((r) => r.json(),);All monetary values are in cents (integers). Divide by 100 for display (e.g., 2999 = $29.99).