# Builderly API reference

Base URL: http://nd.max-media.io
Generated from the running server on 2026-11-05T11:39:01.506Z. 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

### Community

Community is the social side of the site: posts, comments, ratings, groups and messages between users, when social mode is on.

#### Comment

##### Like or unlike a comment
`PATCH /comment-like/:id`
Like or unlike a comment.
- Access: User token
- Path:
  - `id` (string): The ID of the comment.
- Body:
  - `liked_by_id` (string): The comment's liked by id.
  - `action` (string): The comment's action.
  - `liked_by` (string): The comment's liked by.
- Returns: the Comment object.
- Status codes: 200, 401, 404, 500
- Models: Comment, ConnectedAccount, Post, Product, Service, BlogPost, Program, UserEngagementNotification

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

##### Create a comment
`POST /comments`
Creates a comment from the fields sent.
- Access: User token
- Body:
  - `user` (objectid): The user - the ID of a user.
  - `comment` (string): The comment's comment.
  - `commented_on` (objectid): The comment's commented on.
  - `mentions` (objectid[]): The mentions - the ID of a user.
  - `connected_account_user` (objectid): The connected account user - the ID of a user.
- Returns: the Comment object.
- Status codes: 201, 400, 401, 403, 500
- Models: ConnectedAccount, User, MyContact, Product, Service, BlogPost, Post, Program, Video, SocialModeSettings, UserEngagementNotification, Comment

##### Update the comment
`PATCH /comments`
Changes the fields sent; the others stay as they are.
- Access: User token
- Body:
  - `comment_id` (string): The comment's comment id.
  - `comment` (string): The comment's comment.
  - `mentions` (objectid[]): The mentions - the ID of a user.
- Returns: the Comment object.
- Status codes: 200, 400, 401, 404, 500
- Models: Comment, UserEngagementNotification

##### Update the comments add reply
`PATCH /comments-add-reply`
Changes the fields sent; the others stay as they are.
- Access: User token
- Body:
  - `comment_id` (string): The comments add reply's comment id.
  - `comment` (string): The comments add reply's comment.
  - `user_id` (string): The comments add reply's user id.
  - `mentions` (string): The comments add reply's mentions.
- Status codes: 200, 400, 401, 403, 404, 500
- Models: Comment, ConnectedAccount, User, Post, Product, Service, BlogPost, Program, UserEngagementNotification

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

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

##### Update the comments reply
`PATCH /comments-reply`
Changes the fields sent; the others stay as they are.
- Access: User token
- Body:
  - `comment_id` (string): The comments reply's comment id.
  - `index` (string): The comments reply's index.
  - `comment` (string): The comments reply's comment.
  - `mentions` (string): The comments reply's mentions.
- Status codes: 200, 400, 401, 404, 500
- Models: Comment, UserEngagementNotification

##### Delete a comments reply
`DELETE /comments-reply/:id/:index`
Deletes the comments reply. This cannot be undone.
- Access: User token
- Path:
  - `id` (string): The ID of the comments reply.
  - `index` (string): The comments reply's index.
- Returns: an empty answer on success.
- Status codes: 200, 401, 404, 500
- Models: Comment, ConnectedAccount

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

##### Delete a comment
`DELETE /comments/:id`
Deletes the comment. This cannot be undone.
- Access: User token
- Path:
  - `id` (string): The ID of the comment.
- Returns: an empty answer on success.
- Status codes: 200, 401, 404, 500
- Models: Comment, Post, ConnectedAccount

##### Update a hide comment
`PATCH /hide-comment/:id&:reply`
Changes the fields sent; the others stay as they are.
- Access: User token
- Path:
  - `id` (string): The ID of the hide comment.
  - `reply` (string): The hide comment's reply.
- Returns: the Comment object.
- Status codes: 200, 400, 401, 404, 500
- Models: Comment, Post

##### Like or unlike a reply
`PATCH /reply-like/:id&:replyId`
Like or unlike a reply.
- Access: User token
- Path:
  - `id` (string): The ID of the reply.
  - `replyId` (string): The reply's reply id.
- Body:
  - `liked_by_id` (string): The reply's liked by id.
  - `action` (string): The reply's action.
  - `liked_by` (string): The reply's liked by.
- Status codes: 200, 401, 404, 500
- Models: Comment, ConnectedAccount, Post, Product, Service, BlogPost, Program, UserEngagementNotification

##### List all user comments
`GET /user-comments/:skip`
Returns the site's user comments, newest first unless a sort is given.
- Access: User token
- Path:
  - `skip` (string): How many results to skip - for paging.
