Products, locations, and catalog data
How to query products, manage inventory, and work with locations through the API.
Working with your product catalog
The products and locations APIs let you manage your rental catalog programmatically — listing products, checking availability, syncing with external systems, or building custom storefronts.
Products
List products
Fetch a paginated list of products for your organization:
curl -X GET "https://api.fjellride.se/api/v1/products?page=1&pageSize=10" \
-H "x-api-key: fjr_your_api_key_here"Query parameters:
| Parameter | Type | Description |
|---|---|---|
page | number | Page number (default: 1) |
pageSize | number | Items per page (default: 25) |
search | string | Search by product name |
type | string[] | Filter by type: RENTAL, PRODUCT, SERVICE |
isVisible | boolean[] | Filter by visibility |
featured | boolean[] | Filter by featured status |
sortBy | string | Sort field |
sortOrder | string | asc or desc |
Response:
{
"data": [
{
"id": 42,
"name": "Mountain Bike — Adult",
"description": "High-quality hardtail mountain bike, suitable for trails and gravel roads.",
"type": "RENTAL",
"category": "Bikes",
"basePrice": 35000,
"extraDayPrice": 25000,
"pricing": "DAILY",
"isVisible": true,
"featured": false,
"tracksInventory": true,
"taxRate": 25,
"image": "https://cdn.fjellride.se/products/mtb-adult.jpg",
"images": [],
"tags": ["summer", "popular"],
"pricingRules": [
{ "days": 3, "price": 30000 },
{ "days": 7, "price": 22000 }
],
"createdAt": "2026-01-10T08:00:00.000Z",
"updatedAt": "2026-03-20T14:30:00.000Z"
}
],
"total": 24,
"page": 1,
"pageSize": 10
}Get a single product
curl -X GET "https://api.fjellride.se/api/v1/products/42" \
-H "x-api-key: fjr_your_api_key_here"Product fields
| Field | Type | Description |
|---|---|---|
id | number | Unique product ID |
name | string | Customer-facing product name |
description | string | Product description |
type | enum | RENTAL, PRODUCT, or SERVICE |
category | string | Product category name |
pricing | enum | DAILY or FLAT |
basePrice | number | Base price in minor units (cents/ören) |
extraDayPrice | number | Price per additional day (daily pricing only) |
pricingRules | array | Tier pricing: { days, price } pairs |
isVisible | boolean | Shown on storefront |
featured | boolean | Highlighted on storefront |
tracksInventory | boolean | Whether inventory units are tracked individually |
taxRate | number | Tax rate percentage |
image | string | Primary image URL |
images | array | Additional image URLs (up to 5) |
tags | array | Internal tags for organization |
Create a product
curl -X POST "https://api.fjellride.se/api/v1/products" \
-H "x-api-key: fjr_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"name": "Kayak — Single",
"description": "Stable sit-on-top kayak for lakes and calm waters.",
"type": "RENTAL",
"category": "Watersports",
"pricing": "DAILY",
"basePrice": 45000,
"extraDayPrice": 35000,
"isVisible": true,
"tracksInventory": true
}'Check availability
Find products available for a given date range and location:
curl -X POST "https://api.fjellride.se/api/v1/products/available" \
-H "x-api-key: fjr_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"startDate": "2026-07-01",
"endDate": "2026-07-05",
"locationId": 1
}'Inventory
Products with tracksInventory: true have individual inventory units. Each unit has a status and can be assigned to a location.
List inventory for a product
curl -X GET "https://api.fjellride.se/api/v1/products/42/inventory" \
-H "x-api-key: fjr_your_api_key_here"Inventory statuses:
| Status | Meaning |
|---|---|
AVAILABLE | Ready for booking |
RESERVED | Allocated to a booking |
IN_USE | Currently with a customer |
MAINTENANCE | Temporarily unavailable |
INACTIVE | Retired or not offered |
Locations
List locations
curl -X GET "https://api.fjellride.se/api/v1/locations" \
-H "x-api-key: fjr_your_api_key_here"Response:
{
"data": [
{
"id": 1,
"name": "Mountain Lodge",
"address": "Fjällvägen 12",
"city": "Ã…re",
"zip": "837 51",
"country": "SE",
"isDefault": true,
"openingHours": [
{ "day": 1, "open": "08:00", "close": "18:00" },
{ "day": 2, "open": "08:00", "close": "18:00" }
],
"createdAt": "2026-01-05T09:00:00.000Z"
}
]
}Location fields
| Field | Type | Description |
|---|---|---|
id | number | Unique location ID |
name | string | Location name |
address | string | Street address |
city | string | City |
zip | string | Postal code |
country | string | Country code (ISO 3166-1 alpha-2) |
isDefault | boolean | Default location for new bookings |
openingHours | array | { day (0-6), open, close } — day 0 is Sunday |
minimumNoticeHours | number | Hours of advance notice required |
allowLateDropoff | boolean | Whether late returns are accepted |
lateDropoffFee | number | Fee for late returns (minor units) |
Public endpoints
If you're building a customer-facing storefront, there are public equivalents for products and locations that don't require authentication:
GET /api/v1/public/products— visible products for a storefrontGET /api/v1/public/locations— public location information
These endpoints resolve the organization from the request hostname or the x-organization-slug header.
Next steps
- Bookings and the customer journey — create reservations and manage the booking flow
- Full API reference — interactive documentation with all endpoints