# Builderly API reference

Base URL: http://nd.max-media.io
Generated from the running server on 2026-11-05T11:37:40.213Z. Every mounted route is listed with the access it needs, the parameters its handler reads and the data models it uses.

## Authentication

Send `Authorization: Bearer <token>` where a route needs a token. Add `?ionic=true` to get JSON from routes that also render pages.

- **Admin token** (`admin`): Bearer token of a site admin (Authorization: Bearer <token>).
- **User token** (`user`): Bearer token of a signed-in user of the site.
- **Optional user** (`optional-user`): Works without a token; a user token personalises the answer.
- **User with access** (`user-priv`): A signed-in user whose plan grants access to the item.
- **Page access** (`page-priv`): Pages limited to some users check the token when one is sent.
- **Webhook signature** (`webhook`): Called by a provider; verified by its signature.
- **reCAPTCHA** (`recaptcha`): Needs a reCAPTCHA token from the site form.
- **System** (`system`): Internal - called by the platform itself.

### For AI assistants: getting a token

Public endpoints (Access: Public) need no token. Everything else - changing the site, or reading its orders, bookings, customers and other private data - needs the site owner's API token.

You cannot create a token yourself, and you must not ask for the owner's password. Ask the user for a token instead - you can send them this message as it is:

> To work with your site through its API, I need an API token from you:
> 1. Sign in to your Builderly admin: https://admin.max-media.io
> 2. Open Developers > API reference (or go straight to https://admin.max-media.io/tabs/site-builder/api-docs).
> 3. Press "Generate token", copy the token and paste it here.
> The token acts as you, so only share it in this chat. You can cancel it at any time by signing out of all devices.

Then send it with every request as `Authorization: Bearer <token>`, and add `?ionic=true` to get JSON. Calls go to the site's own address (its domain), not to the reference's.

The token acts as the user: say what you will change and wait for their yes before any request that creates, changes or deletes something, never repeat the token back, and never put it in a link or a file you share.

## Status codes

| Code | Name | Meaning |
| --- | --- | --- |
| 200 | OK | It worked. The answer is the object or list asked for. |
| 201 | Created | The object was created. Some endpoints send it back; others send an empty body. |
| 202 | Accepted | The work was started and finishes in the background - for example a video being processed ({ "status": "processing" }). Check back on the object. |
| 204 | No Content | It worked, and there is nothing to send back - for example after removing a staff member. |
| 301 | Moved Permanently | The address changed; follow the Location header. |
| 400 | Bad Request | The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text. |
| 401 | Unauthorized | No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON. |
| 402 | Payment Required | The content needs a subscription: the user has no price plan that unlocks it. |
| 403 | Forbidden | The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits. |
| 404 | Not Found | No object with that ID or URL slug, or no such endpoint. |
| 409 | Conflict | It clashes with the current state: the item is already being processed, a version is already applied, or an AI plan or preview is no longer available. |
| 410 | Gone | It existed but is no longer there - for example a comment already deleted on the social network. |
| 412 | Precondition Failed | A rule the request must meet is not met - for example push notifications of the same type at least 48 hours apart. |
| 418 | I'm a teapot | An account confirmation or password reset link was used with an email that does not match it. |
| 421 | Misdirected Request | The domain is not a Builderly site. Call the site's own address. |
| 422 | Unprocessable Content | The request was understood but could not be done - for example the AI could not read the website it was asked to clone. The message says what to try instead. |
| 429 | Too Many Requests | Slow down: the site's request limit was reached, an AI chat already has a request running, or the hourly limit of AI search answers is used up. Wait and retry. |
| 500 | Internal Server Error | Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle. |
| 502 | Bad Gateway | A service the request depends on failed - for example the address a redirect forwards to. |
| 503 | Service Unavailable | Used by the lead form when an order is below its minimum value, not only for outages: read the message. |

Errors do not share one shape: depending on the endpoint the body is plain text, { "error": "..." }, { "message": "..." } or empty. Rely on the status code, and show the body to the user as the reason.

## Endpoints

### Users & staff

Users are the people with an account on the site: customers, staff members who take bookings, and admins. A user signs in with an email and password and gets a token for the API.

#### Professional Account

##### Create a professional account
`POST /professional-account`
Creates a professional account from the fields sent.
- Access: User token
- Returns: the ProfessionalAccount object.
- Status codes: 201, 400, 401, 402, 403, 500
- Models: SocialModeSettings, ProfessionalAccount

##### List all professional account pages
`GET /professional-account-pages/:model`
Returns the site's professional account pages, newest first unless a sort is given.
- Access: Optional user
- Path:
  - `model` (string): The professional account page's model.
- Query:
  - `collection` (string): Only results in this collection.
  - `origin_address` (string): Only professional account pages with this origin address.
- Status codes: 200, 404, 500
- Models: PaymentMethod, Collection, ProfessionalAccount, OriginAddress

##### List all professional accounts
`GET /professional-account-preview/:user`
Returns the site's professional accounts, newest first unless a sort is given.
- Access: Public
- Path:
  - `user` (string): The user - the ID of a user.
- Returns: a list of ProfessionalAccount objects.
- Status codes: 200, 403, 404, 500
- Models: ProfessionalAccount

##### Update a professional account
`PATCH /professional-account/:id`
Changes the fields sent; the others stay as they are.
- Access: User token
- Path:
  - `id` (string): The ID of the professional account.
- Returns: the ProfessionalAccount object.
- Status codes: 200, 400, 401, 403, 404, 500
- Models: ProfessionalAccount

##### Delete a professional account
`DELETE /professional-account/:id`
Deletes the professional account. This cannot be undone.
- Access: User token
- Path:
  - `id` (string): The ID of the professional account.
- Returns: an empty answer on success.
- Status codes: 201, 401, 403, 404, 500
- Models: ProfessionalAccount

##### List all professional accounts
`GET /professional-account/:user`
Returns the site's professional accounts, newest first unless a sort is given.
- Access: Optional user
- Path:
  - `user` (string): The user - the ID of a user.
- Returns: a list of ProfessionalAccount objects.
- Status codes: 200, 403, 404, 500
- Models: ProfessionalAccount

#### User

##### Retrieve the account confirmation
`GET /account-confirmation`
Returns the account confirmation.
- Access: Optional user
- Status codes: 200
- Models: MyContact

##### Block a block user
`PATCH /block-user/:id`
Block a block user.
- Access: User token
- Path:
  - `id` (string): The ID of the block user.
- Returns: the User object.
- Status codes: 201, 400, 401, 404, 500
- Models: User

##### List all blocked users
`GET /blocked-users`
Returns the site's blocked users, newest first unless a sort is given.
- Access: User token
- Returns: a list of User objects.
- Status codes: 200, 401, 500
- Models: User

##### List all booking schedule full months
`GET /booking-schedule-full-month/:date`
Returns the site's booking schedule full months, newest first unless a sort is given.
- Access: Optional user, User token
- Path:
  - `date` (string): A date (YYYY-MM-DD).
- Status codes: 200, 401, 500
- Models: Service, Booking, UserLockedHours

##### List all booking schedule months
`GET /booking-schedule-month/:date`
Returns the site's booking schedule months, newest first unless a sort is given.
- Access: Optional user, User token
- Path:
  - `date` (string): A date (YYYY-MM-DD).
- Status codes: 200, 401, 500
- Models: Service, Booking, UserLockedHours

##### List all booking schedule weeks
`GET /booking-schedule-week/:date&:direction`
Returns the site's booking schedule weeks, newest first unless a sort is given.
- Access: Optional user, User token
- Path:
  - `date` (string): A date (YYYY-MM-DD).
  - `direction` (string): The booking schedule week's direction.
- Status codes: 200, 401, 500
- Models: Service, Booking, UserLockedHours

##### Update the disable user
`PATCH /disable-user`
Changes the fields sent; the others stay as they are.
- Access: User token
- Status codes: 200, 401, 500

##### Retrieve the followers email
`GET /followers-email`
Returns the followers email.
- Access: User token
- Status codes: 200, 401, 500
- Models: User

##### Generate a 2auth token with AI
`GET /generate-2auth-token`
Generate a 2auth token from a prompt, written by the AI builder.
- Access: User token
- Status codes: 201, 400, 401, 500
- Models: MyContact, User

##### List all user bookings
`GET /new-user-bookings`
Returns the site's user bookings, newest first unless a sort is given.
- Access: Optional user, User token
- Query:
  - `newer_than` (string): Only user bookings with this newer than.
- Returns: a list of Booking objects.
- Status codes: 200, 401, 500
- Models: Service, Booking

##### Retrieve the password reset
`GET /password-reset`
Returns the password reset.
- Access: Optional user
- Status codes: 200
- Models: MyContact

##### Reset a reset password
`GET /reset-password/:email&:validation_code`
Reset a reset password.
- Access: Optional user
- Path:
  - `email` (string): An email address.
  - `validation_code` (string): The reset password's validation code.
- Status codes: 200, 400, 500
- Models: MyContact

##### Retrieve the signup
`GET /signup`
Returns the signup.
- Access: Optional user
- Status codes: 200
- Models: MyContact

##### Update a staff
`PATCH /staff/:id`
Changes the fields sent; the others stay as they are.
- Access: Admin token
- Path:
  - `id` (string): The ID of the staff.
- Status codes: 200, 400, 401, 404, 500
- Models: User

##### Retrieve an u
`GET /u/:handle`
Returns one u, found by its ID.
- Access: Optional user
- Path:
  - `handle` (string): The u's handle.
- Status codes: 200, 500
- Models: MyContact

##### Delete user addresses
`DELETE /user-address/:index`
Deletes the user address. This cannot be undone.
- Access: User token
- Path:
  - `index` (string): The user address's index.
- Returns: an empty answer on success.
- Status codes: 200, 401, 500

##### List all user ads
`GET /user-ads`
Returns the site's user ads, newest first unless a sort is given.
- Access: Optional user
- Query:
  - `handle` (string): Only user ads with this handle.
  - `user` (string): Only user ads with this user.
- Status codes: 200, 404, 500
- Models: User, ProfessionalAccount, SocialModeSettings, Product, Service, BlogPost, PricePlan, Program, Subscription, Media, UserEngagementNotification

##### List all user attributions
`GET /user-attributions`
Returns the site's user attributions, newest first unless a sort is given.
- Access: User token
- Status codes: 200, 401, 500
- Models: AttributedRevenue

##### List all user attributions
`GET /user-attributions/:days`
Returns the site's user attributions, newest first unless a sort is given.
- Access: User token
- Path:
  - `days` (string): The user attribution's days.
- Status codes: 200, 401, 500
- Models: AttributedRevenue

##### Retrieve the user blog post
`GET /user-blogpost`
Returns the user blog post.
- Access: Optional user, User token
- Query:
  - `id` (string): The ID of the user blog post.
- Returns: the BlogPost object.
- Status codes: 200, 401
- Models: BlogPost, Collection

##### Retrieve the user booking
`GET /user-booking`
Returns the user booking.
- Access: Optional user, User token
- Query:
  - `id` (string): The ID of the user booking.
- Returns: the Booking object.
- Status codes: 200, 401, 403, 500
- Models: Booking, Service, ConnectedAccount, User

##### Search user bookings
`GET /user-bookings-search/:args`
Search user bookings.
- Access: User token
- Path:
  - `args` (string): The user booking's args.
- Returns: a list of Booking objects.
- Status codes: 200, 401, 500
- Models: Service, Booking

##### List all user bookings
`GET /user-bookings/:skip`
Returns the site's user bookings, newest first unless a sort is given.
- Access: Optional user, User token
- Path:
  - `skip` (string): How many results to skip - for paging.
- Query:
  - `sortBy` (string): The order of the results.
  - `sortOrder` (string): Only user bookings with this sort order.
- Returns: a list of Booking objects.
- Status codes: 200, 401, 500
- Models: Service, Booking

##### Update the user churned booking
`PATCH /user-churned-booking`
Changes the fields sent; the others stay as they are.
- Access: Optional user, User token
- Query:
  - `booking_id` (string): Only user churned bookings with this booking id.
- Returns: the Booking object.
- Status codes: 200, 401, 403, 500
- Models: Booking

##### Confirm a user booking
`PATCH /user-confirm-booking`
Confirm a user booking.
- Access: Optional user, User token
- Query:
  - `booking_id` (string): Only user bookings with this booking id.
- Returns: the Booking object.
- Status codes: 200, 401, 403, 500
- Models: Booking

##### Retrieve the user confirmation mail
`GET /user-confirmation-mail`
Returns the user confirmation mail.
- Access: User token
- Status codes: 200, 401, 500

##### Search user confirmed bookings
`GET /user-confirmed-bookings-search/:args`
Search user confirmed bookings.
- Access: User token
- Path:
  - `args` (string): The user confirmed booking's args.
- Returns: a list of Booking objects.
- Status codes: 200, 401, 500
- Models: Service, Booking

##### List all user confirmed bookings
`GET /user-confirmed-bookings/:skip`
Returns the site's user confirmed bookings, newest first unless a sort is given.
- Access: Optional user, User token
- Path:
  - `skip` (string): How many results to skip - for paging.
- Query:
  - `sortBy` (string): The order of the results.
  - `sortOrder` (string): Only user confirmed bookings with this sort order.
- Returns: a list of Booking objects.
- Status codes: 200, 401, 500
- Models: Service, Booking

##### List all user current bookings
`GET /user-current-bookings`
Returns the site's user current bookings, newest first unless a sort is given.
- Access: Optional user, User token
- Query:
  - `sortBy` (string): The order of the results.
  - `sortOrder` (string): Only user current bookings with this sort order.
- Returns: a list of Booking objects.
- Status codes: 200, 401, 500
- Models: Service, Booking

##### Update the user did not answer booking
`PATCH /user-did-not-answer-booking`
Changes the fields sent; the others stay as they are.
- Access: Optional user, User token
- Query:
  - `booking_id` (string): Only user did not answer bookings with this booking id.
- Returns: the Booking object.
- Status codes: 200, 401, 403, 500
- Models: Booking

##### List all user dynamic models
`GET /user-dynamic-models`
Returns the site's user dynamic models, newest first unless a sort is given.
- Access: User token
- Returns: a list of DynamicModel objects.
- Status codes: 200, 401, 500
- Models: DynamicModel, Model

##### Retrieve a user dynamic model
`GET /user-dynamic-models/:id`
Returns one user dynamic model, found by its ID.
- Access: User token
- Path:
  - `id` (string): The ID of the user dynamic model.
- Returns: the DynamicModel object.
- Status codes: 200, 401, 404, 500
- Models: DynamicModel

##### Retrieve a user follower
`GET /user-followers/:id&:skip`
Returns one user follower, found by its ID.
- Access: Public
- Path:
  - `id` (string): The ID of the user follower.
  - `skip` (string): How many results to skip - for paging.
- Status codes: 200, 500
- Models: User

##### Retrieve a user following
`GET /user-following/:id&:skip`
Returns one user following, found by its ID.
- Access: Public
- Path:
  - `id` (string): The ID of the user following.
  - `skip` (string): How many results to skip - for paging.
- Status codes: 200, 500
- Models: User

##### Retrieve a user handle
`GET /user-handle/:handle`
Returns one user handle, found by its ID.
- Access: Public
- Path:
  - `handle` (string): The user handle's handle.
- Status codes: 200, 500
- Models: User

##### Retrieve the user inbox
`GET /user-inbox`
Returns the user inbox.
- Access: User token
- Query:
  - `on_behalf_of` (string): Only user inboxes with this on behalf of.
- Status codes: 200, 401, 403, 404, 500
- Models: ConnectedAccount, Message, User, Product, Service, BlogPost

##### List all user invoices
`GET /user-invoices`
Returns the site's user invoices, newest first unless a sort is given.
- Access: User token
- Status codes: 200, 401, 500

##### Retrieve the user lead from booking
`GET /user-lead-from-booking`
Returns the user lead from booking.
- Access: Optional user, User token
- Query:
  - `id` (string): The ID of the user lead from booking.
- Returns: the Booking object.
- Status codes: 200, 401, 500
- Models: Booking, Order, Lead, Service

##### Retrieve a user mention
`GET /user-mention/:handle`
Returns one user mention, found by its ID.
- Access: User token
- Path:
  - `handle` (string): The user mention's handle.
- Status codes: 200, 401, 500
- Models: User

##### Retrieve the user order
`GET /user-order`
Returns the user order.
- Access: Optional user, User token
- Query:
  - `id` (string): The ID of the user order.
- Returns: the Order object.
- Status codes: 200, 401, 500
- Models: Order, Lead, Product, Program

##### List all user payment methods
`GET /user-payment-method/:payment_method`
Returns the site's user payment methods, newest first unless a sort is given.
- Access: Optional user, User token
- Path:
  - `payment_method` (string): The user payment method's payment method.
- Status codes: 200, 401, 404, 500

##### List all user payments
`GET /user-payments`
Returns the site's user payments, newest first unless a sort is given.
- Access: User token
- Status codes: 200, 401, 500
- Models: UserPaymentSettings, PaymentMethod, SocialModeSettings, AboutPage, MyContact

##### Retrieve the user price plan
`GET /user-price-plan/`
Returns the user price plan.
- Access: User token
- Returns: the PricePlan object.
- Status codes: 200, 401, 500
- Models: User, PricePlan

##### Retrieve the user product
`GET /user-product`
Returns the user product.
- Access: Optional user, User token
- Query:
  - `id` (string): The ID of the user product.
- Returns: the Product object.
- Status codes: 200, 401, 500
- Models: Product, Media, Collection, OriginAddress

##### List all user products
`GET /user-products`
Returns the site's user products, newest first unless a sort is given.
- Access: Optional user
- Query:
  - `user` (string): Only user products with this user.
- Returns: a list of Product objects.
- Status codes: 200, 500
- Models: Product, User, Media

##### Retrieve the user program
`GET /user-program`
Returns the user program.
- Access: Optional user, User token
- Query:
  - `id` (string): The ID of the user program.
- Returns: the Program object.
- Status codes: 200, 401, 500
- Models: Program, Collection

##### Retrieve the user service
`GET /user-service`
Returns the user service.
- Access: Optional user, User token
- Query:
  - `id` (string): The ID of the user service.
  - `on_behalf_of` (string): Only user services with this on behalf of.
- Returns: the Service object.
- Status codes: 200, 401, 403
- Models: Service, ConnectedAccount, User, Collection, OriginAddress

##### List all user services
`GET /user-services`
Returns the site's user services, newest first unless a sort is given.
- Access: User token
- Returns: a list of Service objects.
- Status codes: 200, 401, 500
- Models: Service

##### Retrieve the user shipping
`GET /user-shipping`
Returns the user shipping.
- Access: Optional user, User token
- Query:
  - `id` (string): The ID of the user shipping.
- Returns: the Shipping object.
- Status codes: 200, 401, 500
- Models: Shipping

##### Retrieve the user staff
`GET /user-staff`
Returns the user staff.
- Access: Optional user, User token
- Status codes: 200, 401

##### Update a user token
`PATCH /user-tokens/:id`
Changes the fields sent; the others stay as they are.
- Access: User token
- Path:
  - `id` (string): The ID of the user token.
- Status codes: 200, 400, 401, 404, 500
- Models: User

##### Retrieve a user
`GET /user/add_staff/:owner_id&:validation_code`
Returns one user, found by its ID.
- Access: User token
- Path:
  - `owner_id` (string): The user's owner id.
  - `validation_code` (string): The user's validation code.
- Returns: the User object.
- Status codes: 200, 401, 500
- Models: User, MyContact, Publish

##### Update your user
`PATCH /user/me/password`
Changes the fields sent; the others stay as they are.
- Access: User token
- Status codes: 200, 401, 500

##### Delete a user
`DELETE /user/remove_admin/:id`
Deletes the user. This cannot be undone.
- Access: Admin token
- Path:
  - `id` (string): The ID of the user.
- Query:
  - `deleteQuery` (string): Only users with this delete query.
- Returns: an empty answer on success.
- Status codes: 204, 401, 403, 500
- Models: User, Product, Service, Media, Booking, Order, Shipping

##### Delete a user
`DELETE /user/remove_staff/:id`
Deletes the user. This cannot be undone.
- Access: User token
- Path:
  - `id` (string): The ID of the user.
- Query:
  - `deleteQuery` (string): Only users with this delete query.
- Returns: an empty answer on success.
- Status codes: 204, 401, 403, 500
- Models: User, Product, Service, Media, Booking, Order, Shipping

##### Create a user
`POST /user/send_staff_email`
Creates a user from the fields sent.
- Access: Optional user, User token
- Body:
  - `on_behalf_of` (string): The user's on behalf of.
  - `email` (string): An email address.
- Status codes: 200, 401, 403, 500
- Models: ConnectedAccount

##### Create a user
`POST /users`
Creates a user from the fields sent.
- Access: Public
- Returns: the User object.
- Status codes: 201, 400, 500
- Models: User

##### Create a users admin
`POST /users-admin`
Creates a users admin from the fields sent.
- Access: Admin token
- Body:
  - `email` (string): An email address.
  - `name` (string): The users admin's name.
  - `can_edit` (string): The users admin's can edit.
- Status codes: 201, 400, 401, 500
- Models: User

##### Update a user
`PATCH /users/:id`
Changes the fields sent; the others stay as they are.
- Access: Admin token
- Path:
  - `id` (string): The ID of the user.
- Returns: the User object.
- Status codes: 200, 400, 401, 404, 500
- Models: User

##### Confirm the user
`GET /users/confirm/:email&:validation_code`
Confirm the user.
- Access: Public
- Path:
  - `email` (string): An email address.
  - `validation_code` (string): The user's validation code.
- Returns: the User object.
- Status codes: 200, 400, 418, 500
- Models: User

##### Retrieve the user
`GET /users/is-logged`
Returns the user.
- Access: Optional user, User token
- Status codes: 200, 401, 500

##### Sign in
`POST /users/login`
Sign in.
- Access: Public
- Body:
  - `email` (string): An email address.
- Returns: the User object.
- Status codes: 200, 400, 401, 500
- Models: User, PricePlan

##### Sign out
`POST /users/logout`
Sign out.
- Access: User token
- Status codes: 200, 401, 500

##### Retrieve your user
`GET /users/me`
Returns the user.
- Access: Optional user, User token
- Query:
  - `skip_transactions_check` (string): Only users with this skip transactions check.
- Returns: the User object.
- Status codes: 200, 401, 404, 500
- Models: MyContact, SocialModeSettings, Publish, Order, Program, Ticket, Event, QrCode, Donation, Product, BlogPost, PricePlan, Subscription, User, Service, Shipping, Booking, PaymentMethod, ProfessionalAccount

##### Update your user
`PATCH /users/me`
Changes the fields sent; the others stay as they are.
- Access: User token
- Body:
  - `saved_products` (string): The user's saved products.
  - `saved_programs` (string): The user's saved programs.
  - `saved_blogposts` (string): The user's saved blog posts.
  - `saved_services` (string): The user's saved services.
- Status codes: 200, 400, 401, 500

##### Delete your user
`DELETE /users/me`
Deletes the users. This cannot be undone.
- Access: User token
- Returns: an empty answer on success.
- Status codes: 200, 401, 500
- Models: ProfessionalAccount

##### Retrieve your user
`GET /users/me/avatar`
Returns the user.
- Access: User token
- Status codes: 200, 401, 404, 500
- Models: Media

##### Create a user
`POST /users/me/avatar`
Creates a user from the fields sent.
- Access: User token
- Status codes: 200, 400, 401

##### Delete your user
`DELETE /users/me/avatar`
Deletes the users. This cannot be undone.
- Access: User token
- Returns: an empty answer on success.
- Status codes: 200, 401
- Models: Media

##### Retrieve your user
`GET /users/me/delete`
Returns the user.
- Access: User token
- Status codes: 200, 400, 401, 500

##### Retrieve your user
`GET /users/me/transactions`
Returns the user.
- Access: Optional user, User token
- Query:
  - `skip_transactions_check` (string): Only users with this skip transactions check.
- Status codes: 200, 401, 404, 500
- Models: PaymentMethod, PricePlan

##### Retrieve the user
`GET /users/on-behalf-of`
Returns the user.
- Access: Optional user, User token
- Query:
  - `on_behalf_of` (string): Only users with this on behalf of.
  - `skip_transactions_check` (string): Only users with this skip transactions check.
- Returns: the User object.
- Status codes: 200, 401, 404, 500
- Models: MyContact, ConnectedAccount, Order, Product, Program, User, BlogPost, PricePlan, Subscription, Service, Shipping, Booking, PaymentMethod, Post, UserPaymentSettings, SocialModeSettings

##### List all users
`GET /users/send-password-reset/:email`
Returns the site's users, newest first unless a sort is given.
- Access: Public
- Path:
  - `email` (string): An email address.
- Returns: a list of User objects.
- Status codes: 201, 400, 500
- Models: User

##### Verify a token
`PATCH /verify-token`
Verify a token.
- Access: User token
- Status codes: 200, 400, 401, 500
- Models: User

#### User Engagement Notification

##### List all user engagement notifications
`GET /latest-user-engagement-notifications/:users`
Returns the site's user engagement notifications, newest first unless a sort is given.
- Access: User token
- Path:
  - `users` (string): The user engagement notification's users.
- Returns: a list of UserEngagementNotification objects.
- Status codes: 200, 401, 500
- Models: UserEngagementNotification, Post, Group

##### List all user engagement notifications
`GET /new-user-engagement-notifications`
Returns the site's user engagement notifications, newest first unless a sort is given.
- Access: User token
- Returns: a list of UserEngagementNotification objects.
- Status codes: 200, 401, 500
- Models: UserEngagementNotification

##### Update the seen message notification
`PATCH /seen-my-message-notification`
Changes the fields sent; the others stay as they are.
- Access: User token
- Status codes: 200, 401, 500
- Models: UserEngagementNotification

##### Update the seen notification
`PATCH /seen-my-notifications`
Changes the fields sent; the others stay as they are.
- Access: User token
- Status codes: 200, 401, 500
- Models: UserEngagementNotification

##### List all system user engagement notifications
`GET /system-user-engagement-notifications`
Returns the site's system user engagement notifications, newest first unless a sort is given.
- Access: User token
- Returns: a list of UserEngagementNotification objects.
- Status codes: 200, 401, 500
- Models: UserEngagementNotification

##### List all user engagement notifications
`GET /user-engagement-notifications`
Returns the site's user engagement notifications, newest first unless a sort is given.
- Access: User token
- Returns: a list of UserEngagementNotification objects.
- Status codes: 200, 401, 500
- Models: UserEngagementNotification, Post, Group

##### List all user engagement notifications
`GET /user-engagement-notifications/:skip&:users`
Returns the site's user engagement notifications, newest first unless a sort is given.
- Access: User token
- Path:
  - `skip` (string): How many results to skip - for paging.
  - `users` (string): The user engagement notification's users.
- Returns: a list of UserEngagementNotification objects.
- Status codes: 200, 401, 500
- Models: UserEngagementNotification

#### User Privilege

##### List all user privileges
`GET /user-privileges`
Returns the site's user privileges, newest first unless a sort is given.
- Access: Public
- Status codes: 200, 500

##### Create a user privilege
`POST /user-privileges`
Create new user_privilege.
- Access: Admin token
- Status codes: 201, 400, 401, 500

##### Retrieve a user privilege
`GET /user-privileges/:id`
Returns one user privilege, found by its ID.
- Access: Public
- Path:
  - `id` (string): The ID of the user privilege.
- Status codes: 200, 404, 500

##### Update a user privilege
`PATCH /user-privileges/:id`
Update UserPrivilege by id.
- Access: Admin token
- Path:
  - `id` (string): The ID of the user privilege.
- Status codes: 200, 400, 401, 404, 500

##### Delete a user privilege
`DELETE /user-privileges/:id`
Delete UserPrivilege record by id.
- Access: Admin token
- Path:
  - `id` (string): The ID of the user privilege.
- Returns: an empty answer on success.
- Status codes: 200, 401, 404, 500

#### User Report

##### List all mini app reports
`GET /mini-app-reports/:skip`
Returns the site's mini app reports, newest first unless a sort is given.
- Access: User token
- Path:
  - `skip` (string): How many results to skip - for paging.
- Status codes: 200, 400, 401, 500
- Models: UserReport

##### Create a user report
`POST /user-report`
Create new UserReport.
- Access: User token
- Returns: the UserReport object.
- Status codes: 201, 400, 401, 500
- Models: UserReport

##### Update a user report
`PATCH /user-report/:id`
Update UserReport by id.
- Access: User token
- Path:
  - `id` (string): The ID of the user report.
- Returns: the UserReport object.
- Status codes: 200, 400, 401, 404, 500
- Models: UserReport

##### List all user reports
`GET /user-reports/:skip&:limit`
Returns the site's user reports, newest first unless a sort is given.
- Access: User token
- Path:
  - `skip` (string): How many results to skip - for paging.
  - `limit` (string): How many results to return.
- Returns: a list of UserReport objects.
- Status codes: 200, 401, 500
- Models: UserReport, KeywordBlacklist, Post

#### AI builder

##### Create a staff member with AI
`POST /create-staff-member`
Create a staff member from a prompt, written by the AI builder.
- Access: User token
- Body:
  - `prompt` (string): What the AI should do with the staff member, in plain words - any language.
  - `chatId` (string): The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat.
  - `aiVersion` (string): Which version of the AI builder to use; leave it out for the current one.
  - `item_id` (string): The ID of the staff member to change.
- Status codes: 200, 401, 500
- Models: ChatMessage

##### Create a staff schedule with AI
`POST /create-staff-schedule`
Create a staff schedule from a prompt, written by the AI builder.
- Access: User token
- Body:
  - `prompt` (string): What the AI should do with the staff schedule, in plain words - any language.
  - `chatId` (string): The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat.
  - `aiVersion` (string): Which version of the AI builder to use; leave it out for the current one.
  - `item_id` (string): The ID of the staff schedule to change.
- Status codes: 200, 401, 500
- Models: ChatMessage

##### Generate a staff with AI
`POST /generate-staff`
Use it to create a new staff member or team member account.
- Access: User token
- Body:
  - `prompt` (string): What the AI should do with the staff, in plain words - any language.
  - `chatId` (string): The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat.
- Status codes: 200, 401, 500

##### Generate a staff schedule with AI
`POST /generate-staff-schedule`
Use it to lock or block time slots in a staff member's schedule.
- Access: User token
- Body:
  - `prompt` (string): What the AI should do with the staff schedule, in plain words - any language.
  - `chatId` (string): The AI chat this request belongs to; its history and language carry over. Leave it out to start a new chat.
- Status codes: 200, 401, 500

## Objects

### AboutPage

A page built in the editor or by the AI builder. Its content is in containers: each container is a full-width section with columns, and each column has components, laid out on a 12-column grid by their size.

- `requiresLogin`: Boolean, default false - Only signed-in users can see the page.
- `requiresSubscription`: Boolean, default false - Only subscribers of one of price_plan_ids can see the page.
- `price_plan_ids`: String[] - The price plans whose subscribers can see the page, with requiresSubscription.
- `title`: String, required - The page's title, shown in the browser tab and in the admin.
- `url`: String, required - The page's address on the site: /<url>. Unique.
- `redirectUrl`: String - When set, visitors who open the page are sent to this address instead.
- `legal_kind`: String - For legal pages: which document it is, in English (Privacy Policy, Terms of Service...).
- `isPartial`: Boolean, default false - A part of other pages (a banner, a block inside a product page), not a page of its own.
- `showTo`: String, default "0" - Who sees the page: "0" everyone, "1" signed-in users only, "2" visitors who are not signed in.
- `showHeader`: Boolean, default true - Show the site's header on the page.
- `showFooter`: Boolean, default true - Show the site's footer on the page.
- `ai_context_v2`: Mixed
- `ai_surfaces_v2`: Mixed
- `ai_overview`: String - A short summary of the page the AI builder keeps for its own use.
- `ai_generation_metadata`: Mixed
- `containers`: Object[] - The page's content: sections, each with columns of components.
  - `isFluid`: Boolean, default false
  - `parallaxEnabled`: Boolean
  - `parallaxAmount`: Number
  - `parallaxZoom`: Number
  - `continuousEnabled`: Boolean, default false
  - `continuousEffect`: String, default "none"
  - `continuousDuration`: Number, default 2400
  - `continuousIntensity`: Number, default 4
  - `backgroundImage`: String
  - `backgroundSize`: String
  - `backgroundPosition`: String
  - `backgroundRepeat`: String
  - `backgroundVideo`: String
  - `backgroundColor`: String
  - `backgroundGradient.enabled`: Boolean, default false
  - `backgroundGradient.type`: String
  - `backgroundGradient.degrees`: Number
  - `backgroundGradient.radialShape`: String
  - `backgroundGradient.radialPosition`: String
  - `backgroundGradient.colors`: Object[]
    - `color`: String
    - `percentage`: Number
    - `_id`: ObjectId
  - `backgroundGradient.css`: String
  - `backgroundParallax`: Boolean, default false
  - `minHeight`: Number
  - `minHeightMobile`: Number
  - `padding_top.value`: String, default ""
  - `padding_top.unit`: String, default "px"
  - `padding_top.mobile_value`: String, default ""
  - `padding_top.mobile_unit`: String, default "px"
  - `padding_right.value`: String, default ""
  - `padding_right.unit`: String, default "px"
  - `padding_right.mobile_value`: String, default ""
  - `padding_right.mobile_unit`: String, default "px"
  - `padding_bottom.value`: String, default ""
  - `padding_bottom.unit`: String, default "px"
  - `padding_bottom.mobile_value`: String, default ""
  - `padding_bottom.mobile_unit`: String, default "px"
  - `padding_left.value`: String, default ""
  - `padding_left.unit`: String, default "px"
  - `padding_left.mobile_value`: String, default ""
  - `padding_left.mobile_unit`: String, default "px"
  - `allowOffset`: Boolean, default false
  - `offsetX`: Number, default 0
  - `offsetY`: Number, default 0
  - `offsetMobileX`: Number, default 0
  - `offsetMobileY`: Number, default 0
  - `zIndex`: Number, default 0
  - `wrap_reverse`: Boolean, default false
  - `borderRadius`: Number, default 0
  - `marginX`: Number, default 0
  - `editorName`: String
  - `horizontalScroll`: Boolean, default false
  - `horizontalScrollWidth`: Number, default 100
  - `overflowX`: String, default "hidden"
  - `columns`: Object[]
    - `size`: String
    - `hoverGroup`: Boolean
    - `parallaxEnabled`: Boolean
    - `parallaxAmount`: Number
    - `parallaxZoom`: Number
    - `continuousEnabled`: Boolean, default false
    - `continuousEffect`: String, default "none"
    - `continuousDuration`: Number, default 2400
    - `continuousIntensity`: Number, default 4
    - `sticky`: Boolean, default false
    - `justify`: String
    - `align`: String
    - `onHoverActions`: Boolean, default false
    - `onHoverTransition`: Number, default 0.3
    - `backgroundColor`: String
    - `backgroundGradient.enabled`: Boolean, default false
    - `backgroundGradient.type`: String
    - `backgroundGradient.degrees`: Number
    - `backgroundGradient.radialShape`: String
    - `backgroundGradient.radialPosition`: String
    - `backgroundGradient.colors`: Object[]
      - `color`: String
      - `percentage`: Number
      - `_id`: ObjectId
    - `backgroundGradient.css`: String
    - `backgroundColorOnHover`: String
    - `innerBackgroundColor`: String
    - `innerBackgroundGradient.enabled`: Boolean, default false
    - `innerBackgroundGradient.type`: String
    - `innerBackgroundGradient.degrees`: Number
    - `innerBackgroundGradient.radialShape`: String
    - `innerBackgroundGradient.radialPosition`: String
    - `innerBackgroundGradient.colors`: Object[]
      - `color`: String
      - `percentage`: Number
      - `_id`: ObjectId
    - `innerBackgroundGradient.css`: String
    - `innerBackgroundColorOnHover`: String
    - `backgroundImage`: String
    - `backgroundSize`: String
    - `backgroundPosition`: String
    - `backgroundRepeat`: String
    - `backgroundVideo`: String
    - `paddingX`: Number, default 0
    - `paddingXOnHover`: Number, default 0
    - `paddingY`: Number, default 0
    - `paddingYOnHover`: Number, default 0
    - `innerPaddingX`: Number, default 0
    - `innerPaddingXOnHover`: Number, default 0
    - `innerPaddingY`: Number, default 0
    - `allowOffset`: Boolean, default false
    - `offsetX`: Number, default 0
    - `offsetY`: Number, default 0
    - `offsetMobileX`: Number, default 0
    - `offsetMobileY`: Number, default 0
    - `zIndex`: Number, default 0
    - `innerPaddingYOnHover`: Number, default 0
    - `paddingOptions`: String
    - `paddingOptionsOnHover`: String
    - `innerPaddingOptions`: String
    - `borderOptions`: String
    - `borderOptionsOnHover`: String
    - `card`: Boolean, default false
    - `borderRadius`: Number, default 0
    - `borderRadiusOnHover`: Number, default 0
    - `borderType`: String, default "none"
    - `borderTypeOnHover`: String, default "none"
    - `borderWidth`: Number, default 0
    - `borderWidthOnHover`: Number, default 0
    - `borderColor`: String, default ""
    - `borderColorOnHover`: String, default ""
    - `components`: Object[]
      - `type`: String
      - `size`: String, default "12"
      - `sticky`: Boolean, default false
      - `paddingX`: Number, default 0
      - `paddingY`: Number, default 0
      - `allowOffset`: Boolean, default false
      - `offsetX`: Number, default 0
      - `offsetY`: Number, default 0
      - `offsetMobileX`: Number, default 0
      - `offsetMobileY`: Number, default 0
      - `zIndex`: Number, default 0
      - `position`: String, one of static | relative | absolute | fixed | sticky, default "static"
      - `top.value`: String, default "0"
      - `top.unit`: String, default "px"
      - `top.mobile_value`: String, default ""
      - `top.mobile_unit`: String, default "px"
      - `left.value`: String, default "0"
      - `left.unit`: String, default "px"
      - `left.mobile_value`: String, default ""
      - `left.mobile_unit`: String, default "px"
      - `right.value`: String, default "0"
      - `right.unit`: String, default "px"
      - `right.mobile_value`: String, default ""
      - `right.mobile_unit`: String, default "px"
      - `bottom.value`: String, default "0"
      - `bottom.unit`: String, default "px"
      - `bottom.mobile_value`: String, default ""
      - `bottom.mobile_unit`: String, default "px"
      - `custom_measurements`: Boolean, default false
      - `edit_type`: String, default "simple"
      - `custom_width.value`: Mixed
      - `custom_width.unit`: String, default "px"
      - `custom_width.mobile_value`: Mixed
      - `custom_width.mobile_unit`: String, default "px"
      - `custom_min_width.value`: Mixed
      - `custom_min_width.unit`: String, default "px"
      - `custom_min_width.mobile_value`: Mixed
      - `custom_min_width.mobile_unit`: String, default "px"
      - `custom_max_width.value`: Mixed
      - `custom_max_width.unit`: String, default "px"
      - `custom_max_width.mobile_value`: Mixed
      - `custom_max_width.mobile_unit`: String, default "px"
      - `custom_height.value`: Mixed
      - `custom_height.unit`: String, default "px"
      - `custom_height.mobile_value`: Mixed
      - `custom_height.mobile_unit`: String, default "px"
      - `custom_min_height.value`: Mixed
      - `custom_min_height.unit`: String, default "px"
      - `custom_min_height.mobile_value`: Mixed
      - `custom_min_height.mobile_unit`: String, default "px"
      - `custom_max_height.value`: Mixed
      - `custom_max_height.unit`: String, default "px"
      - `custom_max_height.mobile_value`: Mixed
      - `custom_max_height.mobile_unit`: String, default "px"
      - `object_fit`: String, default "none"
      - `aspect_ratio.custom`: Boolean, default false
      - `aspect_ratio.ratio`: String, default ""
      - `min_height`: Number, default 0
      - `margin_left.value`: Mixed
      - `margin_left.unit`: String, default "px"
      - `margin_left.mobile_value`: Mixed
      - `margin_left.mobile_unit`: String, default "px"
      - `margin_right.value`: Mixed
      - `margin_right.unit`: String, default "px"
      - `margin_right.mobile_value`: Mixed
      - `margin_right.mobile_unit`: String, default "px"
      - `margin_top.value`: Mixed
      - `margin_top.unit`: String, default "px"
      - `margin_top.mobile_value`: Mixed
      - `margin_top.mobile_unit`: String, default "px"
      - `margin_bottom.value`: Mixed
      - `margin_bottom.unit`: String, default "px"
      - `margin_bottom.mobile_value`: Mixed
      - `margin_bottom.mobile_unit`: String, default "px"
      - `padding_left.value`: Mixed
      - `padding_left.unit`: String, default "px"
      - `padding_left.mobile_value`: Mixed
      - `padding_left.mobile_unit`: String, default "px"
      - `padding_right.value`: Mixed
      - `padding_right.unit`: String, default "px"
      - `padding_right.mobile_value`: Mixed
      - `padding_right.mobile_unit`: String, default "px"
      - `padding_top.value`: Mixed
      - `padding_top.unit`: String, default "px"
      - `padding_top.mobile_value`: Mixed
      - `padding_top.mobile_unit`: String, default "px"
      - `padding_bottom.value`: Mixed
      - `padding_bottom.unit`: String, default "px"
      - `padding_bottom.mobile_value`: Mixed
      - `padding_bottom.mobile_unit`: String, default "px"
      - `border_left.color`: String
      - `border_left.width.value`: Mixed
      - `border_left.width.unit`: String, default "px"
      - `border_left.style`: String
      - `border_right.color`: String
      - `border_right.width.value`: Mixed
      - `border_right.width.unit`: String, default "px"
      - `border_right.style`: String
      - `border_top.color`: String
      - `border_top.width.value`: Mixed
      - `border_top.width.unit`: String, default "px"
      - `border_top.style`: String
      - `border_bottom.color`: String
      - `border_bottom.width.value`: Mixed
      - `border_bottom.width.unit`: String, default "px"
      - `border_bottom.style`: String
      - `border_top_left_radius.value`: Mixed
      - `border_top_left_radius.unit`: String, default "px"
      - `border_top_right_radius.value`: Mixed
      - `border_top_right_radius.unit`: String, default "px"
      - `border_bottom_left_radius.value`: Mixed
      - `border_bottom_left_radius.unit`: String, default "px"
      - `border_bottom_right_radius.value`: Mixed
      - `border_bottom_right_radius.unit`: String, default "px"
      - `custom_border_radius.value`: Number
      - `custom_border_radius.unit`: String, default "px"
      - `specific_border_radius`: Boolean, default false
      - `box_shadows`: Object[]
      - `mix_blend_mode`: String, one of normal | multiply | screen | overlay | darken | lighten | color-dodge | color-burn | hard-light | soft-light | difference | exclusion | hue | saturation | color | luminosity, default "normal"
      - `paddingOptions`: String
      - `backgroundColor`: String
      - `backgroundGradient.enabled`: Boolean, default false
      - `backgroundGradient.type`: String
      - `backgroundGradient.degrees`: Number
      - `backgroundGradient.radialShape`: String
      - `backgroundGradient.radialPosition`: String
      - `backgroundGradient.colors`: Object[]
      - `backgroundGradient.css`: String
      - `card`: Boolean, default false
      - `borderRadius`: Number, default 0
      - `borderType`: String, default "none"
      - `borderWidth`: Number, default 0
      - `borderColor`: String, default ""
      - `borderOptions`: String
      - `showOnMobile`: Boolean, default true
      - `showOnDesktop`: Boolean, default true
      - `icon`: String
      - `iconSettings.size`: Number, default 40
      - `iconSettings.color`: String, default "var(--ion-color-primary)"
      - `heading`: String
      - `subHeading`: String
      - `heading_alignment`: String
      - `innerHTML`: String
      - `innerCSS`: String
      - `innerJS`: String
      - `lineHeight`: String, default "normal"
      - `medias`: Object[]
      - `products`: ObjectId[], → Product
      - `product_gallery.design_layout`: String, default ""
      - `product_gallery.mode`: String, default "card"
      - `product_gallery.columns`: Number, default 3
      - `product_gallery.placeholderItems`: Object[]
      - `product_gallery.placeholderPlateColor`: String, default ""
      - `product_gallery.showName`: Boolean, default true
      - `product_gallery.showPrice`: Boolean, default true
      - `product_gallery.showDescription`: Boolean, default false
      - `product_gallery.showBrand`: Boolean, default false
      - `product_gallery.showRibbon`: Boolean, default false
      - `product_gallery.showRating`: Boolean, default false
      - `product_gallery.showCart`: Boolean, default false
      - `product_gallery.showLink`: Boolean, default false
      - `product_gallery.linkLabel`: String, default "View product"
      - `product_gallery.imageAspectRatio`: String, default "1/1"
      - `product_gallery.imageHeight`: Number, default 260
      - `product_gallery.imageRadius`: Number, default 20
      - `product_gallery.imageObjectFit`: String, default "cover"
      - `product_gallery.cardBackgroundColor`: String, default "var(--ion-card-background, #ffffff)"
      - `product_gallery.cardBorderRadius`: Number, default 28
      - `product_gallery.cardBorderWidth`: Number, default 0
      - `product_gallery.cardBorderColor`: String, default "transparent"
      - `product_gallery.cardPaddingX`: Number, default 20
      - `product_gallery.cardPaddingY`: Number, default 20
      - `product_gallery.gap`: Number, default 24
      - `product_gallery.boxShadowColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.22)"
      - `product_gallery.boxShadowOffsetY`: Number, default 20
      - `product_gallery.boxShadowBlurRadius`: Number, default 40
      - `product_gallery.boxShadowSpreadRadius`: Number, default -22
      - `product_gallery.fieldBackground`: String, default "transparent"
      - `product_gallery.hairlineColor`: String, default "transparent"
      - `product_gallery.hairlineWidth`: Number, default 0
      - `product_gallery.maxWidth`: Number, default 0
      - `product_gallery.scrimGradient`: String, default ""
      - `product_gallery.align`: String, default "left"
      - `product_gallery.accentColor`: String, default "var(--ion-color-primary, #3880ff)"
      - `product_gallery.nameColor`: String, default "var(--ion-text-color, #1e293b)"
      - `product_gallery.nameFontSize`: String, default "1em"
      - `product_gallery.nameFontWeight`: String, default "700"
      - `product_gallery.nameFontFamily`: String, default ""
      - `product_gallery.nameTransform`: String, default "none"
      - `product_gallery.priceColor`: String, default "var(--ion-color-primary, #3880ff)"
      - `product_gallery.priceFontSize`: String, default "0.94em"
      - `product_gallery.priceFontWeight`: String, default "600"
      - `product_gallery.priceFontFamily`: String, default ""
      - `product_gallery.priceFontStyle`: String, default "normal"
      - `product_gallery.metaColor`: String, default "rgba(var(--ion-text-color-rgb, 30,41,59), 0.66)"
      - `product_gallery.titlePosition`: String, default "bottom"
      - `product_gallery.imageSide`: String, default "left"
      - `product_gallery.imagePadding`: Number, default 0
      - `product_gallery.boxShadowOffsetX`: Number, default 0
      - `product_gallery.descFontSize`: String, default "13px"
      - `product_gallery.descFontWeight`: String, default "400"
      - `product_gallery.animation`: String, default "none"
      - `product_gallery.animationDuration`: Number, default 0
      - `product_gallery.animationDelay`: Number, default 0
      - `product_gallery.showCustomFields`: Boolean, default false
      - `product_gallery.cardDesign`: String, default ""
      - `product_gallery.carouselLoop`: Boolean, default false
      - `product_gallery.carouselControls`: Boolean, default false
      - `product_gallery.customCss`: String, default ""
      - `services`: ObjectId[], → Service
      - `service_gallery.design_layout`: String, default ""
      - `service_gallery.mode`: String, default "card"
      - `service_gallery.columns`: Number, default 3
      - `service_gallery.placeholderItems`: Object[]
      - `service_gallery.placeholderPlateColor`: String, default ""
      - `service_gallery.showTitle`: Boolean, default true
      - `service_gallery.showPrice`: Boolean, default true
      - `service_gallery.showDescription`: Boolean, default false
      - `service_gallery.showDuration`: Boolean, default false
      - `service_gallery.durationLabel`: String, default "min"
      - `service_gallery.showImage`: Boolean, default true
      - `service_gallery.showLink`: Boolean, default false
      - `service_gallery.linkLabel`: String, default "View service"
      - `service_gallery.imageAspectRatio`: String, default "1/1"
      - `service_gallery.imageHeight`: Number, default 260
      - `service_gallery.imageRadius`: Number, default 20
      - `service_gallery.imageObjectFit`: String, default "cover"
      - `service_gallery.cardBackgroundColor`: String, default "var(--ion-card-background, #ffffff)"
      - `service_gallery.cardBorderRadius`: Number, default 28
      - `service_gallery.cardBorderWidth`: Number, default 0
      - `service_gallery.cardBorderColor`: String, default "transparent"
      - `service_gallery.cardPaddingX`: Number, default 20
      - `service_gallery.cardPaddingY`: Number, default 20
      - `service_gallery.gap`: Number, default 24
      - `service_gallery.boxShadowColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.22)"
      - `service_gallery.boxShadowOffsetY`: Number, default 20
      - `service_gallery.boxShadowBlurRadius`: Number, default 40
      - `service_gallery.boxShadowSpreadRadius`: Number, default -22
      - `service_gallery.fieldBackground`: String, default "transparent"
      - `service_gallery.hairlineColor`: String, default "transparent"
      - `service_gallery.hairlineWidth`: Number, default 0
      - `service_gallery.rowRuleColor`: String, default "transparent"
      - `service_gallery.rowRuleWidth`: Number, default 0
      - `service_gallery.maxWidth`: Number, default 0
      - `service_gallery.scrimGradient`: String, default ""
      - `service_gallery.align`: String, default "left"
      - `service_gallery.accentColor`: String, default "var(--ion-color-primary, #3880ff)"
      - `service_gallery.titleColor`: String, default "var(--ion-text-color, #1e293b)"
      - `service_gallery.titleFontSize`: String, default "1em"
      - `service_gallery.titleFontWeight`: String, default "700"
      - `service_gallery.titleFontFamily`: String, default ""
      - `service_gallery.titleTransform`: String, default "none"
      - `service_gallery.priceColor`: String, default "var(--ion-color-primary, #3880ff)"
      - `service_gallery.priceFontSize`: String, default "0.94em"
      - `service_gallery.priceFontWeight`: String, default "600"
      - `service_gallery.priceFontFamily`: String, default ""
      - `service_gallery.priceFontStyle`: String, default "normal"
      - `service_gallery.metaColor`: String, default "rgba(var(--ion-text-color-rgb, 30,41,59), 0.66)"
      - `service_gallery.titlePosition`: String, default "bottom"
      - `service_gallery.imageSide`: String, default "left"
      - `service_gallery.imagePadding`: Number, default 0
      - `service_gallery.boxShadowOffsetX`: Number, default 0
      - `service_gallery.descFontSize`: String, default "13px"
      - `service_gallery.descFontWeight`: String, default "400"
      - `service_gallery.animation`: String, default "none"
      - `service_gallery.animationDuration`: Number, default 0
      - `service_gallery.animationDelay`: Number, default 0
      - `service_gallery.showCustomFields`: Boolean, default false
      - `service_gallery.cardDesign`: String, default ""
      - `service_gallery.carouselLoop`: Boolean, default false
      - `service_gallery.carouselControls`: Boolean, default false
      - `service_gallery.customCss`: String, default ""
      - `blog_gallery.design_layout`: String, default ""
      - `blog_gallery.mode`: String, default "card"
      - `blog_gallery.columns`: Number, default 3
      - `blog_gallery.leadLayout`: String, default "beside"
      - `blog_gallery.leadWidth`: Number, default 58
      - `blog_gallery.placeholderItems`: Object[]
      - `blog_gallery.placeholderPlateColor`: String, default ""
      - `blog_gallery.showTitle`: Boolean, default true
      - `blog_gallery.showExcerpt`: Boolean, default false
      - `blog_gallery.showDate`: Boolean, default true
      - `blog_gallery.showImage`: Boolean, default true
      - `blog_gallery.showLink`: Boolean, default false
      - `blog_gallery.linkLabel`: String, default "Read more"
      - `blog_gallery.showCustomFields`: Boolean, default false
      - `blog_gallery.imageAspectRatio`: String, default "1/1"
      - `blog_gallery.imageHeight`: Number, default 260
      - `blog_gallery.imageRadius`: Number, default 20
      - `blog_gallery.imageObjectFit`: String, default "cover"
      - `blog_gallery.imagePadding`: Number, default 0
      - `blog_gallery.imageSide`: String, default "left"
      - `blog_gallery.cardBackgroundColor`: String, default "var(--ion-card-background, #ffffff)"
      - `blog_gallery.cardBorderRadius`: Number, default 28
      - `blog_gallery.cardBorderWidth`: Number, default 0
      - `blog_gallery.cardBorderColor`: String, default "transparent"
      - `blog_gallery.cardPaddingX`: Number, default 20
      - `blog_gallery.cardPaddingY`: Number, default 20
      - `blog_gallery.gap`: Number, default 24
      - `blog_gallery.boxShadowColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.22)"
      - `blog_gallery.boxShadowOffsetX`: Number, default 0
      - `blog_gallery.boxShadowOffsetY`: Number, default 20
      - `blog_gallery.boxShadowBlurRadius`: Number, default 40
      - `blog_gallery.boxShadowSpreadRadius`: Number, default -22
      - `blog_gallery.fieldBackground`: String, default "transparent"
      - `blog_gallery.hairlineColor`: String, default "transparent"
      - `blog_gallery.hairlineWidth`: Number, default 0
      - `blog_gallery.rowRuleColor`: String, default "transparent"
      - `blog_gallery.rowRuleWidth`: Number, default 0
      - `blog_gallery.maxWidth`: Number, default 0
      - `blog_gallery.scrimGradient`: String, default ""
      - `blog_gallery.align`: String, default "left"
      - `blog_gallery.accentColor`: String, default "var(--ion-color-primary, #3880ff)"
      - `blog_gallery.titleColor`: String, default "var(--ion-text-color, #1e293b)"
      - `blog_gallery.titleFontSize`: String, default "1em"
      - `blog_gallery.titleFontWeight`: String, default "700"
      - `blog_gallery.titleFontFamily`: String, default ""
      - `blog_gallery.titleTransform`: String, default "none"
      - `blog_gallery.dateColor`: String, default "var(--ion-color-primary, #3880ff)"
      - `blog_gallery.dateFontSize`: String, default "0.81em"
      - `blog_gallery.dateFontWeight`: String, default "600"
      - `blog_gallery.dateFontFamily`: String, default ""
      - `blog_gallery.dateFontStyle`: String, default "normal"
      - `blog_gallery.metaColor`: String, default "rgba(var(--ion-text-color-rgb, 30,41,59), 0.66)"
      - `blog_gallery.excerptFontSize`: String, default "0.88em"
      - `blog_gallery.excerptFontWeight`: String, default "400"
      - `blog_gallery.excerptFontFamily`: String, default ""
      - `blog_gallery.titlePosition`: String, default "bottom"
      - `blog_gallery.animation`: String, default "none"
      - `blog_gallery.animationDuration`: Number, default 0
      - `blog_gallery.animationDelay`: Number, default 0
      - `blog_gallery.cardDesign`: String, default ""
      - `blog_gallery.customCss`: String, default ""
      - `multi_booking.layout`: String, default "chips"
      - `multi_booking.columns`: Number, default 3
      - `multi_booking.pickerBackground`: String, default "transparent"
      - `multi_booking.gap`: Number, default 10
      - `multi_booking.align`: String, default "left"
      - `multi_booking.showPrice`: Boolean, default false
      - `multi_booking.showDuration`: Boolean, default false
      - `multi_booking.showDescription`: Boolean, default false
      - `multi_booking.showImage`: Boolean, default false
      - `multi_booking.itemPaddingX`: Number, default 18
      - `multi_booking.itemPaddingY`: Number, default 10
      - `multi_booking.itemRadius`: Number, default 100
      - `multi_booking.itemBorderWidth`: Number, default 0
      - `multi_booking.itemBorderColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.12)"
      - `multi_booking.itemBackground`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.10)"
      - `multi_booking.itemTextColor`: String, default "var(--ion-text-color, inherit)"
      - `multi_booking.itemSubTextColor`: String, default "var(--ion-color-medium, rgba(0,0,0,0.55))"
      - `multi_booking.selectedBackground`: String, default "var(--ion-color-primary)"
      - `multi_booking.selectedTextColor`: String, default "var(--ion-color-primary-contrast, #ffffff)"
      - `multi_booking.selectedSubTextColor`: String, default "rgba(var(--ion-color-primary-contrast-rgb, 255,255,255), 0.75)"
      - `multi_booking.selectedBorderColor`: String, default "var(--ion-color-primary)"
      - `multi_booking.hoverBackground`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.18)"
      - `multi_booking.titleFontSize`: Number, default 14
      - `multi_booking.titleFontWeight`: String, default "500"
      - `multi_booking.subFontSize`: Number, default 13
      - `multi_booking.dividerColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.12)"
      - `multi_booking.dividerWidth`: Number, default 1
      - `multi_booking.autoScroll`: Boolean, default true
      - `multi_booking.cardBackground`: String, default "var(--ion-card-color, #ffffff)"
      - `multi_booking.cardRadius`: Number, default 28
      - `multi_booking.cardBorderWidth`: Number, default 0
      - `multi_booking.cardBorderColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.12)"
      - `multi_booking.cardMaxWidth`: Number, default 820
      - `multi_booking.cardLayout`: String, default "stack"
      - `multi_booking.splitWidth`: Number, default 340
      - `multi_booking.shadowColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.18)"
      - `multi_booking.shadowOffsetY`: Number, default 20
      - `multi_booking.shadowBlur`: Number, default 40
      - `multi_booking.shadowSpread`: Number, default -22
      - `multi_booking.sectionPaddingX`: Number, default 40
      - `multi_booking.sectionPaddingY`: Number, default 32
      - `multi_booking.sectionDividerColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.12)"
      - `multi_booking.sectionDividerWidth`: Number, default 1
      - `multi_booking.showStepLabels`: Boolean, default true
      - `multi_booking.serviceStepLabel`: String, default "Step 1 — Service"
      - `multi_booking.dayStepLabel`: String, default "Step 2 — Day"
      - `multi_booking.staffStepLabel`: String, default "Step 3 — Staff member"
      - `multi_booking.timeStepLabel`: String, default "Step 4 — Time"
      - `multi_booking.stepLabelColor`: String, default "var(--ion-color-medium, rgba(0,0,0,0.55))"
      - `multi_booking.stepLabelSize`: Number, default 13
      - `multi_booking.stepLabelWeight`: String, default "700"
      - `multi_booking.stepLabelSpacing`: Number, default 0.04
      - `multi_booking.stepLabelUppercase`: Boolean, default true
      - `multi_booking.dayCount`: Number, default 6
      - `multi_booking.dayLayout`: String, default "strip"
      - `multi_booking.dayBorderColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.15)"
      - `multi_booking.dayShape`: String, default "circle"
      - `multi_booking.daySize`: Number, default 64
      - `multi_booking.dayGap`: Number, default 10
      - `multi_booking.dayShowWeekday`: Boolean, default false
      - `multi_booking.dayBackground`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.10)"
      - `multi_booking.dayTextColor`: String, default "var(--ion-text-color, inherit)"
      - `multi_booking.daySelectedBackground`: String, default "var(--ion-color-primary)"
      - `multi_booking.daySelectedTextColor`: String, default "var(--ion-color-primary-contrast, #ffffff)"
      - `multi_booking.dayDisabledOpacity`: Number, default 0.35
      - `multi_booking.timeGap`: Number, default 10
      - `multi_booking.timeRadius`: Number, default 100
      - `multi_booking.timeBorderWidth`: Number, default 0
      - `multi_booking.timeBorderColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.15)"
      - `multi_booking.timeSelectedBorderColor`: String, default "var(--ion-color-primary)"
      - `multi_booking.timePaddingX`: Number, default 18
      - `multi_booking.timePaddingY`: Number, default 10
      - `multi_booking.timeBackground`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.10)"
      - `multi_booking.timeTextColor`: String, default "var(--ion-text-color, inherit)"
      - `multi_booking.timeSelectedBackground`: String, default "var(--ion-color-primary)"
      - `multi_booking.timeSelectedTextColor`: String, default "var(--ion-color-primary-contrast, #ffffff)"
      - `multi_booking.buttonText`: String, default "Confirm my booking"
      - `multi_booking.buttonBackground`: String, default "var(--ion-color-primary)"
      - `multi_booking.buttonTextColor`: String, default "var(--ion-color-primary-contrast, #ffffff)"
      - `multi_booking.buttonRadius`: Number, default 100
      - `multi_booking.buttonPaddingY`: Number, default 16
      - `multi_booking.buttonFontSize`: Number, default 15
      - `multi_booking.buttonFontWeight`: String, default "700"
      - `multi_booking.buttonFullWidth`: Boolean, default true
      - `blogposts`: ObjectId[], → BlogPost
      - `videos`: ObjectId[], → Video
      - `price_plans`: ObjectId[], → PricePlan
      - `href`: String, default "#"
      - `router_link`: String
      - `buttonOptions.fill`: String
      - `buttonOptions.expand`: String
      - `buttonOptions.size`: String
      - `buttonOptions.color`: String
      - `buttonOptions.class`: String
      - `buttonOptions.customColor`: String
      - `buttonOptions.customColorContrast`: String
      - `buttonOptions.customColorHover`: String
      - `buttonOptions.hoverRoll`: Boolean
      - `buttonOptions.fontWeight`: Number
      - `buttonOptions.letterSpacing`: Number
      - `buttonOptions.fontSize`: Number, default 14
      - `buttonOptions.borderRadius`: Number, default 6
      - `buttonOptions.customColorA`: String
      - `buttonOptions.customColorB`: String
      - `buttonOptions.customColorC`: String
      - `buttonOptions.custom_measurements`: Boolean, default false
      - `buttonOptions.height.value`: String
      - `buttonOptions.height.unit`: String
      - `buttonOptions.width.value`: String
      - `buttonOptions.width.unit`: String
      - `carousel.showArrows`: Boolean, default true
      - `carousel.showIndicators`: Boolean, default true
      - `carousel.height`: Number, default 90
      - `carousel.automaticHeight`: Boolean, default true
      - `carousel.carouselMedias`: Object[]
      - `map`: String
      - `contactForm.name`: String
      - `contactForm.email`: String
      - `contactForm.subject`: String
      - `contactForm.body`: String
      - `contactForm.button`: String
      - `contactForm.hideNewsletter`: Boolean
      - `contactForm.placeholders.name`: String
      - `contactForm.placeholders.email`: String
      - `contactForm.placeholders.subject`: String
      - `contactForm.placeholders.body`: String
      - `contactForm.style.backgroundColor`: String
      - `contactForm.style.textColor`: String
      - `contactForm.style.accentColor`: String
      - `contactForm.style.border.color`: String
      - `contactForm.style.border.width.value`: Mixed
      - `contactForm.style.border.width.unit`: String
      - `contactForm.style.border.style`: String
      - `contactForm.style.borderRadius.value`: Mixed
      - `contactForm.style.borderRadius.unit`: String
      - `contactForm.style.padding.value`: Mixed
      - `contactForm.style.padding.unit`: String
      - `contactForm.style.labelFontSize.value`: Mixed
      - `contactForm.style.labelFontSize.unit`: String
      - `contactForm.style.consentFontSize.value`: Mixed
      - `contactForm.style.consentFontSize.unit`: String
      - `contactForm.style.inputBackgroundColor`: String
      - `contactForm.style.inputTextColor`: String
      - `contactForm.style.placeholderColor`: String
      - `contactForm.style.inputFocusColor`: String
      - `contactForm.style.inputFontSize.value`: Mixed
      - `contactForm.style.inputFontSize.unit`: String
      - `contactForm.style.inputPadding.value`: Mixed
      - `contactForm.style.inputPadding.unit`: String
      - `contactForm.style.textareaMinHeight.value`: Mixed
      - `contactForm.style.textareaMinHeight.unit`: String
      - `contactForm.style.inputMargin.value`: Mixed
      - `contactForm.style.inputMargin.unit`: String
      - `contactForm.style.inputBorder.color`: String
      - `contactForm.style.inputBorder.width.value`: Mixed
      - `contactForm.style.inputBorder.width.unit`: String
      - `contactForm.style.inputBorder.style`: String
      - `contactForm.style.inputBorderRadius.value`: Mixed
      - `contactForm.style.inputBorderRadius.unit`: String
      - `contactForm.style.buttonBackgroundColor`: String
      - `contactForm.style.buttonTextColor`: String
      - `contactForm.style.buttonAlign`: String
      - `contactForm.style.buttonFontSize.value`: Mixed
      - `contactForm.style.buttonFontSize.unit`: String
      - `contactForm.style.buttonBorder.color`: String
      - `contactForm.style.buttonBorder.width.value`: Mixed
      - `contactForm.style.buttonBorder.width.unit`: String
      - `contactForm.style.buttonBorder.style`: String
      - `contactForm.style.buttonBorderRadius.value`: Mixed
      - `contactForm.style.buttonBorderRadius.unit`: String
      - `contactForm.style.buttonWidth.value`: Mixed
      - `contactForm.style.buttonWidth.unit`: String
      - `contactForm.additional`: Object[]
      - `instagram.columns`: Number
      - `instagram.first`: Number
      - `instagram.skip`: Number
      - `instagram.showInfo`: Boolean
      - `instagram.gridType`: Number
      - `instagram.profile`: String
      - `facebook.url`: String
      - `facebook.width`: String
      - `facebook.height`: String
      - `animation`: String, default "none"
      - `animationDuration`: Number, default 0
      - `animationStrength`: Number
      - `parallaxEnabled`: Boolean
      - `parallaxAmount`: Number
      - `parallaxZoom`: Number
      - `textReveal`: String
      - `animationDelay`: Number, default 0
      - `animationReplay`: String, default "once"
      - `animationEasing`: String, default "power3.out"
      - `animationBreakpoint`: String, default "all"
      - `scrollScrubEnabled`: Boolean, default false
      - `scrollScrubAxis`: String, default "y"
      - `scrollScrubDistance`: Number, default 80
      - `motionOrigin`: String, default "center center"
      - `hoverEnabled`: Boolean, default false
      - `hoverEffect`: String, default "none"
      - `hoverDuration`: Number, default 240
      - `hoverIntensity`: Number, default 4
      - `continuousEnabled`: Boolean, default false
      - `continuousEffect`: String, default "none"
      - `continuousDuration`: Number, default 2400
      - `continuousIntensity`: Number, default 4
      - `statefulEnabled`: Boolean, default false
      - `statefulEffect`: String, default "none"
      - `statefulDuration`: Number, default 260
      - `statefulStagger`: Number, default 60
      - `transform.enabled`: Boolean, default false
      - `transform.translateX.value`: Number, default 0
      - `transform.translateX.unit`: String, default "px"
      - `transform.translateY.value`: Number, default 0
      - `transform.translateY.unit`: String, default "px"
      - `transform.scaleX`: Number, default 1
      - `transform.scaleY`: Number, default 1
      - `transform.rotate`: Number, default 0
      - `transform.rotateX`: Number, default 0
      - `transform.rotateY`: Number, default 0
      - `transform.skewX`: Number, default 0
      - `transform.skewY`: Number, default 0
      - `transform.perspective`: Number, default 0
      - `transform.originX`: String, default "center"
      - `transform.originY`: String, default "center"
      - `opacity`: Mixed
      - `transitionDuration`: Mixed
      - `transitionEasing`: String
      - `states`: Mixed
      - `useIframe`: Boolean, default false
      - `popup.text`: String
      - `popup.backgroundColor`: String
      - `popup.fullScreen`: Boolean, default false
      - `popup.about_page`: ObjectId, → AboutPage
      - `custom_component.html`: String
      - `custom_component.compiled_html`: String
      - `custom_component.css`: String
      - `custom_component.compiled_css`: String
      - `custom_component.js`: String
      - `custom_component.iframe`: Boolean, default false
      - `custom_component.variables`: Object[]
      - `hoverable_media.before_hover_media.media`: ObjectId, → Media
      - `hoverable_media.before_hover_media.gcs_url`: String
      - `hoverable_media.before_hover_media.vimeo_uri`: String
      - `hoverable_media.before_hover_media.vimeo_picture`: String
      - `hoverable_media.before_hover_media.youtube_url`: String
      - `hoverable_media.before_hover_media.vimeo_url`: String
      - `hoverable_media.before_hover_media.href`: String
      - `hoverable_media.before_hover_media.router_link`: String
      - `hoverable_media.before_hover_media.thumbnail`: String
      - `hoverable_media.before_hover_media.autoplay`: Boolean, default false
      - `hoverable_media.before_hover_media.loop`: Boolean, default false
      - `hoverable_media.before_hover_media.show_controls`: Boolean, default true
      - `hoverable_media.after_hover_media.media`: ObjectId, → Media
      - `hoverable_media.after_hover_media.gcs_url`: String
      - `hoverable_media.after_hover_media.vimeo_uri`: String
      - `hoverable_media.after_hover_media.vimeo_picture`: String
      - `hoverable_media.after_hover_media.youtube_url`: String
      - `hoverable_media.after_hover_media.vimeo_url`: String
      - `hoverable_media.after_hover_media.href`: String
      - `hoverable_media.after_hover_media.router_link`: String
      - `hoverable_media.after_hover_media.thumbnail`: String
      - `hoverable_media.after_hover_media.autoplay`: Boolean, default false
      - `hoverable_media.after_hover_media.loop`: Boolean, default false
      - `hoverable_media.after_hover_media.show_controls`: Boolean, default true
      - `collapsible_container`: Object[]
      - `collapsible_container_settings.enable_customization`: Boolean, default false
      - `collapsible_container_settings.title_color`: String
      - `collapsible_container_settings.title_color_checked`: String
      - `collapsible_container_settings.title_background`: String
      - `collapsible_container_settings.title_background_checked`: String
      - `collapsible_container_settings.title_font_size`: String
      - `collapsible_container_settings.title_border_radius`: String
      - `collapsible_container_settings.title_border_color`: String
      - `collapsible_container_settings.title_border_width`: String
      - `collapsible_container_settings.body_color`: String
      - `collapsible_container_settings.body_background`: String
      - `collapsible_container_settings.body_border_radius`: String
      - `collapsible_container_settings.body_border_color`: String
      - `collapsible_container_settings.body_border_width`: String
      - `collapsible_container_settings.body_font_size`: String
      - `collapsible_container_settings.icon_color`: String
      - `collapsible_container_settings.icon_glyph_color`: String
      - `collapsible_container_settings.icon_background_color`: String
      - `quiz.title`: String
      - `quiz.header`: String
      - `quiz.questions`: Object[]
      - `quiz.score_results`: Object[]
      - `quiz.show_right_answers`: Boolean, default false
      - `quiz.mutliple_choice`: Boolean, default false
      - `partners.defaultCollection`: String, default ""
      - `partners.defaultView`: String, default "locations"
      - `scroll_sequence.media`: ObjectId, → Media
      - `scroll_sequence.scroll_length`: Number, default 3
      - `scroll_sequence.fit`: String, one of cover | contain, default "cover"
      - `scroll_sequence.background_color`: String, default "#000000"
      - `scroll_sequence.overlay_color`: String, default ""
      - `scroll_sequence.overlay_opacity`: Number, default 0
      - `scroll_sequence.rows_over`: Boolean, default true
      - `scroll_sequence.rows_effect`: String, one of slide | pop, default "slide"
      - `scroll_sequence.snap_points`: Number[]
      - `scroll_sequence.snap_scroll_speed`: Number, default 1.5
      - `scroll_sequence.snap_down`: Boolean, default true
      - `scroll_sequence.snap_up`: Boolean, default false
      - `scroll_sequence.stop_momentum`: Boolean, default false
      - `smart_search.placeholder`: String, default ""
      - `smart_search.kinds`: String[]
      - `smart_search.collections`: String[]
      - `smart_search.items`: Object[]
      - `smart_search.showKindFilter`: Boolean, default true
      - `smart_search.showPriceFilter`: Boolean, default false
      - `smart_search.showDateFilter`: Boolean, default false
      - `smart_search.showSort`: Boolean, default true
      - `smart_search.dateMode`: String, one of created | updated | availability, default "created"
      - `smart_search.layout`: String, one of grid | list, default "grid"
      - `smart_search.columns`: Number, default 3
      - `smart_search.perPage`: Number, default 12
      - `smart_search.instant`: Boolean, default true
      - `smart_search.showImages`: Boolean, default true
      - `smart_search.showPrices`: Boolean, default true
      - `smart_search.showInitial`: Boolean, default false
      - `smart_search.showAnswer`: Boolean, default false
      - `countdown.targetDate`: String, default ""
      - `countdown.expiredText`: String, default "Offer has ended"
      - `countdown.hideOnExpire`: Boolean, default false
      - `countdown.textColor`: String, default ""
      - `countdown.boxColor`: String, default ""
      - `countdown.align`: String, one of  | left | center | right, default ""
      - `swiper.slides`: Object[]
      - `swiper.autoplay`: Boolean, default false
      - `swiper.loop`: Boolean, default false
      - `swiper.show_controls`: Boolean, default true
      - `swiper.dynamic_bullets`: Boolean, default false
      - `swiper.pagination`: Boolean, default true
      - `dynamicField`: String
      - `useDynamicField`: Boolean, default false
      - `text_auto_slider.speed`: Number
      - `text_auto_slider.aspect_ratio`: String
      - `text_auto_slider.text_color`: String
      - `text_auto_slider.background_color`: String
      - `text_auto_slider.delimiter_color`: String
      - `text_auto_slider.direction`: String
      - `text_auto_slider.width`: Number
      - `text_auto_slider.font_size`: Number
      - `text_auto_slider.text_transform`: String, one of none | uppercase, default "none"
      - `text_auto_slider.texts`: Object[]
      - `image_auto_slider.speed`: Number
      - `image_auto_slider.aspect_ratio`: String
      - `image_auto_slider.direction`: String
      - `image_auto_slider.width`: Number
      - `image_auto_slider.medias`: Object[]
      - `image_dragger.aspect_ratio`: String
      - `image_dragger.media_1.media`: ObjectId, → Media
      - `image_dragger.media_1.gcs_url`: String
      - `image_dragger.media_1.vimeo_uri`: String
      - `image_dragger.media_1.vimeo_picture`: String
      - `image_dragger.media_1.vimeo_url`: String
      - `image_dragger.media_1.youtube_url`: String
      - `image_dragger.media_2.media`: ObjectId, → Media
      - `image_dragger.media_2.gcs_url`: String
      - `image_dragger.media_2.vimeo_uri`: String
      - `image_dragger.media_2.vimeo_picture`: String
      - `image_dragger.media_2.vimeo_url`: String
      - `image_dragger.media_2.youtube_url`: String
      - `image_dragger.media_2.title`: String
      - `image_dragger.media_2.body`: String
      - `image_dragger.media_2.textColor`: String
      - `image_dragger.media_2.href`: String
      - `image_dragger.media_2.router_link`: String
      - `_id`: ObjectId
    - `sections`: Object[]
      - `position`: String, one of static | relative | absolute | fixed | sticky, default "static"
      - `overflow`: String, one of visible | hidden | scroll | auto, default "visible"
      - `editorName`: String
      - `top.value`: String, default "0"
      - `top.unit`: String, default "px"
      - `top.mobile_value`: String, default ""
      - `top.mobile_unit`: String, default "px"
      - `left.value`: String, default "0"
      - `left.unit`: String, default "px"
      - `left.mobile_value`: String, default ""
      - `left.mobile_unit`: String, default "px"
      - `right.value`: String, default "0"
      - `right.unit`: String, default "px"
      - `right.mobile_value`: String, default ""
      - `right.mobile_unit`: String, default "px"
      - `bottom.value`: String, default "0"
      - `bottom.unit`: String, default "px"
      - `bottom.mobile_value`: String, default ""
      - `bottom.mobile_unit`: String, default "px"
      - `display`: String, one of block | inline | flex, default "block"
      - `flex_direction`: String, one of row | row-reverse | column | column-reverse, default "row"
      - `flex_direction_mobile`: String, default ""
      - `backdropFilter`: String, default ""
      - `justify`: String, one of start | end | center | space-between | space-around | stretch, default "start"
      - `justify_mobile`: String, default ""
      - `align`: String, one of start | end | center | space-between | space-around | stretch, default "start"
      - `align_mobile`: String, default ""
      - `animation`: String, default "none"
      - `animationDuration`: Number, default 0
      - `animationStrength`: Number
      - `parallaxEnabled`: Boolean
      - `parallaxAmount`: Number
      - `parallaxZoom`: Number
      - `animationDelay`: Number, default 0
      - `animationReplay`: String, default "once"
      - `animationEasing`: String, default "power3.out"
      - `animationBreakpoint`: String, default "all"
      - `scrollScrubEnabled`: Boolean, default false
      - `scrollScrubAxis`: String, default "y"
      - `scrollScrubDistance`: Number, default 80
      - `motionOrigin`: String, default "center center"
      - `hoverEnabled`: Boolean, default false
      - `hoverEffect`: String, default "none"
      - `hoverDuration`: Number, default 240
      - `hoverIntensity`: Number, default 4
      - `continuousEnabled`: Boolean, default false
      - `continuousEffect`: String, default "none"
      - `continuousDuration`: Number, default 2400
      - `continuousIntensity`: Number, default 4
      - `statefulEnabled`: Boolean, default false
      - `statefulEffect`: String, default "none"
      - `statefulDuration`: Number, default 260
      - `statefulStagger`: Number, default 60
      - `transform.enabled`: Boolean, default false
      - `transform.translateX.value`: Number, default 0
      - `transform.translateX.unit`: String, default "px"
      - `transform.translateY.value`: Number, default 0
      - `transform.translateY.unit`: String, default "px"
      - `transform.scaleX`: Number, default 1
      - `transform.scaleY`: Number, default 1
      - `transform.rotate`: Number, default 0
      - `transform.rotateX`: Number, default 0
      - `transform.rotateY`: Number, default 0
      - `transform.skewX`: Number, default 0
      - `transform.skewY`: Number, default 0
      - `transform.perspective`: Number, default 0
      - `transform.originX`: String, default "center"
      - `transform.originY`: String, default "center"
      - `opacity`: Mixed
      - `transitionDuration`: Mixed
      - `transitionEasing`: String
      - `states`: Mixed
      - `hoverGroup`: Boolean
      - `flex_wrap`: String, one of nowrap | wrap | wrap-reverse, default "wrap"
      - `flex_wrap_mobile`: String, default ""
      - `width.value`: String, default ""
      - `width.unit`: String, default "px"
      - `width.mobile_value`: String, default ""
      - `width.mobile_unit`: String, default "px"
      - `min_width.value`: String, default ""
      - `min_width.unit`: String, default "px"
      - `min_width.mobile_value`: String, default ""
      - `min_width.mobile_unit`: String, default "px"
      - `max_width.value`: String, default ""
      - `max_width.unit`: String, default "px"
      - `max_width.mobile_value`: String, default ""
      - `max_width.mobile_unit`: String, default "px"
      - `height.value`: String, default ""
      - `height.unit`: String, default "px"
      - `height.mobile_value`: String, default ""
      - `height.mobile_unit`: String, default "px"
      - `min_height.value`: String, default ""
      - `min_height.unit`: String, default "px"
      - `min_height.mobile_value`: String, default ""
      - `min_height.mobile_unit`: String, default "px"
      - `max_height.value`: String, default ""
      - `max_height.unit`: String, default "px"
      - `max_height.mobile_value`: String, default ""
      - `max_height.mobile_unit`: String, default "px"
      - `object_fit`: String
      - `aspect_ratio.custom`: Boolean, default false
      - `aspect_ratio.ratio`: String, default ""
      - `margin_left.value`: String, default "0"
      - `margin_left.unit`: String, default "px"
      - `margin_left.mobile_value`: String, default ""
      - `margin_left.mobile_unit`: String, default "px"
      - `margin_right.value`: String, default "0"
      - `margin_right.unit`: String, default "px"
      - `margin_right.mobile_value`: String, default ""
      - `margin_right.mobile_unit`: String, default "px"
      - `margin_top.value`: String, default "0"
      - `margin_top.unit`: String, default "px"
      - `margin_top.mobile_value`: String, default ""
      - `margin_top.mobile_unit`: String, default "px"
      - `margin_bottom.value`: String, default "0"
      - `margin_bottom.unit`: String, default "px"
      - `margin_bottom.mobile_value`: String, default ""
      - `margin_bottom.mobile_unit`: String, default "px"
      - `padding_left.value`: String, default "0"
      - `padding_left.unit`: String, default "px"
      - `padding_left.mobile_value`: String, default ""
      - `padding_left.mobile_unit`: String, default "px"
      - `padding_right.value`: String, default "0"
      - `padding_right.unit`: String, default "px"
      - `padding_right.mobile_value`: String, default ""
      - `padding_right.mobile_unit`: String, default "px"
      - `padding_top.value`: String, default "0"
      - `padding_top.unit`: String, default "px"
      - `padding_top.mobile_value`: String, default ""
      - `padding_top.mobile_unit`: String, default "px"
      - `padding_bottom.value`: String, default "0"
      - `padding_bottom.unit`: String, default "px"
      - `padding_bottom.mobile_value`: String, default ""
      - `padding_bottom.mobile_unit`: String, default "px"
      - `border_left.style`: String, default "none"
      - `border_left.color`: String
      - `border_left.width.value`: String, default "0"
      - `border_left.width.unit`: String, default "px"
      - `border_right.style`: String, default "none"
      - `border_right.color`: String
      - `border_right.width.value`: String, default "0"
      - `border_right.width.unit`: String, default "px"
      - `border_top.style`: String, default "none"
      - `border_top.color`: String
      - `border_top.width.value`: String, default "0"
      - `border_top.width.unit`: String, default "px"
      - `border_bottom.style`: String, default "none"
      - `border_bottom.color`: String
      - `border_bottom.width.value`: String, default "0"
      - `border_bottom.width.unit`: String, default "px"
      - `border_top_left_radius.value`: String, default "0"
      - `border_top_left_radius.unit`: String, default "px"
      - `border_top_right_radius.value`: String, default "0"
      - `border_top_right_radius.unit`: String, default "px"
      - `border_bottom_left_radius.value`: String, default "0"
      - `border_bottom_left_radius.unit`: String, default "px"
      - `border_bottom_right_radius.value`: String, default "0"
      - `border_bottom_right_radius.unit`: String, default "px"
      - `border_radius.value`: String, default "0"
      - `border_radius.unit`: String, default "px"
      - `specific_border_radius`: Boolean, default false
      - `box_shadows`: Object[]
      - `backgroundColor`: String
      - `backgroundGradient.enabled`: Boolean, default false
      - `backgroundGradient.type`: String
      - `backgroundGradient.degrees`: Number
      - `backgroundGradient.radialShape`: String
      - `backgroundGradient.radialPosition`: String
      - `backgroundGradient.colors`: Object[]
      - `backgroundGradient.css`: String
      - `backgroundVideo`: String
      - `backgroundImage`: String
      - `backgroundSize`: String
      - `backgroundPosition`: String
      - `backgroundRepeat`: String
      - `showOnMobile`: Boolean, default true
      - `showOnDesktop`: Boolean, default true
      - `components`: Object[]
      - `sections`: Object[]
      - `_id`: ObjectId
    - `_id`: ObjectId
  - `ai_meta`: Mixed
  - `_id`: ObjectId