- Query:
  - `on_behalf_of` (string): Only user comments with this on behalf of.
- Returns: a list of Comment objects.
- Status codes: 200, 401, 403, 500
- Models: ConnectedAccount, User, Comment, Post, Product, Media, Service, BlogPost

##### List all user liked comments
`GET /user-liked-comments/:skip`
Returns the site's user liked comments, newest first unless a sort is given.
- Access: User token
- Path:
  - `skip` (string): How many results to skip - for paging.
- Query:
  - `on_behalf_of` (string): Only user liked comments with this on behalf of.
- Returns: a list of Comment objects.
- Status codes: 200, 401, 403, 500
- Models: ConnectedAccount, User, Comment, Post, Product, Service, BlogPost

#### Group

##### Update the group remove user
`PATCH /group-remove-user`
Changes the fields sent; the others stay as they are.
- Access: User token
- Body:
  - `group` (string): The group remove user's group.
  - `user` (string): The group remove user's user.
- Status codes: 200, 400, 401, 403, 404, 500
- Models: Group, GroupJoinRequest

##### Retrieve a group
`GET /group/:id`
Returns one group, found by its ID.
- Access: Optional user
- Path:
  - `id` (string): The ID of the group.
- Status codes: 200, 500
- Models: MyContact

##### Create a group
`POST /groups`
Create new group.
- Access: User token
- Returns: the Group object.
- Status codes: 201, 400, 401, 403, 500
- Models: SocialModeSettings, Group

##### Retrieve a group
`GET /groups/:id`
Returns one group, found by its ID.
- Access: User token
- Path:
  - `id` (string): The ID of the group.
- Returns: the Group object.
- Status codes: 200, 401, 402, 404, 500
- Models: SocialModeSettings, Group, GroupJoinRequest

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

##### Delete a group
`DELETE /groups/:id`
Delete Group record by id.
- Access: User token
- Path:
  - `id` (string): The ID of the group.
- Returns: an empty answer on success.
- Status codes: 200, 401, 403, 404, 500
- Models: Group, Post, Comment, Media, User

##### List all groups
`GET /groups/:skip/:limit`
Returns the site's groups, newest first unless a sort is given.
- Access: Public
- Path:
  - `skip` (string): How many results to skip - for paging.
  - `limit` (string): How many results to return.
- Returns: a list of Group objects.
- Status codes: 200, 500
- Models: Group

##### Join a join group
`POST /join-group`
Join a join group.
- Access: User token
- Body:
  - `group` (string): The join group's group.
- Returns: the Group object.
- Status codes: 201, 400, 401, 403, 404, 500
- Models: Group, GroupJoinRequest, UserEngagementNotification

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

##### List all groups
`GET /search-groups/:args/:skip`
Returns the site's groups, newest first unless a sort is given.
- Access: Public
- Path:
  - `args` (string): The group's args.
  - `skip` (string): How many results to skip - for paging.
- Returns: a list of Group objects.
- Status codes: 200, 404, 500
- Models: Group

##### Update a join request with AI
`PATCH /update-join-request-status`
Update a join request from a prompt, written by the AI builder.
- Access: User token
- Body:
  - `group` (objectid): The group - the ID of a group join request.
  - `user` (objectid): The user - the ID of a user.
- Returns: the GroupJoinRequest object.
- Status codes: 201, 400, 401, 403, 404, 500
- Models: Group, GroupJoinRequest, UserEngagementNotification

#### Message

##### Add an add user
`PATCH /add-user/:id`
Add an add user.
- Access: User token
- Path:
  - `id` (string): The ID of the add user.
- Body:
  - `users` (string): The add user's users.
- Status codes: 201, 400, 401, 404, 500
- Models: Message

##### Connect a connect to room
`POST /connect-to-room`
Connect a connect to room.
- Access: User token
- Body:
  - `me` (string): The connect to room's me.
  - `chatSupport` (string): The connect to room's chat support.
  - `receiver_id` (string): The connect to room's receiver id.
  - `user` (string): The connect to room's user.
  - `room` (string): The connect to room's room.
- Status codes: 201, 400, 401, 403, 500
- Models: ConnectedAccount, User, Message

##### Update a delete chat
`PATCH /delete-chat/:id`
Changes the fields sent; the others stay as they are.
- Access: User token
- Path:
  - `id` (string): The ID of the delete chat.
- Body:
  - `user_id` (string): The delete chat's user id.
