# Builderly API reference

Base URL: http://www.kanokonlit.com
Generated from the running server on 2026-11-05T23:05:58.433Z. 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

### SEO & analytics

How the site is found and measured: SEO keywords, meta titles and descriptions, redirects, tracking codes and visit statistics.

#### Activity Log

##### List the activity log filters
`GET /activity-log-filters`
The action and entity values actually present, for the filter menus.
- Access: Admin token
- Returns: a list of ActivityLog objects.
- Status codes: 200, 401, 500
- Models: ActivityLog

##### List all activity logs
`GET /activity-logs`
List activity log entries, newest first.
- Access: Admin token
- Query:
  - `limit` (string): How many results to return.
  - `skip` (string): How many results to skip - for paging.
- Returns: a list of ActivityLog objects.
- Status codes: 200, 401, 500
- Models: ActivityLog

##### Export activity logs
`GET /activity-logs-export`
The current selection as CSV.
- Access: Admin token
- Query:
  - `limit` (string): How many results to return.
- Returns: the ActivityLog object.
- Status codes: 200, 401, 500
- Models: ActivityLog

##### Retrieve an activity log
`GET /activity-logs/:id`
One entry, including the full recorded payload.
- Access: Admin token
- Path:
  - `id` (string): The ID of the activity log.
- Returns: the ActivityLog object.
- Status codes: 200, 401, 404, 500
- Models: ActivityLog

#### Ga

##### Connect the Google Analytic
`POST /ga/connect`
Connect the Google Analytic.
- Access: User token
- Status codes: 200, 400, 401, 500

##### Create a Google Analytic
`POST /ga/create`
Creates a Google Analytic from the fields sent.
- Access: User token
- Body:
  - `property` (string): The Google Analytic's property.
  - `accountName` (string): The Google Analytic's account name.
  - `currencyCode` (string): The Google Analytic's currency code.
  - `propertyName` (string): The Google Analytic's property name.
  - `timeZone` (string): The Google Analytic's time zone.
  - `replaceTag` (string): The Google Analytic's replace tag.
- Status codes: 200, 400, 401, 500
- Models: MyContact, PaymentMethod

##### Disconnect the Google Analytic
`POST /ga/disconnect`
Disconnect the Google Analytic.
- Access: User token
- Status codes: 200, 401, 500
- Models: MyContact, Tracking

##### List all Google Analytics
`GET /ga/events`
Returns the site's Google Analytics, newest first unless a sort is given.
- Access: User token
- Query:
  - `range` (string): Only Google Analytics with this range.
- Status codes: 200, 400, 401, 500
- Models: MyContact

##### List all Google Analytics
`GET /ga/pages`
Returns the site's Google Analytics, newest first unless a sort is given.
- Access: User token
- Query:
  - `range` (string): Only Google Analytics with this range.
- Status codes: 200, 400, 401, 500
- Models: MyContact

##### Retrieve the Google Analytic
`GET /ga/realtime`
Returns the Google Analytic.
- Access: User token
- Status codes: 200, 400, 401, 500
- Models: MyContact

##### Report the Google Analytic
`GET /ga/report`
Report the Google Analytic.
- Access: User token
- Query:
  - `range` (string): Only Google Analytics with this range.
- Status codes: 200, 400, 401, 500
- Models: MyContact

##### Change the status of a Google Analytic
`GET /ga/status`
Change the status of a Google Analytic.
- Access: User token
- Status codes: 200, 401, 500
- Models: MyContact, Tracking

#### Gmb

##### List all Google Business Profiles
`GET /gmb/categories`
Returns the site's Google Business Profiles, newest first unless a sort is given.
- Access: User token
- Query:
  - `accessToken` (string): Only Google Business Profiles with this access token.
  - `regionCode` (string): Only Google Business Profiles with this region code.
  - `languageCode` (string): Only Google Business Profiles with this language code.
  - `q` (string): The words to search for.
- Status codes: 200, 400, 401, 500

##### Connect the Google Business Profile
`POST /gmb/connect`
Connect the Google Business Profile.
- Access: User token
- Status codes: 200, 400, 401, 500
- Models: MyContact