- `suitability_price_plans`: ObjectId[], → PricePlan
- `isSuitable`: Boolean
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### AttributedRevenue

- `value`: Number, required
- `owner_id`: ObjectId, required, → User
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### BlogPost

An article on the site's blog.

- `title`: String, required - Name of the blog post, required.
- `url`: String, required
- `static_url`: String
- `header`: String - Short excerpt or summary shown in listings and social previews, required.
- `description`: String, required - Full body text of the blog post in HTML format, required.
- `medias`: Object[]
  - `media`: ObjectId, → Media
  - `gcs_url`: String
  - `gcs_480_30_url`: String
  - `gcs_720_30_url`: String
  - `gcs_1080_30_url`: String
  - `duration`: Number
  - `thumbnail`: String
  - `vimeo_uri`: String
  - `vimeo_picture`: String
  - `vimeo_url`: String
  - `youtube_url`: String
  - `youtube_picture`: String
  - `_id`: ObjectId
- `published`: Boolean, default true - If true the post is visible on the site, default true.
- `owner_id`: ObjectId, → User
- `connected_account_owner_id`: ObjectId, → User
- `collection_id`: ObjectId, → Collection - Reference to a Collection model with name starting with 'blogpost/', used to categorise the post.
- `selected`: Boolean, default false - If true the post is highlighted/featured, default false.
- `custom_1`: String - Optional text field used for filtering.
- `custom_2`: String - Optional text field used for filtering.
- `custom_3`: String - Optional text field used for filtering.
- `about_page`: ObjectId, → AboutPage - Reference to AboutPage model, shown at the bottom of the post page.
- `suitability_price_plans`: ObjectId[], → PricePlan - A list of references to PricePlan model, marks post as suitable for users with those plans.
- `isSuitable`: Boolean
- `reference_id`: String
- `wildcard_url`: Mixed
- `likes`: ObjectId[], → User
- `views`: ObjectId[], → User
- `total_views`: Number, default 0
- `saves`: ObjectId[], → User
- `times_showed`: Number, default 0
- `requiresLogin`: Boolean, default false
- `requiresSubscription`: Boolean, default false
- `price_plan_ids`: String[] - A list of price plan id strings that grant access to this post.
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Booking