- Status codes: 200, 401, 403, 404, 500
- Models: Message, ConnectedAccount

##### Find a chat
`GET /find-chat/:product_id`
Find a chat.
- Access: User token
- Path:
  - `product_id` (string): The chat's product id.
- Status codes: 200, 401, 500
- Models: Message, MyContact

##### Leave a leave group
`PATCH /leave-group/:id`
Leave a leave group.
- Access: User token
- Path:
  - `id` (string): The ID of the leave group.
- Status codes: 201, 400, 401, 404, 500
- Models: Message

##### Retrieve a message event
`GET /message-event/:id`
Returns one message event, found by its ID.
- Access: User token
- Path:
  - `id` (string): The ID of the message event.
- Status codes: 200, 401, 403, 404, 500
- Models: Message, ConnectedAccount

##### Update the message seen
`PATCH /message-seen`
Changes the fields sent; the others stay as they are.
- Access: User token
- Body:
  - `id` (string): The ID of the message seen.
  - `user` (string): The message seen's user.
- Status codes: 200, 400, 401, 500
- Models: Message

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

##### Create a message
`POST /messages`
Create new message.
- Access: User token
- Body:
  - `message` (object[]): The message's message.
  - `product_id` (objectid): The product id - the ID of a product.
  - `receiver_id` (objectid): The receiver id - the ID of a user.
  - `service_id` (objectid): The service id - the ID of a service.
  - `blogpost_id` (objectid): The blog post id - the ID of a blog post.
  - `program_id` (objectid): The program id - the ID of a program.
  - `isDirectMessage` (boolean): Whether the message is is direct message.
  - `postId` (string): The message's post id.
  - `group_users` (objectid[]): The group users - the ID of a user.
  - `isGroup` (boolean): Whether the message is is group.
- Returns: the Message object.
- Status codes: 201, 400, 401, 403, 500
- Models: User, Service, Product, BlogPost, Program, Message

##### Retrieve a messages media
`GET /messages-medias/:id&:skip&:limit`
Returns one messages media, found by its ID.
- Access: User token
- Path:
  - `id` (string): The ID of the messages media.
  - `skip` (string): How many results to skip - for paging.
  - `limit` (string): How many results to return.
- Status codes: 200, 401, 404, 500
- Models: Message

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

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

##### Retrieve a message
`GET /messages/:id&:skip&:limit`
Returns one message, found by its ID.
- Access: User token
- Path:
  - `id` (string): The ID of the message.
  - `skip` (string): How many results to skip - for paging.
  - `limit` (string): How many results to return.
- Returns: the Message object.
- Status codes: 200, 401, 404, 500
- Models: Message

##### Retrieve a received in app message
`GET /received-in-app-message/:id`
Returns one received in app message, found by its ID.
- Access: Public
- Path:
  - `id` (string): The ID of the received in app message.
- Status codes: 200, 400, 404, 500
- Models: UserEngagementNotification, Group

##### Send an in app message
`POST /send-in-app-message`
Send an in app message.
- Access: User token
- Body:
  - `type` (string): The in app message's type.
  - `comment_owner` (string): The in app message's comment owner.
  - `item_id` (string): The ID of the in app message to change.
  - `action_doer` (string): The in app message's action doer.
  - `group` (string): The in app message's group.
  - `owner_id` (string): The in app message's owner id.
  - `from` (string): The in app message's from.
  - `message` (string): The in app message's message.
  - `mentioned` (string): The in app message's mentioned.
  - `post` (string): The in app message's post.
- Status codes: 201, 400, 401, 500
- Models: UserEngagementNotification

##### Send a message
`POST /send-message`
Send a message.
- Access: User token
- Body:
  - `from` (string): The message's from.
  - `text` (string): The message's text.
  - `chatSupport` (string): The message's chat support.
  - `receiver_id` (objectid): The receiver id - the ID of a user.
  - `to` (string): The message's to.
  - `room` (string): The message's room.
  - `isDirectMessage` (boolean): Whether the message is is direct message.
  - `postId` (string): The message's post id.
  - `userId` (string): The message's user id.
  - `groupId` (string): The message's group id.
  - `medias` (string): The message's medias.
- Returns: the Message object.
- Status codes: 201, 400, 401, 403, 500
- Models: ConnectedAccount, User, Message, BlogPost, Service, Product, UserEngagementNotification

##### Delete a sent message
`DELETE /sent-message/:id&:msg`
Deletes the sent message. This cannot be undone.
- Access: User token
- Path:
  - `id` (string): The ID of the sent message.
  - `msg` (string): The sent message's msg.