##### Create a Google Business Profile
`POST /gmb/create`
Creates a Google Business Profile from the fields sent.
- Access: User token
- Body:
  - `locations` (string): The Google Business Profile's locations.
- Status codes: 201, 400, 401, 500
- Models: MyContact

##### Disconnect the Google Business Profile
`POST /gmb/disconnect`
Disconnect the Google Business Profile.
- Access: User token
- Status codes: 200, 400, 401, 500
- Models: MyContact

##### Import the Google Business Profile
`POST /gmb/import`
Import the Google Business Profile.
- Access: User token
- Body:
  - `serviceItems` (string): The Google Business Profile's service items.
  - `storefrontAddress` (string): The Google Business Profile's storefront address.
  - `regularHours` (string): The Google Business Profile's regular hours.
  - `location` (string): The Google Business Profile's location.
  - `importServices` (string): The Google Business Profile's import services.
  - `collectionId` (string): The Google Business Profile's collection id.
  - `importHours` (string): The Google Business Profile's import hours.
  - `importAddress` (string): The Google Business Profile's import address.
  - `email` (string): An email address.
  - `importEmail` (string): The Google Business Profile's import email.
- Status codes: 200, 400, 401, 500
- Models: OriginAddress, Collection, MyContact, Service

##### Create a Google Business Profile
`POST /gmb/select`
Creates a Google Business Profile from the fields sent.
- Access: User token
- Body:
  - `location` (string): The Google Business Profile's location.
- Status codes: 200, 400, 401, 500
- Models: MyContact

##### Change the status of a Google Business Profile
`GET /gmb/status`
Change the status of a Google Business Profile.
- Access: User token
- Status codes: 200, 401, 500
- Models: MyContact

#### Gsc

##### Retrieve the Search Console
`GET /gsc/breakdown`
Returns the Search Console.
- Access: User token
- Query:
  - `range` (string): Only Search Consoles with this range.
  - `type` (string): Only Search Consoles with this type.
  - `dimension` (string): Only Search Consoles with this dimension.
- Status codes: 200, 400, 401, 500
- Models: MyContact, Tracking

##### Connect the Search Console
`POST /gsc/connect`
Connect the Search Console.
- Access: User token
- Status codes: 200, 400, 401, 500
- Models: MyContact, Tracking

##### Disconnect the Search Console
`POST /gsc/disconnect`
Disconnect the Search Console.
- Access: User token
- Status codes: 200, 401, 500
- Models: Tracking

##### Retrieve the Search Console
`GET /gsc/performance`
Returns the Search Console.
- Access: User token
- Query:
  - `range` (string): Only Search Consoles with this range.
  - `type` (string): Only Search Consoles with this type.
- Status codes: 200, 400, 401, 500
- Models: MyContact, Tracking

##### List all Search Consoles
`GET /gsc/sites`
Returns the site's Search Consoles, newest first unless a sort is given.
- Access: User token
- Status codes: 200, 401, 500
- Models: MyContact, Tracking

#### Keyword

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

##### Retrieve a keyword
`GET /keywords/:id`
Returns one keyword, found by its ID.
- Access: Admin token
- Path:
  - `id` (string): The ID of the keyword.
- Returns: the Keyword object.
- Status codes: 200, 401, 404, 500
- Models: Keyword

#### Keyword Blacklist

##### Retrieve the keyword blacklist
`GET /keyword-blacklist`
Returns the keyword blacklist.
- Access: User token
- Returns: the KeywordBlacklist object.
- Status codes: 200, 401, 500
- Models: KeywordBlacklist

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

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

##### Delete a keyword blacklist
`DELETE /keyword-blacklist/:id`
Delete KeywordBlacklist record by id.
- Access: User token
- Path:
  - `id` (string): The ID of the keyword blacklist.
- Returns: an empty answer on success.
- Status codes: 200, 401, 404, 500
- Models: KeywordBlacklist

#### Meta

##### List all metas
`GET /metas`
Returns the site's metas, newest first unless a sort is given.
- Access: Public
- Returns: a list of Meta objects.
- Status codes: 200, 500
- Models: Meta

