Storefront APIs

Build a storefront on Vondera

Public REST APIs for catalog, cart, checkout, customers, funnels, and content β€” 74 endpoints documented from production routes.

This page documents Storefront APIs only (building / customizing shopfronts). For Plugin apps, OAuth, and scopes, use the Developers Portal.

Developers Portal

Overview

These routes power Vondera storefronts. The same router is mounted twice: authenticate with your merchant API key on /api/public, or let live shop domains resolve the store via host headers on /api/ecommerce.

Base URLhttps://production.api.vondera.app
Public key mounthttps://production.api.vondera.app/api/public
Host-resolved mounthttps://production.api.vondera.app/api/ecommerce

Response envelope

Most JSON endpoints return:

{
  "status": 200,
  "message": "Success",
  "data": {}
}

74 endpoints across 12 resources.

Authentication

Merchant API key (x-api-key)

  1. Open the Merchant Dashboard β†’ Developers / API Key.
  2. Copy your public API key (requires a plan with apiAccess).
  3. Send it as the x-api-key header on every /api/public request.
  4. Never embed the key in public browser bundles β€” call from your backend or a trusted server.

Dashboard path: https://dashboard.vondera.app/dashboard/api

Open API key settings

Customer JWT

Account routes under /customer require Authorization: Bearer <token> from signup or login. Cart and checkout use userid / sessionId headers for guest sessions.

Useful headers

HeaderDescription
x-api-keyStore API key β€” required on /api/public
language / localeLocale (default en)
sessionIdAnonymous session for cart & analytics
useridCart identity (defaults to sessionId)
AuthorizationBearer <customer JWT> for account routes
x-store-domain / HostStore host β€” used by /api/ecommerce (checkUrl)

Enums

String values accepted by checkout, cart, and theme payloads.

paymentMethod / gatewayType

  • CASHCash on delivery
  • GATEWAYOnline card / payment gateway
  • DEPOSITPartial deposit then remainder COD
  • MANUALMerchant-configured manual payment (requires manualPaymentMethodId)

pickupMethod

  • SHIPPINGDeliver to customer address (default)
  • PICKUPCustomer picks up at a store location
  • EMAILDigital / email fulfillment (when enabled)

Cart line type

  • PRODUCTStandard product line (default)
  • BUNDLEProduct offer bundle β€” send bundleId + variants[]
  • GROUP_BUNDLEKit of components β€” send componentSelections[]

Order payment.paymentStatus

  • PENDINGAwaiting payment / COD
  • PAIDFully paid
  • PARTIALDeposit paid, remainder outstanding

themeing.popUpMessage.type

  • ANNOUNCEMENTInformational popup
  • LEADCollect email/phone (plan popUpAccess)
  • DISCOUNTLead capture that returns a discount code

Store

12

Bootstrap, shipping geography, builder settings, feeds, and attribution.

GET/store

Store bootstrap

Storefront settings, theme, SEO, features, currency, and checkout flags.

Query

NameTypeRequiredDescription
versionIdstringNoOptional website version preview id
curl --request GET 'https://production.api.vondera.app/api/public/store' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'

Errors

  • 404 Store not found
  • 400/404 invalid versionId
GET/store/shipping-countries

Shipping countries

List shipping countries for the current storefront market (global market stores).

curl --request GET 'https://production.api.vondera.app/api/public/store/shipping-countries' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'
GET/store/zones

Cities / zones

City/zone list used for checkout shipping.

Query

NameTypeRequiredDescription
countrystringNoOverride market country code
curl --request GET 'https://production.api.vondera.app/api/public/store/zones' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'

Errors

  • 400 unsupported country
GET/store/shipping-options

Shipping options

Available shipping options for a market/country.

Query

NameTypeRequiredDescription
countrystringNoMarket country code
curl --request GET 'https://production.api.vondera.app/api/public/store/shipping-options' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'
GET/store/pickup-locations

Pickup locations

Active pickup locations for PICKUP checkout.

curl --request GET 'https://production.api.vondera.app/api/public/store/pickup-locations' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'
GET/store/subzones

Courier sub-zones

Courier sub-zones for a city when showCourierZonesInCheckout is enabled.

Query

NameTypeRequiredDescription
cityIdstringYesCity / zone id
curl --request GET 'https://production.api.vondera.app/api/public/store/subzones' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'

Errors

  • 400 when courier zones disabled or invalid city
GET/store/builder/settings