One appointment a client booked for a service.

- `date`: String
- `date_iso`: Date
- `depart_date`: String
- `depart_date_iso`: Date
- `price`: Number
- `time`: String
- `local_time`: String
- `isLastHour`: Boolean
- `organization_name`: String
- `name`: String, required
- `firstname`: String
- `lastname`: String
- `email`: String, required
- `phone_number`: String, required
- `address`: String, required
- `city`: String, required
- `state`: String
- `country`: String, required
- `zip_code`: String, required
- `tax_identification_number`: String
- `notes`: String
- `service_id`: ObjectId, → Service
- `staff_member`: ObjectId, → User
- `coupon`: ObjectId
- `discount_value`: Number, default 0
- `finalized`: Boolean, default false
- `confirmed`: Boolean, default false
- `confirmed_timestamp`: Date
- `week_reminder_sent`: Boolean
- `day_reminder_sent`: Boolean
- `status`: String
- `upsell`: ObjectId, → Order
- `staffmember_notes`: String
- `rating_mail_sent`: Boolean, default false
- `call_attempts`: Number, default 0
- `last_call_attempt`: Date
- `attached_dynamic_models`: Object[]
  - `model`: ObjectId, → DynamicModel
  - `document`: ObjectId
  - `_id`: ObjectId
- `beds24_booking_id`: String
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### ChatMessage