- Returns: an empty answer on success.
- Status codes: 200, 401, 404, 500
- Models: Message

##### Update the user added
`PATCH /user-added`
Changes the fields sent; the others stay as they are.
- Access: User token
- Body:
  - `room` (string): The user added's room.
  - `users` (string): The user added's users.
- Status codes: 200, 400, 401, 403, 500
- Models: Message, ConnectedAccount, User

#### Partner

##### List all partners
`GET /partners`
Get partners, optionally searched, filtered, sorted and paged.
- Access: Optional user
- Status codes: 200, 500

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

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

##### Update a partner
`PATCH /partners/:id`
Update Partner by id.
- Access: Admin token
- Path:
  - `id` (string): The ID of the partner.
- Body:
  - `address` (string): The partner's address.
  - `city` (string): The partner's city.
  - `country` (string): The partner's country.
- Returns: the Partner object.
- Status codes: 200, 400, 401, 404, 500
- Models: Partner

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

#### Post

##### Retrieve the avg cost per action
`GET /avg-cost-per-action`
Returns the avg cost per action.
- Access: User token
- Query:
  - `interests` (string): Only avg cost per actions with this interests.
  - `app_categories` (string): Only avg cost per actions with this app categories.
  - `languages` (string): Only avg cost per actions with this languages.
  - `keywords` (string): Only avg cost per actions with this keywords.
  - `user_economics` (string): Only avg cost per actions with this user economics.
  - `user_education` (string): Only avg cost per actions with this user education.
  - `marital_status` (string): Only avg cost per actions with this marital status.
  - `ages` (string): Only avg cost per actions with this ages.
  - `sexes` (string): Only avg cost per actions with this sexes.
- Status codes: 200, 401, 500
- Models: Post

##### List all bites
`GET /bites/:posts&:popular&:ads&:location_ads`
Returns the site's bites, newest first unless a sort is given.
- Access: User token
- Path:
  - `posts` (string): The bite's posts.
  - `popular` (string): The bite's popular.
  - `ads` (string): The bite's ads.
  - `location_ads` (string): The bite's location ads.
- Status codes: 200, 401, 500
- Models: Post

##### Update a boost user post
`PATCH /boost-user-post/:id`
Changes the fields sent; the others stay as they are.
- Access: User token
- Path:
  - `id` (string): The ID of the boost user post.
- Query:
  - `on_behalf_of` (string): Only boost user posts with this on behalf of.
  - `edit` (string): Only boost user posts with this edit.
- Body:
  - `interests` (string[]): The boost user post's interests.
  - `app_categories` (string): The boost user post's app categories.
  - `languages` (string): The boost user post's languages.
  - `keywords` (string[]): The boost user post's keywords.
  - `user_economics` (string): The boost user post's user economics.
  - `user_education` (string): The boost user post's user education.
  - `marital_status` (string): The boost user post's marital status.
  - `ages` (string): The boost user post's ages.
  - `sexes` (string): The boost user post's sexes.
  - `cost_per_click` (string): The boost user post's cost per click.
  - `cost_per_mile` (string): The boost user post's cost per mile.
  - `created_on` (string): The boost user post's created on.
  - `duration` (string): The boost user post's duration.
  - `days_left` (string): The boost user post's days left.
  - `daily_budget` (string): The boost user post's daily budget.
  - `outer_link` (string): The boost user post's outer link.
  - `targeting` (string): The boost user post's targeting.
  - `isAdvertisment` (boolean): Whether the boost user post is is advertisement.
- Returns: the Post object.
- Status codes: 200, 400, 401, 403, 404, 500
- Models: Post, ConnectedAccount, User

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

##### Update a boost user post
`PATCH /cancel-boost-user-post/:id`
Changes the fields sent; the others stay as they are.
- Access: User token
- Path:
  - `id` (string): The ID of the boost user post.
- Query:
  - `on_behalf_of` (string): Only boost user posts with this on behalf of.
- Returns: the Post object.
- Status codes: 200, 400, 401, 403, 404, 500
- Models: Post, ConnectedAccount, User

##### List all expirable posts
`GET /expirable-posts/:skip&:feed&:users`
Returns the site's expirable posts, newest first unless a sort is given.
- Access: User token
- Path:
  - `skip` (string): How many results to skip - for paging.
  - `feed` (string): The expirable post's feed.
  - `users` (string): The expirable post's users.
- Status codes: 200, 401, 500