Builder settings

Published (or draft) home-builder page sections for the storefront.

Query

NameTypeRequiredDescription
withDraftbooleanNoInclude draft when true
versionIdstringNoWebsite version preview id
curl --request GET 'https://production.api.vondera.app/api/public/store/builder/settings' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'
GET/store/sitemaptext/xml

XML sitemap

XML sitemap of products and pages for SEO.

curl --request GET 'https://production.api.vondera.app/api/public/store/sitemap' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'
GET/store/catalog

JSON catalog feed

JSON product catalog feed.

curl --request GET 'https://production.api.vondera.app/api/public/store/catalog' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'
GET/store/catalog.csvtext/csv

CSV catalog feed

CSV product catalog feed (legacy path).

curl --request GET 'https://production.api.vondera.app/api/public/store/catalog.csv' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'
POST/store/referral

Record referral / UTM

Record referral / UTM attribution for the browser session.

Headers

NameTypeRequiredDescription
sessionIdstringNoAnonymous session id (also accepted as sessionid)

Body fields

NameTypeRequiredDescription
referrerstringNoβ€”
sourcestringNoβ€”
mediumstringNoβ€”
campaignstringNoβ€”
contentstringNoβ€”
termstringNoβ€”
landingstringNoβ€”
curl --request POST 'https://production.api.vondera.app/api/public/store/referral' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"referrer":"https://google.com","source":"google","medium":"cpc","campaign":"spring"}'
POST/store/visit

Record storefront visit

Analytics visit ping for the storefront session.

Headers

NameTypeRequiredDescription
sessionIdstringNoAnonymous session id
curl --request POST 'https://production.api.vondera.app/api/public/store/visit' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{}'

Products

12

Catalog listing, PDP lookup, reviews, Q&A, and view tracking.

GET/products

List products

Paginated visible products. Supports search/filters passed through to the catalog DAO / Typesense.

Query

NameTypeRequiredDescription
limitnumberYesPage size
pageNonumber|stringNoPage number or cursor token
pagenumber|stringNoAlias of pageNo
fullDatabooleanNotrue for full ProductMapper.toEcommerce
cursorModestringNoCursor pagination mode when enabled
categoryIdstringNoβ€”
subCategoryIdstringNoβ€”
qstringNoSearch query (alias: search)
sortBystringNoβ€”
curl --request GET 'https://production.api.vondera.app/api/public/products' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'

Errors

  • 400 validation (missing limit)
GET/products/v2/

List products (cursor v2)

Cursor-based product list using pageKey.

Query

NameTypeRequiredDescription
limitnumberYesβ€”
pageKeystringNoβ€”
fullDatabooleanNoβ€”
curl --request GET 'https://production.api.vondera.app/api/public/products/v2/' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'
GET/products/single/slug/:slug

Product by slug

Full product detail by URL slug.

Query

NameTypeRequiredDescription
variantIdstringNoβ€”
curl --request GET 'https://production.api.vondera.app/api/public/products/single/slug/{slug}' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'

Errors

  • 404 Product Not Found
GET/products/single/resolve/:param

Resolve product

Resolve a product by id or slug in one path param.

Query

NameTypeRequiredDescription
variantIdstringNoβ€”
curl --request GET 'https://production.api.vondera.app/api/public/products/single/resolve/{param}' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'

Errors

  • 404 Product Not Found
GET/products/single/:id

Product by id

Full product detail by id.

Query

NameTypeRequiredDescription
variantIdstringNoβ€”
curl --request GET 'https://production.api.vondera.app/api/public/products/single/{id}' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'

Errors

  • 404 Product Not Found
POST/products/by-ids

Products by ids

Batch fetch products by ids (order preserved; missing β†’ null).

Body fields

NameTypeRequiredDescription
idsstring[]Yesβ€”
fullDatabooleanNoβ€”
curl --request POST 'https://production.api.vondera.app/api/public/products/by-ids' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"ids":["Product_abc","Product_def"],"fullData":false}'

Errors

  • 400 empty ids
POST/products/:productId/view

Record product view

Record a product view analytics event.

Headers

NameTypeRequiredDescription
x-event-idstringNoClient event idempotency key
curl --request POST 'https://production.api.vondera.app/api/public/products/{productId}/view' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{}'

Errors

  • 400 Product id required
POST/products/:productId/review

Submit review

Submit a product review (images optional as base64).

Body fields