- `chat_id`: ObjectId, required, → ChatHistory
- `role`: String, one of user | model
- `text`: String
- `target_url`: String
- `action`: String, one of RESPONSE | REDIRECT | OBJECT_RESPONSE | ERROR | CLARIFY | PROPOSED_ACTION
- `options`: String[]
- `data.object`: Mixed
- `data.object_type`: String
- `data.edit_summary`: Mixed
- `data.edit_diff`: Mixed
- `data.undo_record`: Mixed
- `data.hero_animation_offer`: Mixed
- `data.preview_state`: String
- `data.pending_credit_cost`: Number
- `data.target_restore`: Mixed
- `data.media_request`: Mixed
- `data.item_request`: Mixed
- `data.reference_request`: Mixed
- `data.section_options`: Mixed
- `data.section_blueprint`: Mixed
- `data.section_style_options`: Mixed
- `data.section_style_blueprint`: Mixed
- `data.section_role_picker`: Mixed
- `data.small_section_regeneration_options`: Mixed
- `data.small_section_regeneration_target`: Mixed
- `data.small_section_regeneration_prompt`: String
- `data.selected_small_section_action`: Mixed
- `data.component_regeneration_input`: Mixed
- `data.selected_section_role`: Mixed
- `data.selected_section_option`: Mixed
- `data.selected_section_style`: Mixed
- `data.section_options_target`: Mixed
- `data.section_options_prompt`: String
- `data.style_options_target`: Mixed
- `data.style_options_prompt`: String
- `data.previous_container`: Mixed
- `data.preserved_custom_components`: Mixed[]
- `data.selection_request`: Mixed
- `data.proposed_action`: Mixed
- `data.plan_result`: Mixed
- `data.parsed_intent`: Mixed
- `data.parsed_intent_version`: Number
- `data.parsed_intent_at`: Date
- `data.item_id`: ObjectId
- `data.design_archetype`: String
- `data.design_palette`: Mixed
- `data.out_of_credits`: Boolean
- `data.site_wide_edit`: Mixed
- `data.redesign`: Mixed
- `medias`: Object[]
  - `media`: ObjectId, → Media
  - `gcs_url`: String
  - `gemini_uri`: String
  - `gemini_interaction_id`: String
  - `_id`: ObjectId
