Build a Product Catalog API Using Google Sheets (No Backend Required)
Managing a product catalog shouldn't require a database engineer. If you're running a small e-commerce store, building a prototype, or managing inventory for a client project, Google Sheets is already a great place to organize your products.
The missing piece? Getting that data into your app, website, or storefront as clean JSON through an API.
Here's how to build a working product catalog API using nothing but a Google Sheet and Jsonsheets.
Step 1: Structure Your Google Sheet
Open Google Sheets and create a spreadsheet with columns that represent your product data. The first row becomes your API field names, so keep them clean and lowercase:
| id | name | category | price | stock | image_url | status |
| 1 | Wireless Earbuds | Audio | 49.99 | 150 | https://example.com/earbuds.jpg | active |
| 2 | USB-C Hub | Accessories | 34.99 | 85 | https://example.com/hub.jpg | active |
| 3 | Laptop Stand | Accessories | 29.99 | 0 | https://example.com/stand.jpg | out_of_stock |
| 4 | Mechanical Keyboard | Peripherals | 89.99 | 42 | https://example.com/keyboard.jpg | active |
Tips for structuring your sheet:
Use consistent naming — lowercase with underscores works best for API fields
Keep one product per row
Use a
statuscolumn to control which products appear in your storeSeparate categories, variants, or pricing tiers into different tabs
Step 2: Connect Your Sheet to Jsonsheets
Sign in at jsonsheets.com with your Google account
Click Browse Drive and select your product catalog spreadsheet
Jsonsheets automatically detects all tabs and generates API endpoints for each one
You'll get an API slug — something like product-catalog — and each tab becomes its own endpoint.
Step 3: Get Your API Key
Go to the API Keys page in your dashboard and create a new key. Every request to your product catalog API needs this key in the header:
Authorization: Bearer js_your_api_key_here
Step 4: Fetch Your Product Catalog
Now you can pull your entire product catalog as JSON:
curl -H "Authorization: Bearer js_your_api_key_here" \
https://jsonsheets.com/api/v1/product-catalog/Sheet1
{
"data": [
{
"id": "1",
"name": "Wireless Earbuds",
"category": "Audio",
"price": "49.99",
"stock": "150",
"image_url": "https://example.com/earbuds.jpg",
"status": "active"
},
{
"id": "2",
"name": "USB-C Hub",
"category": "Accessories",
"price": "34.99",
"stock": "85",
"image_url": "https://example.com/hub.jpg",
"status": "active"
}
],
"count": 4
}
Step 5: Filter and Search Products
The real power is in query parameters. You don't need to fetch everything and filter client-side.
Get only active products:
GET /api/v1/product-catalog/Sheet1?status=active
Get products in a specific category:
GET /api/v1/product-catalog/Sheet1?category=Accessories
Limit results for pagination:
GET /api/v1/product-catalog/Sheet1?limit=10&start=1&end=10
Get a single product by row:
GET /api/v1/product-catalog/Sheet1/2
Step 6: Add New Products via API
Your team can add products through the spreadsheet, but you can also add them programmatically:
curl -X POST \
-H "Authorization: Bearer js_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"name": "Webcam HD", "category": "Peripherals", "price": "59.99", "stock": "30", "status": "active"}' \
https://jsonsheets.com/api/v1/product-catalog/Sheet1
The new row appears instantly in your Google Sheet and is immediately available through the API.
Step 7: Update Inventory and Prices
Need to mark a product as out of stock? Update by condition:
curl -X PUT \
-H "Authorization: Bearer js_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"condition": {"name": "Laptop Stand"}, "set": {"status": "out_of_stock", "stock": "0"}}' \
https://jsonsheets.com/api/v1/product-catalog/Sheet1
Or update a specific row directly:
curl -X PUT \
-H "Authorization: Bearer js_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"price": "39.99"}' \
https://jsonsheets.com/api/v1/product-catalog/Sheet1/2
Using Multiple Tabs for Organized Catalogs
If your catalog has different product types, use separate tabs in the same spreadsheet:
Electronics tab →
/api/v1/product-catalog/ElectronicsClothing tab →
/api/v1/product-catalog/ClothingBooks tab →
/api/v1/product-catalog/Books
Each tab gets its own endpoint automatically. No extra configuration needed.
Example: Loading Products in a React App
const response = await fetch(
"https://jsonsheets.com/api/v1/product-catalog/Sheet1?status=active",
{
headers: { Authorization: "Bearer js_your_api_key_here" }
}
);
const { data: products } = await response.json();
products.forEach(product => {
console.log(`${product.name} - $${product.price}`);
});
Why This Approach Works
Non-technical team members can update products directly in Google Sheets without touching code
No database setup — your spreadsheet is the database
Instant changes — edit a cell in Sheets, and the API reflects it on the next request
Built-in caching — repeated API calls are fast, reducing load on Google's servers
API key security — your product data is never publicly exposed
When to Use This (and When Not To)
This approach works great for:
Small to medium product catalogs (under 10,000 items)
MVP and prototype stores
Internal tools and dashboards
Client projects with tight deadlines
Headless commerce setups where the team manages data in Sheets
Consider a traditional database when:
You have hundreds of thousands of products
You need complex relational queries (joins, aggregations)
You need sub-millisecond response times under heavy concurrent load
Get Started
You can have a working product catalog API in under 2 minutes:
Structure your products in Google Sheets
Connect the sheet at jsonsheets.com
Start fetching products as JSON
No server to deploy. No database to manage. No backend code to write.
Build your product catalog API at jsonsheets.com