NameTypeRequiredDescription
ratingnumberYesβ€”
namestringYesβ€”
emailstringYesβ€”
reviewstringNoβ€”
imagesBase64string[]Noβ€”
curl --request POST 'https://production.api.vondera.app/api/public/products/{productId}/review' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"rating":5,"name":"Sara","email":"sara@example.com","review":"Great quality"}'

Errors

  • 400 validation
  • 404 product
GET/products/:productId/review

List reviews

Paginated product reviews.

Query

NameTypeRequiredDescription
pageNonumberYesβ€”
limitnumberYesβ€”
sortstringNoβ€”
curl --request GET 'https://production.api.vondera.app/api/public/products/{productId}/review' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'
POST/products/:productId/qa

Ask a question

Submit a product Q&A question.

Body fields

NameTypeRequiredDescription
questionstringYesβ€”
namestringYesβ€”
emailstringNoβ€”
curl --request POST 'https://production.api.vondera.app/api/public/products/{productId}/qa' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"question":"Is this waterproof?","name":"Omar","email":"omar@example.com"}'
GET/products/:productId/qa

List Q&A

Paginated product questions & answers.

Query

NameTypeRequiredDescription
pageNonumberYesβ€”
limitnumberYesβ€”
curl --request GET 'https://production.api.vondera.app/api/public/products/{productId}/qa' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'

Categories

2

Visible category tree for storefront navigation.

GET/category

List categories

All visible categories (localized) with subcategories.

curl --request GET 'https://production.api.vondera.app/api/public/category' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'
GET/category/single/:id

Category by id

Single category by id.

curl --request GET 'https://production.api.vondera.app/api/public/category/single/{id}' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'

Errors

  • 404 not found

Cart

9

Session cart keyed by userid / sessionId headers.

GET/cart

Get cart

Current session cart. Empty cart if no userId.

Headers

NameTypeRequiredDescription
useridstringNoCart identity (defaults to sessionId)
sessionIdstringNoβ€”
curl --request GET 'https://production.api.vondera.app/api/public/cart' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'
GET/cart/count

Cart count

Cart line-item count.

curl --request GET 'https://production.api.vondera.app/api/public/cart/count' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'
GET/cart/suggestions

Cart suggestions

Cross-sell / cart suggestions for the current cart.

curl --request GET 'https://production.api.vondera.app/api/public/cart/suggestions' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'
POST/cart

Add to cart

Add a PRODUCT, BUNDLE, or GROUP_BUNDLE line.

Body fields

NameTypeRequiredDescription
productIdstringYesβ€”
quantitynumberNoRequired for PRODUCT (> 0)
variantIdstringNoβ€”
typePRODUCT|BUNDLE|GROUP_BUNDLENoDefault PRODUCT
bundleIdstringNoRequired for BUNDLE
variantsstring[]NoVariant ids for BUNDLE lines
componentSelectionsobject[]No[{ componentId, variantId }] for GROUP_BUNDLE
customizationResponsesobject[]Noβ€”
curl --request POST 'https://production.api.vondera.app/api/public/cart' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"productId":"Product_abc","quantity":1,"variantId":"var_1","type":"PRODUCT"}'

Errors

  • 400 invalid productId / quantity / bundle mismatch
  • 404 Product/Bundle not found
PUT/cart

Update cart line

Update quantity / selection for an existing cart line.

Body fields

NameTypeRequiredDescription
productIdstringYesβ€”
quantitynumberYesβ€”
variantIdstringNoβ€”
typePRODUCT|BUNDLE|GROUP_BUNDLENoβ€”
variantsstring[]Noβ€”
bundleIdstringNoβ€”
customizationResponsesobject[]Noβ€”
curl --request PUT 'https://production.api.vondera.app/api/public/cart' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"productId":"Product_abc","quantity":2,"variantId":"var_1","type":"PRODUCT"}'

Errors

  • 400/404 validation
DELETE/cart/item

Remove cart line

Remove one cart line.

Body fields

NameTypeRequiredDescription
productIdstringYesβ€”
variantIdstringNoβ€”
typePRODUCT|BUNDLE|GROUP_BUNDLENoβ€”
variantsstring[]Noβ€”
bundleIdstringNoβ€”
customizationResponsesobject[]Noβ€”
curl --request DELETE 'https://production.api.vondera.app/api/public/cart/item' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"productId":"Product_abc","variantId":"var_1","type":"PRODUCT"}'
DELETE/cart

