Storefront API
Public-facing endpoints for browsing inventory, checking availability, and creating bookings.
The Storefront API provides public-facing endpoints designed for customer-facing applications. These endpoints work with publishable keys (renta_pk_...) and are safe to call from browsers and mobile apps.
All storefront endpoints use the storefront:read scope. They return only public data — no admin info, internal notes, or other tenants' data.
Get Shop Profile
GET /v1/storefront/shopReturns the public profile of the tenant's rental shop.
import { RentaStorefront } from '@renta/sdk/storefront';
const storefront = new RentaStorefront({
apiKey: 'renta_pk_live_...',
});
const shop = await storefront.shop();
console.log(shop.name);
console.log(shop.pickup_locations);curl https://api.getrenta.io/v1/storefront/shop \
-H "Authorization: Bearer renta_pk_live_..."Response:
{
"id": "tenant_abc",
"slug": "mountain-adventures",
"name": "Mountain Adventures",
"brand_settings": {
"primary_color": "#C4572A",
"logo_url": "https://storage.getrenta.io/..."
},
"pickup_locations": [
{
"id": "loc_main",
"name": "Main Shop",
"address": "123 Mountain Road, Moab, UT 84532",
"phone": "+1-435-555-0123",
"hours": {
"mon": "8:00-18:00",
"tue": "8:00-18:00",
"wed": "8:00-18:00",
"thu": "8:00-18:00",
"fri": "8:00-18:00",
"sat": "7:00-19:00",
"sun": "9:00-17:00"
}
}
]
}Browse Inventory
GET /v1/storefront/inventoryReturns available fleet items with calculated pricing for a date range. Combines availability checking and pricing in one call.
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
pickup_date | string | ✅ | Pickup date (ISO 8601) |
return_date | string | ✅ | Return date (ISO 8601) |
half_day | boolean | — | Force half-day pricing |
const inventory = await storefront.inventory({
pickup_date: '2026-07-01T09:00:00Z',
return_date: '2026-07-03T17:00:00Z',
});
for (const item of inventory.data) {
console.log(`${item.name} — $${(item.calculated_price / 100).toFixed(2)}`);
console.log(` Available: ${item.available}`);
}curl "https://api.getrenta.io/v1/storefront/inventory?pickup_date=2026-07-01T09:00:00Z&return_date=2026-07-03T17:00:00Z" \
-H "Authorization: Bearer renta_pk_live_..."Response:
{
"data": [
{
"id": "fi_abc123",
"name": "Trail Blazer 500",
"slug": "trail-blazer-500",
"description": "High-performance electric mountain bike",
"category": {
"id": "cat_xyz",
"name": "E-Bikes",
"slug": "e-bikes"
},
"photos": [{"url": "https://storage.getrenta.io/..."}],
"skill_level": "intermediate",
"available": true,
"calculated_price": 10000,
"deposit_amount": 15000,
"price_breakdown": {
"days": 2,
"rate_per_day": 5000,
"base_price": 10000,
"seasonal_adjustment": 0
}
}
],
"categories": [
{"id": "cat_xyz", "name": "E-Bikes", "slug": "e-bikes", "item_count": 5}
]
}Create Storefront Booking
POST /v1/storefront/bookCreate a booking from the customer-facing storefront flow. Requires a Stripe payment intent.
Body Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
payment_intent_id | string | ✅ | Stripe PaymentIntent ID |
pickup_date | string | ✅ | Pickup date (ISO 8601) |
return_date | string | ✅ | Return date (ISO 8601) |
line_items | array | ✅ | Array of {fleet_item_id, quantity?} |
addons | array | — | Array of {addon_id, quantity} |
pickup_location_id | string | — | Pickup location ID |
half_day | boolean | — | Half-day rental |
coupon_code | string | — | Coupon code. Requires one of customer_id, customer_email, or customer_phone |
customer_id | string | — | Existing customer ID (creates or matches a guest if omitted) |
customer_email | string | — | Guest email. Matches an existing customer with this email, otherwise creates one |
customer_phone | string | — | Guest phone. Used only when customer_email is omitted |
customer_name | string | — | Guest name for a newly created customer (defaults to Guest Customer) |
const result = await storefront.book({
payment_intent_id: 'pi_stripe_123',
pickup_date: '2026-07-01T09:00:00Z',
return_date: '2026-07-03T17:00:00Z',
line_items: [{ fleet_item_id: 'fi_abc123' }],
addons: [{ addon_id: 'addon_helmet', quantity: 1 }],
pickup_location_id: 'loc_main',
});
console.log(`Booking ID: ${result.id}`);curl -X POST https://api.getrenta.io/v1/storefront/book \
-H "Authorization: Bearer renta_pk_live_..." \
-H "Content-Type: application/json" \
-d '{
"payment_intent_id": "pi_stripe_123",
"pickup_date": "2026-07-01T09:00:00Z",
"return_date": "2026-07-03T17:00:00Z",
"line_items": [{"fleet_item_id": "fi_abc123"}],
"addons": [{"addon_id": "addon_helmet", "quantity": 1}],
"pickup_location_id": "loc_main"
}'The storefront booking endpoint creates a guest customer if customer_id is omitted. Send customer_email (or customer_phone) whenever you have it: the booking is then matched to the existing customer with that email instead of adding another guest row, which keeps repeat renters on one record.
Coupons need an identified customer. Per-customer coupon limits are counted against a customer record, so a request with coupon_code must carry customer_id, customer_email, or customer_phone. Without one, the request is rejected with 400 invalid_request and no booking is created. Requests with no coupon are unaffected and still work with no customer fields at all.
Storefront Auth
The storefront includes optional customer authentication for returning customers.
Request Auth Code
POST /api/storefront/auth/requestSends a one-time code to the customer's email.
Verify Auth Code
POST /api/storefront/auth/verifyVerifies the code and returns a session token.
Check Add-ons
GET /api/storefront/addons-checkReturns available add-ons for the selected fleet items.
Get Waiver Template
GET /api/sign/templateLegacy (still supported): GET /api/storefront/waiver-template
Returns the waiver template for the customer to sign during booking.