MailerLite
E-commerce API

E-commerce Products API

Sync products from your shop into MailerLite so they can be added to campaigns and product blocks.

Get products

If you want to get products for the given shop, send this GET request

GET https://connect.mailerlite.com/api/ecommerce/shops/:shop_id/products

Request parameters

ParameterTypeRequiredLimitations
shop_idintegeryesMust provide valid shop id
limitintegernoDefaults to 100
pageintegernoDefaults to 1
typestringnoMailerLite shop only. One of one-time, subscription, booking

Response

{
  "data": [
    {
      "id": "31986843543567834",
      "name": "Product name",
      "price": 123.4,
      "url": "https://shop-url.com/product-name",
      "image": "https://shop-url.com/product-image.jpg",
      "exclude_from_automations": false,
      "short_description": "Product's short description.",
      "description": "Product's longer description.",
      "categories": [
        {
          "id": "1234566457534276",
          "name": "Category 1",
          "exclude_from_automations": false,
          "created_at": "2021-09-01 14:03:50",
          "updated_at": "2021-09-01 14:03:50"
        },
        {
          "id": "1234566457534278",
          "name": "Category 2",
          "exclude_from_automations": false,
          "created_at": "2021-09-01 14:03:50",
          "updated_at": "2021-09-01 14:03:50"
        }
      ],
      "variants": []
    }
  ],
  "links": {
    "first": "https://connect.mailerlite.com/api/ecommerce/shops/:shop_id/products?page=1",
    "last": "https://connect.mailerlite.com/api/ecommerce/shops/:shop_id/products?page=1",
    "prev": null,
    "next": null
  },
  "meta": {
    "current_page": 1,
    "from": 1,
    "last_page": 1,
    "links": [
      {
        "url": null,
        "label": "« Previous",
        "active": false
      },
      {
        "url": "https://connect.mailerlite.com/api/ecommerce/shops/:shop_id/products?page=1",
        "label": "1",
        "active": true
      },
      {
        "url": null,
        "label": "Next »",
        "active": false
      }
    ],
    "path": "https://connect.mailerlite.com/api/ecommerce/shops/:shop_id/products",
    "per_page": 100,
    "to": 1,
    "total": 1
  }
}

Create/update product

You can create or update a product for the given shop.

To create a product for the given shop, send this POST request

POST https://connect.mailerlite.com/api/ecommerce/shops/:shop_id/products

To update a product for the given shop, send this PUT request

PUT https://connect.mailerlite.com/api/ecommerce/shops/:shop_id/products/:product_id

Request body

ParameterTypeRequiredLimitations
namestringyesThe product's name
pricefloatnoThe product's price in the shop's currency. Defaults to 0.
exclude_from_automationsbooleannoIf true this product will not trigger any automations. Defaults to false
urlstringnoThe products url.
imagestringnoThe products main image url.
short_descriptionstringnoThe product's short description. Max 255 characters. HTML tags are automatically removed
descriptionstringnoThe product's description. HTML tags are automatically removed.
{
    "name": "Product name",
    "price": 123.40,
    "url": "https://shop-url.com/product-name",
    "image": "https://shop-url.com/product-image.jpg",
    "exclude_from_automations": false,
    "short_description": "Product's short description.",
    "description": "Product's longer description."
}

Response

If the product was created:

Response Code: 201 Created
{
  "data": {
    "id": "31986843543567834",
    "name": "Product name",
    "price": 123.4,
    "url": "https://shop-url.com/product-name",
    "image": "https://shop-url.com/product-image.jpg",
    "exclude_from_automations": false,
    "short_description": "Product's short description.",
    "description": "Product's longer description.",
    "categories": [],
    "variants": []
  }
}

Error

Response Code: 422 Unprocessable Entity

The error response will contain information about the invalid data.

{
  "message": "The given data was invalid.",
  "errors": {
    "name": ["The name must be provided."]
  }
}

Fetch a product

If you want to fetch a product for the given shop, send this GET request

GET https://connect.mailerlite.com/api/ecommerce/shops/:shop_id/products/:product_id

Request parameters

ParameterTypeRequiredLimitations
product_idintegeryesMust provide valid product id
shop_idintegeryesMust provide valid shop id
GET https://connect.mailerlite.com/api/ecommerce/shops/31986843064993537/products/319868430643456756

Response

If the shop and the product exist:

Response Code: 200 OK
{
  "data": {
    "id": "31986843543567834",
    "name": "Product name",
    "price": 123.4,
    "url": "https://shop-url.com/product-name",
    "image": "https://shop-url.com/product-image.jpg",
    "exclude_from_automations": false,
    "short_description": "Product's short description.",
    "description": "Product's longer description.",
    "categories": [
      {
        "id": "1234566457534276",
        "name": "Category 1",
        "exclude_from_automations": false,
        "created_at": "2021-09-01 14:03:50",
        "updated_at": "2021-09-01 14:03:50"
      },
      {
        "id": "1234566457534278",
        "name": "Category 2",
        "exclude_from_automations": false,
        "created_at": "2021-09-01 14:03:50",
        "updated_at": "2021-09-01 14:03:50"
      }
    ],
    "variants": []
  }
}

Error

If the product or shop cannot be found:

Response Code: 404 Not Found

Fetch total products count

If you want to fetch the total products count for the given shop, send this GET request

GET https://connect.mailerlite.com/api/ecommerce/shops/:shop_id/products?limit=0

Request parameters

ParameterTypeRequiredLimitations
shop_idintegeryesMust provide valid shop id
limitintegeryesValue must be 0

Response