##### List all explores
`GET /explore/:posts&:popular&:ads&:location_ads`
Returns the site's explores, newest first unless a sort is given.
- Access: User token
- Path:
  - `posts` (string): The explore's posts.
  - `popular` (string): The explore's popular.
  - `ads` (string): The explore's ads.
  - `location_ads` (string): The explore's location ads.
- Status codes: 200, 401, 500
- Models: Post

##### List all feeds
`GET /feed/:posts&:popular&:ads&:location_ads&:users`
Returns the site's feeds, newest first unless a sort is given.
- Access: User token
- Path:
  - `posts` (string): The feed's posts.
  - `popular` (string): The feed's popular.
  - `ads` (string): The feed's ads.
  - `location_ads` (string): The feed's location ads.
  - `users` (string): The feed's users.
- Status codes: 200, 401, 500
- Models: GroupJoinRequest, Post, Comment

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

##### List all group feeds
`GET /group-feed/:group/:skip/:limit`
Returns the site's group feeds, newest first unless a sort is given.
- Access: User token
- Path:
  - `group` (string): The group feed's group.
  - `skip` (string): How many results to skip - for paging.
  - `limit` (string): How many results to return.
- Status codes: 200, 401, 500
- Models: Group, GroupJoinRequest, Post, Comment

##### Retrieve a long video avg percentage viewed insight
`GET /long-video-avg-percentage-viewed-insights/:id`
Returns one long video avg percentage viewed insight, found by its ID.
- Access: User token
- Path:
  - `id` (string): The ID of the long video avg percentage viewed insight.
- Status codes: 200, 401, 500
- Models: Post, VideoInteraction

##### Retrieve a long video engagement insight
`GET /long-video-engagement-insights/:id`
Returns one long video engagement insight, found by its ID.
- Access: User token
- Path:
  - `id` (string): The ID of the long video engagement insight.
- Status codes: 200, 401, 500
- Models: VideoInteraction, Post

##### Retrieve a long video total watchtime insight
`GET /long-video-total-watchtime-insights/:id`
Returns one long video total watchtime insight, found by its ID.
- Access: User token
- Path:
  - `id` (string): The ID of the long video total watchtime insight.
- Status codes: 200, 401, 500
- Models: VideoInteraction

##### Record a view of a long video days insight
`GET /long-video-views-by-days-insights/:id&:days`
Record a view of a long video days insight.
- Access: User token
- Path:
  - `id` (string): The ID of the long video days insight.
  - `days` (string): The long video days insight's days.
- Status codes: 200, 401, 500
- Models: VideoInteraction

##### Retrieve a long video watchtime days insight
`GET /long-video-watchtime-by-days-insights/:id&:days`
Returns one long video watchtime days insight, found by its ID.
- Access: User token
- Path:
  - `id` (string): The ID of the long video watchtime days insight.
  - `days` (string): The long video watchtime days insight's days.
- Status codes: 200, 401, 500
- Models: VideoInteraction

##### List all long videos
`GET /long-videos/:posts&:popular&:ads`
Returns the site's long videos, newest first unless a sort is given.
- Access: User token
- Path:
  - `posts` (string): The long video's posts.
  - `popular` (string): The long video's popular.
  - `ads` (string): The long video's ads.
- Query:
  - `current_video` (string): Only long videos with this current video.
- Status codes: 200, 401, 500
- Models: Post

##### List all feeds
`GET /my-feed/:skip/:limit`
Returns the site's feeds, 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.
- Status codes: 200, 401, 500
- Models: Post, Comment

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

##### Update the pin group post
`PATCH /pin-group-post/:post/:group`
Changes the fields sent; the others stay as they are.
- Access: User token
- Path:
  - `post` (string): The pin group post's post.
  - `group` (string): The pin group post's group.
- Returns: the Post object.
- Status codes: 200, 401, 403, 404, 500
- Models: Group, Post, UserEngagementNotification

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

##### Update the post comment
`PATCH /post-comments/:post&:comment`
Changes the fields sent; the others stay as they are.
- Access: User token
- Path:
  - `post` (string): The post comment's post.
  - `comment` (string): The post comment's comment.
- Status codes: 200, 400, 401, 500
- Models: Post

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

##### Retrieve a post feed
`GET /post-feed/:posts&:popular&:ads&:original_post_id&:location_ads`
Returns one post feed, found by its ID.
- Access: User token
- Path:
  - `posts` (string): The post feed's posts.
  - `popular` (string): The post feed's popular.
  - `ads` (string): The post feed's ads.
  - `original_post_id` (string): The post feed's original post id.
  - `location_ads` (string): The post feed's location ads.