- `products`: ObjectId[], → Product
- `services`: ObjectId[], → Service
- `blogposts`: ObjectId[], → BlogPost
- `programs`: ObjectId[], → Program
- `suggestions`: Object[]
  - `text`: String
  - `route`: String
  - `item_id`: ObjectId
  - `medias`: Mixed[]
  - `picture`: ObjectId
  - `_id`: ObjectId
- `is_system`: Boolean, default false
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Collection

A group or filter of items; the prefix of its name is its kind (product/, grouping/, service/, blogpost/...).

- `name`: String, required - Name of the collection, should be unique, required.
- `parent_collection`: ObjectId, → Collection - Reference to Collection.
- `picture`: ObjectId, → Media - Reference to Media.
- `about_page`: ObjectId, → AboutPage - Reference to AboutPage.
- `match_to_option`: Boolean, default false - Matches all products which have an option with match_to_collection true.
- `is_color`: Boolean, default false - Used for products with color options.
- `color`: String - Used to visually show the color on the page when is_color is true.
- `position`: Number
- `items`: ObjectId[]
- `thumbnail`: ObjectId, → Media
- `_id`: ObjectId

### ConnectedAccount

- `on_behalf_of`: ObjectId, required, → User
- `user_account`: ObjectId, required, → User
- `status`: String, default "pending"
- `is_authorized_to.create_posts`: Boolean, default false
- `is_authorized_to.send_messages`: Boolean, default false
- `is_authorized_to.answer_delete_comments`: Boolean, default false
- `is_authorized_to.access_engagements`: Boolean, default false
- `is_authorized_to.access_boosted_posts`: Boolean, default false
- `is_authorized_to.access_analytics`: Boolean, default false
- `is_authorized_to.alter_profile_settings`: Boolean, default false
- `is_authorized_to.catalogue_access.alter_products`: Boolean, default false
- `is_authorized_to.catalogue_access.alter_services`: Boolean, default false
- `is_authorized_to.catalogue_access.alter_blogposts`: Boolean, default false
- `is_authorized_to.catalogue_access.alter_price_plans`: Boolean, default false
- `is_authorized_to.catalogue_access.alter_programs`: Boolean, default false
- `is_authorized_to.catalogue_access.alter_orders`: Boolean, default false
- `is_authorized_to.catalogue_access.alter_bookings`: Boolean, default false
- `is_authorized_to.catalogue_access.alter_subscriptions`: Boolean, default false
- `is_authorized_to.catalogue_access.alter_purchases`: Boolean, default false
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Donation

