# Builderly API reference

Base URL: http://www.debate.bg
Generated from the running server on 2026-11-05T11:55:02.859Z. 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

### Leads & forms

Leads are the enquiries visitors send - contact forms, custom forms and lead forms on pages - with where they came from.

#### Custom Form

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

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

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

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

#### Form

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

##### Create a form
`POST /forms`
Create new form.
- Access: reCAPTCHA
- Body:
  - `body` (string): The form's body.
  - `email` (string): An email address.
- Returns: the Form object.
- Status codes: 200, 400, 500
- Models: NewsletterContact, Form

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

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

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

#### Lead

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

##### Create a lead
`POST /leads`
Creates a lead from the fields sent.
- Access: Public
- Body:
  - `owner_id` (string): The lead's owner id.
  - `split` (string): The lead's split.
  - `email` (string): An email address.
  - `phone_number` (string): The lead's phone number.
  - `organization_name` (string): The lead's organization name.
  - `firstname` (string): The lead's firstname.
  - `lastname` (string): The lead's lastname.
  - `address` (string): The lead's address.
  - `city` (string): The lead's city.
  - `state` (string): The lead's state.
  - `country` (string): The lead's country.
  - `zip_code` (string): The lead's zip code.
  - `tax_identification_number` (string): The lead's tax identification number.
  - `notes` (string): The lead's notes.
  - `tickets` (objectid[]): The tickets - the ID of a ticket.
  - `products` (string[]): The lead's products.
  - `programs` (string[]): The lead's programs.
  - `donations` (objectid[]): The donations - the ID of a donation.
  - `newsletter` (string): The lead's newsletter.
  - `name` (string): The lead's name.
  - `age` (string): The lead's age.
  - `products_obj` (object[]): The lead's products obj.
  - `programs_obj` (object[]): The lead's programs obj.
  - `value` (string): The lead's value.
  - `donations_str` (string): The lead's donations str.
- Returns: the Lead object.
- Status codes: 200, 400, 500, 503
- Models: Lead, NewsletterContact, Product, Shipping, SocialModeSettings, Ticket, PaymentMethod, Order

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

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

##### Delete a lead
`DELETE /leads/:id`
Deletes the lead. This cannot be undone.
- Access: Admin token
- Path:
  - `id` (string): The ID of the lead.
- Returns: an empty answer on success.
- Status codes: 200, 401, 404, 500
- Models: Lead

#### Newsletter Contact

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

##### Create a newsletter contact
`POST /newsletter_contacts`
Create new newsletter_contact.
- Access: reCAPTCHA
- Body:
  - `name` (string): The newsletter contact's name.
  - `email` (string): An email address.
  - `age` (number): The newsletter contact's age.
  - `city` (string): The newsletter contact's city.
- Returns: the NewsletterContact object.
- Status codes: 200, 400, 500
- Models: Unsubscribed, NewsletterContact

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

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

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

#### Price Quote

##### Retrieve a download price quote
`GET /download-price-quote/:id/:translate/:filename`
Download price quote pdf.
- Access: Public
- Path:
  - `id` (string): The ID of the download price quote.
  - `translate` (string): The download price quote's translate.
  - `filename` (string): The download price quote's filename.
- Status codes: 200, 400, 500

##### Retrieve the price quote
`GET /price-quote`
Returns the price quote.
- Access: Admin token
- Returns: the PriceQuote object.
- Status codes: 200, 401, 500
- Models: PriceQuote

##### Create a price quote
`POST /price-quote`
Create new price quote.
- Access: Admin token
- Body:
  - `send` (string): The price quote's send.
- Returns: the PriceQuote object.
- Status codes: 201, 400, 401, 500
- Models: MyContact, Lead, PaymentMethod, User, PriceQuote

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

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

#### Unsubscribed

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

##### Retrieve the unsubscribed
`GET /unsubscribed-list`
Returns the unsubscribed.
- Access: Admin token
- Returns: the Unsubscribed object.
- Status codes: 200, 401, 500
- Models: Unsubscribed

##### Create an unsubscribed
`POST /unsubscribed-list`
Create new unsubscribed.
- Access: Public
- Body:
  - `email` (string): An email address.
- Returns: the Unsubscribed object.
- Status codes: 201, 400, 409, 500
- Models: Unsubscribed

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

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

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

## Objects

### CustomForm

- `obj`: Mixed, required
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Form

- `name`: String
- `email`: String
- `subject`: String
- `body`: String
- `medias`: Buffer[]
- `additional`: Object[]
  - `title`: String
  - `option`: String
  - `_id`: ObjectId
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Lead

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

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

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

### PriceQuote

- `customer_name`: String
- `customer_address`: String
- `customer_postal_code`: String
- `customer_city`: String
- `customer_country`: String
- `customer_phone`: String
- `customer_email`: String
- `customer_tax_id`: String, required
- `customer_vat_id`: String
- `customer_responsible_official`: String, required
- `customer_organization_name`: String
- `billing_customer_address`: String
- `billing_customer_postal_code`: String
- `billing_customer_city`: String
- `billing_customer_country`: String
- `billing_customer_phone`: String
- `subtotal`: Number
- `amount`: Number
- `day_of_issue`: String
- `number`: Number
- `foreign`: Boolean
- `home_tax`: Number, default 0
- `foreign_tax`: Number, default 0
- `items`: Object[]
  - `id`: String
  - `name`: String
  - `qty`: Number
  - `unit_price`: Number
  - `discount`: Number
  - `amount`: Number
  - `_id`: ObjectId
- `grounds_for_transaction`: String
- `description_of_transaction`: String
- `place_of_transaction`: String
- `payment`: String
- `dateDue`: String
- `invoice_id`: ObjectId, → invoice
- `invoice_settings.number`: Number
- `invoice_settings.price_quote_number`: String
- `invoice_settings.bic`: String
- `invoice_settings.swift`: String
- `invoice_settings.tax_id`: String
- `invoice_settings.vat_id`: String
- `invoice_settings.logo`: ObjectId
- `invoice_settings.business_name`: String
- `invoice_settings.business_name_translated`: String
- `invoice_settings.responsible_official`: String
- `invoice_settings.responsible_official_translated`: String
- `invoice_settings.business_email`: String
- `invoice_settings.company_id`: String
- `invoice_settings.business_address`: String
- `invoice_settings.business_address_translated`: String
- `invoice_settings.business_phone_number`: String
- `invoice_settings.business_country`: String
- `invoice_settings.business_country_translated`: String
- `invoice_settings.footer`: String
- `invoice_settings.footer_translated`: String
- `invoice_settings.foreign_tax`: Number, default 0
- `invoice_settings.home_tax`: Number, default 0
- `invoice_settings.currency_symbol`: String
- `_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

### Shipping

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

### SocialModeSettings

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

### Ticket

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

### Unsubscribed

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

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