- Status codes: 200, 401, 500
- Models: Post

##### Retrieve a post insight
`GET /post-insights/:id`
Returns one post insight, found by its ID.
- Access: User token
- Path:
  - `id` (string): The ID of the post insight.
- Query:
  - `on_behalf_of` (string): Only post insights with this on behalf of.
- Status codes: 200, 401, 403, 500
- Models: ConnectedAccount, Post

##### Update a post poll
`PATCH /post-poll/:id`
Changes the fields sent; the others stay as they are.
- Access: User token
- Path:
  - `id` (string): The ID of the post poll.
- Body:
  - `answer` (string): The post poll's answer.
- Status codes: 200, 400, 401, 403, 500
- Models: Post

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

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

##### Record a view of a post
`PATCH /post-views/:id`
Record a view of a post.
- Access: User token
- Path:
  - `id` (string): The ID of the post.
- Returns: the Post object.
- Status codes: 200, 400, 401, 500
- Models: Post

##### Retrieve a post
`GET /post/:id`
Returns one post, found by its ID.
- Access: Optional user
- Path:
  - `id` (string): The ID of the post.
- Status codes: 200, 500
- Models: MyContact

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

##### List all profile feeds
`GET /profile-feed/:user&:post&:skip`
Returns the site's profile feeds, newest first unless a sort is given.
- Access: User token
- Path:
  - `user` (string): The profile feed's user.
  - `post` (string): The profile feed's post.
  - `skip` (string): How many results to skip - for paging.
- Status codes: 200, 401, 500
- Models: Post

##### List all feeds
`GET /recent-feed/:skip&:users`
Returns the site's feeds, newest first unless a sort is given.
- Access: User token
- Path:
  - `skip` (string): How many results to skip - for paging.
  - `users` (string): The feed's users.
- Status codes: 200, 401, 500
- Models: Post

##### Remove a remove thread post
`PATCH /remove-thread-post/:post`
Remove a remove thread post.
- Access: User token
- Path:
  - `post` (string): The remove thread post's post.
- Returns: the Post object.
- Status codes: 200, 400, 401, 500
- Models: Post

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

##### Create a sponsored post attribution
`POST /sponsored-post-attributions`
Creates a sponsored post attribution from the fields sent.
- Access: User token
- Body:
  - `post_id` (string): The sponsored post attribution's post id.
  - `attributed_user_id` (string): The sponsored post attribution's attributed user id.
- Status codes: 200, 401, 500
- Models: Post

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

##### Retrieve a static profile
`GET /static-profile/:handle`
Returns one static profile, found by its ID.
- Access: Public
- Path:
  - `handle` (string): The static profile's handle.
- Status codes: 200, 404, 500
- Models: User, Post, Comment, Product, Service, BlogPost, PricePlan, Program, Subscription, Media

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

##### List all trending videos
`GET /trending-videos/:category&:skip`
Returns the site's trending videos, newest first unless a sort is given.
- Access: User token
- Path:
  - `category` (string): The trending video's category.
  - `skip` (string): How many results to skip - for paging.
- Status codes: 200, 401, 500
- Models: Post

##### Update the repost
`PATCH /update-repost/:post&:repost`
Changes the fields sent; the others stay as they are.
- Access: User token
- Path:
  - `post` (string): The repost's post.
  - `repost` (string): The repost's repost.
- Returns: the Post object.
- Status codes: 200, 400, 401, 500
- Models: Post

##### List all user exclusive feeds
`GET /user-exclusive-feed/:user/:skip/:limit`
Returns the site's user exclusive feeds, newest first unless a sort is given.
- Access: Optional user
- Path:
  - `user` (string): The user exclusive feed's user.
  - `skip` (string): How many results to skip - for paging.
  - `limit` (string): How many results to return.
- Status codes: 200, 500
- Models: Subscription, Post

##### List all user expirable posts
`GET /user-expirable-posts/:user`
Returns the site's user expirable posts, newest first unless a sort is given.
- Access: User token
- Path:
  - `user` (string): The user expirable post's user.
- Returns: a list of Post objects.
- Status codes: 200, 401, 500
- Models: Post, Program, Service, BlogPost, Product, Group

##### List all user feeds
`GET /user-feed/:user/:skip/:limit`
Returns the site's user feeds, newest first unless a sort is given.
- Access: Optional user
- Path:
  - `user` (string): The user feed's user.
  - `skip` (string): How many results to skip - for paging.
  - `limit` (string): How many results to return.