Clear cart

Clear the entire cart for the session user.

curl --request DELETE 'https://production.api.vondera.app/api/public/cart' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'
POST/cart/view

Record cart view

Analytics event when the cart UI is opened.

Headers

NameTypeRequiredDescription
x-event-idstringNoβ€”

Body fields

NameTypeRequiredDescription
eventIdstringNoβ€”
curl --request POST 'https://production.api.vondera.app/api/public/cart/view' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{}'
POST/cart/funnel-abandon

Funnel abandon cart

Record an abandoned funnel checkout cart for recovery.

Body fields

NameTypeRequiredDescription
productIdstringYesβ€”
quantitynumberNoβ€”
variantIdstringNoβ€”
typePRODUCT|BUNDLE|GROUP_BUNDLENoβ€”
variantsstring[]Noβ€”
bundleIdstringNoβ€”
componentSelectionsobject[]Noβ€”
customizationResponsesobject[]Noβ€”
funnelIdstringNoβ€”
funnelLinkIdstringNoβ€”
funnelNamestringNoβ€”
schemaVersionnumberNoβ€”
isVersion2booleanNoβ€”
curl --request POST 'https://production.api.vondera.app/api/public/cart/funnel-abandon' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"productId":"Product_abc","quantity":1,"funnelLinkId":"summer-offer","funnelId":"fun_1"}'

Orders & Checkout

6

Payment methods, pricing, discount validation, and order creation.

GET/orders/payment-methods

Payment methods

Active payment methods for the checkout country.

Query

NameTypeRequiredDescription
shippingCountrystringNoβ€”
curl --request GET 'https://production.api.vondera.app/api/public/orders/payment-methods' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'

Errors

  • 400 unsupported shipping country
POST/orders/discount/validate

Validate discount

Validate a promo code against cart products.

Body fields

NameTypeRequiredDescription
codestringYesβ€”
productsobject[]NoCart lines with id, quantity, …
cityIdstringNoβ€”
pickupMethodSHIPPING|PICKUPNoβ€”
shippingCountrystringNoβ€”
shippingOptionIdstringNoβ€”
subZoneIdstringNoβ€”
gatewayTypeCASH|GATEWAY|DEPOSIT|MANUALNoβ€”
gatewayIdstringNoβ€”
curl --request POST 'https://production.api.vondera.app/api/public/orders/discount/validate' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"code":"SAVE10","products":[{"id":"Product_abc","quantity":1,"variantId":"var_1"}],"gatewayType":"CASH","pickupMethod":"SHIPPING"}'
POST/orders/price

Calculate price

Calculate items, shipping, taxes, gateway fees, and discounts.

Body fields

NameTypeRequiredDescription
productsarrayYesβ€”
discountCodestringYesMay be empty string
cityIdstringNoβ€”
pickupMethodSHIPPING|PICKUPNoβ€”
gatewayTypeCASH|GATEWAY|DEPOSIT|MANUALNoβ€”
gatewayIdstringNoβ€”
shippingOptionIdstringNoβ€”
shippingCountrystringNoβ€”
subZoneIdstringNoβ€”
skipAutoApplybooleanNoβ€”
funnelIdstringNoβ€”
funnelLinkIdstringNoβ€”
curl --request POST 'https://production.api.vondera.app/api/public/orders/price' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"products":[{"id":"Product_abc","quantity":1,"variantId":"var_1","type":"PRODUCT"}],"discountCode":"","cityId":"cairo","pickupMethod":"SHIPPING","gatewayType":"CASH"}'

Errors

  • 400 Invalid city / shipping country
POST/orders/init-checkout

Init checkout

Fire checkout-initiated analytics. Body shape matches /orders/price.

curl --request POST 'https://production.api.vondera.app/api/public/orders/init-checkout' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"products":[{"id":"Product_abc","quantity":1}],"discountCode":"","pickupMethod":"SHIPPING","gatewayType":"CASH"}'

Errors

  • 400 Invalid city / shipping country
POST/orders

Create order

Create a checkout order. Rate-limited per IP. Captcha may be required for CASH/MANUAL.

Body fields