A fundraising campaign.

- `enabled`: Boolean, default false
- `has_shippable_items`: Boolean, default false
- `medias`: Object[]
  - `media`: ObjectId, → Media
  - `gcs_url`: String
  - `gcs_480_30_url`: String
  - `gcs_720_30_url`: String
  - `gcs_1080_30_url`: String
  - `duration`: Number
  - `vimeo_uri`: String
  - `vimeo_picture`: String
  - `vimeo_url`: String
  - `youtube_url`: String
  - `youtube_picture`: String
  - `thumbnail`: String
  - `_id`: ObjectId
- `url`: String, required
- `static_url`: String
- `title`: String, required - Name of the campaign, required.
- `description`: String, required - Full body text describing the campaign and its goals, in HTML format, required.
- `about_page`: ObjectId, → AboutPage
- `target_amount.enabled`: Boolean, default false
- `target_amount.amount`: Number
- `predefined_amounts.enabled`: Boolean, default false
- `predefined_amounts.amounts`: Object[]
  - `title`: String, required
  - `description`: String
  - `amount`: Number, required
  - `_id`: ObjectId
- `collection_id`: ObjectId, → Collection - Reference to a Collection with name starting with 'donation-category/', optional.
- `topics`: Object[]
  - `collection_id`: ObjectId, → Collection
  - `_id`: ObjectId
- `owner_id`: ObjectId, → User
- `options`: Object[] - Purchasable add-on option groups for the donation (e.g. "Include a gift", "Select a reward tier").
  - `name`: String, required
  - `options`: Object[]
    - `option`: String, required
    - `match_to_collection`: ObjectId, → Collection
    - `quantity`: Number
    - `badge`: String
    - `option_specific_media`: ObjectId, → Media
    - `_id`: ObjectId
  - `_id`: ObjectId
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### DynamicModel

- `name`: String
- `fields`: Object[]
  - `name`: String, required
  - `type`: String
  - `required`: Boolean
  - `default`: Mixed
  - `validations.minLength`: String
  - `validations.maxLength`: String
  - `patchable`: Boolean, default true
  - `ref`: String
  - `ref_value_field`: String, default "_id"
  - `ref_text_field`: String, default "_id"
  - `depends_on`: String
  - `populate`: Boolean
  - `wysiwyg`: Boolean
  - `fields`: Mixed[]
  - `show_field_in_cms_table`: Boolean, default true
  - `enumerator_values`: Object[]
    - `value`: String
    - `_id`: ObjectId
  - `_id`: ObjectId
- `auth.create`: Boolean, default true
- `auth.read`: Boolean, default false
- `auth.update`: Boolean, default true
- `auth.delete`: Boolean, default true
- `ownership_settings.enable_ownership_identification`: Boolean, default false
- `ownership_settings.ownership_based_auth`: String, one of none | owner | admin, default "none"
- `ownership_settings.profile_use`: Boolean, default false
- `routers.post.replace_all`: Boolean, default false
- `routers.post.code`: String
- `routers.get.replace_all`: Boolean, default false
- `routers.get.code`: String
- `routers.get_one.replace_all`: Boolean, default false
- `routers.get_one.code`: String
- `routers.patch.replace_all`: Boolean, default false
- `routers.patch.code`: String
- `routers.delete.replace_all`: Boolean, default false
- `routers.delete.code`: String
- `attach_in`: Object[], → [object Object]
  - `ref`: String
  - `ref_value_field`: String, default "_id"
  - `ref_text_field`: String, default "_id"
  - `user_input`: Boolean, default false
  - `_id`: ObjectId
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Event

A ticketed event at a venue.

- `name`: String, required
- `venue`: ObjectId, required, → Venue
- `description`: String, required
- `medias`: Object[]
  - `media`: ObjectId, → Media
  - `gcs_url`: String
  - `gcs_480_30_url`: String
  - `gcs_720_30_url`: String
  - `gcs_1080_30_url`: String
  - `duration`: Number
  - `vimeo_uri`: String
  - `vimeo_picture`: String
  - `vimeo_url`: String
  - `youtube_url`: String
  - `youtube_picture`: String
  - `thumbnail`: String
  - `_id`: ObjectId
- `dates`: Object[]
  - `date`: Date, required
  - `seating_plan.id`: ObjectId, required, → SeatingPlan
  - `seating_plan.sections`: Object[], required
    - `subsections`: Object[], required
      - `rows`: Object[], required
      - `edit`: Boolean, required
      - `widest_column`: Number, required
      - `justify`: String, required
      - `left`: Number
      - `top`: Number
    - `section_type`: String, required
    - `name`: String, required
    - `top`: Number
    - `left`: Number
    - `color`: String
    - `premium_color`: String
    - `rotation`: Number
    - `tier`: Number, default 0
    - `max_seats`: Number
    - `tickets`: ObjectId[], → Ticket
  - `_id`: ObjectId
- `tier_1.name`: String
- `tier_1.price`: Number
- `tier_2.name`: String
- `tier_2.price`: Number
- `tier_3.name`: String
- `tier_3.price`: Number
- `tier_4.name`: String
- `tier_4.price`: Number
- `tier_5.name`: String
- `tier_5.price`: Number
- `tier_6.name`: String
- `tier_6.price`: Number
- `tier_7.name`: String
- `tier_7.price`: Number
- `tier_8.name`: String
- `tier_8.price`: Number
- `tier_9.name`: String
- `tier_9.price`: Number
- `tier_10.name`: String
- `tier_10.price`: Number
- `tier_11.name`: String
- `tier_11.price`: Number
- `tier_12.name`: String
- `tier_12.price`: Number
- `tier_13.name`: String
- `tier_13.price`: Number
- `tier_14.name`: String
- `tier_14.price`: Number
- `tier_15.name`: String
- `tier_15.price`: Number
- `owner_id`: ObjectId, required, → User
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Group

- `type`: String, required
- `avatar`: ObjectId, → Media
- `cover`: ObjectId, → Media
- `name`: String, required
- `handle`: String, required
- `bio`: String
- `participants`: ObjectId[], → User
- `owner_id`: ObjectId, required, → User
- `who_can_post`: String, default "all"
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### KeywordBlacklist

- `keyword`: String[]
- `_id`: ObjectId

### Lead

- `seq`: Number, default 0
- `organization_name`: String
- `firstname`: String, required
- `lastname`: String, required
- `email`: String, required
- `phone_number`: String, required
- `address`: String, required
- `city`: String, required
- `state`: String
- `country`: String, required
- `zip_code`: String, required
- `tax_identification_number`: String
- `vat_id`: String
- `notes`: String
- `products`: String[]
- `products_obj`: Object[]
  - `product_id`: ObjectId, → Product
  - `name`: String
  - `options`: String
  - `price`: Number
  - `quantity`: Number
  - `_id`: ObjectId
- `programs`: String[]
- `programs_obj`: Object[]
  - `program_id`: ObjectId, → Program
  - `title`: String
  - `price`: Number
  - `_id`: ObjectId
- `tickets`: ObjectId[], → Ticket
- `donations`: ObjectId[], → Donation
- `donations_obj`: Object[]
  - `donation_id`: ObjectId, → Donation
  - `name`: String
  - `options`: String
  - `price`: Number
  - `quantity`: Number
  - `_id`: ObjectId
- `lifetime_value`: Number, default 0
- `last_order_value`: Number
- `services`: ObjectId[], → Service
- `stripe_id`: String
- `delivery_method`: String
- `shipping_option`: String, one of address | office, default "address"
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Media

An uploaded image, video or file.

- `file`: Buffer
- `file_path`: String
- `alt`: String
- `filename`: String
- `filetype`: String
- `vimeo_uri`: String
- `vimeo_picture`: String
- `duration`: Number
- `vimeo_url`: String
- `youtube_url`: String
- `youtube_picture`: String
- `thumbnail`: String
- `gcs_url`: String
- `gcs_480_30_url`: String
- `gcs_720_30_url`: String
- `gcs_1080_30_url`: String
- `picture_gcs_url`: String
- `transcode_status`: String, default "not_started"
- `owner_id`: ObjectId, → User
- `sequence.status`: String
- `sequence.started_at`: Date
- `sequence.updated_at`: Date
- `sequence.step`: String
- `sequence.done`: Number
- `sequence.total`: Number
- `sequence.ext`: String
- `sequence.trim_start`: Number
- `sequence.trim_end`: Number
- `sequence.build_id`: String
- `sequence.previous_base`: String
- `sequence.frame_count`: Number
- `sequence.fps`: Number
- `sequence.width`: Number
- `sequence.height`: Number
- `sequence.desktop_path`: String
- `sequence.mobile_path`: String
- `sequence.portrait_path`: String
- `sequence.poster`: String
- `sequence.error`: String
- `source_url`: String
- `origin`: String
- `width`: Number
- `height`: Number
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Message

- `sender_id`: ObjectId, required, → User
- `receiver_id`: ObjectId, required, → User
- `product_id`: ObjectId, → Product
- `service_id`: ObjectId, → Service
- `isOpened`: Boolean, default false
- `blogpost_id`: ObjectId, → BlogPost
- `isDirectMessage`: Boolean, default false
- `message`: Object[]
  - `from`: ObjectId, required, → User
  - `text`: String, required
  - `createdAt`: String
  - `sent`: Boolean, default false
  - `seen`: Boolean, default false
  - `seen_by`: ObjectId[], → User
  - `postId`: ObjectId, → Post
  - `userId`: ObjectId, → User
  - `medias`: Object[]
    - `media`: ObjectId, → Media
    - `vimeo_uri`: String
    - `vimeo_picture`: String
    - `vimeo_url`: String
    - `youtube_url`: String
    - `youtube_picture`: String
    - `gcs_url`: String
    - `_id`: ObjectId
  - `isSystem`: Boolean, default false
  - `groupId`: ObjectId, → Group
  - `_id`: ObjectId
- `isGroup`: Boolean, default false
- `group_users`: ObjectId[], → User
- `current_group_users`: ObjectId[], → User
- `users_nicknames`: Object[]
  - `nickname`: String
  - `user`: ObjectId, → User
  - `_id`: ObjectId
- `group_avatar`: ObjectId, → Media
- `group_name`: String
- `delete_chat`: Object[]
  - `isDeleted`: Boolean, default false
  - `user`: ObjectId, → User
  - `createdAt`: Date
  - `_id`: ObjectId
- `program_id`: ObjectId, → Program
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Model

- `name`: String, required
- `make`: ObjectId, → Make
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### MyContact

The site's name and contact details.