- Status codes: 200, 500
- Models: Post, Comment

##### List all user group feeds
`GET /user-group-feed/:posts&:public_groups&:users`
Returns the site's user group feeds, newest first unless a sort is given.
- Access: User token
- Path:
  - `posts` (string): The user group feed's posts.
  - `public_groups` (string): The user group feed's public groups.
  - `users` (string): The user group feed's users.
- Status codes: 200, 401, 500
- Models: Group, GroupJoinRequest, Post

##### List all user liked posts
`GET /user-liked-posts/:skip`
Returns the site's user liked posts, newest first unless a sort is given.
- Access: User token
- Path:
  - `skip` (string): How many results to skip - for paging.
- Query:
  - `on_behalf_of` (string): Only user liked posts with this on behalf of.
- Returns: a list of Post objects.
- Status codes: 200, 401, 403, 500
- Models: ConnectedAccount, User, Post

##### Retrieve a user long video ad
`GET /user-long-video-ads/:id`
Returns one user long video ad, found by its ID.
- Access: Optional user
- Path:
  - `id` (string): The ID of the user long video ad.
- Status codes: 200, 404, 500
- Models: Post

##### Create a user post
`POST /user-post`
Creates a user post from the fields sent.
- Access: User token
- Body:
  - `text` (string): The user post's text.
  - `title` (string): The user post's title.
  - `posted_in` (objectid): The posted in - the ID of a group.
  - `selected_account_id` (string): The user post's selected account id.
  - `medias` (object[]): The user post's medias.
  - `exclusive` (boolean): Whether the user post is exclusive.
  - `mentions` (objectid[]): The mentions - the ID of a user.
  - `transcode` (string): The user post's transcode.
  - `link` (string): The user post's link.
- Returns: the Post object.
- Status codes: 201, 400, 401, 403, 404, 500
- Models: Group, GroupJoinRequest, ConnectedAccount, MyContact, Media, Message, UserEngagementNotification, Post

##### Like or unlike a user post
`PATCH /user-post-like/:id`
Like or unlike a user post.
- Access: User token
- Path:
  - `id` (string): The ID of the user post.
- Body:
  - `likes` (objectid[]): The likes - the ID of a user.
  - `dislikes` (objectid[]): The dislikes - the ID of a user.
- Returns: the Post object.
- Status codes: 200, 400, 401, 404, 500
- Models: Post, UserEngagementNotification

##### Create a user post link
`POST /user-post-link-preview`
Creates a user post link from the fields sent.
- Access: Optional user, User token
- Body:
  - `link` (string): The user post link's link.
- Status codes: 200, 401, 500

##### Retrieve a user post object
`GET /user-post-object/:id`
Returns one user post object, found by its ID.
- Access: Optional user
- Path:
  - `id` (string): The ID of the user post object.
- Status codes: 200, 404, 500
- Models: Post, Program, Service, BlogPost, Product

##### Save or unsave a user post
`PATCH /user-post-save/:id`
Save or unsave a user post.
- Access: User token
- Path:
  - `id` (string): The ID of the user post.
- Returns: the Post object.
- Status codes: 200, 400, 401, 404, 500
- Models: Post

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

##### Retrieve a user post
`GET /user-post/:id`
Returns one user post, found by its ID.
- Access: Optional user
- Path:
  - `id` (string): The ID of the user post.
- Returns: the Post object.
- Status codes: 200, 404, 500
- Models: Post, VideoInteraction

##### Update a user post
`PATCH /user-post/:id`
Changes the fields sent; the others stay as they are.
- Access: User token
- Path:
  - `id` (string): The ID of the user post.
- Query:
  - `on_behalf_of` (string): Only user posts with this on behalf of.
- Body:
  - `mentions` (objectid[]): The mentions - the ID of a user.
- Returns: the Post object.
- Status codes: 200, 400, 401, 403, 404, 500
- Models: Post, ConnectedAccount, UserEngagementNotification

##### Delete a user post
`DELETE /user-post/:id`
Deletes the user post. This cannot be undone.
- Access: User token
- Path:
  - `id` (string): The ID of the user post.
- Returns: an empty answer on success.
- Status codes: 200, 401, 403, 404, 500
- Models: Post, Group, Comment, Media, User

##### Retrieve a video feed
`GET /video-feed/:video_id&:posts&:popular&:ads`
Returns one video feed, found by its ID.
- Access: User token
- Path:
  - `video_id` (string): The video feed's video id.
  - `posts` (string): The video feed's posts.
  - `popular` (string): The video feed's popular.
  - `ads` (string): The video feed's ads.