##### Create a meta
`POST /metas`
Creates a meta from the fields sent.
- Access: User token
- Returns: the Meta object.
- Status codes: 201, 400, 401, 500
- Models: Meta

##### Retrieve a meta
`GET /metas/:id`
Returns one meta, found by its ID.
- Access: Public
- Path:
  - `id` (string): The ID of the meta.
- Returns: the Meta object.
- Status codes: 200, 404, 500
- Models: Meta

#### Pixel Data

##### List all conversions days
`GET /conversions-by-days/:days`
Returns the site's conversions days, newest first unless a sort is given.
- Access: User token
- Path:
  - `days` (string): The conversions day's days.
- Query:
  - `on_behalf_of` (string): Only conversions days with this on behalf of.
- Status codes: 200, 401, 403, 500
- Models: ConnectedAccount, User, PixelData

##### List all conversions graph days
`GET /conversions-graph-by-days/:days`
Returns the site's conversions graph days, newest first unless a sort is given.
- Access: User token
- Path:
  - `days` (string): The conversions graph day's days.
- Query:
  - `on_behalf_of` (string): Only conversions graph days with this on behalf of.
- Status codes: 200, 401, 403, 500
- Models: ConnectedAccount, User, PixelData

##### List all conversions table days
`GET /conversions-table-by-days/:days`
Returns the site's conversions table days, newest first unless a sort is given.
- Access: User token
- Path:
  - `days` (string): The conversions table day's days.
- Query:
  - `on_behalf_of` (string): Only conversions table days with this on behalf of.
- Status codes: 200, 401, 403, 500
- Models: ConnectedAccount, User, PixelData

##### Count event days
`GET /event-count-by-days/:days`
Count event days.
- Access: User token
- Path:
  - `days` (string): The event day's days.
- Query:
  - `on_behalf_of` (string): Only event days with this on behalf of.
- Status codes: 200, 401, 403, 500
- Models: ConnectedAccount, User, PixelData

##### List all pages and screens days
`GET /pages-and-screens-by-days/:days`
Returns the site's pages and screens days, newest first unless a sort is given.
- Access: User token
- Path:
  - `days` (string): The pages and screens day's days.
- Query:
  - `on_behalf_of` (string): Only pages and screens days with this on behalf of.
- Status codes: 200, 401, 403, 500
- Models: ConnectedAccount, User, MyContact, PixelData

##### List all pages and screens graph days
`GET /pages-and-screens-graph-by-days/:days`
Returns the site's pages and screens graph days, newest first unless a sort is given.
- Access: User token
- Path:
  - `days` (string): The pages and screens graph day's days.
- Query:
  - `on_behalf_of` (string): Only pages and screens graph days with this on behalf of.
- Status codes: 200, 401, 403, 500
- Models: MyContact, ConnectedAccount, User, PixelData

##### Count sessions days
`GET /sessions-count-by-days/:days`
Count sessions days.
- Access: User token
- Path:
  - `days` (string): The sessions day's days.
- Query:
  - `on_behalf_of` (string): Only sessions days with this on behalf of.
- Status codes: 200, 401, 403, 500
- Models: ConnectedAccount, User, PixelData

##### Count user days
`GET /user-count-by-days/:days`
Count user days.
- Access: User token
- Path:
  - `days` (string): The user day's days.
- Query:
  - `on_behalf_of` (string): Only user days with this on behalf of.
- Status codes: 200, 401, 403, 500
- Models: ConnectedAccount, User, PixelData

#### Report

##### List all item rating over times
`GET /item-rating-over-time/:from&:to`
Returns the site's item rating over times, newest first unless a sort is given.
- Access: Admin token
- Path:
  - `from` (string): The item rating over time's from.
  - `to` (string): The item rating over time's to.
- Query:
  - `split` (string): Only item rating over times with this split.
  - `itemsString` (string): Only item rating over times with this items string.
- Status codes: 200, 401, 500
- Models: Rating

##### Report bookings over time
`GET /report-bookings-over-time/:from&:to`
Get report-bookings-over-time.
- Access: Admin token
- Path:
  - `from` (string): The bookings over time's from.
  - `to` (string): The bookings over time's to.