NameTypeRequiredDescription
namestringYesβ€”
phonestringYesβ€”
emailstringYesβ€”
notesstringYesMay be empty string
paymentMethodCASH|GATEWAY|DEPOSIT|MANUALYesβ€”
discountCodestringYesMay be empty string
productsarrayYesβ€”
otherPhonestringNoβ€”
addressstringNoβ€”
citystringNoβ€”
cityIdstringNoβ€”
countryCodestringNoβ€”
pickupMethodSHIPPING|PICKUP|EMAILNoβ€”
courierSubZoneIdstringNoβ€”
subZoneIdstringNoβ€”
subZoneNamestringNoβ€”
shippingOptionIdstringNoβ€”
pickupLocationIdstringNoβ€”
shippingCountrystringNoβ€”
manualPaymentMethodIdstringNoβ€”
receiptImagestringNoβ€”
turnstileTokenstringNoRequired when store.requireCheckoutCaptcha
cloudFlareTokenstringNoAlias of turnstileToken
skipAutoApplybooleanNoβ€”
funnelIdstringNoβ€”
funnelLinkIdstringNoβ€”
funnelNamestringNoβ€”
templateIdstringNoβ€”
curl --request POST 'https://production.api.vondera.app/api/public/orders' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"name":"Ahmed Hassan","phone":"01012345678","email":"ahmed@example.com","notes":"","paymentMethod":"CASH","discountCode":"","products":[{"id":"Product_abc","quantity":1,"variantId":"var_1","type":"PRODUCT"}],"address":"12 Nile St","cityId":"cairo","countryCode":"+20","pickupMethod":"SHIPPING"}'

Errors

  • 400 validation / captcha / stock / payment method
  • 429 rate limit
GET/orders/single/:id

Get order

Fetch an order by id (host-market scoped). Customer PII may be masked.

curl --request GET 'https://production.api.vondera.app/api/public/orders/single/{id}' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'

Errors

  • 404 Order Not Found

Customer Account

13

Storefront customer auth, profile, orders history, and wishlist. JWT routes need Authorization: Bearer.

POST/customer/signup

Sign up

Register a storefront customer. Turnstile may be required.

Body fields

NameTypeRequiredDescription
namestringYesβ€”
emailstringYesβ€”
passwordstringYesMin 6 characters
phonestringYesβ€”
addressstringNoβ€”
govstringNoβ€”
countryCodestringNoβ€”
newsLetterEnabledbooleanNoβ€”
cloudFlareTokenstringNoβ€”
curl --request POST 'https://production.api.vondera.app/api/public/customer/signup' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"name":"Sara Ali","email":"sara@example.com","password":"secret12","phone":"01098765432","newsLetterEnabled":true}'

Errors

  • 400 invalid email/phone/name/password
  • 400 email/phone already exists
  • 400 captcha failure
POST/customer/login

Log in

Customer login. Migrates guest cart into the customer id.

Body fields

NameTypeRequiredDescription
emailstringYesβ€”
passwordstringYesβ€”
curl --request POST 'https://production.api.vondera.app/api/public/customer/login' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"email":"sara@example.com","password":"secret12"}'

Errors

  • 401 Invalid Email or Password
GET/customerCustomer JWT

Current customer

Profile for the authenticated customer (password never returned).

curl --request GET 'https://production.api.vondera.app/api/public/customer' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'Authorization: Bearer CUSTOMER_JWT' \
  --header 'language: en'

Errors

  • 401 Unauthorized
PUT/customer/updateCustomer JWT

Update profile

Update profile fields.

Body fields

NameTypeRequiredDescription
namestringNoβ€”
emailstringNoβ€”
phonestringNoβ€”
addressstringNoβ€”
govstringNoβ€”
countryCodestringNoβ€”
curl --request PUT 'https://production.api.vondera.app/api/public/customer/update' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'Authorization: Bearer CUSTOMER_JWT' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"name":"Sara Ali","phone":"01098765432","address":"15 Corniche"}'

Errors

  • 401
  • 400 validation
PUT/customer/change-passwordCustomer JWT

Change password

Change password with current password verification.

Body fields

NameTypeRequiredDescription
currentPasswordstringYesβ€”
newPasswordstringYesβ€”
curl --request PUT 'https://production.api.vondera.app/api/public/customer/change-password' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'Authorization: Bearer CUSTOMER_JWT' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"currentPassword":"secret12","newPassword":"newSecret99"}'

Errors

  • 400 wrong current password
POST/customer/forget

Forgot password

Request password-reset email (always 200 to avoid enumeration).

Body fields

NameTypeRequiredDescription
emailstringYesβ€”
curl --request POST 'https://production.api.vondera.app/api/public/customer/forget' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"email":"sara@example.com"}'
POST/customer/reset-password