Response Code: 200 OK
{
  "total": 123
}

Delete a product

If you want to delete a product for the given shop, send this DELETE request

   DELETE https://connect.mailerlite.com/api/ecommerce/shops/:shop_id/products/:product_id

Request parameters

ParameterTypeRequiredLimitations
product_idintegeryesMust provide valid product id
shop_idintegeryesMust provide valid shop id

Response

Response code: 200 OK
{
  "data": {
    "id": "31986843543567834",
    "name": "Product name",
    "price": 123.4,
    "url": "https://shop-url.com/product-name",
    "image": "https://shop-url.com/product-image.jpg",
    "exclude_from_automations": false,
    "short_description": "Product's short description.",
    "description": "Product's longer description.",
    "categories": [],
    "variants": []
  }
}

Error

Response code: 404 Not Found

MailerLite shop products

Products of the MailerLite shop are sold through MailerLite checkout. They use the same endpoints as other products, with extra fields.

Additional response fields

FieldTypeDescription
typestringone-time, subscription or booking
currencystringISO 4217 currency code of the product
currency_symbolstringSymbol of currency
enabledbooleanWhether the product can be bought
discountsarrayDiscounts on the product
assetsarrayFiles and links delivered after purchase
settingsobjectPost-purchase action and booking settings
stripe_minimumbooleantrue if the price is below Stripe's minimum charge for the currency
has_checkoutbooleanWhether the product has a checkout page
checkout_urlstringCheckout page URL. Only returned when has_checkout is true
order_statsobjectOrders count and total amount. Only returned when listing products
created_atstringCreation date
{
  "data": {
    "id": "31986843543567834",
    "name": "Product name",
    "price": 20,
    "type": "one-time",
    "currency": "USD",
    "currency_symbol": "$",
    "enabled": true,
    "discounts": [
      {
        "id": "31986843543567900",
        "name": "Launch discount",
        "value": "10",
        "is_percentage": true,
        "enabled": true,
        "start_date": "2026-10-01 00:00:00",
        "end_date": "2026-10-31 23:59:59",
        "created_at": "2026-10-01 10:00:00",
        "updated_at": "2026-10-01 10:00:00",
        "price_after_discount": 18
      }
    ],
    "assets": [],
    "settings": {
      "action": "move_to_group",
      "group_id": "1234567890"
    },
    "stripe_minimum": false,
    "has_checkout": true,
    "checkout_url": "https://...",
    "created_at": "2026-10-01 10:00:00"
  }
}

Create/update request body

On the MailerLite shop, name, price, currency and settings are required on both POST and PUT.

ParameterTypeRequiredLimitations
pricefloatyesMust meet Stripe's minimum charge for currency, unless settings.free is true
currencystringyesISO 4217 currency code
typestringnoone-time, subscription or booking
enabledbooleannoWhether the product can be bought
settingsobjectyesSee settings below
discountsarraynoSee discounts below

Discounts

ParameterTypeRequiredLimitations
discounts.*.namestringnoDiscount name
discounts.*.valuefloatnoAmount or percentage. The discounted price must meet Stripe's minimum or be 0
discounts.*.is_percentagebooleannoIf true, value is a percentage
discounts.*.enabledbooleannoWhether the discount is active
discounts.*.start_datestringnoY-m-d H:i:s
discounts.*.end_datestringnoY-m-d H:i:s, after start_date

On PUT, sending discounts replaces all existing discounts and [] removes them. Omit discounts to keep them.

Settings

settings is merged into the product's existing settings on PUT, but action must still be sent.

ParameterTypeRequiredLimitations
actionstringyesmove_to_group, remove_from_group or update_custom_field
group_idstringif action is move_to_group or remove_from_groupGroup id
field_idstringif action is update_custom_fieldField id
action_on_fieldstringnoset_to_current_date sets the field to the purchase date
field_valuestringwith field_id, unless set_to_current_dateValue to set
freebooleannoProduct is free
booking_typestringnoone-on-one or group
durationfloatnoBetween 15 minutes and 24 hours, in 5-minute steps
duration_unitstringwith durationminutes or hours
calendar_integration_typestringnogoogle, outlook or external. Google and Outlook must be connected
external_linkstringif calendar_integration_type is externalURL
locationstringnogoogle-meet, in-person, phone-call, custom-link, teams-meeting
location_addressstringif location is in-person
location_linkstringif location is custom-linkURL
location_instructionsstringno
timezone_idintegernoTimezone id
booking_window_daysintegerno0 to 100
buffer_between_meetingsintegernoMinimum 0
buffer_between_meetings_unitstringnominutes or hours
minimum_notice_periodintegernoMinimum 0
minimum_notice_period_unitstringnominutes, hours or days
custom_availability_daysobjectnoKeyed by weekday (monday...), each ["H:i", "H:i"] with start before end
booking_group_date_time_utcstringif booking_type is groupY-m-d H:i in UTC, in the future
booking_group_max_participantsintegerno1 to 1000
booking_group_display_remaining_slotsbooleannoShow remaining slots on checkout
{
  "name": "Product name",
  "price": 20,
  "currency": "USD",
  "type": "one-time",
  "settings": {
    "action": "move_to_group",
    "group_id": "1234567890"
  },
  "discounts": [
    {
      "name": "Launch discount",
      "value": 10,
      "is_percentage": true,
      "enabled": true,
      "start_date": "2026-10-01 00:00:00",
      "end_date": "2026-10-31 23:59:59"
    }
  ]
}

Errors

If the account's paid product limit would be exceeded:

Response Code: 413 Payload Too Large

On this page