- Query:
  - `split` (string): Only bookings over times with this split.
  - `services` (string): Only bookings over times with this services.
- Status codes: 200, 401, 500
- Models: Service, Booking, Order

##### Report clicks over time
`GET /report-clicks-over-time/:from&:to`
Get report-users-over-time.
- Access: Admin token
- Path:
  - `from` (string): The clicks over time's from.
  - `to` (string): The clicks over time's to.
- Status codes: 200, 401, 500
- Models: Click

##### Report a coupon over time
`GET /report-coupon-over-time/:from&:to`
Get report-coupon-over-time.
- Access: Admin token
- Path:
  - `from` (string): The coupon over time's from.
  - `to` (string): The coupon over time's to.
- Query:
  - `split` (string): Only coupon over times with this split.
  - `coupons` (string): Only coupon over times with this coupons.
- Status codes: 200, 401, 500
- Models: Coupon, Order

##### Report an interaction over time
`GET /report-interaction-over-time/:from&:to`
Get report-interaction-over-time.
- Access: Public
- Path:
  - `from` (string): The interaction over time's from.
  - `to` (string): The interaction over time's to.
- Status codes: 200, 500
- Models: Traffic

##### Report an item over time
`GET /report-item-over-time/:from&:to`
Get report-item-over-time.
- Access: Admin token
- Path:
  - `from` (string): The item over time's from.
  - `to` (string): The item over time's to.
- Query:
  - `split` (string): Only item over times with this split.
  - `ids` (string): Only item over times with this ids.
- Status codes: 200, 401, 500
- Models: Product, Order

##### Report an item sales over time
`GET /report-item-sales-over-time/:from&:to`
Get report-item-sales-over-time.
- Access: Admin token
- Path:
  - `from` (string): The item sales over time's from.
  - `to` (string): The item sales over time's to.
- Status codes: 200, 401, 500
- Models: Order, Product

##### Report a newsletter over time
`GET /report-newsletter-over-time/:from&:to`
Get report-newsletter-over-time.
- Access: Admin token
- Path:
  - `from` (string): The newsletter over time's from.
  - `to` (string): The newsletter over time's to.
- Status codes: 200, 401, 500
- Models: NewsletterContact

##### Report a payment methods revenue over time
`GET /report-payment-methods-revenue-over-time/:from&:to`
Get report-payment-methods-revenue-over-time.
- Access: Admin token
- Path:
  - `from` (string): The payment methods revenue over time's from.
  - `to` (string): The payment methods revenue over time's to.
- Query:
  - `split` (string): Only payment methods revenue over times with this split.
  - `payments` (string): Only payment methods revenue over times with this payments.
- Status codes: 200, 401, 500
- Models: Order

##### Report a price plan over time
`GET /report-priceplan-over-time/:from&:to`
Get report-priceplan-over-time.
- Access: Admin token
- Path:
  - `from` (string): The price plan over time's from.
  - `to` (string): The price plan over time's to.
- Query:
  - `split` (string): Only price plan over times with this split.
  - `price_plans` (string): Only price plan over times with this price plans.
- Status codes: 200, 401, 500
- Models: PricePlan, Subscription

##### Report a push over time
`GET /report-push-over-time/:from&:to`
Get report-push-over-time.
- Access: Admin token
- Path:
  - `from` (string): The push over time's from.
  - `to` (string): The push over time's to.
- Status codes: 200, 401, 500
- Models: PushToken

##### Report sales over time
`GET /report-sales-over-time/:from&:to`
Get report-sales-over-time.
- Access: Admin token
- Path:
  - `from` (string): The sales over time's from.
  - `to` (string): The sales over time's to.
- Status codes: 200, 401, 500
- Models: Order

##### Report a shipping over time
`GET /report-shipping-over-time/:from&:to`
Get report-shipping-over-time.
- Access: Admin token
- Path:
  - `from` (string): The shipping over time's from.
  - `to` (string): The shipping over time's to.
- Query:
  - `split` (string): Only shipping over times with this split.
  - `shippings` (string): Only shipping over times with this shippings.