- `zip_code`: String, required - Postal/ZIP code.
- `city`: String, required - The city where the business is located.
- `address`: String, required - The street address.
- `contact`: String
- `email`: String, required - The public contact email address.
- `google_app`: String
- `workhours`: String
- `logo`: ObjectId
- `site_name`: String, required - The business/site name shown publicly.
- `domain`: String, required
- `stock_domain`: String
- `isMarket`: Boolean, required, default false
- `forbidden_collections`: Object[]
  - `collection_id`: ObjectId, → Collection
  - `_id`: ObjectId
- `isInit`: Boolean, default false
- `template`: String, default "0000"
- `lang`: String - 2-letter language code (e.g. "en", "fr", "de").
- `allowedComponents.services`: Boolean, default true
- `allowedComponents.products`: Boolean, default true
- `allowedComponents.blogposts`: Boolean, default true
- `allowedComponents.programs`: Boolean, default true
- `favicon`: ObjectId
- `cacheEnabled`: Boolean
- `has_completed_startup_prompt`: Boolean, default true
- `gmb_location`: String
- `ga_property`: String
- `site_generated_at`: Date
- `admin_first_opened_at`: Date
- `admin_last_opened_at`: Date
- `admin_in_app_browser`: Boolean
- `domain_suggestions`: Mixed
- `_id`: ObjectId

### Order

A completed purchase.

- `organization_name`: String
- `firstname`: String, required
- `lastname`: String, required
- `email`: String, required
- `phone_number`: String, required
- `address`: String, required
- `city`: String, required
- `state`: String
- `country`: String, required
- `zip_code`: String, required
- `tax_identification_number`: String
- `notes`: String
- `products`: String[]
- `products_obj`: Object[]
  - `product_id`: ObjectId, → Product
  - `name`: String
  - `options`: String
  - `price`: Number
  - `quantity`: Number
  - `_id`: ObjectId
- `programs`: String[]
- `programs_obj`: Object[]
  - `program_id`: ObjectId, → Program
  - `title`: String
  - `price`: Number
  - `_id`: ObjectId
- `tickets`: ObjectId[], → Ticket
- `donations`: ObjectId[], → Donation
- `donations_obj`: Object[]
  - `donation_id`: ObjectId, → Donation
  - `name`: String
  - `options`: String
  - `price`: Number
  - `quantity`: Number
  - `_id`: ObjectId
- `value`: Number
- `finalized`: Boolean, default false
- `fulfilled`: Boolean, default false
- `paid`: Boolean, default false
- `delivery_method`: String
- `payment_method`: String
- `shipping_cost`: Number
- `coupon_code`: String
- `owner_id`: ObjectId, → User
- `reference_id`: String
- `rating_mail_sent`: Boolean, default false
- `shipping_label`: String
- `shipping_option`: String, one of address | office, default "address"
- `shipping_message`: String
- `shipping_office`: String
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### OriginAddress

- `title`: String, required
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### PaymentMethod

- `has_cash`: Boolean, default false
- `cash_locale`: String, default "Pay by cash"
- `cash_instructions`: String
- `cash_increase`: Number, default 0
- `has_card`: Boolean, default false
- `card_locale`: String, default "Pay with credit card"
- `email`: String
- `country`: String
- `has_invoicing`: Boolean, default false
- `invoice_locale`: String, default "Pay via invoice"
- `invoicing_instructions`: String
- `currency`: String, required
- `agreedToTerms`: Boolean, default false
- `agreedToTermsAt`: String
- `merchant_id`: String
- `has_paypal`: Boolean, default false
- `paypal_increase`: Number, default 0
- `paypal_id`: String
- `lock_currency`: Boolean, default false
- `commission_percentage`: Number, default 4.4
- `two_currencies`: Boolean, default false
- `second_currency`: String
- `calculate_rate`: Boolean, default false
- `currency_rate`: Number
- `_id`: ObjectId

### Post

- `posted_by`: ObjectId, required, → User
- `repost_of`: ObjectId, → Post
- `connected_account_posted_by`: ObjectId, → User
- `text`: String
- `title`: String
- `likes`: ObjectId[], → User
- `shares`: Object[]
  - `from`: ObjectId, → User
  - `to`: ObjectId, → User
  - `_id`: ObjectId
- `views`: ObjectId[], → User
- `comments`: ObjectId[], → Comment
- `medias`: Object[]
  - `media`: ObjectId, → Media
  - `vimeo_uri`: String
  - `vimeo_picture`: String
  - `vimeo_url`: String
  - `youtube_url`: String
  - `youtube_picture`: String
  - `gcs_url`: String
  - `gcs_480_30_url`: String
  - `gcs_720_30_url`: String
  - `gcs_1080_30_url`: String
  - `duration`: Number
  - `transcode_status`: String, default "not_started"
  - `_id`: ObjectId
- `thumbnail.media`: ObjectId, → Media
- `keywords`: String[]
- `emotion`: String
- `political_spectrum`: String
- `explicit`: String
- `harmful`: String
- `propaganda`: String
- `advertisement`: String
- `engaging`: String
- `language`: String
- `interests`: String[]
- `app_category`: String[]
- `user_profile`: String[]
- `user_economics`: String
- `user_education`: String
- `marital_status`: String
- `age`: String
- `sex`: String
- `attractiveness`: String
- `isAdvertisment`: Boolean, default false
- `saves`: ObjectId[], → User
- `expirable`: Boolean, default false
- `exclusive`: Boolean, default false
- `price_plans`: ObjectId[], → PricePlan
- `targeting.keywords`: String[]
- `targeting.language`: String[]
- `targeting.interests`: String[]
- `targeting.app_category`: String[]
- `targeting.user_economics`: String[]
- `targeting.user_education`: String[]
- `targeting.marital_status`: String[]
- `targeting.age`: String[]
- `targeting.sex`: String[]
- `targeting.isCpc`: Boolean, default false
- `targeting.cost_per_click`: Number, default 0
- `targeting.cost_per_mile`: Number, default 0
- `targeting.daily_budget`: Number, default 0
- `targeting.duration`: Number, default 0
- `targeting.outer_link.text`: String
- `targeting.outer_link.url`: String
- `targeting.locations`: Object[]
  - `type`: String, one of Point
  - `coordinates`: Number[]
  - `_id`: ObjectId
- `targeting.total`: Number, default 0
- `targeting.created_on`: Date
- `targeting.inner_link.text`: String
- `targeting.inner_link.profile_segment`: String
- `targeting.total_clicks`: Number, default 0
- `targeting.unique_clicks`: ObjectId[], → User
- `targeting.campaign_type`: String
- `targeting.related_videos`: ObjectId[], → Post
- `mentions`: ObjectId[], → User
- `total_views`: Number, default 0
- `times_showed`: Number, default 0
- `attached_to`: ObjectId, → Post
- `attached_to_cta_text`: String
- `poll.question`: String
- `poll.answers`: Object[]
  - `text`: String
  - `users`: ObjectId[], → User
  - `_id`: ObjectId
- `isBlacklist`: Boolean, default false
- `isReviewed`: Boolean, default false
- `custom_link.heading`: String
- `custom_link.url`: String
- `embeded_link.og:image`: String
- `embeded_link.og:site_name`: String
- `embeded_link.og:title`: String
- `embeded_link.og:url`: String
- `posted_in`: ObjectId, → Group
- `attached_to_service`: ObjectId, → Service
- `attached_to_product`: ObjectId, → Product
- `attached_to_blogpost`: ObjectId, → BlogPost
- `attached_to_program`: ObjectId, → Program
- `attached_to_priceplans`: Boolean, default false
- `isWhitelisted`: Boolean, default false
- `attached_to_group`: ObjectId, → Group
- `reach`: ObjectId[], → User
- `showAds`: Boolean, default true
- `adminShowAds`: Boolean, default true
- `isAddReviewed`: Boolean, default false
- `reposts`: ObjectId[], → Post
- `original_post`: ObjectId, → Post
- `isHidden`: Boolean, default false
- `dislikes`: ObjectId[], → User
- `frames`: Object[]
  - `media`: ObjectId, → Media
  - `timestamp`: Number
  - `_id`: ObjectId
- `privacy`: String, required, one of everyone | followers | private, default "everyone"
- `isPinned`: Boolean, default false
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### PricePlan

A recurring membership plan.

- `name`: String, required
- `description`: String
- `statement_descriptor`: String, required
- `plan_features`: Object[]
  - `feature_type`: String
  - `feature_name`: String
  - `feature_value`: String
  - `_id`: ObjectId
- `price`: Number, required
- `recurring_options.interval`: String, required
- `recurring_options.interval_count`: Number, required
- `link`: String, required
- `image`: ObjectId, → Media
- `price_id`: String, required
- `payment_link_id`: String, required
- `free_trial_days`: Number, default 0
- `billing_address_collection`: String, default "auto"
- `owner_id`: ObjectId, → User
- `times_showed`: Number, default 0
- `views`: ObjectId[], → User
- `total_views`: Number, default 0
- `disabled`: Boolean, default false
- `ribbon`: String
- `linked_plans`: ObjectId[], → PricePlan
- `is_hidden`: Boolean, default false
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Product

An item the store sells, with its price, images, options and delivery details.

- `name`: String, required - Name of the product, required.
- `url`: String, required - Url of the product, it is automatically generated.
- `static_url`: String
- `ribbon`: String - A banner that appears on top of product, for example 'Sale', 'New', etc.
- `striked`: String - A striked text that appears next to price, useful for striking old price.
- `price`: Number, required - Price of the product - default 0 if not provided.
- `description`: String - Description of product in html format.
- `product_informations`: Object[] - Dropdown texts with additional information about the product.
  - `name`: String, required
  - `description`: String, required
  - `_id`: ObjectId
- `product_options`: Object[]
  - `name`: String, required
  - `options`: Object[]
    - `option`: String, required
    - `match_to_collection`: ObjectId, → Collection
    - `quantity`: Number
    - `badge`: String
    - `option_specific_media`: ObjectId, → Media
    - `_id`: ObjectId
  - `informations`: Object[]
    - `name`: String
    - `description`: String
    - `_id`: ObjectId
  - `_id`: ObjectId
- `published`: Boolean, default true - If true the product is visible in the site/app product pages - default true.
- `available_for_purchase`: Boolean, default true - If true the product can be purchased - default true.
- `medias`: Object[]
  - `media`: ObjectId, → Media
  - `gcs_url`: String
  - `gcs_480_30_url`: String
  - `gcs_720_30_url`: String
  - `gcs_1080_30_url`: String
  - `duration`: Number
  - `vimeo_uri`: String
  - `vimeo_picture`: String
  - `vimeo_url`: String
  - `youtube_url`: String
  - `youtube_picture`: String
  - `thumbnail`: String
  - `_id`: ObjectId
- `collection_id`: ObjectId, → Collection - Reference to the Collection model, it is the store where product is grouped.
- `grouping`: Object[] - References to the Collection model, they act as filters.
  - `collection_id`: ObjectId, → Collection
  - `_id`: ObjectId
- `owner_id`: ObjectId, required, → User
- `connected_account_owner_id`: ObjectId, → User
- `qty`: Number, default 1
- `origin_address`: String - Name of the address, taken from OriginAdress model, used for filtering.
- `selected`: Boolean, default false
- `custom_1`: String - Field used for filtering if additionalFieldsLocales are present.
- `custom_2`: String - Field used for filtering if additionalFieldsLocales are present.
- `custom_3`: String - Field used for filtering if additionalFieldsLocales are present.
- `about_page`: ObjectId, → AboutPage - Reference to AboutPage model, shown in product page.
- `is_digital`: Boolean, default false
- `digital_contents`: Object[]
  - `content`: ObjectId, → DigitalContent
  - `option`: String
  - `_id`: ObjectId
- `suitability_price_plans`: ObjectId[], → PricePlan - A list of references to PricePlan model, if user has any of the listed priceplan ids, then is Suitable is true.
- `isSuitable`: Boolean
- `brand`: String - Name of the product brand.
- `brand_logo`: ObjectId, → Media - Logo of the brand, reference to Media model.
- `weight`: Number, default 0 - Weight of product in kg.
- `height`: Number, default 0 - Weight of product in cm.
- `length`: Number, default 0 - Weight of product in cm.
- `width`: Number, default 0 - Weight of product in cm.
- `delivery_type`: String, default "parcel" - Used for delivery, default is parcel, allowed values are books, bulk, letter, parcel or parcel_letter.
- `reference_id`: String
- `secondary_cta.show`: Boolean, default false
- `secondary_cta.title`: String
- `secondary_cta.webUrl`: String
- `secondary_cta.appUrl`: String
- `wildcard_url`: Mixed
- `sku`: Mixed - Sku of product if available.
- `reviewed`: Boolean
- `approved`: Boolean
- `expired`: Boolean, default false
- `expires_on`: Date
- `expire_reminder_sent`: Boolean, default false
- `likes`: ObjectId[], → User
- `views`: ObjectId[], → User
- `total_views`: Number, default 0
- `saves`: ObjectId[], → User
- `times_showed`: Number, default 0
- `requiresLogin`: Boolean, default false
- `requiresSubscription`: Boolean, default false
- `price_plan_ids`: String[] - Reference to PricePlan ids.
- `linked_products`: Object[] - List of products that are shown for quick add to cart in the product page.
  - `product`: ObjectId, → Product
  - `option`: String
  - `_id`: ObjectId
- `attached_priceplans.name`: String
- `attached_priceplans.priceplans`: ObjectId[], → PricePlan
- `about_section`: ObjectId, → AboutPage - Reference to AboutPage model, shown below the add to cart button.
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### ProfessionalAccount

- `user`: ObjectId, required, → User
- `show.services`: Boolean, default false
- `show.staff_members`: Boolean, default false
- `show.blogposts`: Boolean, default false
- `show.programs`: Boolean, default false
- `show.products`: Boolean, default false
- `show.events`: Boolean, default false
- `show.price_plans`: Boolean, default false
- `show.posts`: Boolean, default false
- `reviewed`: Boolean, default false
- `approved`: Boolean, default false
- `cover`: ObjectId, → Media
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Program

An online course: weeks of days, each day a list of steps.

- `title`: String - Name of the program, required.
- `url`: String, required
- `static_url`: String
- `header`: String - Short tagline or subtitle shown in listings, optional.
- `body`: String - Full program description in HTML format, optional.
- `medias`: Object[]
  - `media`: ObjectId, → Media
  - `gcs_url`: String
  - `gcs_480_30_url`: String
  - `gcs_720_30_url`: String
  - `gcs_1080_30_url`: String
  - `duration`: Number
  - `vimeo_uri`: String
  - `vimeo_picture`: String
  - `vimeo_url`: String
  - `youtube_url`: String
  - `youtube_picture`: String
  - `thumbnail`: String
  - `_id`: ObjectId
- `video`: ObjectId, → Video
- `about_page`: ObjectId, → AboutPage
- `weeks`: Object[] - A list of week objects, required.
  - `isCompleted`: Mixed
  - `progress`: Mixed
  - `title`: String
  - `days`: Object[]
    - `isCompleted`: Mixed
    - `progress`: Mixed
    - `title`: String
    - `steps`: Object[]
      - `title`: String, required
      - `body`: String, required
      - `video`: ObjectId, → Video
      - `medias`: Object[]
      - `about_page`: ObjectId, → AboutPage
      - `timer`: Number, default 0
      - `_id`: ObjectId
    - `_id`: ObjectId
  - `_id`: ObjectId
- `suitability_price_plans`: ObjectId[], → PricePlan - A list of PricePlan ids, marks program as suitable for users with those plans.
- `isSuitable`: Boolean
- `popup.title`: String
- `popup.points`: String[]
- `price`: Number, default 0 - Price in the user's currency, default 0.
- `collection_id`: ObjectId, → Collection - Reference to a Collection with name starting with 'program-category/', required.
- `topics`: Object[]
  - `collection_id`: ObjectId, → Collection
  - `_id`: ObjectId
- `owner_id`: ObjectId, required, → User
- `connected_account_owner_id`: ObjectId, → User
- `ribbon`: String - Short badge text shown on the card (e.g. "New", "Best seller"), optional.
- `striked`: String - Original price shown as strikethrough next to the real price, optional.
- `isConsistent`: Boolean, default false
- `isAcademic`: Boolean, default true
- `wildcard_url`: Mixed
- `reviewed`: Boolean
- `approved`: Boolean
- `likes`: ObjectId[], → User
- `views`: ObjectId[], → User
- `total_views`: Number, default 0
- `saves`: ObjectId[], → User
- `requiresLogin`: Boolean, default false
- `requiresSubscription`: Boolean, default false
- `price_plan_ids`: String[] - A list of price plan id strings that grant access to this program.
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Publish

- `web`: Boolean
- `ios`: Boolean
- `android`: Boolean
- `pwaSwitch`: String
- `android_app_id`: String
- `ios_app_id`: String
- `_id`: ObjectId

### QrCode

- `ticket`: ObjectId, required, → Ticket
- `status`: String, one of used | not-used, default "not-used"
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Service

A bookable service: its duration, price, the staff who perform it and when it can be booked.

