API Change Log - 31 March 2026
11 days ago by Nikhitha George
Reports – Core v2
- API Endpoint: {api_url} /v1/reports/business_summaries
- Scenario: This API retrieves details for Salon summary report.
- API method: POST
- Earlier behavior: The duration_kpis object within SalonSummaryEmployeeDurationKpisValues returned time-based metrics such as actual_minutes, production_minutes, non_production_minutes, unpaid_minutes, and related per-hour KPIs, but did not include production and non-production hours expressed in decimal hour format.
- New behavior: The duration_kpis object additionally returns production_hours_in_hours and non_production_hours_in_hours as decimal values, representing production and non-production time in hours respectively.
Reports – Core v2
- API Endpoint: v1/reports/employee/metrics/flat_file
- Scenario: This API retrieves details for employee metrics report.
- API method: POST
- Earlier behavior: The response did not include production and non-production hours in decimal hour format, either at the individual employee level or in the overall totals.
- New behavior: The response now additionally returns production_hours_in_hours and non_production_hours_in_hours for each employee record in metrics, as well as in the total object, showing how many hours an employee spent in production and non-production time expressed as decimal hours (e.g., 1.5 hours instead of 90 minutes).
Reports – Core V2
- API Endpoint: v1/reports/center/metrics/flat_file
- Scenario: This API retrieves details for center metrics report.
- API method: POST
- Earlier behavior: The response did not include production and non-production hours in decimal hour format, either at the individual center record level or in the overall totals.
- New behavior: The response now additionally returns production_hours_in_hours and non_production_hours_in_hours for each center record in metrics, as well as in the total object, showing how many hours were spent in production and non-production time expressed as decimal hours (e.g., 1.5 hours instead of 90 minutes).
AI Scribe
- API Endpoint: {api_url}/v1/zenscribe/usage_metrics
- Scenario: This API retrieves fetches AIScribe guest recording usage metrics. It returns a list of guest recording records for each organization.
- API method: GET
- Earlier behavior: New API. No earlier behavior.
- New behavior: The GET endpoint returns a list of recording-level metrics per organization, including details such as organization, center, provider, guest, appointment, recording duration, and void status. The API requires a custom service header (zenscribe_auth_key) along with a signature (sign_key) and timestamp (time_stamp) for request validation. Standard employee, guest, and API key tokens are not permitted. Both start_date and end_date are optional — if omitted, end_date defaults to today and start_date defaults to yesterday.
POS V2, Zenoti Mobile – iOS
- API Endpoint: {api_url} /v1/Centers/{center_id}/appointment_views
- Scenario: This API retrieves the list of appointment views configured for a center.
- API method: GET
- Earlier behavior: Each appointment view in the response only returned basic details — id, name, order, type, and filter (with job, tag, or form-based filter options).
- New behavior: Each appointment view now additionally returns void (whether the view is voided), orientation (horizontal, vertical, or list), item_ids (list of associated item IDs), item_type (type of item such as service, product, membership, etc.), therapist_ids (list of associated therapist IDs), and appointment_status (the appointment status filter applied to the view).
AI Scribe, All
- API Endpoint: {api_url}/v1/zenscribe/ai_mapping/services
- Scenario: This API retrieves the list of services available for AI mapping for an organization, returning each service's ID, name, category, sub-category, and description.
- API method: GET
- Earlier behavior: New API. No earlier behavior.
- New behavior: The GET endpoint returns a list of services available for AI mapping for the specified organization. The API can be called either via the custom service header flow (zenscribe_auth_key with sign_key, time_stamp, and organization_id) or via a standard employee token or API key. Cross-organization access is restricted.
Zenoti Mobile – iOS
- API Endpoint: {base_url}/v1/invoices/{invoice_id}/tips
- Scenario: This API fetches saved employee tips for a single or group invoice.
- API method: GET
- Earlier behavior: The response returned tips under the employee_tips field, where each tip record contained only the employee details and tip amount. The API only supported single invoices.
- New behavior: The response field is renamed from employee_tips to tips, and each tip record now additionally returns invoice_id to identify which invoice the tip belongs to. The API now supports both single and group invoices, making it possible to retrieve tips across all invoices in a group in a single call.
Reports - Core
- API Endpoint: {api_url}/v1/memberships/bulk_notifications
- Scenario: This API triggers membership notifications in bulk, supporting both reinserting existing notifications (via reference_id) and creating new ones (via action_type or notification_type) for actions such as signup, freeze, cancel, upgrade, downgrade, and payment method changes.
- API method: PUT
- Earlier behavior: New API. No earlier behavior.
- New behavior: The PUT endpoint accepts a list of notification items and processes them in bulk. Each item can either reinsert an existing notification using a reference_id, or create a new one using action_type or notification_type along with the relevant source ID (user_membership_id or invoice_item_id). notification_type takes priority over action_type when both are provided, and notification_channel defaults to ALL if not specified. The API validates all items before processing — valid items are processed and invalid ones are returned with failure reasons. The response always includes processed_count, and failed_count and failed_items are returned only when failures occur.
Zenoti Mobile - iOS
- API Endpoint: {base_url}/v1/group_invoices/{group_invoice_id}/properties
- Scenario: This API updates a specific property of a group invoice, currently supporting the invoice name and notes.
- API method: PUT
- Earlier behavior: New API. No earlier behavior.
- New behavior: The PUT endpoint accepts a property (either Name or Notes), the new value to set, and an optional updated_by_id to track who made the change. The group invoice ID is taken from the URL path parameter.
Employee
- API Endpoint: {api_url} /v1/reports/employees/kpi/flat_file
- Scenario: This API retrieves employee key performance indicator metrics for a given date range and center.
- API method: POST
- Earlier behavior: The request did not support sorting, and the response did not include revenue breakdown fields (service, product, membership, package, free service revenue), hair service and treatment transaction counts, rebook-with-same-provider metrics, new service guest counts, retail purchase percentages, or custom columns. The response also did not return a totals object summarising metrics across all employees.
- New behavior: The request now accepts an optional sorting array, allowing results to be sorted by any column in ascending or descending order. The response now additionally returns a richer set of per-employee metrics including job_id, revenue breakdowns, hair/treatment transaction counts, rebook and retail percentages, and custom columns. A new total object is also returned in the response, providing aggregated values across all employees for all key metrics.
Employee
- API Endpoint: {api_url} /v1/reports/employees/kpi/flat_file
- Scenario: This API retrieves employee key performance indicator metrics for a given date range and center.
- API method: POST
- Earlier behavior: The request did not support sorting. The response did not include revenue breakdowns (service, product, membership, package, free service), hair and treatment service transaction counts, rebook-with-same-provider metrics, new service guest counts, retail purchase percentages, or custom columns. There was also no totals object summarising metrics across all employees in the response.
- New behavior: The request now accepts an optional sorting array, allowing results to be sorted by any column in ascending or descending order. Each employee record in the response now additionally returns job_id, revenue breakdowns, hair and treatment transaction counts, rebook and retail percentages, and custom columns. A new total object is also returned, providing aggregated values across all employees for all key metrics.
Zenoti Mobile - iOS
- API Endpoint: {base_url}/v1/invoices/{invoice_id}/lock
- Scenario: This API locks a single or group invoice to prevent any further edits or modifications after a receipt has been printed or emailed.
- API method: PUT
- Earlier behavior: New API. No earlier behavior.
- New behavior: The PUT endpoint locks the specified invoice using the invoice ID from the URL path parameter. No request body is required. Supports both single and group invoices.
Zenoti Mobile - iOS
- API Endpoint: {base_url}/v1/centers/{center_id}/invoices
- Scenario: This API retrieves open invoices for a center, and now additionally supports searching invoices by invoice number or guest user ID for grouping purposes.
- API method: GET
- Earlier behavior: The API only returned open invoices for the current date. There was no way to search for specific invoices by invoice number or guest user ID, and the response only contained todays_invoices.
- New behavior: Two new optional query parameters are introduced — search_type (0 for Invoice Number, 1 for User ID) and search_value. When search_type is null, the API continues its existing behavior of returning today's open invoices. When search_type is provided as 0 or 1, the API performs a search and returns results in a new invoices field in the response, alongside the existing todays_invoices field. If search_type is 1 (User ID), the search_value is parsed as a GUID and a bad request is returned if parsing fails.