- Status codes: 200, 401, 500
- Models: Order

##### Report a traffic over time
`GET /report-traffic-over-time/:from&:to`
Report a traffic over time.
- Access: Admin token
- Path:
  - `from` (string): The traffic over time's from.
  - `to` (string): The traffic over time's to.
- Status codes: 200, 401, 500
- Models: Traffic

##### Report users over time
`GET /report-users-over-time/:from&:to`
Get report-users-over-time.
- Access: Admin token
- Path:
  - `from` (string): The users over time's from.
  - `to` (string): The users over time's to.
- Status codes: 200, 401, 500
- Models: User

##### List all user item rating over times
`GET /user-item-rating-over-time/:from&:to`
Returns the site's user item rating over times, newest first unless a sort is given.
- Access: Admin token
- Path:
  - `from` (string): The user item rating over time's from.
  - `to` (string): The user item rating over time's to.
- Query:
  - `charAt` (string): Only user item rating over times with this char at.
  - `slice` (string): Only user item rating over times with this slice.
  - `type` (string): Only user item rating over times with this type.
- Status codes: 200, 401, 404, 500
- Models: Model, Rating

#### Tracking

##### List all trackings
`GET /trackings`
Returns the site's trackings, newest first unless a sort is given.
- Access: Public
- Returns: a list of Tracking objects.
- Status codes: 200, 500
- Models: Tracking

##### Create a tracking
`POST /trackings`
Create new tracking.
- Access: Admin token
- Returns: the Tracking object.
- Status codes: 201, 400, 401, 500
- Models: Tracking

##### Retrieve a tracking
`GET /trackings/:id`
Returns one tracking, found by its ID.
- Access: Public
- Path:
  - `id` (string): The ID of the tracking.
- Returns: the Tracking object.
- Status codes: 200, 404, 500
- Models: Tracking

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

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

#### AI builder

##### Create a SEO keyword with AI
`POST /create-seo-keywords`
Create a SEO keyword from a prompt, written by the AI builder.
- Access: Admin token
- Body:
  - `prompt` (string): What the AI should do with the SEO keyword, 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 SEO keyword to change.
- Status codes: 200, 401, 500
- Models: ChatMessage

##### Create a search result meta with AI
`POST /create-serp-meta`
Create a search result meta from a prompt, written by the AI builder.
- Access: Admin token
- Body:
  - `prompt` (string): What the AI should do with the search result meta, 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 search result meta to change.
- Status codes: 200, 401, 500
- Models: ChatMessage

##### Generate a SEO keyword with AI
`POST /generate-seo-keywords`
Use it to generate, add, or suggest SEO keywords or search terms for the site.
- Access: Admin token
- Body:
  - `prompt` (string): What the AI should do with the SEO keyword, 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 search result meta with AI
`POST /generate-serp-meta`
Use it to generate or update the default meta title, meta description, or site name for SEO/SERP purposes.
- Access: Admin token
- Body:
  - `prompt` (string): What the AI should do with the search result meta, 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

### ActivityLog

- `actor.user`: ObjectId, → User
- `actor.email`: String
- `actor.name`: String
- `actor.kind`: String, one of admin | customer | guest | system, default "guest"
- `action`: String, required
- `entity`: String
- `entity_id`: String
- `label`: String
- `method`: String
- `path`: String
- `status`: Number
- `changes`: Mixed
- `ip`: String
- `user_agent`: String
- `_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

### Click

- `url`: String
- `ip`: String
- `_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

### Coupon

A discount code for checkout.