- Query:
  - `current_video` (string): Only video feeds with this current video.
- Status codes: 200, 401, 500
- Models: Post

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

#### Rating

##### Retrieve a rating
`GET /all-ratings/:id&:item&:skip&:limit`
Returns one rating, found by its ID.
- Access: Public
- Path:
  - `id` (string): The ID of the rating.
  - `item` (string): The rating's item.
  - `skip` (string): How many results to skip - for paging.
  - `limit` (string): How many results to return.
- Returns: the Rating object.
- Status codes: 200, 400, 404, 500
- Models: ProfessionalAccount, Service, Rating, Model, MyContact

##### Create a rating
`POST /rating`
Creates a rating from the fields sent.
- Access: Public
- Body:
  - `body` (string): The rating's body.
- Returns: the Rating object.
- Status codes: 201, 400, 500
- Models: Media, Rating

##### Retrieve a rating
`GET /rating/:id`
Returns one rating, found by its ID.
- Access: User token
- Path:
  - `id` (string): The ID of the rating.
- Returns: the Rating object.
- Status codes: 200, 400, 401, 500
- Models: Rating

##### Retrieve the ratings table
`GET /ratings-table`
Returns the ratings table.
- Access: User token
- Query:
  - `charAt` (string): Only ratings tables with this char at.
  - `slice` (string): Only ratings tables with this slice.
  - `type` (string): Only ratings tables with this type.
- Status codes: 200, 400, 401, 500
- Models: Model, Rating

##### Retrieve a user rating
`GET /user-rating/:email&:validation_code&:type&:id`
Returns one user rating, found by its ID.
- Access: Public
- Path:
  - `email` (string): An email address.
  - `validation_code` (string): The user rating's validation code.
  - `type` (string): The user rating's type.
  - `id` (string): The ID of the user rating.
- Status codes: 200, 400, 500
- Models: Order, Booking, Service, Subscription, PricePlan, MyContact

## Objects

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

### Comment

- `user`: ObjectId, required, → User
- `connected_account_user`: ObjectId, → User
- `commented_on`: ObjectId, required
- `comment`: String, required
- `likes`: ObjectId[], → User
- `replies`: Object[]
  - `comment`: String, required
  - `user`: ObjectId, required, → User
  - `likes`: ObjectId[], → User
  - `createdAt`: Date
  - `isHidden`: Boolean, default false
  - `_id`: ObjectId
- `mentions`: ObjectId[], → User
- `isHidden`: Boolean, default false
- `medias`: Object[]
  - `media`: ObjectId, → Media
  - `_id`: ObjectId
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

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

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

### GroupJoinRequest

- `group`: ObjectId, → GroupJoinRequest
- `user`: ObjectId, → User
- `status`: String, default "pending"
- `_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

### Partner

- `name`: String, required
- `venue`: String
- `venue_types`: Object[]
  - `collection_id`: ObjectId, → Collection
  - `_id`: ObjectId
- `city`: String, required
- `country`: String
- `address`: String, required
- `contact`: String
- `additional_information`: String
- `phone`: String
- `email`: String
- `website`: String
- `hours`: String
- `latitude`: Number
- `longitude`: Number
- `formatted_address`: String
- `geo_status`: String, one of pending | ok | failed, default "pending"
- `custom_1`: String
- `custom_2`: String
- `custom_3`: String
- `medias`: Object[]
  - `media`: ObjectId, → Media
  - `_id`: ObjectId
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

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

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

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

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

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

### Video

- `name`: String, required
- `link`: String
- `collection_id`: ObjectId, → Collection
- `media_id`: ObjectId, → Media
- `selected`: Boolean, default false
- `custom_1`: String
- `custom_2`: String
- `custom_3`: String
- `suitability_price_plans`: ObjectId[], → PricePlan
- `isSuitable`: Boolean
- `views`: ObjectId[], → User
- `total_views`: Number, default 0
- `times_showed`: Number, default 0
- `owner_id`: ObjectId, → User
- `requiresLogin`: Boolean, default false
- `requiresSubscription`: Boolean, default false
- `price_plan_ids`: String[]
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### VideoInteraction

- `start`: Number, required
- `end`: Number, required
- `watch_time`: Number, required
- `video_viewer`: ObjectId, required, → User
- `video_id`: ObjectId, required, → Post
- `video_owner`: ObjectId, required, → User
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date