Reset password

Reset password with the email token.

Body fields

NameTypeRequiredDescription
tokenstringYesβ€”
newPasswordstringYesβ€”
curl --request POST 'https://production.api.vondera.app/api/public/customer/reset-password' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"token":"reset_token","newPassword":"newSecret99"}'

Errors

  • 400 invalid/expired token
DELETE/customerCustomer JWT

Delete account

Soft-delete account credentials (clears email/password).

curl --request DELETE 'https://production.api.vondera.app/api/public/customer' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'Authorization: Bearer CUSTOMER_JWT' \
  --header 'language: en'
GET/customer/ordersCustomer JWT

Customer orders

Logged-in customer order history.

Query

NameTypeRequiredDescription
pageNonumberNoβ€”
limitnumberNoβ€”
curl --request GET 'https://production.api.vondera.app/api/public/customer/orders' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'Authorization: Bearer CUSTOMER_JWT' \
  --header 'language: en'
GET/customer/wishlistCustomer JWT

Wishlist

Wishlist products.

Query

NameTypeRequiredDescription
pagenumberNoβ€”
limitnumberNoβ€”
curl --request GET 'https://production.api.vondera.app/api/public/customer/wishlist' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'Authorization: Bearer CUSTOMER_JWT' \
  --header 'language: en'
POST/customer/wishlistCustomer JWT

Add to wishlist

Add a product to the wishlist.

Body fields

NameTypeRequiredDescription
productIdstringYesβ€”
curl --request POST 'https://production.api.vondera.app/api/public/customer/wishlist' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'Authorization: Bearer CUSTOMER_JWT' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"productId":"Product_abc"}'

Errors

  • 404 product
DELETE/customer/wishlistCustomer JWT

Remove from wishlist

Remove a product from the wishlist.

Body fields

NameTypeRequiredDescription
productIdstringYesβ€”
curl --request DELETE 'https://production.api.vondera.app/api/public/customer/wishlist' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'Authorization: Bearer CUSTOMER_JWT' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"productId":"Product_abc"}'
PUT/customer/unsubscribe

Marketing unsubscribe (token)

Unsubscribe from marketing using an email token (no session auth).

Body fields

NameTypeRequiredDescription
unSubscribeTokenstringYesβ€”
curl --request PUT 'https://production.api.vondera.app/api/public/customer/unsubscribe' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"unSubscribeToken":"token_…"}'

Errors

  • 400 invalid token

Custom Pages

2

CMS pages such as policies and about (plan customPagesAccess).

GET/custompages

List custom pages

List custom CMS pages (localized).

curl --request GET 'https://production.api.vondera.app/api/public/custompages' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'
GET/custompages/single/:id

Custom page by id/slug

Single custom page by id or link slug.

curl --request GET 'https://production.api.vondera.app/api/public/custompages/single/{id}' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'

Errors

  • 404

Blogs

3

Store blog index and live posts (plan blogs access).

GET/blogs

List blogs

Ensure default blog and return blogs metadata.

curl --request GET 'https://production.api.vondera.app/api/public/blogs' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'
GET/blogs/posts

List posts

Live blog posts (paginated via limit/offset).

Query

NameTypeRequiredDescription
limitnumberNo1–50, default 20
offsetnumberNoDefault 0
curl --request GET 'https://production.api.vondera.app/api/public/blogs/posts' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'
GET/blogs/posts/:slug

Post by slug

Single live blog post with SEO payload.

curl --request GET 'https://production.api.vondera.app/api/public/blogs/posts/{slug}' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'

Errors

  • 404 Post Not Found

Funnels

4

Sales funnel pages (plan funnelsAccess). 410 when the plan does not support funnels.

GET/funnels/:linkId

Funnel by link

Classic funnel payload by public link id.

curl --request GET 'https://production.api.vondera.app/api/public/funnels/{linkId}' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'

Errors

  • 410 plan does not support funnels
  • 404
GET/funnels/:linkId/v2

Funnel v2

Funnel v2 payload.

curl --request GET 'https://production.api.vondera.app/api/public/funnels/{linkId}/v2' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'

Errors

  • 410
  • 404
GET/funnels/:linkId/page

Funnel page

Rendered funnel page document for storefront hosting.

curl --request GET 'https://production.api.vondera.app/api/public/funnels/{linkId}/page' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'

