Endpoints for analytics dashboards, revenue forecasting, AI-powered insights, and event tracking.
Analytics
Get analytics metrics for dashboard KPIs
GET /analytics/metrics
Returns aggregated metrics including revenue, tax, tips, discounts, and booking counts with daily breakdown
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
locationIds | query | string | Yes | Comma-separated list of location IDs |
startDate | query | string | Yes | Start date (YYYY-MM-DD) |
endDate | query | string | Yes | End date (YYYY-MM-DD) |
Responses
| Code | Description |
|---|---|
200 | Analytics metrics returned successfully |
400 | Missing required parameters |
500 | Server error |
Get inventory performance metrics
GET /analytics/inventory-performance
Returns top performing inventory items and assets by revenue
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
locationIds | query | string | Yes | Comma-separated list of location IDs |
startDate | query | string | Yes | Start date (YYYY-MM-DD) |
endDate | query | string | Yes | End date (YYYY-MM-DD) |
limit | query | integer | No | Number of items to return |
Responses
| Code | Description |
|---|---|
200 | Inventory performance data returned successfully |
400 | Missing required parameters |
500 | Server error |
Get year-over-year revenue data
GET /analytics/year-over-year
Returns monthly revenue data for specified locations comparing current and previous year. Uses ledger/journal entries to include all revenue sources (bookings + POS).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
locationIds | query | string | Yes | Comma-separated list of location IDs |
currentYear | query | integer | No | The current year to compare (defaults to current year) |
Responses
| Code | Description |
|---|---|
200 | Year-over-year revenue data returned successfully |
400 | Missing or invalid locationIds parameter |
500 | Server error |
Update revenue target
PATCH /analytics/revenue-target
Updates the revenue target and/or previous year revenue override for a location
Request body
| Field | Type | Required | Description |
|---|---|---|---|
locationId | string | Yes | The location ID to update |
revenueTarget | number | No | Revenue target amount (must be positive) |
previousYearRevenueOverride | number | No | Override value for previous year revenue (must be positive) |
Responses
| Code | Description |
|---|---|
200 | Revenue settings updated successfully |
400 | Missing locationId or invalid values |
404 | Location not found |
500 | Server error |
Realize revenue for all completed bookings
POST /analytics/realize-completed-bookings
Creates journal entries for all completed bookings that haven't had revenue recognized yet. This syncs booking revenue to the ledger.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
locationIds | array | No | Optional - limit to specific location IDs |
dryRun | boolean | No | If true, only returns count without creating entries |
Responses
| Code | Description |
|---|---|
200 | Revenue realization completed successfully |
500 | Server error |
Get widget/booking page engagement metrics
GET /analytics/widget-metrics
Returns funnel, temporal heatmap, daily engagement, source breakdown, and top products
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
locationIds | query | string | Yes | Comma-separated list of location IDs |
startDate | query | string | Yes | |
endDate | query | string | Yes |
Responses
| Code | Description |
|---|---|
200 | Widget engagement metrics returned successfully |
400 | Missing required parameters |
500 | Server error |
Forecast
Get demand forecast for a location
GET /forecast
Returns predicted daily renter counts using historical data, weather, and holiday detection
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
locationId | query | string | Yes | Location ID to forecast for |
days | query | integer | No | Number of days to forecast (7 or 14) |
timezone | query | string | No | Timezone for date calculations (e.g. America/Toronto) |
units | query | string | No | Temperature units |
Responses
| Code | Description |
|---|---|
200 | Forecast data returned successfully |
400 | Missing required parameters |
500 | Server error |
AI
Process AI request
POST /ai
Routes AI requests to different services based on the 'what' parameter
Request body
| Field | Type | Required | Description |
|---|---|---|---|
what | string | Yes | Type of AI request |
message | string | No | Message or prompt for the AI |
prompt | string | No | Detailed prompt for AI analysis (for emailEnhancement) |
businessName | string | No | Business name (for socialMediaPost) |
businessType | string | No | Type of business (for socialMediaPost) |
businessLocation | string | No | Business location (for socialMediaPost) |
bookings | array | No | Booking data (for bookingSidekick) |
websiteUrl | string | No | Website URL (for businessAudit) |
businessData | object | No | Additional business data (for businessAudit) |
Responses
| Code | Description |
|---|---|
200 | AI response returned successfully |
400 | Invalid or missing parameters |
401 | Unauthorized |
500 | Server error |
Perform business audit
POST /ai/business-audit
Performs a comprehensive business audit using AI analysis of website and business data. Charges $4.99 per audit.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
websiteUrl | string | Yes | Website URL to audit |
businessData | object | No | Additional business data for analysis |
Responses
| Code | Description |
|---|---|
200 | Business audit completed successfully |
400 | Invalid or missing websiteUrl |
401 | Unauthorized |
403 | Business audit integration not enabled |
404 | Customer not found |
500 | Server error |
Get business audit billing history
GET /ai/business-audit/billing
Retrieves business audit billing history and analytics for the authenticated customer
Responses
| Code | Description |
|---|---|
200 | Billing history returned successfully |
401 | Unauthorized |
404 | Customer not found |
500 | Server error |
Validate receipt data
POST /ai/validate-receipt
Validates inputted transaction data against an uploaded receipt image using AI Vision
Request body
| Field | Type | Required | Description |
|---|---|---|---|
receiptImage | string | Yes | Base64 encoded image or image URL |
inputData | object | No |
Responses
| Code | Description |
|---|---|
200 | Validation completed successfully |
400 | Missing receipt image or validation data |
500 | Server error |
Extract receipt data
POST /ai/extract-receipt-data
Extracts structured data from a receipt image without validation (useful for auto-filling forms)
Request body
| Field | Type | Required | Description |
|---|---|---|---|
receiptImage | string | Yes | Base64 encoded image or image URL |
Responses
| Code | Description |
|---|---|
200 | Data extracted successfully |
400 | Missing receipt image |
500 | Server error |
Proxy external webpage
GET /ai/proxy-page
Proxies an external webpage and injects selection script for click-to-tag inventory import functionality
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
url | query | string | Yes | URL of the page to proxy |
Responses
| Code | Description |
|---|---|
200 | Proxied HTML page with injected selection tools |
400 | Missing or invalid URL |
500 | Failed to load page |
Scrape inventory from URL
POST /ai/scrape-inventory
Scrapes inventory/rental information from a website URL using Puppeteer screenshots and OpenAI Vision to extract structured data
Request body
| Field | Type | Required | Description |
|---|---|---|---|
url | string | Yes | URL of the inventory page to scrape |
Responses
| Code | Description |
|---|---|
200 | Inventory data extracted successfully |
400 | Missing or invalid URL |
401 | Customer ID required |
500 | Server error |
Extract driver's license data
POST /ai/extract-license
Extracts driver's license information from an image using GPT-4 Vision
Request body
| Field | Type | Required | Description |
|---|---|---|---|
image | string | Yes | Base64 encoded image or image URL of the driver's license |
Responses
| Code | Description |
|---|---|
200 | License data extracted successfully |
400 | Missing image or extraction failed |
500 | Server error |
Events
Create a new booking event
POST /events
Request body
| Field | Type | Required | Description |
|---|---|---|---|
transactionid | string | No | |
rentalId | string | No | |
event_type | string | No | |
eventType | string | No | |
event_change | string | No | |
eventLabel | string | No | |
content | string | No | |
details | object | No | |
actorName | string | No | |
actorId | string | No | |
customerId | string | No |
Responses
| Code | Description |
|---|---|
200 | Event created successfully |
500 | Error creating event |
Get events for booking(s)
GET /events
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
transactionid | query | string | No | Single rental ID (backward compat) |
rentalIds | query | string | No | Comma-separated rental IDs for batch fetch |
Responses
| Code | Description |
|---|---|
200 | Events retrieved successfully |
400 | transactionid or rentalIds is required |
500 | Error retrieving events |