- `code`: String, required - The coupon code customers enter at checkout (e.g. "SUMMER20", "SAVE10").
- `name`: String, required - Internal label for this coupon (e.g. "Summer Sale 20% Off").
- `fixed_discount`: Number - Fixed amount discount (e.g. 10 for $10 off).
- `percentage_discount`: Number - Percentage discount 1–100 (e.g. 20 for 20% off).
- `shipping_discount`: Number - Discount on shipping cost.
- `sale_discount`: Number - Sale price override.
- `quantity_discount.buy`: Number
- `quantity_discount.get`: Number
- `apply_to_all_orders`: Boolean
- `apply_to_all_products`: Boolean
- `apply_to_product`: String - Name of the specific product to apply to.
- `apply_to_event`: String - Name of the specific event to apply to.
- `apply_to_all_events`: Boolean
- `apply_to_collection`: String - Name of the specific collection/category to apply to.
- `apply_to_minimum_subtotal`: Number - Minimum order subtotal required.
- `start_date`: Date - ISO 8601 date when the coupon becomes active (e.g. "2026-03-20T00:00:00.000Z").
- `end_date`: Date - ISO 8601 expiry date (omit if no_end_date is true).
- `no_end_date`: Boolean, default false - Set to true if the coupon should never expire.
- `limit_uses`: Number - Max total uses (omit or set 0 for unlimited).
- `uses`: Number
- `_id`: ObjectId

### Keyword

- `word`: String, required
- `_id`: ObjectId

### KeywordBlacklist

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

### Meta

- `title`: String
- `url`: String, required
- `description`: String
- `site_name`: String
- `image`: ObjectId
- `_id`: ObjectId

### 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

### NewsletterContact

- `name`: String, required
- `age`: Number
- `email`: String, required
- `city`: String
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### 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

### PixelData

- `id`: String
- `uid`: String
- `ev`: String
- `ed.currency`: String
- `ed.value`: Number
- `ed.payment_type`: String
- `ed.coupon`: String
- `ed.items`: Object[]
  - `item_id`: String
  - `item_name`: String
  - `affiliation`: String
  - `coupon`: String
  - `discount`: Number
  - `index`: Number
  - `item_brand`: String
  - `item_category`: String
  - `item_category2`: String
  - `item_category3`: String
  - `item_category4`: String
  - `item_category5`: String
  - `item_list_id`: String
  - `item_list_name`: String
  - `item_variant`: String
  - `location_id`: String
  - `price`: Number
  - `quantity`: Number
  - `_id`: ObjectId
- `ed.shipping_tier`: String
- `ed.virtual_currency_name`: String
- `ed.group_id`: String
- `ed.level_name`: String
- `ed.success`: Boolean
- `ed.level`: Number
- `ed.character`: String
- `ed.method`: String
- `ed.score`: Number
- `ed.transaction_id`: String
- `ed.shipping`: Number
- `ed.tax`: Number
- `ed.search_term`: String
- `ed.content_type`: String
- `ed.content_id`: String
- `ed.creative_name`: String
- `ed.creative_slot`: String
- `ed.promotion_id`: String
- `ed.promotion_name`: String
- `ed.achievement_id`: String
- `v`: String
- `dl`: String
- `rl`: String
- `ts`: String
- `de`: String
- `sr`: String
- `vp`: String
- `cd`: String
- `dt`: String
- `bn`: String
- `md`: String
- `ua`: String
- `tz`: String
- `utm_source`: String
- `utm_medium`: String
- `utm_term`: String
- `utm_content`: String
- `utm_campaign`: String
- `utm_source_platform`: String
- `utm_creative_format`: String
- `utm_marketing_tactic`: String
- `_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

### PushToken

- `user`: String
- `is_admin`: Boolean, default false
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Rating

- `email`: String, required
- `text`: String
- `medias`: Object[]
  - `media`: ObjectId, → Media
  - `_id`: ObjectId
- `stars`: Number, required
- `product`: ObjectId, → Product
- `service`: ObjectId, → Service
- `program`: ObjectId, → Program
- `price_plan`: ObjectId, → PricePlan
- `name`: String
- `miniapp`: ObjectId, → MiniApp
- `staff_member`: ObjectId, → User
- `_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

### 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

### Tracking

- `title`: String
- `script`: String, required
- `prefix`: String
- `place_in_body`: Boolean, default false
- `external_tracker_id`: String
- `external_tracker_integration`: String
- `event_map`: Map
- `_id`: ObjectId

### Traffic

- `session_id`: String
- `page_views`: Number
- `site_session`: Number, default 0
- `app_session`: Number, default 0
- `last_url`: String
- `path`: String[]
- `_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