Errors

  • 410
  • 404
GET/funnels/:linkId/bootstrap

Funnel bootstrap

Checkout bootstrap for a funnel β€” product, payments, and settings.

curl --request GET 'https://production.api.vondera.app/api/public/funnels/{linkId}/bootstrap' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'

Errors

  • 410
  • 404

Marketing

6

Newsletter subscribe, popup leads, and checkout contact capture.

POST/marketing/subscribe

Subscribe

Subscribe an email to the store marketing list (consent required).

Body fields

NameTypeRequiredDescription
emailstringYesβ€”
consentbooleanYesβ€”
sourcestringNoDefault footer
phonestringNoβ€”
curl --request POST 'https://production.api.vondera.app/api/public/marketing/subscribe' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"email":"fan@example.com","consent":true,"source":"footer"}'

Errors

  • 400 Invalid email
  • 400 Consent is required
PUT/marketing/unsubscribe

Unsubscribe

Unsubscribe via token (preferred) or email.

Body fields

NameTypeRequiredDescription
emailstringNoβ€”
tokenstringNoβ€”
curl --request PUT 'https://production.api.vondera.app/api/public/marketing/unsubscribe' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"token":"unsub_token"}'
POST/marketing/unsubscribe-link

One-click unsubscribe (POST)

RFC 8058 one-click List-Unsubscribe POST.

Query

NameTypeRequiredDescription
tokenstringNoβ€”

Body fields

NameTypeRequiredDescription
tokenstringNoβ€”
curl --request POST 'https://production.api.vondera.app/api/public/marketing/unsubscribe-link' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"token":"unsub_token"}'
POST/marketing/popup-lead

Popup lead

Capture popup / lead form email or phone. Requires sessionId + userid headers from /store/referral.

Headers

NameTypeRequiredDescription
sessionIdstringYesβ€”
useridstringYesβ€”

Body fields

NameTypeRequiredDescription
emailstringNoβ€”
phonestringNoβ€”
curl --request POST 'https://production.api.vondera.app/api/public/marketing/popup-lead' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"email":"lead@example.com"}'

Errors

  • 400 sessionId required
  • 403 Popup feature not enabled
POST/marketing/checkout-contact

Checkout contact

Progressive checkout contact capture (blur/debounce β€” does not create an order).

Body fields

NameTypeRequiredDescription
emailstringNoβ€”
phonestringNoβ€”
consentbooleanNoβ€”
funnelIdstringNoβ€”
funnelLinkIdstringNoβ€”
funnelNamestringNoβ€”
schemaVersionnumberNoβ€”
isVersion2booleanNoβ€”
curl --request POST 'https://production.api.vondera.app/api/public/marketing/checkout-contact' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"email":"shopper@example.com","phone":"01012345678","consent":true}'

Catalog Feeds

3

CSV feeds for Meta, TikTok, and Google Merchant Center.

GET/catalogs/meta-catalog.csvtext/csv

Meta catalog CSV

Meta / Facebook product catalog CSV feed.

curl --request GET 'https://production.api.vondera.app/api/public/catalogs/meta-catalog.csv' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'
GET/catalogs/tiktok-catalog.csvtext/csv

TikTok catalog CSV

TikTok product catalog CSV feed.

curl --request GET 'https://production.api.vondera.app/api/public/catalogs/tiktok-catalog.csv' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'
GET/catalogs/google-catalog.csvtext/csv

Google catalog CSV

Google Merchant Center CSV feed.

curl --request GET 'https://production.api.vondera.app/api/public/catalogs/google-catalog.csv' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en'

Password Unlock

2

Host-scoped unlock when the storefront has password protection enabled. Mounted at /storefront/*.

POST/storefront/unlock

Unlock storefront

Verify password and set unlock cookie / return token.

Body fields

NameTypeRequiredDescription
passwordstringYesβ€”
curl --request POST 'https://production.api.vondera.app/api/public/storefront/unlock' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"password":"store-password"}'

Errors

  • 400 Password protection is not enabled
  • 401 Incorrect password
POST/storefront/unlock/verify

Verify unlock token

Verify an unlock token when the storefront host cannot verify HMAC locally.

Body fields

NameTypeRequiredDescription
tokenstringYesβ€”
curl --request POST 'https://production.api.vondera.app/api/public/storefront/unlock/verify' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'language: en' \
  --header 'Content-Type: application/json' \
  --data '{"token":"…"}'