- `title`: String, required
- `url`: String, required
- `static_url`: String
- `header`: String - This is the subtitle of the service.
- `description`: String - This is the description of the service.
- `bookable`: Boolean, default true
- `expirable`: Boolean, default false
- `confirm_bookings`: Boolean, default false
- `show_notes`: Boolean, default false
- `minutes_delete_bookings`: Number - Number of minutes before the booking expires before being confirmed and is set 'expirable:true'.
- `medias`: Object[]
  - `media`: ObjectId, → Media
  - `gcs_url`: String
  - `gcs_480_30_url`: String
  - `gcs_720_30_url`: String
  - `gcs_1080_30_url`: String
  - `duration`: Number
  - `vimeo_uri`: String
  - `vimeo_picture`: String
  - `vimeo_url`: String
  - `youtube_url`: String
  - `youtube_picture`: String
  - `thumbnail`: String
  - `_id`: ObjectId
- `collection_id`: ObjectId, → Collection - Reference to the Collection model, it is the store where service is grouped.
- `price`: Number - The price of the service in the globally set currency.
- `online_payment`: Boolean, default false
- `book_by_date`: Boolean, default false
- `book_date_range`: Boolean, default false
- `start_date`: Date - Start date of allowed slots for booking.
- `end_date`: Date - End date of allowed slots for booking.
- `day_offset`: Number, default 0
- `is_recurring`: Boolean, default false
- `max_participants`: Number, required
- `session_duration`: Number, required
- `time_between_sessions`: Number, default 0
- `discount`: Object[]
  - `days`: Number
  - `per_total_price`: Number
  - `fixed_price`: Number
  - `per_day`: Number
  - `_id`: ObjectId
- `monday.active`: Boolean, default false
- `monday.hours`: Object[]
  - `start`: String
  - `end`: String
  - `_id`: ObjectId
- `tuesday.active`: Boolean, default false
- `tuesday.hours`: Object[]
  - `start`: String
  - `end`: String
  - `_id`: ObjectId
- `wednesday.active`: Boolean, default false
- `wednesday.hours`: Object[]
  - `start`: String
  - `end`: String
  - `_id`: ObjectId
- `thursday.active`: Boolean, default false
- `thursday.hours`: Object[]
  - `start`: String
  - `end`: String
  - `_id`: ObjectId
- `friday.active`: Boolean, default false
- `friday.hours`: Object[]
  - `start`: String
  - `end`: String
  - `_id`: ObjectId
- `saturday.active`: Boolean, default false
- `saturday.hours`: Object[]
  - `start`: String
  - `end`: String
  - `_id`: ObjectId
- `sunday.active`: Boolean, default false
- `sunday.hours`: Object[]
  - `start`: String
  - `end`: String
  - `_id`: ObjectId
- `address`: String - Where is the service performed.
- `staff_member`: ObjectId[], → User
- `owner_id`: ObjectId, → User
- `connected_account_owner_id`: ObjectId, → User
- `timezone`: Number, default false
- `choose_timezone`: Boolean
- `origin_address`: String
- `selected`: Boolean, default false
- `custom_1`: String - Field used for filtering if additionalFieldsLocales are present.
- `custom_2`: String - Field used for filtering if additionalFieldsLocales are present.
- `custom_3`: String - Field used for filtering if additionalFieldsLocales are present.
- `about_page`: ObjectId, → AboutPage
- `show_only_about_page`: Boolean, default false
- `suitability_price_plans`: ObjectId[], → PricePlan
- `isSuitable`: Boolean
- `booking_only`: Boolean - If the booking page should not show a header and footer.
- `dates_disabled`: String[]
- `dates_booked`: String[]
- `receipt_about_page`: ObjectId, → AboutPage
- `wildcard_url`: Mixed
- `locked_hours`: Date[]
- `reviewed`: Boolean
- `approved`: Boolean
- `likes`: ObjectId[], → User
- `views`: ObjectId[], → User
- `total_views`: Number, default 0
- `saves`: ObjectId[], → User
- `times_showed`: Number, default 0
- `analytics_locales.google_event_custom_title`: String, default "schedule"
- `analytics_locales.facebook_event_custom_title`: String, default "Schedule"
- `analytics_locales.tiktok_event_custom_title`: String
- `analytics_locales.linkedin_event_custom_title`: String
- `analytics_locales.chatgpt_event_custom_title`: String
- `email_text`: String - The text the client will receive inside the email.
- `calendar_description`: String - The text the client will see when adding the appointment inside their calendar.
- `requiresLogin`: Boolean, default false
- `requiresSubscription`: Boolean, default false
- `price_plan_ids`: String[]
- `calendar_filter`: Object[]
  - `collection_id`: ObjectId, → Collection
  - `_id`: ObjectId
- `locked_ranges`: Object[]
  - `start`: Date
  - `end`: Date
  - `_id`: ObjectId
- `connected_services`: ObjectId[], → Service
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Shipping

- `region`: String, required
- `has_store_pickup`: Boolean, default false
- `pickup_title`: String
- `pickup_address`: String
- `pickup_available`: String
- `pickup_instructions`: String
- `delivery`: Object[]
  - `name`: String
  - `estimated_delivery_time`: String
  - `fixed_rate`: Number
  - `rate_per_total`: Number
  - `rate_per_unit`: Number
  - `has_free_delivery`: Boolean, default false
  - `free_delivery_requirement`: Number, default 0
  - `delivery_days`: Number, default 3
  - `hasIntegration`: Boolean, default true
  - `has_time_window`: Boolean, default false
  - `available_from`: String
  - `available_to`: String
  - `timezone`: String
  - `_id`: ObjectId
- `owner_id`: ObjectId, required, → User
- `connected_account_owner_id`: ObjectId, → User
- `min_order_value`: Number, default 0
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### SocialModeSettings

- `social_mode`: Boolean, default false
- `allow_products`: Boolean, default false
- `allow_services`: Boolean, default false
- `allow_services_stp`: Boolean, default false
- `allow_blogposts`: Boolean, default false
- `allow_programs`: Boolean, default false
- `allow_programs_stp`: Boolean, default false
- `allow_posts`: Boolean, default false
- `allow_ai`: Boolean, default false
- `allow_bites`: Boolean, default false
- `allow_long_videos`: Boolean, default false
- `allow_explore`: Boolean, default false
- `allow_online_payments`: Boolean, default false
- `allow_price_plans`: Boolean, default false
- `allow_boosting_posts`: Boolean, default false
- `allow_single_ai`: Boolean, default false
- `merchant_agreement`: ObjectId, → AboutPage
- `verification_popup`: ObjectId, → AboutPage
- `commission`: Number
- `home_page`: String, default "home"
- `navigation_pages.bites`: Boolean, default true
- `navigation_pages.long_videos`: Boolean, default true
- `navigation_pages.vouchers`: Boolean, default true
- `navigation_pages.store`: Boolean, default true
- `navigation_pages.programs`: Boolean, default true
- `navigation_pages.services`: Boolean, default true
- `navigation_pages.blogposts`: Boolean, default true
- `navigation_pages.subscription`: Boolean, default true
- `navigation_pages.playlists`: Boolean, default true
- `navigation_pages.partners`: Boolean, default true
- `navigation_pages.contacts`: Boolean, default true
- `navigation_pages.tracker`: Boolean, default true
- `navigation_pages.more`: Boolean, default true
- `navigation_pages.claims`: Boolean, default true
- `navigation_pages.miniapps`: Boolean, default false
- `navigation_pages.events`: Boolean, default false
- `navigation_pages.professional_pages`: Boolean, default false
- `allow_google_login`: Boolean, default true
- `use_cdn_for_medias`: Boolean, default false
- `cdn_for_medias`: String
- `use_cdn_for_microservices`: Boolean, default false
- `cdn_for_microservices`: String
- `cdn_for_sockets`: String
- `paywall.store.has_paywall`: Boolean, default false
- `paywall.store.priceplans`: ObjectId[], → PricePlan
- `paywall.programs.has_paywall`: Boolean, default false
- `paywall.programs.priceplans`: ObjectId[], → PricePlan
- `paywall.services.has_paywall`: Boolean, default false
- `paywall.services.priceplans`: ObjectId[], → PricePlan
- `paywall.blogposts.has_paywall`: Boolean, default false
- `paywall.blogposts.priceplans`: ObjectId[], → PricePlan
- `paywall.subscription.has_paywall`: Boolean, default false
- `paywall.subscription.priceplans`: ObjectId[], → PricePlan
- `paywall.post.has_paywall`: Boolean, default false
- `paywall.post.priceplans`: ObjectId[], → PricePlan
- `paywall.groups.has_paywall`: Boolean, default false
- `paywall.groups.priceplans`: ObjectId[], → PricePlan
- `paywall.professional_pages.has_paywall`: Boolean, default false
- `paywall.professional_pages.priceplans`: ObjectId[], → PricePlan
- `allow_chat`: Boolean, default true
- `allow_in_app_notifications`: Boolean, default true
- `dashboard_pages.following`: Boolean, default true
- `dashboard_pages.recent`: Boolean, default true
- `dashboard_pages.threads`: Boolean, default true
- `dashboard_pages.long_videos`: Boolean, default true
- `dashboard_pages.groups`: Boolean, default true
- `dashboard_pages.about_pages`: Boolean, default true
- `dashboard_pages.mini_apps`: Boolean, default true
- `dashboard_pages.blogposts`: Boolean, default true
- `dashboard_pages.products`: Boolean, default true
- `dashboard_pages.services`: Boolean, default true
- `dashboard_pages.price_plans`: Boolean, default true
- `dashboard_pages.programs`: Boolean, default true
- `dashboard_pages.claims`: Boolean, default true
- `dashboard_pages.bites`: Boolean, default true
- `dashboard_pages.playlists`: Boolean, default true
- `dashboard_pages.partners`: Boolean, default true
- `dashboard_pages.contacts`: Boolean, default true
- `dashboard_pages.tracker`: Boolean, default true
- `dashboard_pages.vouchers`: Boolean, default true
- `dashboard_pages.explore`: Boolean, default true
- `feed_menus`: String, default "grid"
- `allow_miniapps`: Boolean, default false
- `about_pages.groups`: ObjectId, → AboutPage
- `user_groups`: Boolean, default true
- `allow_professional_pages`: Boolean, default false
- `allow_professional_account_registration`: Boolean, default false
- `locations_map.enabled`: Boolean, default false
- `use_companion_bookings`: Boolean, default false
- `confirm_bookings_call`: Boolean, default false
- `require_professional_account.services`: Boolean, default false
- `require_professional_account.products`: Boolean, default false
- `require_professional_account.programs`: Boolean, default false
- `require_professional_account.blogposts`: Boolean, default false
- `require_professional_account.subscriptions`: Boolean, default false
- `hide_feed_menus`: Boolean, default false
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Subscription

- `stripe_subscription_id`: String
- `user_id`: ObjectId, required, → User
- `status`: Number, default 0
- `payment_intent_id`: String
- `price_plan`: ObjectId, required, → PricePlan
- `rating_mail_sent`: Boolean, default false
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Ticket

- `event`: ObjectId, required, → Event
- `date`: Number, required
- `section`: Number
- `subsection`: Number
- `row`: Number
- `seat`: Number
- `row_index_formated`: Number
- `seat_index_formated`: Number
- `lead_id`: ObjectId, → Lead
- `socket_id`: String
- `tier.name`: String
- `tier.price`: Number
- `status`: String, one of frozen | waiting-for-payment | paid | frozen-by-admin | bought-by-admin, default "frozen"
- `expiration_time`: Date, required
- `qr_code`: ObjectId, → QrCode
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### User

A person with an account on the site - customer, staff member or admin.

- `name`: String
- `email`: String, required
- `avatar`: ObjectId
- `social_avatar`: String
- `isAdmin`: Boolean, default false
- `isStaff`: Boolean, default false
- `owner_id`: ObjectId
- `organization_name`: String
- `firstname`: String
- `lastname`: String
- `phone_number`: String
- `address`: String
- `city`: String
- `state`: String
- `country`: String
- `zip_code`: String
- `tax_identification_number`: String
- `notes`: String
- `isConfirmed`: Boolean, default false
- `number_of_sales`: Number, default 0
- `stripe_id`: String
- `paypal_id`: String
- `access_level`: Number
- `can_edit.site`: Boolean, default true
- `can_edit.crm`: Boolean, default true
- `can_edit.store`: Boolean, default true
- `can_edit.payments`: Boolean, default true
- `can_edit.staff`: Boolean, default true
- `validation_code`: String
- `price_plans`: ObjectId[], → PricePlan
- `emotion`: String
- `political_spectrum`: String
- `language`: Mixed
- `interests`: Mixed
- `app_category`: Mixed
- `user_profile`: Mixed
- `user_economics`: String
- `user_education`: String
- `marital_status`: String
- `age`: String
- `sex`: String
- `attractiveness`: String
- `following`: ObjectId[], → User
- `followers`: ObjectId[], → User
- `handle`: String
- `saved_posts`: ObjectId[], → Post
- `blocked_users`: ObjectId[], → User
- `blocked_by`: ObjectId[], → User
- `bio`: String
- `wallet`: Number, default 0
- `ip_location.city`: String
- `ip_location.continent_name`: String
- `ip_location.country_name`: String
- `ip_location.country_subdivision`: String
- `ip_location.location_latitude`: Number
- `ip_location.location_longitude`: Number
- `ip_location.last_updated`: Date
- `ip_location.ip_address`: String
- `ip_location.zip_code`: String
- `ip_location.dialing_code`: String
- `location`: Embedded
  - `type`: String, one of Point
  - `coordinates`: Number[]
  - `_id`: ObjectId
- `checkout_recovery_at`: Date
- `search_history`: String[]
- `isRestricted`: Boolean, default false
- `isMonetized`: Boolean, default false
- `monetization_request.isRequested`: Boolean, default false
- `monetization_request.requested_on`: Date
- `sentFollowersEmail`: Date
- `isShadowbanned`: Boolean, default false
- `custom_url`: Object[]
  - `heading`: String
  - `url`: String
  - `_id`: ObjectId
- `isWhitelisted`: Boolean, default false
- `isReviewedWhitelist`: Boolean, default false
- `advertiser_id`: String
- `selected_events`: String[]
- `profile_feed_style`: String, default "list"
- `hidden_users`: ObjectId[], → User
- `isVerified`: Boolean, default false
- `saved_products`: ObjectId[], → Product
- `saved_programs`: ObjectId[], → Program
- `saved_blogposts`: ObjectId[], → Blogpots
- `saved_services`: ObjectId[], → Service
- `last_used_miniapps`: ObjectId[], → MiniApp
- `has_disabled_seen`: Boolean, default false
- `other_address`: Object[]
  - `firstname`: String
  - `lastname`: String
  - `email`: String
  - `phone_number`: String
  - `address`: String
  - `city`: String
  - `state`: String
  - `country`: String
  - `zip_code`: String
  - `_id`: ObjectId
- `is_disabled`: Boolean, default false
- `delete_date`: Date
- `trial_price_plans`: Object[]
  - `end_date`: Date
  - `start_date`: Date
  - `price_plan`: ObjectId, → PricePlan
  - `_id`: ObjectId
- `lastActivity`: Date
- `attached_dynamic_models`: Object[]
  - `model`: ObjectId, → DynamicModel
  - `document`: ObjectId
  - `_id`: ObjectId
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### UserEngagementNotification

- `type`: String
- `title`: String, required
- `body`: String
- `owner_id`: ObjectId, → User
- `from`: ObjectId, → User
- `post`: ObjectId, → Post
- `group`: ObjectId, → Group
- `sendToAll`: Boolean, default false
- `comment`: ObjectId, → Comment
- `is_received`: Boolean, default false
- `is_seen`: Boolean, default false
- `url`: String
- `image`: String
- `service`: ObjectId, → Service
- `product`: ObjectId, → Product
- `blogpost`: ObjectId, → BlogPost
- `program`: ObjectId, → Program
- `booking`: ObjectId, → Booking
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### UserLockedHours

- `user`: ObjectId, required
- `locked_ranges`: Object[]
  - `start`: Date
  - `end`: Date
  - `_id`: ObjectId
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### UserPaymentSettings

- `has_card`: Boolean, default false
- `card_locale`: String, default "Pay with credit card"
- `email`: String
- `country`: String
- `agreedToTerms`: Boolean, default false
- `agreedToTermsAt`: String
- `merchant_id`: String
- `has_paypal`: Boolean, default false
- `paypal_increase`: Number, default 0
- `paypal_id`: String
- `owner_id`: ObjectId, required
- `number`: Number
- `price_quote_number`: String
- `bic`: String
- `swift`: String
- `tax_id`: String
- `vat_id`: String
- `logo`: ObjectId
- `business_name`: String
- `business_name_translated`: String
- `responsible_official`: String
- `responsible_official_translated`: String
- `business_email`: String
- `company_id`: String
- `business_address`: String
- `business_address_translated`: String
- `business_phone_number`: String
- `business_country`: String
- `business_country_translated`: String
- `footer`: String
- `footer_translated`: String
- `foreign_tax`: Number, default 0
- `home_tax`: Number, default 0
- `_id`: ObjectId

### UserReport

- `user`: ObjectId, required, → User
- `post`: ObjectId, → Post
- `reason`: String, required
- `reported_user`: ObjectId, → User
- `comment`: ObjectId, → Comment
- `reply`: ObjectId
- `seen`: Boolean, default false
- `miniApp`: ObjectId, → MiniApp
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date
