# Introduction ## What is Geins? Geins is an **API-first commerce backend** that handles products, orders, inventory, payments, and fulfillment—so you can focus on building great customer experiences. ::card-group :::card --- icon: i-lucide-rocket title: Quickstart to: https://geins.io/docs/getting-started/quickstart --- Make your first API call in under 5 minutes ::: :::card --- icon: custom:geins-g title: Geins Concept to: https://geins.io/docs/getting-started/concept --- Understand the core architecture and data model ::: :::card --- icon: i-lucide-book-open title: API Reference (Merchant API) to: https://geins.io/developers/merchant-api --- Full API documentation and examples for the Merchant API ::: :::card --- icon: i-lucide-book-open title: API Reference (Management API) to: https://geins.io/developers/management-api --- Full API documentation and examples for the Management API ::: :: ## Two APIs, One Platform | API | Type | Best For | | ------------------ | ------- | -------------------------------------------- | | **Merchant API** | GraphQL | Storefronts, product display, cart, checkout | | **Management API** | REST | Back-office, integrations, inventory sync | ## Quick Example Fetch products with a single GraphQL query: ```graphql query { products(take: 5) { products { productId name alias } } } ``` ## Why Geins? - **🔌 API-First** — Build web, mobile, POS, IoT, or anything else - **🚀 Production-Ready** — Cloud-native, auto-scaling infrastructure - **🛠️ Developer Experience** — SDKs, launchpads, and comprehensive docs - **🔄 Flexible Integrations** — Connect ERPs, payment providers, shipping carriers ::callout --- icon: i-lucide-arrow-right to: https://geins.io/docs/getting-started/quickstart --- Ready to start? Jump to the **Quickstart** guide. :: # Quickstart ## Your First API Call in 5 Minutes Get your API key and make your first call to the Geins Merchant API. ### Step 1: Get Your API Key 1. Log in to your [account](https://geins.io/login) 2. Got to the Merchant Center, navigate to **Settings** → **API Keys** 3. Create a new API key or copy an existing one ### Step 2: Make Your First Call ::code-group ```bash [cURL] curl -X POST 'https://merchantapi.geins.io/graphql' \ -H 'Content-Type: application/json' \ -H 'X-ApiKey: {MERCHANT_API_KEY}' \ -d '{ "query": "query { products(take: 3) { products { productId name alias } } }" }' ``` ```javascript [JavaScript] const response = await fetch('https://merchantapi.geins.io/graphql', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-ApiKey': '{MERCHANT_API_KEY}', }, body: JSON.stringify({ query: ` query { products(take: 3) { products { productId name alias } } } `, }), }); const data = await response.json(); console.log(data.data.products.products); ``` ```python [Python] import requests response = requests.post( 'https://merchantapi.geins.io/graphql', headers={ 'Content-Type': 'application/json', 'X-ApiKey': '{MERCHANT_API_KEY}', }, json={ 'query': ''' query { products(take: 3) { products { productId name alias } } } ''' } ) print(response.json()) ``` :: ### Step 3: Explore the Response ```json { "data": { "products": { "products": [ { "productId": 12345, "name": "Awesome Product", "alias": "awesome-product" } ] } } } ``` 🎉 **Congratulations!** You've just made your first Geins API call! ## Next Steps ::card-group :::card --- icon: custom:geins-g title: Geins Concept to: https://geins.io/docs/getting-started/concept --- Understand channels, products, and the data model ::: :::card --- icon: i-lucide-book-open title: Full API Reference to: https://geins.io/developers/merchant-api --- Explore all available queries and mutations ::: :::card --- icon: i-lucide-layers title: Open Source Launchpads to: https://geins.io/developers/open-source --- Starter projects for Nuxt, Next.js, and more ::: :: # Geins Concept ## Architecture Overview Geins is a **headless commerce backend**—we handle all the e-commerce logic while you build the frontend experience your customers deserve. ```text ┌─────────────────────────────────────────────────────────┐ │ SALES CHANNELS │ │ (Web, Mobile, POS, IoT, Voice, AR/VR) │ └─────────────────────────┬───────────────────────────────┘ │ ▼ ┌─────────────────────┐ │ Merchant API │ │ (GraphQL) │ └─────────────────────┘ │ ┌─────────────────────────┴───────────────────────────────┐ │ GEINS COMMERCE BACKEND │ └─────────────────────────┬───────────────────────────────┘ │ ┌─────────────────────┐ │ Management API │ │ (REST) │ └─────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────┐ │ BACKENDS │ │ (ERP, WMS, PIM, Marketing, BI) │ └─────────────────────────────────────────────────────────┘ ``` ## Core Concepts ### Channels A **channel** represents a sales portal—your website, mobile app, or marketplace presence. Each channel can have: - Different product assortments and pricing - Multiple languages and currencies - Custom checkout flows and payment methods [Learn more about multi-market support →](https://geins.io/developers/how-to/use-multi-market-support) ### Products & Variants Products in Geins can have multiple **variants** (size, color, material), each with: - Unique SKU and barcode - Individual pricing and inventory - Variant-specific images [Learn more about products →](https://geins.io/developers/how-to/get-product) ### Cart & Checkout The Merchant API handles the complete purchase flow: 1. **Add to cart** — Create cart, add/update items 2. **Checkout** — Collect shipping, apply discounts 3. **Payment** — Integrate with payment providers 4. **Order** — Create order, trigger fulfillment [Learn more about checkout →](https://geins.io/developers/how-to/checkout-headless-cart) ### Content Management Geins includes a built-in CMS for: - **Pages** — Landing pages, campaigns, content - **Widgets** — Reusable content blocks - **Personalization** — Targeted content based on user segments [Learn more about CMS →](https://geins.io/developers/how-to/get-cms-pages) ### Authentication & Personalization Create logged-in experiences with secure, signature-based authentication: - **User management** — Register, login, password reset, logout - **Personalized pricing** — B2B, VIP tiers, contract pricing per customer - **Targeted content** — Personalized banners and recommendations [Learn more about authentication →](https://geins.io/developers/guides/authentication-flow) ## Data Flow | What you need | API to use | Example | | ---------------- | -------------- | --------------------------------- | | Display products | Merchant API | Product listings, search, filters | | Build a cart | Merchant API | Add items, calculate totals | | Process checkout | Merchant API | Payments, shipping options | | Sync with ERP | Management API | Inventory, order export | | Update catalog | Management API | Bulk product updates | ## Next Steps ::card-group :::card --- icon: i-lucide-book-open title: API Reference to: https://geins.io/developers/merchant-api --- Explore the full Merchant API documentation ::: :::card --- icon: i-lucide-rocket title: Open Source Launchpads to: https://geins.io/developers/open-source --- Get started with a pre-built storefront template ::: :: # Channels ## Description A channel represents a distinct sales avenue or storefront. Each channel can have its own: - Products: Specific products available in that channel. - Configurations: Pricing, discounts, and other channel-specific configurations. - Settings: Localization, market, currency, etc. Channels, markets, and languages are closely related: - A channel can include one or more markets. - Each market defines its currency, default VAT rate, and country of sale. - You choose which languages are available for each channel. Channels enable you to manage multiple storefronts or sales channels within a single application, providing flexibility and scalability. ### Common use cases - Operate B2B, B2C, or multiple brands in parallel, each with its own catalog. - Offer region-specific assortments, prices, taxes, and content. - Support omnichannel while managing shared data centrally. --- ### How to use the feature 1. Create a channel and set: name, active state, URL, default country, currency, language, and VAT rate. 2. Add markets to the channel. 3. Choose languages available for the channel and per market. 4. Attach or configure channel-scoped entities. 5. Optional: enable automatic price calculation and choose rounding. ### Capabilities and features - Sales channel management with dedicated settings. - Market management per channel (currency, VAT, country, grouping). - Channel- and market-level product availability. - Channel- and language-level website metadata. - Per-channel languages and per-market allowed languages. - Per-channel configuration. - Categories and brands visibility driven by product assignments. - Localized pricing and taxes by market. - Automatic price calculation with rounding strategies. --- ### Key attributes | Attribute | Description | | ---------------------------- | ------------------------------------------------------- | | Channel name | Display name of the channel. | | Active | Enable or disable a channel. | | URL | Base URL for the webshop. | | Default country | Channel-level default country. | | Default currency | Channel-level default currency. | | Default language | Channel-level default language. | | Default VAT rate | Channel-level default VAT. | | Markets | Collection of market configurations within the channel. | | Market: Name | Optional display name (can differ from country). | | Market: Country | Country of sale for the market. | | Market: Currency | Currency used in the market. | | Market: Standard VAT rate | VAT rate for the market. | | Market: Group | Logical grouping (e.g., EU, Asia). | | Market: Allowed languages | Languages allowed in the market. | | Market: Default shipping fee | Default shipping fee for the market. | ### Related features and concepts | Entity | Relation | | ---------------------------- | ---------------------------------------------------------------- | | Products | Availability can be set per channel and per market. | | Orders | Connected to a channel and market. | | Price lists | Different pricing set per channel and per market. | | Promotions | Scoped to channels and their markets. | | Payments | Methods and settings configurable per channel or market. | | Shipping | Methods, rates, and defaults configurable per channel or market. | | Markets | One or more markets belong to a channel. | | CMS Content | Channel-specific content and localization. | | Customers | Segmentation can be channel-specific. | | Mail | Templates, and settings configurable per channel. | | Feeds | Channel-specific product feeds. | | Meta information | Channel-scoped metadata. | | General Settings and toggles | Overrides settings or toggles at the channel level. | | Categories | Availability follows assigned products per channel/market. | | Brands | Availability follows assigned products per channel/market. | # Markets The **markets** functionality provides management of regional or country-based configurations within a sales channel. Each **channel** can include multiple **markets**, allowing merchants to define local settings such as currency, VAT, country, and language preferences. This enables a single commerce setup to efficiently support international operations with localized experiences. --- ### Market key configurations: | Type | Description | | ------------------------ | -------------------------------------------------------------------------- | | **Market name** | Optional display name (can differ from the country). | | **Country** | Defines the primary country of sale. | | **Currency** | Specifies which currency is used in the market. | | **Standard VAT rate** | VAT rate applied within the market. | | **Group** | Logical grouping (e.g., EU, Asia) to simplify configuration and reporting. | | **Allowed languages** | Defines which languages are available in this market. | | **Default shipping fee** | Default shipping fee configuration for the market. | --- ## Typical use cases The markets functionality enables a variety of use cases, providing flexibility in managing and optimizing localized e-commerce operations. ### 1. Multi-region commerce setup Markets allow a single channel to support multiple regions with different configurations. :br Examples include: - Setting up individual markets for Sweden, Norway, and Finland within one Nordic channel. - Applying country-specific VAT rates, currencies, and shipping fees automatically. ### 2. Localized customer experience Markets make it possible to adapt the storefront experience to local requirements. :br Examples include: - Displaying prices in local currency with correct VAT and rounding. - Offering market-specific languages, content, or product selections. ::tip Payments can also be configured per market to support local payment methods and gateways. :: ### 3. Operational grouping Grouping markets enables easier management and data insights across regions. :br Examples include: - Grouping all EU markets under a shared “EU” configuration for VAT handling. - Running performance reports by market group (e.g., “Asia” or “North America”). --- ## Related functionality | Related feature | Description | | --------------------- | -------------------------------------------------------------------------- | | **Channels** | Markets exist within channels and inherit base channel settings. | | **Currencies** | Defines available currencies and exchange rate handling per market. | | **VAT configuration** | Connects market-level VAT settings with product and checkout calculations. | | **Languages** | Controls localized storefront content and translations per market. | | **Payments** | Uses market-level default payment methods and gateways. | | **Shipping** | Uses market-level default shipping fees and rules. | # Currencies Geins supports multiple currencies to facilitate international sales across different regions. Each currency is defined by its ISO 4217 code, symbol, and formatting rules. --- ### Pricing Automatic price calculation lets you manage base prices in the default channel/currency and derive other prices by: - Exchange rate plus a multiplier (set on the channel or the currency). - Optional rounding: nearest integer, nearest 9/.9 or , nearest 5/.5 ::note Although prices can automatically be calculated based on exchange rates, the actual exchange rates are not updated automatically. You need to update exchange rates manually. :: ## Related functionality | Related feature | Description | | --------------- | ---------------------------------------------------------------------------- | | **Channels** | Set a default currency for the channel. | | **Markets** | Each market defines its currency. | | **Products** | Product prices are defined per currency and market. | | **Orders** | Orders capture prices in the currency of the market at the time of purchase. | # Products ## Description Flexible product model with predefined fields and custom, localizable attributes. Per‑channel/market pricing and availability with tax handling and lowest‑price tracking. Variants as multiple SKUs or via Variant Groups; stock and locations managed at the SKU level. --- ## How to use In order to publish a product you have to set at least the following fields: - Name - Price - Main Category - Brand - Image - Active (true) If the above fields are set, the product is published automatically and the date and time of the publication is recorded. :br:br ::note Products can be published only if all referenced categories and brands are published. :: ## Capabilities and features - Prices per channel and market. Changes are logged. - Localizable texts - Automatic calculation of lowest price 30 days to accomodate EU regulations - Automatic price calculation with exchange rates and rounding strategies - Availability: Product availability is set per channel and market and can be scheduled - Stock balance can be configured to control availability - Configuration of Taxes per market - Customizable attributes - Text attribute are localizable - Variant handling - Catalog organization by - Categories - Brands - Relations between products - Product information - Texts - Standard fields - Media: Images can be uploaded and organzied with tags. It is possible to configure different image size that are created automatically upon upload. - Inventory Management - Stock balance - Backorder allocation - Transaction log - Product monitoring - Notifications to end customers when product back in stock. - Package products --- ## Key attributes | Attribute | Description | | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------- | | Name | Localizable name of the product. | | Active | Enable or disable the product. | | URL | URL for the product. Set automatically based on the product name and configured URL format. | | Article number | Set the article number on the product level. | | Categories | Choose a main category (required) and optionally one ore several minor category relations. | | Brand | Choose from a list of configured brands. | | Supplier | Choose from a list of configured suppliers. | | Dimensions | Weight, Width, Height and Length. | | Customs information | Intrastat code and country of origin. | | Prices | 3 price fields: regular, sale and campaign (set by campaign/promotion module). | | Max discount | Use it to define the maximum discount percentage for the product | | Purchase price | The average cost of the product in a selected currency. | | Publication date | Used to schedule publication. | | Texts | 3 localizable product text fields are included. | | Metadata | Localizable Web metadata fields are included. | | Attribute values | Select one or more attribute groups for the product. Each group contains a list of attributes you can set on the product. | | SKU: Name | Name is required for a SKU. | | SKU: Stock | In stock, oversellable or static. | | SKU: Incoming date | Used to inform about the incoming date for out of stock products. | | SKU: Dimensions | Weight, Width, Height and Length. Optional and when set overrides dimensions set on product level | | SKU: Article number | Set the article number on the SKU level. | | SKU: GTIN Unique global identifier for products. | | | SKU: Shelf. | Name/Identifier of the shelf in the warehouse | ## Related features and concepts | Entity | Relation | | ---------------- | ---------------------------------------------------- | | Orders | Every order includes at least one purchased product. | | Purchase Orders | Every purchase order includes at least one product. | | Pricing | Different pricing set per channel and per market. | | Price lists | Different pricing set per channel and per market. | | Promotions | Promotions can be applied on products. | | Channels | Scoped to channels and their markets. | | CMS Content | Products can be part of CMS content. | | Mail | Product information is displayed in various emails. | | Feeds | Channel-specific product feeds. | | Meta information | localizable metadata. | | Categories | Every product have at least one assigned category. | | Brands | Every product must have an assigned brand. | --- # Product variants The **product variants** functionality defines how variations of a product are structured and managed in the catalog. Variants enable flexible handling of product attributes such as size, color, fit, or material — essential for both B2C and B2B use cases. --- ## Primary methods for managing variants Two methods are available for handling variants: - Multiple SKUs on a single product. - A Variant Group that connects separate products. Every product must have at least one SKU. A product can also include multiple SKUs (e.g., S, M, L for fashion). Stock and warehouse shelf locations are managed at the SKU level. A Variant Group links individual products and lets you specify one or more variant dimensions on the connection (e.g., color: red; fit: slim). You can designate a main product for the Variant Group and collapse product listings to show only the main product. ::note Every product must have at least one SKU. Variant structures determine how data is grouped, displayed, and synchronized between product information, stock, and storefront listings. :: ::tip Both methods are often used together. For example, create separate products for each color variant and connect them in a Variant Group; sizes then exist as SKUs on each color variant. :: --- ## Key configurations | Type | Description | | ---------------------- | ------------------------------------------------------------------------------ | | **SKU** | Unique identifier for a specific product variation. Required for all products. | | **Variant dimensions** | Attributes that differentiate variants, such as size, color, or fit. | | **Variant group** | A group that connects several variants of the same product. | | **Main product** | The designated product representing the variant group in listings. | | **Inventory link** | Connects stock data and shelf locations at the SKU level. | --- ## Typical use cases The product variant functionality enables a variety of use cases, providing flexibility in catalog structure and merchandising control. ### 1. Managing simple variants on a single product Handle multiple SKUs (e.g., sizes) directly on one product entry. :br Examples include: - Managing stock levels per size (S, M, L). - Displaying all available sizes under a single product detail page. ### 2. Grouping multiple products as variants Link related products together via a **variant group** for cleaner storefront presentation. :br Examples include: - Connecting color variants (red, blue, green) as part of the same product family. - Displaying a single main product with selectable color options. ::note Available variant group dimensions are configurable and needs to be defined in advance. :: ### 3. Combining both methods for advanced catalogs Use both SKU-level and product-level variants for complex products. :br Examples include: - Color variants as separate products, each with its own set of size SKUs. - Managing warehouse stock per SKU while showing one unified product in the storefront. --- ## Related functionality | related feature | description | | --------------------- | ---------------------------------------------------------------------------------- | | **products** | Base entity for catalog structure. Variants extend product data and relationships. | | **inventory / stock** | Stock management occurs at the SKU level, connected to each variant. | | **pricing** | Supports per-variant or per-SKU pricing logic. | | **media and assets** | Variant-specific images or media can be assigned (e.g., color photos). | | **PIM integration** | Enables external product data synchronization for variant management. | ::tip Use variant groups to simplify product listings and improve storefront navigation. Managing inventory at the SKU level ensures accurate availability tracking across all variants. :: # Product relations The **product relations** functionality allows you to create logical connections between products in the catalog. For example, a USB cord can be related to a USB charger, or a phone case\*\* can be linked as an accessory to a smartphone. ## Default relation types Out of the box, the system includes three default relation types: - **related** - **accessory** - **similar** ::note Additional or custom relation types can be configured in the Merchant Center or through the Management API. :: --- ## Typical use cases The product relations functionality enables several ways to enhance discoverability, product bundling, and upselling opportunities. ### 1. Showing related products Display similar or complementary products on the product detail page. Examples include: - Showing alternative models or editions of the same product. - Linking items frequently bought together. ### 2. Adding product accessories Connect compatible items that can be purchased alongside the main product. Examples include: - Linking a **USB cable** to a **charger**. - Suggesting **printer cartridges** for a **printer**. ### 3. Managing alternative or replacement products Use “similar” relations to help customers find comparable items if one is out of stock. Examples include: - Suggesting replacement parts or newer versions of a discontinued product. - Displaying products with similar attributes or specifications. --- ## Related functionality | Type | Description | | ------------------- | ----------------------------------------------------------------- | | **Products** | Product relations link two or more products within the catalog. | | **Management API** | Enables creating and updating product relations programmatically. | | **Merchant Center** | Provides a UI for managing product relations manually. | # Product inventory The **inventory** functionality handles product stock levels and availability across the platform. :br Inventory defines how stock quantities are tracked, allocated, and updated based on warehouse operations, order processing, and returns. Only one warehouse is currently supported, simplifying stock tracking and transactions. :br Each SKU (variant) maintains its own stock information to ensure accurate availability across the catalog. ::note Stock levels are managed per SKU. All adjustments are categorized by transaction types to ensure traceability and accurate stock reporting. :: ::note Backorder allocation is automatic. :: --- ## Stock levels Stock levels are represented by three fields: - **In stock**: Number of units (SKUs) physically available in the warehouse. - **Oversellable**: Number of units that can be sold beyond the available amount, often linked to an external supplier stock balance. - **Static**: Always available; limits the quantity that can be purchased at one time. Often used for products manufactured ad hoc. ::note Upon new goods delivery Average Cost per Unit must be calculated either using built in function or manually. :: --- ## Typical use cases The inventory functionality enables efficient stock control, accurate product availability, and automated transaction tracking. Below are some common scenarios working with inventory that are beneficial: ### 1. Managing available stock Maintain accurate counts of physically available units. Examples include: - Updating “in stock” levels when receiving new goods. - Automatically decreasing stock after an order is completed. ### 2. Allowing overselling for supplier-managed products Enable sales beyond on-hand stock when supply chains allow. Examples include: - Selling items with guaranteed restock from a supplier. - Using oversellable values to maintain availability for dropshipped items. ::tip Working with oversellable stock enables flexible handling of delivery times. By configuring products with oversellable quantities, you can communicate varying delivery times directly in the storefront — for example, showing longer delivery estimates when stock is low or out of stock but still available for order. :: ### 3. Handling made-to-order or unlimited products Use static inventory for items that can always be produced or configured on demand. Examples include: - Custom furniture or print-on-demand merchandise. - Products manufactured per order without a stock cap. ### 4. Processing returns and backorders Manage restocks and balance adjustments efficiently. Examples include: - Choosing to restock returned products automatically. - When registering new deliveries backordered orders will be allocated stock first automatically. --- ## Related functionality | related feature | description | | ---------------------- | ------------------------------------------------------------------------- | | **Products / SKUs** | Each product variant has its own stock data managed in inventory. | | **Orders** | Orders automatically adjust stock levels during checkout and fulfillment. | | **Purchasing** | Incoming deliveries trigger average cost per unit recalculation. | | **Returns** | Returns can optionally update stock balances. | | **Reporting** | Stock transactions and balance changes can be tracked historically. | | **Product monitoring** | Notifications to end customers when product back in stock. | # Product attributes The **product attributes** functionality allows you to extend the default product model with custom data fields tailored to your business needs. Attributes can be used to store additional product information, enable advanced filtering in product lists, and provide richer product experiences across sales channels. ## Supported attribute types Out of the box, the system supports the following attribute types: - **Text** (localizable) - **Number** - **Date** - **Multi value list** (localizable) - **Single value list** (localizable) - **Tag** – Used to assign one or more tags to a product ::note Attributes can be organized into groups, and one or several groups can be activated on a product to keep data structured and manageable. :: --- ## Typical use cases The product attributes functionality enables several ways to enrich product data, improve discoverability, and support advanced filtering. ### 1. Extending product information Add custom fields to capture product-specific data beyond the default model. Examples include: - Adding **material type** or **fabric composition** for clothing products. - Storing **warranty period** or **energy rating** for electronics. ### 2. Enabling advanced filtering Use attributes to create dynamic filters in product lists and category pages. Examples include: - Filtering products by **material**, **color**, or **brand**. ### 3. Managing product variants and specifications Leverage attributes to define product specifications and variant properties. Examples include: - Storing **dimensions** and **weight** for shipping calculations. - Defining **technical specifications** such as **processor type** or **screen size**. ### 4. Organizing with attribute groups Group related attributes together for better data management and display. Examples include: - Creating a **"Technical Specifications"** group for electronics. - Defining a **"Care Instructions"** group for apparel items. --- ## Related functionality | Type | Description | | ------------------- | -------------------------------------------------------------------- | | **Products** | Attributes extend the core product model with custom fields. | | **Management API** | Enables creating and updating product attributes programmatically. | | **Merchant Center** | Provides a UI for managing attributes and attribute groups manually. | # Product categories The **product categories** functionality allows you to organize your product catalog into a hierarchical structure. Categories form a tree where each category can have multiple subcategories but only one parent. ## Key features Categories provide several built-in capabilities: - **Hierarchical structure** – Each category can have multiple subcategories but only one parent - **Automatic URL generation** – URLs are assigned based on category name and configured URL format - **Channel availability** – Categories are automatically available in channels where at least one assigned product is available - **Localization support** – Names, descriptions, and web metadata can be localized - **Dual descriptions** – Two localizable description fields for flexible content management - **Dual images** – Two configurable images with automatic size generation on upload - **Active toggle** – Controls publication status - **Hidden flag** – Indicates the category should be excluded from menus ::note Category availability in a channel is dynamically determined by product assignment. If at least one assigned product is available in that channel, the category becomes available there automatically. :: --- ## Typical use cases The product categories functionality enables several ways to organize products and improve navigation. ### 1. Structuring product catalogs Create logical hierarchies to organize products by type, department, or theme. Examples include: - Building a **Clothing > Men's > Shirts** hierarchy for apparel. - Organizing **Electronics > Computers > Laptops** for tech products. ### 2. Enabling site navigation Use categories as the foundation for menu structures and navigation elements. Examples include: - Creating main navigation menus based on top-level categories. - Building breadcrumb trails from category hierarchy. ### 3. Managing product groupings Assign products to categories to create browsable collections. Examples include: - Grouping products by **brand**, **season**, or **collection**. - Creating **promotional categories** for special campaigns. ### 4. Controlling visibility Use active and hidden flags to manage category presentation. Examples include: - Hiding **internal categorization** while keeping it active for filtering. - Deactivating **seasonal categories** outside their relevant periods. --- ## Related functionality | Type | Description | | ------------------- | ------------------------------------------------------------------------------------- | | **Products** | Products are assigned to categories to determine their organization and availability. | | **Management API** | Enables creating and updating categories programmatically. | | **Merchant Center** | Provides a UI for managing category hierarchies and settings manually. | # Product brands The **product brands** functionality allows you to manage manufacturer or label information for your products. Each product must be assigned to exactly one brand. ## Key features Brands provide several built-in capabilities: - **Automatic URL generation** – URLs are assigned based on brand name and configured URL format - **Channel availability** – Brands are automatically available in channels where at least one assigned product is available - **Localization support** – Names, descriptions, and web metadata can be localized - **Dual descriptions** – Two localizable description fields for flexible content management - **Logo/Image support** – Configurable images with automatic size generation on upload - **Active toggle** – Controls publication status ::note Brand availability in a channel is dynamically determined by product assignment. If at least one assigned product is available in that channel, the brand becomes available there automatically. :: --- ## Typical use cases The product brands functionality enables several ways to organize products and improve navigation. ### 1. Catalog organization Organize products by manufacturer or label for easier management. Examples include: - Grouping all **Nike** products under a single brand. - Managing **house brands** separately from third-party manufacturers. ### 2. Brand navigation and filtering Use brands as navigation elements and filtering options. Examples include: - Creating **brand landing pages** showcasing all products from a manufacturer. - Adding **brand filters** in product listing pages. ### 3. Brand presentation Leverage brand information to enhance product presentation. Examples include: - Displaying **brand logos** on product pages. - Creating **brand directories** with descriptions and images. ### 4. Controlling brand visibility Use the active flag to manage brand publication. Examples include: - Deactivating brands that are **no longer carried**. - Temporarily hiding brands during **contract negotiations**. --- ## Related functionality | Type | Description | | ------------------- | ---------------------------------------------------------------------------------------------------- | | **Products** | Products must be assigned to exactly one brand to determine their manufacturer or label association. | | **Management API** | Enables creating and updating brands programmatically. | | **Merchant Center** | Provides a UI for managing brand information and settings manually. | # Product suppliers The **product suppliers** functionality allows you to manage information about entities that deliver products to your business. Products can optionally be linked to suppliers for inventory and procurement management. ## Key features Suppliers provide several built-in capabilities: - **Supplier identification** – Track suppliers with unique IDs and customer numbers - **VAT tracking** – Store VAT or registration numbers for compliance - **Lead time management** – Configure expected delivery times for procurement planning - **Contact management** – Maintain address and contact details for each supplier - **Purchase order integration** – Suppliers are typically used together with the purchase order module - **Optional assignment** – Products can optionally be linked to suppliers based on business needs ::note Unlike brands, supplier assignment is optional. Products do not require a supplier association unless your business uses purchase order or procurement workflows. :: --- ## Typical use cases The product suppliers functionality enables several ways to manage procurement and inventory operations. ### 1. Purchase order management Track which suppliers provide specific products for procurement workflows. Examples include: - Creating **purchase orders** for products from specific suppliers. - Managing **reorder points** based on supplier lead times. ### 2. Inventory planning Use supplier information to optimize inventory management. Examples include: - Planning **stock levels** based on supplier lead times. - Identifying **alternative suppliers** for critical products. ### 3. Supplier relationship management Maintain comprehensive supplier information for business operations. Examples include: - Storing **contact details** for procurement teams. - Tracking **customer numbers** assigned by suppliers. ### 4. Compliance and reporting Leverage supplier data for regulatory and financial reporting. Examples include: - Reporting **VAT numbers** for cross-border transactions. - Generating **supplier performance reports** based on lead times. --- ## Related functionality | Type | Description | | ------------------- | ------------------------------------------------------------------------------------ | | **Products** | Products can optionally be assigned to suppliers to track procurement sources. | | **Purchase orders** | The purchase order module uses supplier information to manage inventory procurement. | | **Management API** | Enables creating and updating supplier information programmatically. | | **Merchant Center** | Provides a UI for managing supplier details and settings manually. | # Product price lists The **product price lists** functionality allows you to manage pricing information for products targeted at different customer groups or individual customers. Price lists support various pricing strategies including margin-based discounts and quantity-based volume pricing. ## Key features Price lists provide several built-in capabilities: - **Multiple price list creation** – Create separate price lists for different customer groups or individual customers - **Flexible pricing strategies** – Set prices based on discount percentages or margin calculations - **Volume pricing** – Configure quantity-based price breaks for volume discounts - **Product-level overrides** – Override global price list settings at individual product level - **Multi-market support** – Configure pricing for different channels and markets - **External integration** – Support for importing price lists from external systems - **Enforced pricing** – Force specific prices to override campaigns and sales prices - **Product visibility control** – Limit product selection based on assigned price lists ::note Price lists can be marked as enforced to guarantee specific pricing regardless of active campaigns or sales. This is useful for contractual pricing agreements or compliance requirements. :: --- ## Typical use cases The product price lists functionality enables several ways to manage pricing strategies and customer segmentation. ### 1. Customer group pricing Apply differentiated pricing based on customer segments. Examples include: - Creating **wholesale price lists** with volume discounts for B2B customers. - Offering **member pricing** for loyalty program participants. ### 2. Volume-based discounts Encourage larger purchases through volume pricing. Examples include: - Configuring **price breaks** where price decreases at e.g. d 10, 50, and 100 units. - Implementing **bulk pricing** for distributors and resellers. ### 3. Market-specific pricing Manage pricing across different geographic regions or channels. Examples include: - Setting **market prices** adjusted for local currencies and purchasing power. - Configuring **channel-specific pricing** for retail vs. online stores. ### 4. Contract and negotiated pricing Maintain special pricing agreements for specific customers. Examples include: - Storing **negotiated rates** for enterprise customers with enforced price lists. - Managing **partner pricing** that overrides standard discounts and promotions. --- ## Prioritization When multiple price lists are applied, Geins uses prioritization rules to determine which price is used: - **External price lists** take precedence over internal price lists. - **Customer-level price lists** take precedence over customer group-level price lists. - **Lowest price wins** – If multiple price lists apply, the lowest price is selected from standard prices, sale prices, campaign prices, and group-level percentage discounts. - **Enforced price lists** always take precedence over non-enforced price lists. If multiple enforced price lists apply, the lowest enforced price is used. --- ## Related functionality | Type | Description | | ------------------- | ------------------------------------------------------------------------------------------ | | **Customer groups** | price lists are typically assigned to customer groups to provide segment-specific pricing. | | **Campaigns** | Campaign prices can be overridden by enforced price lists for guaranteed pricing. | | **Management API** | Enables creating and updating price list information programmatically. | | **Merchant Center** | Provides a UI for managing price list details and assignments manually. | # Promotions ## Description The Geins promotion feature is a unified way to configure and execute promotions across channels and markets. Define clear eligibility, timing, and stacking rules to align with your pricing and merchandising strategy. Create promotions in two ways to fit your merchandising strategy: - **Cart-level promotions:** auto-applied when conditions are met or redeemed with a promo code. Configure eligibility by channel, market, customer segment, and thresholds. - **Catalog- or product-level promotions:** apply directly to selected products using selection criteria and appear on product and listing pages before checkout. Selections are dynamic and update automatically as rules or prices change. For example, if you include a category, any product added to that category is automatically included. --- ### Common use cases: - Sitewide percent/amount off (e.g., Black Friday) per channel or market. - Category-level markdowns (e.g., 20% off Shoes) with dynamic product inclusion. - SKU-specific price drops for hero products or new launches. - Buy X, Get Y (BOGO/BXGY) based on quantities or product mixes. - Tiered cart discounts (spend thresholds: $100→10%, $200→20%). - Free shipping above a threshold or for selected customer segments. - Multi-buy deals (3 for 2, 2 for $X) on selected collections. - Schedule weekend/holiday campaigns with automatic activation/deactivation. - Personalized promotions using customer segments. --- ### How to use the feature 1. Create a promotion and choose type. 2. Choose Sales Channel. 3. Choose Promotion code if type was code. 4. Choose Discount type. 5. Choose Product selection. 6. Configure promotion settings, segmentation and thresholds. 7. Configure timing. --- ### Available discount types The promotion features comes with wide range of discount types: - Cheapest item(s) for free - Buy x pay y (amount) - Percentage - Fixed amount - Free shipping - Percentage on most expensive/cheapest item - Buy x get y percentage ::note Free shipping can be applied together with the selected discount type :: ### Capabilities and features - Sales channel segmentation. - Multi market/language support. - Optional stacking of promotions based on a priority value - Include/Exclude Selection critera based on a combination of: - Categories - Brands - List of products - Price ranges - Import products and prices - Fallback percentage. - Use a percentage value for product-level promotions or set percentage or fixed price per product. - If not explicitally set on a product the fallback will be used. - Customer segmentation on customer groups or email - Thresholds - Minimum purchase amount - Minimum quantity of products - Once per customer - Limit number of total uses - Schedule timing - Create a promotion landing page and set web metadata. - Integrated with CMS - Filter on a promotion when using merchant api - Support for "badges" - Apply on regular price or sale price - Stacked product-level campaigns - Choose one of the two reduced price fields to be used - Use it to discount products already on sale based on their current discounted price. - Monitor campaign performance - Configurable rounding methods - Per promotion type - Per channel --- ### Related features and concepts | Entity | Relation | | ---------------- | ----------------------------------------------------------------------- | | Products | Choose a selection of products to be included in the promotion. | | Cart | Promotions are applied to the cart automatically or by code. | | Orders | Used promotions are visible on orders. | | Pricing | Promotions can be applied to one of the two reduced price fields. | | Channels | Scoped to channels and their markets. | | CMS Content | Include a list of products belonging to a promotion. | | Customers | Limit a promotion to a specific customer or group. | | Mail | Information about used promotions are included in transactional emails. | | Feeds | Channel-specific product feeds. | | Meta information | Promotion landing pages have configurable metadata. | | Categories | Select which categories to include in the promotion. | | Brands | Select which brands to include in the promotion. | # Promotion levels Promotions can be created in two main ways, depending on your merchandising goals and how you want discounts to appear to customers. ::note Configured to apply automatically or through promo codes, with support for market, channel, and customer segmentation for precise targeting. :: ### Cart level Applied during checkout when conditions are met or a promo code is used. :br Eligibility can be configured by **channel**, **market**, **customer segment**, and **thresholds**. :br These promotions affect the cart total and are typically designed to drive conversion or reward loyalty. Examples include: - “Get 10% off your entire order with code SAVE10.” - “Free shipping on all orders over €100.” - “Buy 2 items and get the 3rd free.” ### Catalog or product level Applied directly to selected products before checkout. :br Selections are dynamic and update automatically based on **rules**, **categories**, or **pricing changes**. :br For example, if a category is included in the promotion, any product added to that category is automatically included. Examples include: - “20% off all winter jackets.” - “Discount automatically shown on the product page.” - “Dynamic inclusion of products when added to a campaign category.” ::tip Cart level promotions can be used to influence checkout behavior and catalog level promotions to boost product visibility earlier in the shopping journey. :: --- ## Related functionality | related feature | description | | ----------------------- | -------------------------------------------------------------------- | | **Discount types** | Defines the type of discount applied within each promotion. | | **Campaign thresholds** | Sets the rules for when promotions are eligible and active. | | **Customer groups** | Enables segmentation and targeting for specific customer audiences. | | **Content / CMS** | Supports linking promotions to campaign pages and marketing content. | # Discount types The **discount types** within the **promotions** system provides flexible ways to configure and apply discounts in the checkout and cart. Each discount type defines how price reductions or benefits are calculated and applied to products, categories, or carts. Discounts can be configured to trigger based on conditions such as product selection, customer group, market, or cart total — allowing highly targeted and automated promotional campaigns. ::note All discount types are part of the promotions feature and can be combined with rules or conditions to create advanced campaign logic. :: --- ## Discount types The promotion feature includes a wide range of configurable discount types: | Type | description | | ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------- | | **Cheapest item(s) for free** | The lowest-priced items in the selection are given free of charge. | | **Buy x pay y (amount)** | The customer pays for a specific number of items (e.g., buy 3 pay for 2). | | **Percentage** | Applies a percentage-based discount on the total price or selected items. | | **Fixed amount** | Deducts a fixed monetary value from the order or specific items. | | **Free shipping** | Removes the shipping fee for qualifying carts or customers. | | **Percentage on most expensive / cheapest item** | Applies a percentage discount on either the most expensive or cheapest product in the selection. | | **Buy x get y percentage** | Provides a percentage discount on specific items when other items are purchased (e.g., buy 2 get 1 at 50% off). | ::tip Promotions can be configured with priority values, allowing multiple promotions to be stacked and applied to a single order when conditions are met. This can be used to combine different discount types and rules, creating layered and highly targeted campaigns. :: ## Typical use cases The discount types functionality enables dynamic and creative promotional campaigns to drive sales and reward customers. Below are some common scenarios where different discount types are beneficial: ### 1. Product level discounts Apply discounts to individual products or categories. Examples include: - 20% off all accessories. - Buy 3 t-shirts, pay for only 2. ### 2. Cart level campaigns Encourage higher cart values or specific combinations of products. Examples include: - Free shipping on orders over €100. - €10 off the entire cart for first-time customers. ### 3. Loyalty and customer-group campaigns Reward specific customer groups with personalized offers. Examples include: - VIP customers receive 15% off all purchases. - “Staff” group gets free shipping on all orders. ::note Free shipping can be applied together with the selected discount type :: --- ## Related functionality | Type | description | | -------------------- | ------------------------------------------------------------------------------- | | **Campaigns** | Framework for defining rules, triggers, and discount actions. | | **Cart** | Manages the collection of items being purchased and applies relevant discounts. | | **Checkout** | Applies and calculates discount logic during the purchase flow. | | **Order management** | Reflects applied discounts and tracks campaign performance. | :br ::note Promotions, discounts and campaigns are all terms used interchangeably in the documentation. Discounts are the actual price reductions, while promotions and campaigns refer more to the overall feature and marketing strategy and configuration. :: # Thresholds The **campaign thresholds** functionality defines the rules and limits that control when and how a promotion is activated. :br Thresholds allow merchants to specify minimum requirements, usage limits, and scheduling to ensure promotions are applied only under defined conditions. These settings make it possible to fine-tune promotional logic — for example, requiring a minimum cart value or limiting how many times a campaign can be used per customer. ::tip Thresholds are configured within each promotion and determine eligibility and duration, ensuring campaigns are applied only under valid circumstances. :: --- ## Threshold types | Type | Description | | ------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | | **Minimum purchase amount** | Sets the minimum cart value required for the promotion to apply. | | **Minimum quantity of products** | Defines the minimum number of products that must be added to the cart to trigger the promotion. | | **Once per customer** | Limits each customer to use the promotion only once. | | **Limit number of total uses** | Restricts the total number of times the promotion can be redeemed across all customers. | | **Schedule timing** | Specifies start and end dates for when the promotion is active. | | **Promotion landing page & metadata** | Enables the creation of a dedicated landing page for the campaign, with editable metadata for SEO and marketing. | ::note Thresholds can vary based on the type of promotion and discount being applied. Not all thresholds are applicable to every discount type. :: --- ## Typical use cases The campaign threshold functionality enables precise control of promotional timing, eligibility, and usage to support targeted marketing strategies. Below are some common scenarios and examples working with thresholds: ### 1. Minimum purchase requirements Encourage higher cart values by setting minimum spend thresholds. Examples include: - Free shipping on orders over €100. - Get 10% off when you spend at least $50. ### 2. Limited use or exclusive promotions Control campaign exposure by limiting how many times a promotion can be redeemed. Examples include: - First 500 customers get 20% off. - One-time welcome discount for new customers. ### 3. Time based campaigns Automate campaign activation and expiration through scheduling. Examples include: - Weekend-only flash sales. - Seasonal discounts that start and end automatically. ### 4. Campaign landing pages Drive traffic and conversions with dedicated landing pages for promotions. Examples include: - Custom campaign URLs for marketing and social media. - SEO optimized metadata for increased visibility in search engines. ::tip Use thresholds strategically to control campaign eligibility and timing — combining minimum order values, customer limits, and scheduled periods can help prevent over-discounting while maintaining promotional impact. :: --- ## Related functionality | related feature | description | | ------------------------------- | ------------------------------------------------------------------ | | **Promotions / discount types** | Uses thresholds to define when specific discount types apply. | | **Customer groups** | Combine thresholds with customer segmentation for targeted offers. | | **Campaign landing pages** | Connects thresholds to marketing pages and web metadata. | # Overview and Structure ## Description Geins CMS is a modular, headless system for composing pages from reusable widgets. It includes a catalog of built‑in widgets and supports custom widgets via the widget designer. :br Additionally a flexible menu feature is included. ## Core concepts - Page Area and Page Area Family - Defines where content can be placed. Use page area families to group related areas, for example, for product pages or the start page. - Available filters are stored on the area family level. - Areas define sections of a page layout that can hold containers. - Collections - A Collection is an actual instance of a Page Area Family and its areas with specific filters applied. It can also represent a full page. - Collections can be used to create pages or add content to other pages. - Two types exist: content and page. Pages include URLs, web metadata, and optional tags. - Collections can be filtered by various criteria (for example: Channel, Language, Customer group, Category, Brand, Product, Campaign). - An Area Collection contains one or more containers. - Containers :br Hold widgets and define layout (for example: two columns 50/50, four columns). - Widgets - Modular content blocks added to containers. Geins includes built‑in widgets and supports custom widgets via the widget designer. - Examples of built‑in widgets: - Banner - Text - Rich text - Image - Product list - Video - HTML code - Pre‑configured page areas - Start Page — homepage content - Productlist — product listing pages - Product — product detail pages - Pages — custom content pages - Scheduling - Collections, containers, and widgets can be scheduled to appear or expire at set times. - Menus - Hierarchical navigation structures supporting multiple levels. - Menu items can link to catalog entities (for example, categories or brands) or be completely custom. - Use menus to build site navigation and render them where needed with your navigation components/widgets. --- ## CMS structure example The following diagram illustrates how a product page is structured using the CMS, showing the hierarchy from page area family down to individual widgets: ```mermaid graph TD A[Page Area Family: Product] --> B[Collection: Product, Filter: Brand X] B --> C[Area: Product Hero] B --> D[Area: Product Content] C --> E[Container 1: Full Width] E --> F[Widget: Image Banner] E --> G[Widget: Rich Text] D --> H[Container 2: Two Columns 50/50] H --> I[Widget: Product List] H --> J[Widget: Video] D --> K[Container 3: Single Column] K --> L[Widget: HTML Code] style A fill:#1e3a5f,stroke:#4a90e2,color:#fff style B fill:#5a4a2a,stroke:#d4a650,color:#fff style C fill:#2d2d2d,stroke:#666,color:#fff style D fill:#2d2d2d,stroke:#666,color:#fff style E fill:#1e4620,stroke:#4caf50,color:#fff style H fill:#1e4620,stroke:#4caf50,color:#fff style K fill:#1e4620,stroke:#4caf50,color:#fff ``` This example shows: - A **Product** page area family with two areas (Product Hero and Product Content) - A **Collection** filtered for a specific brand - Multiple **Containers** with different layouts - Various **Widgets** providing content and functionality --- ## Typical use cases The CMS content structure enables flexible page design and reusable content management across a storefront. ### 1. Defining page templates with page area families Page area families provide the foundation for different page types and layouts. Examples include: - Setting up distinct structures for the start page, product pages, product listing pages, and custom content pages. - Creating a new page area family for campaign landing pages or promotional sections. ### 2. Managing content with collections Collections are instances of page area families with specific filters applied. Examples include: - Creating a collection filtered by brand to display brand-specific hero content on product pages. - Using collections filtered by category, product, or campaign to show contextual content across multiple pages. - Building standalone pages with collections of type "page" that include URLs and web metadata. ### 3. Building page layouts with areas, containers, and widgets Areas define content zones within a page area family, containers organize the layout within areas, and widgets provide the actual content. Examples include: - Adding multiple containers to the "Product Hero" area with different layouts (full width, two columns, etc.). - Populating containers with widgets like image banners, product lists, videos, or custom HTML. - Scheduling containers and widgets to appear or expire at specific times for promotions. ### 4. Creating site navigation with menus Menus provide hierarchical navigation structures that can be rendered anywhere on the site. Examples include: - Building a main navigation menu linking to categories and brands from the catalog. - Creating custom menu items for specific pages or external links. - Using menus in header, footer, or sidebar navigation components. --- # Widgets Widgets are modular content blocks added to containers within page areas. They form the core building blocks of content in Geins CMS, enabling flexible and reusable content management across a storefront. Widgets can display various types of content such as text, images, videos, banners, or product lists. They can also be scheduled to appear or expire at specific times, allowing dynamic and timely updates to storefront content. --- ## Built-in widget types Geins CMS includes a catalog of built-in widgets that cover common content needs: | Widget | Description | | ---------------- | ----------------------------------------------------------------- | | **Banner** | Used for campaign banners or hero images. | | **Text** | Contains plain text or formatted messages. | | **Rich text** | Includes a rich text editor for flexible content formatting. | | **Image** | Displays a single image or graphic. | | **Product list** | Displays a filtered or curated list of products from the catalog. | | **Video** | Embeds a video element, such as a promotional or explainer video. | | **HTML code** | Allows custom HTML and CSS for full design control. | :br ::tip Developers can create custom widgets to meet specific business needs using the widget designer feature (Create widget). :: --- ## Typical use cases Widgets enable flexible and dynamic content management within containers and areas throughout the CMS. ### 1. Managing marketing content Widgets allow content editors to manage marketing elements such as banners, campaigns, and promotional text. :br Examples include: - Adding a promotional banner widget to the start page hero area. - Displaying campaign messages on category pages using rich text widgets. - Scheduling banner widgets to appear during specific promotional periods. ### 2. Enhancing product presentation Widgets can complement product content with media or curated product lists. :br Examples include: - Embedding product videos using video widgets in product detail page areas. - Displaying lifestyle images with image widgets in the product hero area. - Showing filtered or manually curated product lists using product list widgets. ### 3. Scheduling time-based content Widgets can be scheduled to appear or expire on specific dates and times. :br Examples include: - Launching a "Black Friday" banner widget automatically at midnight. - Displaying limited-time offers that automatically expire after the promotion ends. - Showing event-specific content widgets during campaigns. ### 4. Custom content and layouts Custom widgets and HTML code widgets provide flexibility for unique content needs. :br Examples include: - Creating interactive elements with custom HTML and CSS. - Building specialized content blocks through the widget designer. - Embedding third-party integrations or custom functionality. --- ## Related concepts | Related feature | Description | | ------------------------- | -------------------------------------------------------------------------------------------- | | **Containers** | Hold widgets and define layout (for example: two columns 50/50, four columns). | | **Areas and collections** | Define where containers and widgets can be placed within page structures. | | **Page area families** | Provide the foundation for different page types that contain areas, containers, and widgets. | | **Campaigns** | Widgets can display campaign-specific messages, banners, or filtered product lists. | | **Products** | Product list widgets connect directly to the product catalog. | | **Scheduling** | Supports start and end times for automatic publishing and unpublishing of widgets. | | **Widget designer** | Enables developers to create custom widget types beyond the built-in catalog. | # Filter options ## Description Filters enable dynamic control over which content appears in collections. By applying filters to collections, you can tailor content based on contextual data such as channel, language, customer group, category, brand, product, or campaign. Filters are defined at the **page area family** level and applied when creating **collections**, making it possible to create targeted, personalized, and localized content experiences. --- ## How filters work - **Filters are stored on the page area family**:br Each page area family defines which filters are available for collections based on that family. - **Filters are applied when creating collections**:br When you create a collection (an instance of a page area family or stand alone page), you apply specific filter values to control which content appears. - **Multiple filters can be combined**:br Collections support multi-filter logic, allowing complex conditions such as filtering by both channel and customer group. --- ## Built-in filters Built-in filters include: **Channel**, **Language**, **Customer group**, **Category**, **Brand**, **Product**, and **Campaign**. ::note Custom filters are also supported — the consuming application provides the filter context. :: --- ## Key configurations | Type | Description | | ---------------------------- | ---------------------------------------------------------------------------------------------- | | **Filter type** | The type of condition used to control content visibility (e.g., Product, Customer group). | | **Filter value** | The specific value the filter matches (e.g., "VIP customers," "Brand X"). | | **Page area family filters** | Defines which filters are available for collections based on that family. | | **Collection filters** | Specific filter values applied to a collection instance. | | **Custom filter** | User-defined filters that rely on context provided by the consuming application. | | **Multi-filter logic** | Multiple filters can be combined for complex conditions (e.g., by Channel and Customer group). | --- ## Typical use cases Filters enable precise control of where and when content is displayed, supporting localized, personalized, and data-driven content delivery. ### 1. Localizing content by language or market Filters allow content to adapt automatically to the visitor's selected language or region. Examples include: - Creating collections filtered by **Language** to display language-specific widgets and banners. - Using **Channel** filters to show market-specific campaigns or promotions. ### 2. Personalizing content for customer groups Filters can target specific customer segments or logged-in users. Examples include: - Creating collections filtered by **Customer group** to show unique promotional content for B2B or VIP customers. - Displaying member-only content when a customer from a defined group logs in. ### 3. Contextual content based on product, category, or brand Filters can connect content to specific catalog entities. Examples include: - Creating collections filtered by **Brand** to display brand-specific banners or videos on product pages. - Using **Product** or **Category** filters to show size guides or cross-sell content on product detail pages. - Applying **Campaign** filters to display time-sensitive promotional content. --- ## Related functionality | Related feature | Description | | ---------------------- | ----------------------------------------------------------------------------------------------- | | **Page area families** | Define which filters are available for collections based on that family. | | **Collections** | Collections apply specific filter values to control which content appears. | | **Areas** | Areas within collections hold containers; filters control collection visibility. | | **Containers** | Containers within areas hold widgets and inherit visibility rules from collection filters. | | **Widgets** | Widgets within containers inherit visibility rules from the filtered collection they belong to. | # Preview content The drafts and previews functionality in the CMS allows editors to safely create, review, and test content before it goes live. :br You can save unfinished work as drafts, preview scheduled or unpublished content, and view how it will appear on your storefront at any given time. --- ## Key functionality | Type | Description | | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------- | | Save as draft | Saves changes without publishing them live. | | Create draft | Creates a new draft version of a collection. Options include: “Convert this collection to draft” or “Create draft for this collection.” | | Preview | Displays how draft or scheduled content will appear on the storefront. | | View | Opens live content directly from the CMS. | | Set spoofed time | Simulates a specific date and time to preview scheduled content. | | Scheduling | Works with drafts to plan future publications or content changes. | ::tip Content can be scheduled on widget level as well as on collection level. Set spoofed time enables the possibility to preview how time-based content appears for visitors in the future on for example the start page. :: --- ## Typical use cases The drafts and previews functionality supports safe content management, team collaboration, and real-time testing before publication. ### 1. Creating and managing drafts Editors can save unfinished content or prepare new versions without affecting the live site. Examples include: - Saving work-in-progress homepage updates as a draft. - Duplicating a live collection to create a new draft version for a seasonal campaign. ### 2. Previewing scheduled or draft content Preview lets you see how unpublished or scheduled content will appear when active. Examples include: - Checking layout and design for a draft banner before publication. - Using Set spoofed time to preview scheduled Black Friday content in advance. ### 3. Viewing live content Editors can easily open and verify live pages or content areas directly from the CMS. Examples include: - Clicking View on a published start page to confirm updates. - Using Set spoofed time to check how time-based content appears for visitors in the future. --- ## Related functionality | Related feature | Description | | --------------- | -------------------------------------------------------------------------------------- | | Collections | Drafts are often created from or linked to collections for structured content updates. | | Scheduling | Enables future publishing or expiration of drafts. | | Filters | Previews respect applied filters such as language, channel, or customer group. | # Scheduling content Scheduling content functionality allows you to control when specific CMS elements such as collections, containers, and widgets become visible or expire. :br This enables to plan and automate content updates in advance, ensuring that time-sensitive campaigns, promotions, and announcements are displayed at the right moment without manual intervention. ::note Scheduling can be applied to individual components or entire pages, providing flexibility for both large-scale and targeted content releases. :: --- ## Key features | Feature | Description | | ------------------------ | ---------------------------------------------------------------------------------- | | Schedule publish | Allows you to set a specific date and time for a page, area, or widget to go live. | | Start time and stop time | Defines the time range when the content will be visible. | | Page scheduling | Enables automated publishing of full pages or page areas at a set time. | | Block scheduling | Allows scheduling for specific blocks or containers within a page. | | Spoofed preview | Lets you preview how scheduled content will appear at a specific date and time. | --- ## Typical use cases Scheduling content is used to automate publication, control visibility, and manage time-sensitive campaigns efficiently. ### 1. Automating page or block publication Prepare pages or blocks in advance and set them to publish automatically at a specific time. Examples include: - Scheduling a promotional banner to appear at midnight for a campaign launch. - Setting new product page content to go live on its release date. ### 2. Managing time-limited content visibility Start and stop times define when content is shown or hidden automatically. Examples include: - Displaying event information only until the event date passes. - Hiding seasonal offers or banners after a promotion ends. ### 3. Previewing scheduled content The spoofed preview feature allows reviewing scheduled content before publication. Examples include: - Viewing how the startpage will look when a campaign goes live. - Testing layout and content in advance for time-sensitive updates. ::tip Spoofed preview can be set down to time level, allowing precise testing of content visibility. :: --- ## Related functionality | Related feature | Description | | -------------------------- | ------------------------------------------------------------------------ | | Drafts and previews | Works together with scheduling for testing and reviewing future content. | | Collections and containers | Define the structural elements that can be scheduled for visibility. | | Widgets | Content blocks that can be individually scheduled to appear or expire. | | Campaigns | Often rely on scheduling for timely promotions and seasonal content. | # Menus The menus functionality provides a hierarchical navigation structure for organizing and displaying links within your storefront. Menus can include multiple levels and menu items that link to catalog entities such as categories or brands, or to custom URLs and pages. :br They are used to build the site’s main and secondary navigation and can be rendered anywhere using menu locations. --- ## Key features | Feature | Description | | ----------------------------- | ------------------------------------------------------------------------------- | | **Hierarchical structure** | Supports multi-level navigation for complex menu designs. | | **Linked entities** | Menu items can link to catalog entities such as categories or brands. | | **Custom menu items** | Allows creation of custom links independent of the product catalog. | | **Menu locations** | Define where menus can be displayed in the storefront (e.g., header, footer). | | **Category import** | Imports an entire category tree from the PIM to quickly build a menu structure. | | **Storefront implementation** | Determines how and where menus are rendered in the frontend. | --- ## Typical use cases Menus are used to structure site navigation and improve the customer browsing experience by linking key pages, categories, and collections. ### 1. Building hierarchical navigation Create multi-level menus to organize content and catalog navigation. Examples include: - Building a main navigation that includes departments, categories, and subcategories. - Creating a multi-level dropdown with brand and product group links. ### 2. Importing and editing category structures Import existing category trees from the PIM to build menus quickly. Examples include: - Importing a full product category structure into the CMS for instant menu creation. ::note Renaming and rearranging menu items using drag-and-drop without affecting the original PIM structure. :: ### 3. Managing multiple menu locations Define and manage multiple menu locations for flexible layout placement. Examples include: - Creating separate header, footer, and sidebar menus. --- ## Managing menu locations Menu locations define where menus are displayed in the storefront, such as headers, footers, or sidebars. Each location has a name and ID and must be implemented in the storefront to be visible. --- ## Related functionality | Related feature | Description | | ----------------------------- | ------------------------------------------------------------------------------- | | **CMS** | Manages menus, pages, and widgets for site navigation and content presentation. | | **Products (PIM)** | Provides category trees that can be imported as menu structures. | | **Storefront implementation** | Determines where and how menus are displayed visually. | | **Collections** | Can be linked within menu items to direct users to dynamic content pages. | # Customers ### Description A customer represents a user of your sales channel or storefront. Customers can be individuals or organizations and can be organized into groups. ### Common use cases - Create a customer section with login - Create price lists and assign them to a customer group - Limit certain promotions to logged in customers --- ### How to use the feature - Use our APIs or import function to create a customer - Manage customer attributes in Geins Studio or Merchant Center ### Capabilities and features - Groups - Merge customers - Secure Authentication and password management - Anonymization of customers - Blacklisting of customers to prevent fraud - Types: individuals or organizations - Login as customer - Customer balance with transaction log - Automatic creation from new orders - Apply group-level percentage discounts automatically on the entire catalog - Limit product selection to the assigned price lists --- ### Key attributes | Attribute | Description | | :-------------- | :------------------------------------------------------------------------------- | | Email | Primary email used for login and communication; Unique per customer and channel. | | Mobile | Mobile phone number with country code. | | Phone | Alternate phone number. | | Customer Type | Individual or Organization. | | Customer Group | Segment the customer belongs to, drives pricing and promotions. | | Gender | Optional demographic field for personalization where applicable. | | SSN/VAT Number | Personal ID (SSN) for individuals or VAT/Tax ID for organizations. | | Channel | Sales channel context the customer is associated with. | | Company Name | Legal entity name; required when Customer Type is Organization. | | First Name | Given name of the primary contact. | | Last Name | Family/surname of the primary contact. | | Address row 1-3 | Street and additional address lines (e.g., apartment, suite, care-of). | | Zip code | Postal/ZIP code; format varies by country. | | City | City or locality of the address. | | State | State/region/province; optional depending on country. | | Country | Country of the address; prefer ISO 3166-1 alpha-2 code in APIs. | | Entry code | Door/buzzer/access code for delivery. | ## Related features and concepts | Entity | Relation | | :---------- | :----------------------------------------------------------- | | Orders | Connected to a channel and market. | | Price lists | Different pricing set per customer or group. | | Promotions | Limit to a specific customer or group. | | Payments | Methods per customer type. | | Shipping | Methods, rates, and defaults configurable per customer type. | | Channels | A customer belong to a channel. | | Mail | Transactional and account emails. | | Checkout | Used to prefill checkout or limit purchases. | # Logged in customer The **Logged-in Customer** functionality enables personalized commerce experiences by connecting a user’s authenticated identity to their customer data. :br Once a customer is logged in, the system can identify them and tailor functionality such as **content** and **commerce logic** based on their individual profile or assigned customer group. This feature is a key part of creating personalized storefronts, gated content, and customer-specific pricing or promotions. :br:br ::note In Geins both the terms Customer and User are used interchangeably and refer to the same entity. The term User is more commonly used in the data structure and technical documentation, while Customer is used in business and storefront contexts. :: ## Typical use cases The logged in customer functionality enables a variety of use cases, providing flexibility in managing and optimizing the e-commerce experience. Below are some common scenarios where logged in customers are beneficial: ### 1. Customer specific content Through integration with the **CMS**, content can be filtered or dynamically displayed based on the logged-in customer. Examples include: - Showing personalized welcome messages or curated product recommendations. - Displaying exclusive pages or campaigns visible only to specific customers. ### 2. Customer specific discounts When a customer is authenticated, **cart campaigns** and **promotion codes** can be restricted to that customer or their assigned group. Examples include: - Discount codes valid only for specific VIP customers. - Cart-level discounts applied only when a logged-in customer meets certain criteria. ### 3. My pages (Customer Portal) Once logged in, the customer’s data becomes available for use, for example in a **My Pages** section in the storefront, where they could: - View **purchase history** (orders placed). - Manage **account settings**, such as billing and shipping addresses. - Access stored preferences or saved information tied to their profile. ::tip In B2B scenarios, the logged-in customer functionality is essential for enabling features like customer-specific pricing, order approval workflows, and access to exclusive pricing or catalogs. :: --- ## Related functionality | Related Feature | Description | | --------------- | ------------------------------------------------------------------------------------------------- | | **Promotions** | Enables customer-specific discounts and promotions when logged in. | | **Content** | Allows dynamic or personalized pages for authenticated customers. | | **Orders** | Provides data for purchase history, can be used to display order details in the My Pages section. | | **CRM** | Stores and manages customer information used across the logged-in experience. | # Customer groups Customer groups make it possible to organize and manage multiple customers under shared rules for pricing, content access, and campaigns. They are essential for handling B2B relationships, loyalty programs, or segmented marketing where different customers require different experiences. :br:br:note[ In Geins both the terms Customer and User are used interchangeably and refer to the same entity. :br The term User is more commonly used in the data structure and technical documentation, while Customer is used in business and storefront contexts.] --- ## Typical use cases The customer groups functionality enables a variety of use cases, providing flexibility in managing and optimizing the e-commerce experience. Below are some common scenarios where customer groups are beneficial: ### 1. Grouped pricing and discounts Customer groups allow merchants to apply shared discounts or rules to multiple customers. :br Examples include: - Internal purchase benefits, automatically applying a 10% discount to the company staff on the entire catalog. - Managing promotions targeted only to “VIP” customers or “Partner” groups. ::tip A customer can belong to only one group at a time. :: ### 2. Segmented content and access Groups can be connected to CMS filters or permissions to tailor content visibility. :br Examples include: - Displaying exclusive product pages for “Influencers” or “Members” only. - Showing specific campaigns to “Wholesale” accounts only. ### 3. Price list assignments Groups can be linked to **price lists**, simplifying pricing management across customer segments. :br Examples include: - Assigning a B2B price list to wholesale accounts. - Using regional groups to display localized pricing. ::note In Geins a wholesale account is a customer group with additional B2B features enabled, such as order approval workflows and business-specific attributes. :: --- ## Related functionality | Related feature | Description | | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | **Campaigns** | Enables group-specific discounts and promotions when a customer is logged in. | | **Content** | Supports group-based pages and content visibility for logged-in customers. | | **B2B / Wholesale** | Wholesale account is a customer group with additional B2B features enabled, such as order approval workflows and business-specific attributes. | | **Price lists** | Connects customer groups to predefined pricing structures. | # Transactional emails for customers events The transactional emails functionality in Geins handles automated customer notifications triggered by customer-related events. These emails are typically sent automatically by the system when specific customer actions occur, ensuring that users receive relevant updates such as registration confirmations or password resets. ::note Transactional emails are managed through backend event flows and can be customized or disabled through system settings. :: ## Mail types | Mail event | Description | | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **CustomerRegistered** | Sent when a customer is created automatically during the first purchase. Can be disabled by adding a setting with the name **DisableMailOnUserCreate**, family **Site**, value **true**. Flow: merchant-api → mgmt-api → mail-service. | | **CustomerUnregistered** | Not implemented yet. | | **CustomerPasswordReset** | Sent when a customer requests a new password. Flow: merchant-api → mail-service or merchant-center → mail-service. Can be replaced by subscribing to the event **passwordReset**. | --- ## Typical use cases Transactional emails support automated, event-based communication with customers and ensure smooth post-interaction notifications across key account events. ### 1. Sending welcome emails on first purchase The system automatically sends a registration email when a customer account is created during their first order. Examples include: - Sending a welcome email confirming account creation. - Informing the customer about account login details after checkout. ### 2. Handling password resets Customers can request a password reset to regain access to their account. Examples include: - Automatically sending a reset link when a user clicks “Forgot password.” - Using the passwordReset event for a custom password recovery workflow. ### 3. Managing optional or disabled transactional emails Merchants can disable specific transactional emails if they prefer to handle notifications externally. Examples include: - Turning off automatic registration emails - Replacing built-in emails with custom workflows through subscribed events. :br:br ::note All transactional emails in Geins use a standard email template. This template includes basic styling, structure, and content text that ensures consistent formatting across all customer-facing notifications. :: --- ## Related functionality | Related feature | Description | | ---------------- | ---------------------------------------------------------------------------------- | | Customer account | Transactional emails are tied to customer creation and account management. | | Events | System events trigger the sending of transactional emails. | | Mail service | Handles message delivery and formatting for all transactional emails. | | Merchant API | Initiates and forwards customer-related events that generate transactional emails. | | Management API | Processes email delivery configurations and routing to the mail service. | # Customer authentication Customer authentication in Geins provides a secure, jwt and signature-based authentication system for managing user sessions and access control across your applications using the merchant API. It ensures secure credential transmission, prevents replay attacks, and provides robust session management through token-based authentication. Use it to enable access to customer profiles, order history, and other protected resources. Also use it to identify the current user in order for personalized experiences or prefilled checkout. :br:br:note[ In Geins both the terms Customer and User are used interchangeably and refer to the same entity. :br The term User is more commonly used in the data structure and technical documentation, while Customer is used in business and storefront contexts.] --- ## Authentication flow The Geins authentication process follows a two-step signature-based approach: 1. **Challenge request**: Send username to receive a signature challenge 2. **Credential verification**: Return signed credentials with password/action data 3. **Token management**: Receive and manage Bearer tokens and refresh tokens This method prevents credential exposure and replay attacks while providing secure user session management. ::card --- icon: i-lucide-user-cog title: "Guide: Authentication flow →" to: https://geins.io/../../../developers/guides/authentication-flow --- Learn more about the authentication flow in this how to guide. :: --- ## Tokens Two types of tokens are used for authentication: - **Bearer token**: Short-lived JWT token for API authentication (default: 15 minutes) - **Refresh token**: Longer-lived token for obtaining new Bearer tokens (default: 7 days) --- ## Authentication functions The authentication system supports five main functions: 1. Registration - Create new user accounts and establish initial authentication sessions. 2. Login - Authenticate existing users and establish active sessions. 3. Password change - Allow users to securely update their passwords while maintaining active sessions. 4. Token refresh - Maintain sessions by refreshing expired or soon-to-expire bearer tokens. 5. Logout - Securely terminate user sessions and invalidate all tokens. --- # Orders ## Description Orders cover the entire flow from checkout to delivery. They track items, prices, customer details, delivery preferences, and applied promotions. Each order belongs to a sales channel and market, progressing through fulfillment and payment events. ## Capabilities and features - Products and quantities - Pricing, discounts, and taxes - Customer and delivery details - Sales channel and market - Applied promotions and discounts - Fulfillment status and history - Metadata (set during checkout or via API) - Messages on order or lines - Partial fulfillment and split shipments - Returns and refunds - Order filters requiring manual confirmation - Update operations after creation - Automatic creation of customers - Separate delivery address - Built in transactional emails ## Returns and refunds Returns can be created for orders. When registering returns, you can choose whether a refund should be created as well. You can also create a refund connected only to an order without a return, which is often used for compensations. It is also possible to select a return reason and specify whether the returned item should be put back in stock. Refunds are automatically triggered and sent to payment providers. ## Order fulfillments Order fulfillments can be created for individual orders or for batches. During the fulfillment process you can register discrepancies if found. You can also download picking lists and related documents (for example receipts and shipping labels). When a fulfillment is completed, payments (captures) and email notifications are triggered, and reserved stock is deducted from physical inventory. ## Related features and concepts | Entity | Relation | | ---------- | --------------------------------------------------------- | | Products | Every order includes at least one purchased product. | | Promotions | Promotions are tracked on orders. | | Channels | Scoped to channels and their markets. | | Mail | Transactional emails. | | Customers | Orders can optionally be connected to a customer account. | | Inventory | Integrates with inventory. | | Payments | Support for one payment method. | | Shipping | Shipping method can be set on every delivery (parcel). | # Order statuses and lifecycle The **order statuses and lifecycle** functionality defines how an order progresses from creation to completion, including handling exceptions such as backorders, refunds, or cancellations. Each order is assigned a status that reflects its current state in the fulfillment and payment process. :br Statuses can also be applied at the **item level**, providing detailed tracking for partial shipments and returns. ::note Order statuses are automatically updated based on system events such as fulfillment, refund, or cancellation, but can also be adjusted manually when needed. :: --- ## Statuses and lifecycle | status | description | | ------------- | ---------------------------------------------------------------------------------------------------------------- | | **Inactive** | Order exists in a “soft deleted” state. | | **Pending** | Order created and awaiting processing. | | **Backorder** | One or more items are out of stock. | | **On-hold** | Order requires confirmation (can also be set later, for example after a failed capture/refund or manual review). | | **Refunded** | At least one refund exists on the order. | | **Completed** | All items are fulfilled with no remaining actions. | | **Partial** | Some items are fulfilled with unfulfilled items remaining. | | **Cancelled** | Order is cancelled. | ### Typical flow ```mermaid graph LR A[Pending] --> B[On-hold] A --> C[Backorder] A --> D[Completed] A --> E[Cancelled] A --> F[Refunded] B --> D C --> D B --> E C --> E D --> F ``` **Common paths:** - `pending → completed` (standard fulfillment) - `pending → on-hold → completed` (manual review required) - `pending → backorder → completed` (stock shortage resolved) - `pending → cancelled` (order cancelled before fulfillment) - `pending → refunded` or `completed → refunded` (refund processed) ### Payment behavior - Payment captures are triggered automatically upon fulfillment. - Refunds or cancellations update the order status accordingly. ### Item level statuses Individual items within an order can also have their own statuses for more granular tracking: - **ready** - **returned** - **shipped** - **cancelled** - **backorder** ::tip Item level statuses can be used for operational precision. For example, partially shipping an order or processing returns without affecting the entire order status. :: --- ## Typical use cases The order lifecycle functionality enables structured handling of order states across fulfillment, payment, and return flows. ### 1. Standard order processing Track and manage the full lifecycle from order creation to fulfillment. - An order moves from **pending** to **completed** once all items are fulfilled. - Automatic payment capture is triggered when fulfillment is confirmed. ### 2. Managing exceptions - Orders automatically placed into **on-hold** for manual review after a failed capture, refund, cancellation or when matched by a fraud detection rule (order filter). - Orders automatically marked as **backorder** when stock runs out. ### 3. Partial fulfillment and returns Support multi-step fulfillment and return workflows. Examples include: - Shipping available items first while others remain in **partial** status. - Processing **returned** items without changing the rest of the order. --- ## Related functionality | Type | description | | --------------------- | ------------------------------------------------------------------ | | **Fulfillment** | Updates order and item statuses upon shipment or completion. | | **Payment / capture** | Automatically triggers payments when orders are fulfilled. | | **Returns** | Adjusts item or order statuses when products are returned. | | **Inventory** | Reflects stock adjustments when orders are fulfilled or cancelled. | # Transactional emails for order events The **transactional emails** for orders in Geins handles automated customer notifications triggered by order related events. :br These emails are typically sent automatically by the system when specific events occur in the order lifecycle — such as order creation, delivery, refund. Transactional emails can be **configured** per channel, allowing merchants to control which notifications are sent. ::note All transactional mail types are configurable on a channel level. Specific mails can be disabled through settings or feature toggles. :: --- ## Mail types | Mail event | Description | | ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | **CustomerRefunded** | Sent when a refund is created. | | **CustomerRegistered** | Sent when a customer is automatically created during their first purchase. | | **OrderConfirmation** | Sent when an order is created in an active state or when changed from inactive to active. Can be replaced by subscribing to the `orderCreated` event. | | **OrderDelivered** | Sent when an order is marked as delivered. | | **OrderCancelled** | Sent when an administrator cancels an order in the Merchant Center (optional trigger). | | **OrderRowRemoved** | Sent when an administrator removes an order row in the Merchant Center (optional trigger). | | **OrderRowReturned** | Sent when an order return is created. | --- ## Typical use cases The transactional mail functionality enables timely and automated communication with customers throughout the order lifecycle. ### 1. Order and fulfillment updates Keep customers informed of order progress. Examples include: - **OrderConfirmation** sent after successful checkout. - **OrderDelivered** notifying customers of delivery. - **OrderCancelled** confirming cancellations initiated by support or admin. ### 2. Returns and refunds Automatically notify customers about return and refund processes. Examples include: - **CustomerRefunded** emails after partial or full refunds. - **OrderRowReturned** confirming returned items and next steps. ### 3. Account and access notifications Manage customer identity-related communication securely. Examples include: - **CustomerRegistered** confirming automatic account creation on first purchase. # Payment providers and operations ## Payments Geins supports multiple payment providers with flexible configuration options. ### Supported Payment Providers The platform integrates with the following payment providers: - **Kustom (Klarna)** - Checkout and payment services - **Avarda** - Checkout and payment services - **Svea** - Checkout and payment services - **Walley** - Checkout and payment services - **Geins Pay** - Payment aggregator offering a wide selection of payment methods - **Manual Invoice** - Traditional invoicing ### Configuration Available payment methods can be configured based on: - Channel/Market - User type (B2C, B2B, etc.) ### Payment Operations All payment providers support the following operations: - **Capture** - Finalize authorized payments - **Refund** - Return payments to customers - **Update** - Modify payment details - **Cancellation** - Cancel pending transactions # Shipping methods and freight configuration ## Shipping Geins provides flexible shipping configuration with support for freight classes and external integrations. ### Freight Classes Products can be assigned to freight classes, which are used to determine shipping eligibility and costs: - Each freight class has a **priority** setting - Freight classes use **matching modes** (any or all) - The effective freight class is calculated during checkout based on cart contents ### Configuration Shipping methods and rates can be configured based on: - Market and channel - Price - Weight - Freight class - Customer type - Customer group ### Integrations **nShift** - Optional built-in integration providing: - Graphical shipping selection interface - Shipping label generation # Cart ## Description The cart is the step before placing an order. Add products and quantities to the cart, and update it at any time until the final payment step during checkout. Promotions are applied automatically or can be added programmatically. ## Related features and concepts | Entity | Relation | | ---------- | -------------------------------------------------------- | | Products | Every cart includes at least one product. | | Promotions | Promotions are applied to carts. | | Channels | Scoped to channels and their markets. | | Customers | Carts can optionally be connected to a customer account. | | Payments | Select one payment method. | | Shipping | Select one shipping method. | # Fulfillment ## Description Order fulfillment manages the entire process from order processing to delivery completion. It encompasses picking, packing, shipping, tracking, and handling returns. The fulfillment system integrates with inventory management, payment processing, and shipping providers to ensure seamless order completion. ## How to use Fulfillments can be created for individual orders or processed in batches for efficiency. During fulfillment, you can register discrepancies if items are damaged or unavailable, download picking lists and related documents (receipts, shipping labels), and track progress through various fulfillment stages. When fulfillment is completed, payments are automatically captured and email notifications are sent to customers. Create returns with ease by selecting the return reason and specifying refund amounts per product. Configure whether returned products should be restored to inventory, with refunds automatically processed through your payment provider. Apply return fees as needed and choose whether to refund shipping costs. The system intelligently suggests refund amounts by proportionally distributing any original order discounts among the returned items. ## Capabilities and features - Individual and batch order fulfillment processing - Picking list generation and document management - Discrepancy registration during fulfillment - Partial fulfillment and split shipments - Automatic payment capture upon completion - Email notification triggers - Stock deduction from physical inventory - Integration with shipping providers through nShift - Shipping label generation - Freight class-based shipping selections - Returns and refunds management - Optional approval flow for refunds d - Return reason tracking - Automatic stock restoration for returns - Configurable return fees per market - Filterable batch processing. ## Key attributes - **Fulfillment Status**: Tracks progress from pending to completed - **Shipping Methods**: Configurable by market, channel, price, weight, freight class, customer type and customer group - **Freight Classes**: Product-based classification with priority and matching modes - **Payment Integration**: Automatic capture triggering upon fulfillment. Automatic sending of refunds to payment provider. - **Return Processing**: Separate handling for returns with optional refunds - **Stock Management**: Real-time inventory updates during fulfillment - **Shipping Labels**: Shipping label generation via nShift ## Related features | Entity | Relation | | --------- | ------------------------------------------------------------------------------- | | Orders | Fulfillment processes are created from and linked to orders | | Inventory | Stock levels are updated during fulfillment completion | | Payments | Captures are automatically triggered upon fulfillment | | Shipping | Integration with shipping providers and label generation | | Returns | Return management with optional refunds and stock restoration | | Channels | Fulfillment methods are scoped to specific channels and markets | | Products | Freight classes and shipping calculations based on product data | | Customers | Limit available shipping or payment methods to certain customer groups or types | # Batch Fulfillments The batch fulfillment feature enables merchants to process multiple orders at once with a single consolidated document. This streamlines warehouse operations by combining receipts, return notes, and shipping labels (including return labels when configured) into one efficient workflow. Batch fulfillments are designed to improve picking, packing, and shipping efficiency by grouping orders based on common criteria such as market, shipping method, or warehouse location. --- ## Key features | Feature | Description | | -------------------------- | ---------------------------------------------------------------------------------- | | **Multi-order processing** | Process multiple orders simultaneously in a single batch operation. | | **Consolidated documents** | Generate combined receipts, return notes, and shipping labels. | | **Return label support** | Automatically include return shipping labels when configured. | | **Flexible filtering** | Group orders by market, shipping method, date range, location, or warehouse shelf. | | **Warehouse optimization** | Organize fulfillment tasks by physical location for efficient picking. | :br ::tip Use warehouse shelf filtering to organize picking routes and minimize travel time in the warehouse. :: --- ## Typical use cases Batch fulfillment optimizes warehouse operations, reduces processing time, and ensures consistent handling of multiple orders. ### 1. Processing orders by shipping method Group orders by delivery type for efficient batch handling. Examples include: - Processing all standard shipping orders together for consolidated pickup. - Creating separate batches for express and economy shipments. ### 2. Market-based fulfillment Organize fulfillment by geographic market or region. Examples include: - Batching all domestic orders separately from international shipments. - Grouping orders by country for customs documentation efficiency. ### 3. Warehouse location optimization Filter orders by packing location or shelf position for streamlined picking. Examples include: - Creating batches for specific warehouse zones to minimize picker travel. - Organizing orders by shelf location for sequential picking routes. --- ## Related functionality | Related feature | Description | | ------------------------ | ------------------------------------------------------------------------------- | | **Orders** | Individual orders are grouped into batch fulfillments based on filter criteria. | | **Shipping methods** | Batch filtering uses shipping method configuration to group compatible orders. | | **Warehouse management** | Integrates with warehouse locations and shelf organization. | | **Printing & labels** | Generates consolidated shipping labels and packing documents. | | **Markets** | Enables market-based filtering for regional fulfillment optimization. | # Partial Fulfillments The partial fulfillment feature enables merchants to process orders in multiple stages when complete fulfillment isn't immediately possible. This ensures customers receive available items quickly while managing backorders and split shipments efficiently. Partial fulfillments are designed to optimize inventory utilization and customer satisfaction by allowing flexible order completion based on stock availability, supplier schedules, or logistical constraints. --- ## Key features | Feature | Description | | ----------------------------- | ---------------------------------------------------------------------------------------- | | **Split shipments** | Divide orders into multiple shipments based on availability or logistics requirements. | | **Automatic splitting** | Configure automatic order splitting when product quantities exceed thresholds. | | **Fulfill available items** | Process available inventory immediately while backordering remaining items. | | **Multiple payment captures** | Each fulfillment triggers its own payment capture, allowing multiple captures per order. | | **Flexible completion** | Complete orders progressively as inventory becomes available. | :br ::tip Configure automatic splitting thresholds to balance shipping costs with customer delivery expectations. :: --- ## Typical use cases Partial fulfillment improves inventory efficiency, reduces delivery delays, and enhances customer experience by shipping available items immediately. ### 1. Stock availability management Handle orders when not all items are in stock. Examples include: - Shipping available products immediately while backordering out-of-stock items. - Processing pre-order items separately from in-stock merchandise. ### 2. Large order processing Split orders that exceed handling or shipping thresholds. Examples include: - Automatically dividing bulk orders into multiple shipments. - Separating oversized items requiring special handling from standard products. ### 3. Multi-supplier fulfillment Manage orders with items from different suppliers or warehouses. Examples include: - Creating separate shipments for products sourced from different locations. - Coordinating drop-ship items with warehouse inventory. --- ## Related functionality | Related feature | Description | | ------------------------ | --------------------------------------------------------------------------------- | | **Orders** | Parent orders can be split into multiple partial fulfillments. | | **Inventory management** | Real-time stock levels determine which items can be fulfilled immediately. | | **Payment processing** | Multiple payment captures are triggered as each partial fulfillment is completed. | | **Backorder management** | Tracks and manages unfulfilled items for future shipment. | | **Shipping methods** | Each partial shipment can use different shipping methods based on content. | # Returns The return management in the fulfillment process provides merchants with full control over handling returns, refunds, and restocking. It supports efficient processing of returned products, refund calculations, and optional approval workflows to ensure that all return scenarios are managed accurately and consistently. Returns can be created directly from an order, allowing the merchant to specify refund amounts, return reasons, and whether items should be added back to inventory. --- ## Key features | Feature | Description | | -------------------------------- | ------------------------------------------------------------------------------------------ | | **Optional approval flow** | Allows merchants to review and approve refund requests before processing. | | **Return reasons** | Enables tracking of return causes for reporting and quality improvements. | | **Automatic stock restoration** | Determines whether returned products should be automatically added back to inventory. | | **Refund calculation** | Automatically distributes original order discounts proportionally among returned products. | | **Return fees** | Allows adding fees that can be deducted from the refund amount. | | **Shipping refunds** | Option to include or exclude shipping costs in the refund. | | **Payment provider integration** | Automatically processes refunds through the connected payment provider. | :br ::tip Return reasons can be configured to match business needs and provide insights into common return causes. :: --- ## Typical use cases The return management functionality streamlines post-purchase operations, ensures transparency for customers, and maintains accurate stock and financial data. ### 1. Creating and processing returns Merchants can easily create returns by selecting the relevant order items and return reasons. Examples include: - Creating a return for a damaged product with a specific return reason. - Issuing a partial refund for one or more items in an order. ### 2. Managing refund approvals Optional approval flows ensure internal control before refund execution. Examples include: - Reviewing refund requests for high-value or complex returns. - Approving or rejecting return requests based on company policy. ### 3. Handling restocking and refund distribution Returned items can be restored to inventory automatically, and refunds are calculated proportionally. Examples include: - Automatically adding returned products back into available stock. - Proportionally distributing discounts among refunded items for accurate refund amounts. --- ## Related functionality | Related feature | Description | | ------------------------ | --------------------------------------------------------------------------------- | | **Orders** | Returns are linked to original orders for item validation and refund calculation. | | **Inventory management** | Handles restocking and stock level adjustments for returned items. | | **Payments** | Processes automatic refunds through integrated payment providers. | | **Reporting** | Tracks return reasons and refund data for operational analysis. | | **Customer account** | Allows customers to view their return and refund status. | # Search ## Description The commerce backend provides configurable search functionality using Azure AI Search to index and query product data. It supports free-text search (analyzers), keyword searches, wildcard and fuzzy matching, and tunable field weighting to influence relevancy. --- ## Capabilities and features - Indexing via Azure AI Search for scalable, language-aware search. - Custom field weighting to tune relevancy. - Support for wildcard and fuzzy matching. - Separate SearchText (analyzed) and SearchKey (keyword) fields. - Up to 6 custom search field mappings. - Ability to disable search globally or per-search via ApiSettings flags. --- ## Related features and concepts | Entity | Relation | | ------------------ | ---------------------------------------------------------- | | Products | Source of indexed data (fields and texts). | | Skus | Often contain ArticleNumber and are included in the index. | | Categories / Brand | Searchable nested fields (Categories/Name, Brand/Name). | | Settings | Global toggles to enable/disable search indexing. | # Configuring relevancy and field weighting Relevancy and field weighting determine how product search results are ranked and prioritized in the commerce backend. By adjusting field weights, you can fine-tune how different product attributes influence the search score calculated by Azure AI Search. This configuration allows you to emphasize more important data, such as product names or brands, and reduce the impact of less critical fields like descriptions. --- ## Working with field weighting Define field weights to tune relevancy (see example below). Example weights: ```text "Weights": { "Name": 1.1, "Categories/Name": 1.5, "Brand/Name": 1.2, "ArticleNumber": 2, "Texts/Text1": 1, "Texts/Text2": 1, "Texts/Text3": 1, "ProductIdString": 20 } ``` --- ## Typical use cases Field weighting allows merchants and developers to shape the search experience by prioritizing certain product data fields. ### 1. Prioritizing product name and brand Give more importance to key identifiers like product name or brand to improve search precision. Examples include: - Assigning higher weights to product name and brand fields for stronger ranking. - Ensuring products with matching brand names appear higher in results. ### 2. Reducing influence of long descriptions Lowering weights on descriptive fields can help reduce noise in search results. Examples include: - Decreasing weight for product descriptions to focus on key product attributes. - Preventing irrelevant matches caused by long or generic text blocks. ### 3. Testing and adjusting weights Field weighting can be tuned iteratively to achieve desired relevancy outcomes. Examples include: - A/B testing different weight values to evaluate impact on result quality. - Updating weights seasonally or per market to reflect user search behavior. # Configuring custom search fields Custom search fields allow you to extend product search capabilities beyond standard product attributes. By mapping product parameters using the `param:{{parameteridentifier}}` syntax, you can include custom product data in search indexes. This configuration enables more flexible search scenarios by incorporating configurable extensions to the standard product model into the search experience. --- ## Standard search fields The following standard product fields are available for search configuration: | Field | Description | | -------------------- | ---------------------------- | | `Name` | Product name | | `Categories/Name` | Category names | | `Brand/Name` | Brand name | | `ArticleNumber` | Product article number | | `Skus/ArticleNumber` | SKU article numbers | | `Texts/Text1` | Product text field 1 | | `Texts/Text2` | Product text field 2 | | `Texts/Text3` | Product text field 3 | | `ProductIdString` | Product identifier as string | --- ## Working with custom search fields Map up to 6 custom search fields using parameter mappings with the `param:{{parameteridentifier}}` syntax (see example below). Example search configuration with custom fields: ```json "Search": { "SearchFields": [ "Name", "Categories/Name", "Brand/Name", "ArticleNumber", "Skus/ArticleNumber", "Texts/Text1", "Texts/Text2", "Texts/Text3", "ProductIdString", "CustomSearch/SearchText1" ], "Weights": { ... }, "CustomSearch": { "SearchText1": "param:testtext" } } ``` --- ## Typical use cases Custom search fields enable merchants and developers to incorporate product parameters into the search index for specialized search scenarios. ### 1. Including custom product attributes Integrate product parameters that extend the standard product model. Examples include: - Mapping supplier codes or internal SKUs stored as product parameters. - Including regulatory or compliance data configured as product parameters. ### 2. Enhancing product discoverability Add product-specific content to improve search results. Examples include: - Mapping promotional keywords or campaign tags stored as parameters. - Including localized product attributes specific to different markets. ### 3. Custom taxonomies and classifications Extend product discoverability with custom categorization. Examples include: - Mapping internal product classifications or merchandising tags. - Including custom attributes like sustainability ratings or quality certifications. - Adding market-specific product groupings stored as product parameters. # Configuring URLs ## Description This article provides an overview of how URLs and slugs for various entities within the system are configured and managed, including products, categories, and other content types. ::note Most entities can have slugs that are used to create user-friendly URLs. These slugs are unique identifiers over all entities. When an entity is created or updated, the system automatically generates a slug based on the entity's name or title. If a slug already exists, the system appends a unique number suffix to ensure uniqueness. Example: "my-product", "my-product-1", "my-product-2". :: ## Configuration # URL format configuration This configuration defines the URL structure patterns for different entity types in the application. ## Structure ## Configuration properties | Property | Description | Available Segments | | ---------------------- | ----------------------------------------------------------- | ----------------------------------------------------------------- | | `Brand` | URL pattern for brand pages | `Market`, `Language`, `Brand` | | `Category` | URL pattern for category pages | `Market`, `Language`, `Category` (expandable) | | `Product` | URL pattern for product pages | `Market`, `Language`, `Category` (expandable), `Brand`, `Product` | | `DiscountCampaign` | URL pattern for discount campaign pages | `Market`, `Language`, `DiscountCampaign` | | `PageWidgetCollection` | URL pattern for page widget collections | `Market`, `Language`, `PageWidgetCollection` | | `Parameter` | URL pattern for parameter pages | `Market`, `Language`, `Parameter` | | `Default` | Default URL pattern for entities without specific patterns | `Market`, `Language`, `Alias` | | `MaxCategoryDepth` | Maximum depth for category hierarchy expansion (default: 4) | N/A | ### Available segments All entity types support the following base segments: - `Market` - The market identifier - `Language` - The language code Entity-specific segments are listed in the table above and can be used within their respective URL patterns. ## Special syntax - **Static Segments**: Adding `!` after a segment (e.g., `l!`) marks it as static and prevents replacement with entity slugs - **Optional Segments**: Market and Language segments can be omitted if multi-market functionality is not used - **Category Expansion**: Categories are expanded hierarchically according to the `MaxCategoryDepth` setting ## Example output Given the following configuration: ```json { "Urls": { "Brand": "/b!/{Brand}", "Category": "/c!/{Category}", "Product": "/p!/{Category}/{Product}", "DiscountCampaign": "/dc!/{DiscountCampaign}", "PageWidgetCollection": "/page!/{PageWidgetCollection}", "Parameter": "/param!/{Parameter}", "MaxCategoryDepth": 4 } } ``` The resulting URLs could be: - Brand: `/b/nike` - Category: `/c/electronics/phones` - Product: `/p/electronics/phones/iphone-13` - Discount Campaign: `/dc/summer-sale` - Page Widget Collection: `/page/homepage` - Parameter: `/param/blue` ## Default configuration The default URL configuration is as follows: ```json { "UrlFormat": { "Brand": "/Market/Language/l!/Brand", "Category": "/Market/Language/l!/Category", "Product": "/Market/Language/p!/Category/Product", "DiscountCampaign": "/Market/Language/l!/DiscountCampaign", "PageWidgetCollection": "/Market/Language/PageWidget", "Parameter": "/Market/Language/l!/parameter", "MaxCategoryDepth": 4 } } ``` ## History When an entity is renamed, a new slug is generated, and the old slug is retained in a history log to ensure existing URLs remain valid. This allows for seamless redirection from old URLs to the updated ones. The history log can be accessed via the Management API, enabling developers to retrieve previous slugs and implement custom redirection logic if needed. :br In the merchant api, when fetching an entity by slug, the system automatically checks the history log to find the current slug if an old slug is used. The same is done for the rest of the segments in the URL, resulting in a canonical URL being returned. If the canonical URL differs from the requested URL, the caller can choose to redirect the user to the canonical URL. # Images ## Description This article provides an overview of included image formats and scaling options. ## Supported image formats The system supports the following image formats: - JPEG - PNG - GIF, including animated GIFs - WebP, Uploaded JPEG and PNG images are automatically converted to WebP for supported browsers to optimize loading times. Do not upload WebP images directly as they will not be processed correctly. ## Image scaling All uploaded images are automatically scaled to various sizes to optimize performance across different devices and screen resolutions. The available scaling options include: - Small thumbnail: 40x40 pixels - Thumbnail: 100x100 pixels Contact support to enable additional scaling options. ## CDN delivery All images are delivered via a Content Delivery Network (CDN) to ensure fast loading times globally. Images are cached at edge locations to reduce latency and improve performance for end-users. We use a third-party CDN provider to handle image delivery and caching. # Sitemaps ## Description The Geins platform automatically generates sitemaps daily to help search engines discover and index your content. Sitemaps include URLs for products, categories, brands, and content pages. ## Key features ### Automatic generation Sitemaps are generated daily and automatically updated with the latest content from your store. ### Multi-market support When multi-market is configured, sitemaps include rel-alternate tags for different languages and markets to help search engines understand your international content structure. ### Automatic file splitting Large sitemaps are automatically split into multiple files when size limits are reached, with all files listed in an index file for easy management. ## Accessing sitemaps Sitemaps are available in two formats: - **JSON format** via the [Management API](https://geins.io/developers/management-api/sitemap/get-get-sitemap) - **XML format** via direct HTTP links ## Implementation For detailed technical information on implementing sitemaps on your website, including URL structures, file formats, and integration instructions, see the [Sitemaps Developer Guide](https://geins.io/developers/guides/sitemaps). # Product Feeds ## Description Product Feeds automatically generate and update your product catalogs for various marketing platforms and price comparison websites. Your product information is transformed into the specific formats required by each platform, keeping your listings current with automatic daily or hourly updates. Each feed can be customized with: - **Format**: Google Shopping or Prisjakt - **Content**: Choose which product information to include and how to display it - **Market Settings**: Language, currency, and country-specific pricing - **Update Schedule**: Automatic updates hourly or daily - **Product Filtering**: Select which products appear in each feed This allows you to reach customers across multiple platforms while managing your product data in one central location. ### Common use cases - List products on Google Shopping with localized content and pricing for different countries - Submit product catalogs to Prisjakt and other price comparison sites - Maintain real-time pricing across all platforms with hourly updates - Publish products in multiple languages and currencies - Create separate feeds for different brands or product categories - Show only in-stock products on certain platforms --- ### How to get started 1. **Choose your platforms**: Decide which marketing channels you want to use (Google Shopping, Prisjakt, etc.) 2. **Select products**: Choose which products to include in each feed 3. **Configure settings**: Set language, currency, pricing rules, and other options 4. **Set update frequency**: Choose hourly updates for dynamic pricing or daily for standard catalogs 5. **Activate**: Your feeds will be automatically generated and updated on schedule Once configured, feeds are accessible via secure URLs that can be submitted to the respective platforms. ### Capabilities & Features - **Automatic Updates**: Feeds refresh hourly or daily to keep product information current - **Multiple Platforms**: Support for Google Shopping, Prisjakt, and other formats - **Multi-Market**: Serve different countries with localized content, pricing, and currencies - **Multi-Language**: Display product information in different languages per market - **Flexible Product Selection**: Choose which products appear in each feed - **Stock Filtering**: Option to show only available products - **Price Management**: Display market-specific pricing with automatic currency and tax handling - **Shipping Options**: Include shipping costs per country or use fixed rates - **Brand & Variant Support**: Handle product variants and optionally include brand names in titles - **Category Control**: Set how deep category hierarchies should display - **Custom Attributes**: Map product characteristics like color, size, material to feed fields - **Manual Updates**: Trigger immediate feed updates when needed --- ## Available Feed Formats ### Google Shopping Feed The Google Shopping feed format includes all required fields for Google Merchant Center, making your products eligible to appear in Google Shopping results, ads, and across Google's network. **Key features:** - Tab-separated format compatible with Google Merchant Center - Support for product variants and item groups - Shipping and tax information - Product identifiers (GTIN, MPN, brand) - Custom product labels and attributes - Automatically sanitized product descriptions ### Prisjakt Feed (v2) Prisjakt is a popular price comparison platform in Scandinavia. This feed format is optimized for Prisjakt's requirements and supports multiple Nordic markets. **Key features:** - CSV format per Prisjakt specifications - Support for SE, NO, DK, FI, GB, FR, NZ markets - Country-specific shipping fees - Sale price handling - Stock availability status - Extensive product attribute validation --- ## Configuration Options ### General Settings | Attribute | Description | Default | | ------------------------- | -------------------------------------------------------------- | ---------------- | | Frequency | Update frequency: "hourly" or "daily" | "daily" | | Disabled | Disable feed generation for this merchant | false | | DescriptionField | Source for description: "long", "short", or "tech" | "long" | | ShippingFeeMode | Shipping handling: "hidden", "api", or "fixed" | "hidden" | | FixedShippingFee | Fixed shipping fee amount (when mode is "fixed") | 0.0 | | PrependBrandToProductName | Include brand name in product titles | false | | OnlyInStock | Include only available products | false | | MaxCategoryDepth | Maximum category tree depth | 4 | | DefaultCondition | Default product condition (new, used, demo, refurbished, etc.) | "new" | | Currency | Override default currency | Channel default | | Country | Override default country | Channel default | | Language | Override default language | Channel default | | UrlLanguage | Override URL language separately | Same as Language | | IsShippingWeightInKg | Shipping weight unit (true = kg, false = g) | false | #### Attribute Mapping Settings | Attribute | Description | Valid Values | | --------- | ------------------------------ | ----------------------------------- | | Color | Source for color attribute | "sku", "param:{id}", "variant:{id}" | | Size | Source for size attribute | "sku", "param:{id}", "variant:{id}" | | Pattern | Source for pattern attribute | "sku", "param:{id}", "variant:{id}" | | Material | Source for material attribute | "sku", "param:{id}", "variant:{id}" | | AgeGroup | Source for age group attribute | "sku", "param:{id}", "variant:{id}" | | Gender | Source for gender attribute | "sku", "param:{id}", "variant:{id}" | #### Google Feed-Specific Settings | Attribute | Description | Default | | ------------------------------ | ------------------------------------------ | ------- | | GoogleIdPrefix | Prefix for product IDs | null | | RemoveMpnIfGtinPresent | Remove MPN when GTIN exists | false | | UseProductIdAsItemGroupId | Always use ProductId as item\_group\_id | false | | UseArticleNumberAsId | Use article number instead of generated ID | false | | Google\_UnitPricingBaseMeasure | Unit pricing base measure | null | | Google\_UnitPricingMeasure | Unit pricing measure | null | #### Prisjakt Feed-Specific Settings | Attribute | Description | Default | | --------------------------- | --------------------------------- | ------- | | Prisjakt\_SeparateSalePrice | Show sale price in separate field | false | #### FeedSettings (Optional per-feed overrides) | Attribute | Description | | --------- | --------------------------------------------------- | | \* | Any setting from MerchantSettings can be overridden | --- ## Product Information in Feeds Your feeds can include the following product information: ### Basic Product Details - **Product Name/Title**: With optional brand prefix - **Description**: Choose from long, short, or technical descriptions - **Brand**: Product brand information - **Categories**: Product categorization up to configured depth - **Product Condition**: New, used, demo, refurbished, or damaged packaging - **Availability**: In stock or out of stock status - **Product Identifiers**: SKU, article number, GTIN, MPN ### Pricing & Currency - **Price**: Regular product price in selected currency - **Sale Price**: Promotional pricing when applicable - **Currency**: Automatic currency conversion per market - **Tax Rates**: Market-specific VAT/tax handling ### Product Variations - **Color**: Product color options - **Size**: Size information - **Pattern**: Pattern or design details - **Material**: Material composition - **Age Group**: Target age group (adult, kids, etc.) - **Gender**: Target gender (male, female, unisex) - **Variant Grouping**: Links variants of the same product together ### Images & Media - **Product Images**: Primary and additional product photos - **Image Sizes**: Configurable image dimensions ### Shipping Information - **Shipping Costs**: Per-country shipping fees - **Shipping Weight**: Product weight for shipping calculations - **Delivery Countries**: Which countries you ship to ### URLs & Links - **Product URL**: Direct link to product page - **Localized URLs**: Language-specific product links --- ## Related Features Product Feeds integrate with several other system features: | Feature | How it relates to feeds | | ---------------------- | ----------------------------------------------------------- | | **Products** | Source of all product information included in feeds | | **Channels/Markets** | Determine language, currency, and pricing for each feed | | **Price Lists** | Different prices can be shown based on market configuration | | **Categories** | Category hierarchies are included in feed structure | | **Brands** | Brand information displayed in feeds | | **Product Parameters** | Custom product attributes can be mapped to feed fields | | **Variants** | Product variants are properly grouped and linked | | **Images** | Product photos are included with proper sizing | | **Shipping** | Shipping costs and options per market | | **Inventory** | Stock levels determine product availability in feeds | --- # What's Geins Studio? Geins Studio is the administrative interface for Geins. It brings the platform’s power into a clear, efficient workspace that makes it easy to work, manage, and grow your business. Studio has three main areas: - **Workspace** - Where you manage products, pricing, customers, orders, and content. - **Settings** - Where you configure channels, payment methods, taxes, shipping, and other options. - **Organization management** - Where you manage your team, roles, and organization-wide settings. ::tip Geins Studio is continually evolving, with new features and improvements being added regularly to enhance your experience and capabilities. :: ### Workspace sections - **Products** - Manage your entire product catalog, including product details, attributes, variants, relations, inventory and categories - **Pricing** - Includes managing price lists, discounts, and special offers. - **Customers** - Where you manage your customer data such as customer details, groups, accounts and segments. - **Orders** - Create and manage quotations. Orders overview and details. - **Content** - Where you manage your content such as, start pages, content and information pages, content blocks, menus and media files. ::note The available sections in your Studio workspace may vary depending on your user role and permissions. :: # Getting started ## To begin using Geins Studio: ### Requirements Before logging in, make sure you have: - An active Geins administratior account (created in Geins Merchant Center). - Your login credentials (email). ::note If you are an administrator in your organization in Geins Merchant Center, you will use the same email, but there are two separate login processes between Studio and Merchant Center (uniqe passwords). :: --- ## How to log in ### The first time you log in 1. Go to {rel="nofollow"} 2. Use the **Forgot your password** link to set your password for the first time. ( With the email address you use for the Merchant Center login ) 3. Follow the link in the email to set your password. 4. Log in with your email and new password. 5. Follow the two-factor authentication and enter the verification code sent to your email. ### Subsequent logins 1. Go to {rel="nofollow"} 2. Enter your registered email address and password. 3. Click Log in. 4. Follow the two-factor authentication and enter the verification code sent to your email. ### Troubleshooting - If you’ve forgotten your password, use the **Forgot your password** link on the login page to reset it. - If you still can’t access your account, contact your organization or reach out to Geins Support. # Pricing Working with pricing in Geins Studio offers managing price lists, setting up promotions, and creating special offers. Product pricing can be tailored to different customer segments through the use of price lists, which allow for specific pricing strategies based on customer groups or individual accounts. ::note Base prices for products is set on the product level, while price lists and promotions enable you to define alternative prices, discounts, and special offers. :: ### Key areas in the pricing section - **Price lists** - Create and manage price lists to define pricing strategies for different companies. - **Promotions** - Set up promotional campaigns to offer discounts and special deals. :br ::tip Geins Studio is continually evolving, with new features and improvements being added regularly. Pricelists is the first feature to be introduced in this area. :: # Create price list ## Key features - Global rules, enabling efficient pricing strategies. - Volume based pricing - Smart pricing calculations, with options to base list prices on either discount or margin. ## Quick guide 1. In Geins Studio, navigate to the **Pricing > Price lists** section and click **New price list** in the upper right corner 2. Create the price list by filling in the required details and clicking **Create price list** 3. Go to **Products & Pricing** to add products to the price list and set their prices. 4. Save the price list, then go to the account you would like to assign the price list to, and select it from the list. --- ## Create a new price list ::steps{level="3"} ### Price VAT configuration This setting determines whether the prices you enter include or exclude VAT. The setting cannot be changed after the price list is created. :::note This VAT setting is for creation of the price list. How and if VAT is shown to the customer depends on the channel settings and conditions such as the customer's location and tax status. ::: ### Price list details When creating a new price list, you will need to provide the following details: - **Name:** A descriptive name for the price list. - **Channel:** The sales channel the price list will be associated with. Available currencies will depend on the selected channel. - **Currency:** The currency in which the prices are listed. #### Additional options - **Enforce price list prices:** If enabled, the price list's prices will override lower available prices such as campaigns and sale prices. ### Create the price list Click **Create price list** to create the price list with the provided details. :: ## Products & Pricing Once you have created your pricelist, you can add products and set their prices. ::tip You **must** add products to the pricelist before setting prices :: ### Product selection In the product selection area, you can add products to the price list in two ways: 1. **Quick add:** Use the search field and select products from the dropdown. Search on either product name or ID. 2. **Use the product selector:** Click browse and select products from the catalog. :br:br ::note Adding a brand or catalog is a static action. Only products that are already in the category or brand will be included in the price list. If products are added to the category or brand after the price list is saved, the new products will not be included in the price list automatically. :: --- ### Set list prices There are three ways to set prices in the price list: - Base rule (*global*) - Manually (*per product*) - Volume pricing (*global and per product*) #### Base rule (*global*) A base rule allows you to change the prices of all products in the price list at once. You can set it either as a fixed percentage-based or margin-based. When using the base rule, you can choose to apply the change to all products or only the products that don't have a manually set price. - **Apply:** The adjustment will only be applied to products that do not have a manually set price. - **Apply and overwrite:** The adjustment will be applied to all products in the price list. ::note If a base rule is set, all products added will also have the base rule applied, unless a manual price is set on the product. :: #### Manually (*per product*) On product level, you can set individual prices for each product in the price list table. To do so just enter the desired price or percentage in the **Price list price**, the **Discount** or **Margin** columns for the specific product. When you leave the field, the other fields will be updated accordingly. ::tip Read more about price list calculations here: [Price list calulations](https://geins.io/price-calculation). :: #### Volume pricing (*global or per product*) You can set up volume-based pricing by defining quantity-based price breaks either globally, or individually per product. **Add global price breaks for volume pricing:** 1. Under **Global rules**, click on **Volume pricing** 2. Choose to calculate the percentage based either on discount or margin. 3. Click **Add price break** and set the desired quantity and discount or margin. 4. Click **Apply** or **Apply and overwrite** if you want to overwrite existing price breaks set on the product level. ::warning Calculations on margin or discount can't be mixed. If you want to change the calculation method, all existing price breaks will be removed and you will have to re-add them using the desired method. :: **Add price breaks on product level:** 1. Click on the **+** in the **Vol. pricing** column 2. Under **Product volume pricing**, set the desired price breaks by specifying the quantity and either the discount, margin, or price. 3. Click **Apply** The number of price breaks is shown in the **Vol. pricing** column. To edit these, :br click on the edit icon next to the number. :br ::note The product price breaks apply only to that specific product. If you add a price break with the same quantity as a global break, it will override the global one. :: --- ### Price calculations Prices in the price list are based on value added in the **Price list price** column (inc or ex VAT depending on the pricing settings). The value can also be calculated using the discount or margin fields, where you set a percentage that will calculate the price list price. ::tip Read more on price calculations in this article: [Price list calculations](https://geins.io/docs/geins-studio/wholesale/price-lists/price-calculation) :: --- ## Assignment and priority When the price list is ready, you can assign it to a specific account or buyer. Go to the account you want to assign the price list to, click on the **Price list** tab and use the quick add field to find and add the price list. ::note Upon saving, the price list updates will be applied within a maximum of 5 minutes. :: # Price list calculations ## Description of fields | Column | Description | | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Purchase price | The value is retrieved from the Purchase price field on a product | | Price (ex VAT) | The value is retrieved from the Price field on a product. If ex VAT, the price is calculated by excluding VAT, based on the rate of the channel's default market. | | Price list price (ex VAT) | The price that the product will be sold for when included in this price list. It is retrieved from the Price field on a product. If ex VAT, the price is calculated by excluding VAT, based on the rate of the channel's default market. | | Discount | Automatically calculate prices based on predefined rules. | | Margin | The margin (%) between the purchase price and the original set price (calculated by excluding VAT, based on the rate of the channel's default market). | ::note Inc VAT :br If the price list is created to be inc VAT, the price and the price list price field are calculated including VAT. :: ## Field behavior There are three fields in the price list that are editable: **Price list price**, **Discount** and **Margin**. The fields interact with each other in the following way: - If the **Price list price** is changed, the Margin is automatically recalculated based on the new Price list price and the Purchase price. - If a **Discount** is applied, the Price list price is adjusted accordingly, and the Margin is recalculated based on the new Price list price after the discount. - If the **Margin** is adjusted manually, the Price list price is recalculated to maintain the specified Margin based on the Purchase price. The discount % is adjusted accordingly. ## Currency and VAT - Prices in the price list are shown either including or excluding VAT, based on which VAT setting the price list is created with. - Because the price of a product is added inc VAT in Merchant Center, an automatic adjustment is made when the product is added to a price list and calculated by excluding VAT, based on the rate of the channel's default market. - If a price list is created inc VAT and the currency of the list is set to other than your default currency, the price is calculated by excluding VAT, based on the rate of the channel's default market. Then calculated including VAT based on VAT rate the chosen currency has. ## Price type indicators: D, G & M In the price list on each row there is a Price type indicator to the right, which can be one of the following: - **D**: Default price, no global rules or manual prices have been set. The price is the product's default price. - **G**: Price set globally, the price is set by a global adjustment - **M**: Price set manually, either by changing the Price list price field, margin or discount field # Volume pricing ## Key features - Define multiple price breaks with different quantity ranges - Set global or individual price breaks for products - Base pricing on either discount or margin --- ## Set price breaks You can either set global price breaks or individual price breaks for each product. At the product level, you can set different prices based on quantity. You can choose to either set global price breaks or set them individually for each product. Global price breaks can be overridden at the product level. ::note If a global price break is set, it will be applied to all new products added to the price list. :: ### Add global price breaks for volume pricing 1. Under **Global rules**, click on **Volume pricing**. 2. Choose to calculate the percentage based on either discount or margin. 3. Click **Add price break** and set the desired quantity and discount or margin. 4. Click **Apply** or **Apply and overwrite**. ::note Calculations on margin or discount cannot be mixed. To change the calculation method, you must remove all existing price breaks and re-add them using the desired method. :: #### Apply behaviors for global price breaks - **Apply:** The price break will be applied to all products that don't have an already set price break with that quantity. - **Apply and overwrite:** The price break will be applied to all products, overwriting any existing price breaks with that quantity. ### Add price breaks on product level 1. Click on the **+** in the **Vol. pricing** column 2. Under **Product volume pricing**, set the desired price breaks by specifying the quantity and either the discount, margin, or price. 3. Click **Apply** - Your price breaks will be added to the product. ::note If global price breaks exist, they will be overridden if the price break is added at the product level. :: The number of price breaks is shown in the **Vol. pricing** column. To edit these, click on the edit icon next to the number. ::tip The number of price breaks does also include global price breaks. If you hover over the number, you will see a small overview of all the price breaks applied to that product. :: # Price list prioritization When multiple price lists are applied, Geins uses prioritization rules to determine which price is shown. Here's how it works: ## Lowest price - If more than one price list includes the same product, the lowest price will be used. ## Enforced price lists Enforced price lists override others based on the following rules: - **Multiple enforced price lists**: The lowest price between them applies. - **One enforced + one non-enforced**: The enforced price list always takes priority. - **No enforced price lists**: The lowest price across all applicable price lists and prices such as sale and campaign prices is used. --- ## Buyer assigned pricelists Buyer assigned price lists has the highest priority. If a buyer has assigned price lists: - They override account price lists on overlapping products. - Enforced account lists still apply, but the buyer’s assigned price wins on overlap. #### Example - A SKU is priced at 100 in the account price list and 90 in the buyer’s assigned price list. The buyer will see **90**. # Add new company ## Key features - Create and manage companies - Assign multiple buyers to aa company - Set specific price lists for different companies. - Company-specific product selection via price lists ## Quick guide 1. In Geins Studio, navigate to the **Customers > Companies** section and click **New company** in the upper right corner 2. Create the company by filling in the required details and clicking **Create company**. 3. Go to the **Buyers** tab to add buyers to the company. 4. Connect a price list to the company by selecting it from the quick add under the **Price list** tab. 5. Review the company settings and save. --- ## Create a new Company ::steps{level="3"} ### Company details When creating a new Company, you will need to provide the following details: - **Company name:** The name of the Company (company). - **VAT / Company reg. nr:** The VAT or company registration number for the Company. The field is validated via VIES if EU format. For informational use — VAT settings must be chosen manually. - **External ID:** Optional field for storing an external reference ID. - **Sales reps:** The sales representatives associated with the Company. A sales rep must be an existing administrator in Geins. - **Channels:** The sales channels the Company will be associated with. ### Addresses - **Billing address:** The billing address for the Company. - **Shipping address:** The shipping address for the Company. Can be set to be the same as the billing address. - **Contact person:** The contact person related to the address. Used primarily when working with quotations and order creations. :::tip You don't need to fill in the address details when creating the Company. You can add or edit the addresses later. ::: ### Create the Company Click **Create Company** to create the Company with the provided details. :: ## Buyers A buyer is a customer that is associated with an Company. An Company can have multiple buyers. Adding a buyer can either create a new customer in the system or link to an existing customer. ### Add a buyer 1. In the **Buyers** tab, click **Add buyer**. 2. Fill in the required details. If the added email is already connected to an existing customer, you can choose to assign the existing customer as a buyer to the Company. ::note If assigned, the information on the existing customer Company will be updated with the new information provided here and the customer will be set as a company customer. The existing customer's password and login details will remain unchanged. :: Buyers created as new will have the Company's billing and shipping address as default. Existing customers will keep their existing addresses as default. 3. Activate the buyer by toggling the Active switch. An inactive buyer will not be able to log in. 4. Click **Save** to add the buyer to the Company. ::tip More information about managing buyers can be found here: [Buyers](https://geins.io/buyers). :: --- ## Connect a price list A price list is a collection of products with specific prices. You can tailor product selection and pricing for an Company by connecting a price list and setting the Company to only show products from it. 1. In the **Price lists** tab, add a price list by selecting it from the quick add dropdown. 2. To restrict the Company to only show products from the price list, enable the **Only access products included in the assigned price lists** switch under the settings tab on the Company. ::note Products will show if the currency set in the application (such as the storefront) matches the currency of the price list they are included in. :: ::tip The price list must be active for the prices and product selection to be applied to the Company. :: --- ## Settings In the settings tab, you can configure additional settings for the Company. :br:br - **Product access:** Controls which products this Company can view and purchase. If the *Only access products included in the assigned price lists* switch is enabled, the Company will only be able to see and purchase products that are included in the assigned price lists. - **VAT settings:** Set whether this Company should be charged VAT on orders. If enabled, the Company will always be charged VAT regardless of country or VAT number. # Buyers ## Key features - Manage buyers associated with a specific company. - Link buyers to existing customers or create new ones. - Set default billing and shipping addresses for buyers. --- ## Add buyer to company 1. In the Buyers tab, click **Add buyer**. 2. Fill in the required details. - #### New customer Add the buyer's information. A new customer will be created in the system and linked to the company as a buyer. The company's billing and shipping address will be set as default. - #### Existing customer If the added email is already connected to an existing customer, you can choose to assign the existing customer as a buyer to the company. :br Buyers created as new customers will have the company's billing and shipping address as default. Existing customers will keep their existing addresses as default. ::note If assigned, the information on the existing customer company will be updated with the new information provided here and the customer will be set as a company customer. The existing customer's password and login details will remain unchanged. :: 3. Activate the buyer by toggling the **Active** switch. An inactive buyer will not be able to log in. 4. Click **Save** to add the buyer to the company. --- ## Assign specific buyer to pricelist 1. Click the edit icon to the right of the buyer in the buyers list. 2. Enable **Assign price lists to buyer**. 3. Choose which price lists to assign to the buyer. ### Product access You can, at the buyer level, choose to restrict product access only to the price lists assigned to that buyer. - **If enabled**: The buyer will only access the products included in the buyer specific price lists (even if the Company has enforced price lists). - **If disabled**: The buyer will be able to access all products available to the Company. #### Priority If product access on buyer level is disabled, and a product exists in both the company’s pricelist and the buyer’s assigned pricelist, the buyer will receive the price from their assigned pricelist. Even if the company’s pricelists are enforced. ::tip When a buyer has specific price lists assigned, those price lists will take priority over the company's price lists. :: --- ## Remove buyer from a company 1. Click on the edit icon to the right of the buyer in the buyers list. 2. Click the **Remove** button. When removing a buyer, they will be unlinked from the company but will still exist as a customer in the system. ::note If the company is inactivated, all buyers will also be inactivated and will not be able to log in. When the company is reactivated, the buyers will need to reset their passwords. :: --- ## Password management for buyers A buyer is a customer, so for password management, the same rules apply as for regular customers. In the application (such as a storefront), the buyer can use the "Forgot password" reset flow to reset their password. --- ## Place order as buyer To place an order, the buyer will log in to the chosen channel where they will see the Company's price list prices, products, and any Company-specific content if set up. There the buyer will be able to place orders as a regular customer. # Customers Customers in Geins Studio is where you manage your customer data such as customer details, companies and groups. The Customers section includes the following key areas: - **Customers** - Manage individual customers details. - **Companies** - Manage company accounts including adding buyers and company-specific pricelists. - **Groups** - Create and manage customer groups for targeted pricing, promotions and content. ### Customers The Customers area allows you to manage individual customer details, including contact information and purchase history. ### Companies A Company is a business entity that you can create and manage within Geins Studio. Companies can have multiple buyers associated with them, and you can assign specific price lists to different companies. ### Groups Customer Groups allow you to segment your customers into different categories based on various criteria. This segmentation can be used for targeted pricing, promotions, and content delivery.Examples of customer groups include staff, partners or VIP customers. ::tip Geins Studio is continually evolving, with new features and improvements being added regularly. Companies is the first feature to be introduced in this area. :: # Create quotation ## Key features - Create quotations for specific companies and buyers - Add products with custom pricing and discounts - Set validity dates and internal notes - Send the quotation to lock it and notify the customer ## Quick guide 1. Go to **Orders > Quotations**. 2. Click **New quotation**. 3. Fill in the required details and click **Create quotation**. 4. Add products and adjust pricing. 5. Click **Save**. 6. Click **Send quotation** to send it to the customer. ::note **Send quotation** locks the quotation for editing and sets its status to **Pending**. :: --- ## Create a quotation draft When creating a new quotation, you provide the basic details that define the customer, buyer, and currency. | Field | Description | | ------------------- | --------------------------------------------------------------------------------- | | **Quotation name** | Internal name used to identify the quotation. | | **Customer** | The company the quotation is created for. Cannot be changed after creation. | | **Quotation owner** | The user responsible for managing the quotation. | | **Buyer** | The contact person at the customer organization. | | **Currency** | Currency used for all pricing in the quotation. Cannot be changed after creation. | Click **Create quotation** to save the draft. You can then add products and pricing. --- ## Add products Go to the **Products** tab to add products to the quotation. 1. Click **+ Add products**. 2. Search for and select the products. 3. Set the **quantity** for each product. 4. Set a **Quotation price** to override the default price if needed. 5. Click **Save**. ::note The active price lists for the customer is shown at the top of the Products tab. :: --- ## Manage pricing Each product line shows three price columns: | Column | Description | | -------------------- | ------------------------------------------------------------------------------------ | | **Price** | The product's standard retail price. | | **Price list price** | The price from the customer's assigned price list. Shown if a price list is applied. | | **Quotation price** | The price you set specifically for this quotation. Overrides the price list price. | ::tip Quotation price overrides apply only to this quotation and do not affect the customer's price list. :: ### Order level adjustments At the bottom of the Products tab, you can also set order level adjustments: | Field | Description | | ------------ | -------------------------------------------------------------- | | **Discount** | A discount amount or percentage applied to the order subtotal. | | **Shipping** | A estimated shipping cost added to the order. | --- ## General details The **General** tab is divided into two sections: quotation details and customer information. ### Quotation details | Field | Description | | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- | | **Quotation name** | Name used to identify the quotation. | | **Expiration date** | The date the quotation expires. After this date, the status changes to **Expired**. | | **Require confirmation** | When enabled, the customer must accept the quotation and you must confirm before the order can be placed. | | **Reference** | An external reference number, such as a customer PO number. | | **Payment terms** | A static label shown on the quotation (e.g. "Net 30"). For informational purposes only — no payment functionality is connected to this field. | ### Customer Displays the customer's information pulled from the company record: company name, VAT number, billing and shipping addresses, buyer, quotation owner, and currency. Click **Change** to assign a different customer to the quotation. ::note **Customer** and **Currency** cannot be changed after the quotation is created. :: ### Communication Once the quotation is sent, a **Communication** tab becomes available for messaging the customer and tracking responses. See [Quotation communication](https://geins.io/quotation-communication). --- ## Send the quotation When the quotation is ready, send quotation . 1. Review all products and pricing. 2. Click **Send quotation**. ::note Sending locks the quotation for editing and sets the status to **Pending**. :: ::tip What happens next depends on your configuration — the customer may receive an email notification, the quotation may become visible in the customer portal, or both. Contact your administrator if you are unsure how your setup is configured. :: --- ## Quotation statuses A quotation moves through several statuses during its lifecycle — from **Draft** when first created, to **Pending** when sent, and finally to **Finalized**, **Rejected**, or **Expired**. If **Require confirmation** is enabled, it also passes through **Accepted** and **Confirmed** before the order can be placed. See [Quotation statuses](https://geins.io/quotation-statuses) for a full overview. # Quotation communication The **Communication** tab becomes available once a quotation has been converted from draft to pending. It provides a full activity log and two communication channels: messages to the customer and internal notes. --- ## With customer The **With customer** tab shows a chronological thread of all external communication on the quotation. This includes messages sent by administrators, replies from the customer, and status change events (e.g. when the quotation was sent and moved from **Draft** to **Pending**). **To send a message to the customer:** 1. Go to the **Communication** tab. 2. Select **With customer**. 3. Enter your message in the text field. 4. Click **Send**. **To reply to a specific message:** 1. Click **...** on the message you want to reply to. 2. Select **Reply**. 3. Enter your reply and click **Send**. The reply is shown threaded under the original message. --- ## Internal notes The **Internal notes** tab is for notes visible only to administrators. Use it to log context, decisions, or follow-up actions without the customer seeing the content. **To add an internal note:** 1. Go to the **Communication** tab. 2. Select **Internal notes**. 3. Enter your note. 4. Click **Send**. --- # Convert quotation to order ## Key features - Place an order directly from a quotation in one step - Carry over all products, pricing, and customer details from the quotation - Retain the link between the order and the original quotation for traceability ## Quick guide 1. Open the quotation. 2. Click **Place order**. 3. Confirm to finalize the order. ::note The required status before placing an order depends on the quotation workflow. See [prerequisites](https://geins.io/#prerequisites) below. :: --- ## Prerequisites The step required before placing an order depends on whether **Require confirmation** is enabled on the quotation. | Workflow | Required status before placing order | | ------------------------ | ------------------------------------ | | No confirmation required | **Pending** | | Confirmation required | **Confirmed** | See [Quotation statuses](https://geins.io/quotation-statuses) for a full description of each workflow. --- ## Place the order 1. Open the quotation. 2. Click **Place order**. 3. Confirm to create the order. The order is created and the quotation status changes to **Finalized**. --- ## After the order is placed - The quotation status changes to **Finalized** and can no longer be edited. - The order follows the standard order fulfillment workflow and has a reference to the base quotation. - The quotation remains accessible in the Quotations list for reference. # Quotation pricing ## Price fields Each product added to a quotation has three price fields that together determine what the customer is charged. | Field | Description | | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Price** | The product's standard catalogue price. | | **Price list price** | The price from the customer's assigned price list, if the product is included in one. Price list prioritization rules apply when multiple price lists are active. | | **Quotation price** | The effective price used in the quotation. | --- ## How the quotation price is set When a product is added to a quotation, the quotation price is set automatically: - If **no price list price exists**, the quotation price is set to the catalogue **price**. - If a **price list price exists**, the quotation price is set to the **price list price**. --- ## Dynamic vs. static quotation price ### Dynamic (no manual adjustment) If the quotation price has not been manually edited, it stays in sync with its source price. Any change to the catalogue price or the price list price will automatically update the quotation price in the quotation. ::note Prices are updated when the draft is opened. In the quotations list, the **Total** column for a draft reflects the total amount from the last time the draft was opened. :: ### Static (manually adjusted) If you manually enter a quotation price, it becomes static and is no longer updated automatically, even if the catalogue price or price list price changes. --- ## Price locking when sent Quotation prices are only dynamic while the quotation is in **Draft** status. When the quotation is sent and transitions to **Pending**, all quotation prices are locked at their current values and will not change regardless of any subsequent price updates. ::note To apply updated prices to a sent quotation, you would need to create a new draft. See [Quotation statuses](https://geins.io/quotation-statuses). :: # Quotation statuses A quotation moves through a series of statuses depending on the workflow configured. The workflow is determined by the **Require confirmation** setting on the quotation. --- ## Workflows There are two quotation flows to choose from when creating a quotation. ### No confirmation required The customer or administrator can place the order directly once the quotation is in **Pending** status. ```text Draft → Pending → Finalized ``` ### Confirmation required The customer accepts the quotation first, then the administrator confirms it before the order can be placed. ```text Draft → Pending → Accepted → Confirmed → Finalized ``` ::info The workflow is set by the **Require confirmation** toggle in the quotation's general details. See [Create quotation](https://geins.io/create-quotation). :: --- ## Status overview | Status | Description | | ------------- | ------------------------------------------------------------------------------------------------------------------------ | | **Draft** | The quotation is being prepared and can be edited freely. | | **Pending** | The quotation has been sent. Depending on the workflow, the customer or administrator can now place or accept the order. | | **Accepted** | The customer has accepted the quotation. Awaiting administrator confirmation. *(Confirmation required flow only.)* | | **Confirmed** | The administrator has confirmed the acceptance. The order can now be placed. *(Confirmation required flow only.)* | | **Finalized** | The order has been placed and the quotation is finalized. | | **Rejected** | The customer has declined the quotation. | | **Expired** | The quotation's expiration date has passed without a response. | --- ## Status details ### Draft The quotation is open for editing. Products, pricing, and details can be changed at any time. - Created automatically when you click **Create quotation**. - Can be sent at any time by clicking **Send quotation**. ### Pending The quotation has been sent and is locked for editing. - In the **no confirmation** flow: the customer or administrator can place the order directly. - In the **confirmation required** flow: the customer can accept the quotation. ### Accepted The customer has accepted the quotation. *(Confirmation required flow only.)* - The administrator must now confirm the quotation before the order can be placed. ### Confirmed The administrator has confirmed the customer's acceptance. *(Confirmation required flow only.)* - The order can now be placed by the customer or administrator. ### Finalized The order has been placed and the quotation is finalized. - The quotation is read-only. ### Rejected The customer has declined the quotation. - The quotation cannot be edited or converted. ::tip If a rejected quotation needs revision, duplicate it to create a new draft with the same details. :: ### Expired The quotation's expiration date has passed without a response. - Set automatically when the expiration date is reached. - The quotation cannot progress further in this state. # Orders The Orders section in Geins Studio provides features for creating and managing quotations and orders. It offers an overview of all orders, allowing you to track their status and details efficiently. ### Key areas in the orders section - **Quotations** - Create and manage quotations for companies. - **Orders overview** - View all orders placed by individual customers and companies. - **Order details** - Access detailed information about individual orders, including customer information, products ordered. :br ::tip Geins Studio is continually evolving, with new features and improvements being added regularly. Quotations is the first feature to be introduced in this area. :: # Base configuration ## Key features - Set the channel name and storefront URL - Configure a default language and add additional languages - Assign a default market and add additional markets with separate currencies - Enable payment methods for the channel - Configure transactional emails sent to customers ## Quick guide 1. Go to **Channels** under Settings select a channel. 2. Enter the channel **Name** and **Storefront URL**. 3. Under **Languages**, set the default language and add any additional languages. 4. Go to the **Markets** tab and set the default market. 5. Add any additional markets. 6. Go to the **Payments** tab and enable the payment methods to use on this channel. 7. Go to the **Mails** tab and configure transaction mails. 8. Go to the **Storefront settings** tab and configure your storefront settings. 9. Click **Save channel**. --- ## Channel details The **General** tab contains the core identity settings for the channel. | Field | Description | | ------------------ | -------------------------------------------------------------------------------------------- | | **Name** | The public-facing name of the channel. | | **Internal name** | Generated automatically from the name when the channel is created. Cannot be changed. | | **Storefront URL** | The URL of the storefront connected to this channel. Read-only when locked by configuration. | --- ## Languages A channel requires one default language. You can add additional languages to support multilingual channels. ### Default language The default language is used as the fallback when no other language is specified. Click **Change** to replace it. ### Additional languages Additional languages allow the channel to serve content in multiple languages. 1. Click **+ Add**. 2. Select a language. 3. Toggle **Active** to enable or disable it. 4. Click **Save channel**. Use the **×** button to remove a language from the channel. --- ## Markets The **Markets** tab controls which markets the channel serves and which currency each market uses. ::note A market is a country of sale defines a country or region with its own currency, VAT rate, and pricing rules. [Learn more about markets](https://geins.io/docs/core-features/channels/markets). :: ### Default market The default market is used as the fallback when no other market is matched. Click **Change** to replace it. ### Additional markets 1. Go to the **Markets** tab. 2. Click **+ Add**. 3. Select a country or region. 4. Toggle **Active** to enable or disable it. 5. Click **Save channel**. Each market displays the following: | Column | Description | | ------------ | ------------------------------------------------------ | | **Country** | The country or region for this market. | | **Currency** | The currency used in this market. | | **VAT rate** | The VAT rate applied in this market, if configured. | | **Active** | Whether the market is currently active on the channel. | ::tip Markets can share the same currency. For example, multiple countries can all use EUR. :: --- ## Payments The **Payments** tab controls which payment methods are available on the channel. Each row shows the payment method, the markets it applies to, and the customer types it is available for. Use the toggle on the right to enable or disable a method on this channel. | Column | Description | | ------------------ | --------------------------------------------------------- | | **Method** | The payment provider or method, with its logo and name. | | **Markets** | The number of markets the method is configured for. | | **Customer types** | The number of customer types the method is available for. | | **Active** | Whether the method is currently active on the channel. | ::note Payments configuration in Studio is being developed. More options and settings for managing payment methods will be added over time. :: --- ## Related settings - [Storefront settings](https://geins.io/storefront-settings), configure storefront-specific behavior for this channel. - [Transaction mails](https://geins.io/transaction-mails), configure transactional emails sent from this channel. # Transaction mails ## Key features - Enable or disable transaction mails for the channel - Set the sender name and from address - Add BCC recipients for order confirmations - Configure content per mail type and per language - Preview the rendered mail before saving - Customize logo, colors, and typography shared across all mails ## Quick guide 1. Go to **Channels** under Settings and select a channel. 2. Open the **Mails** tab. 3. On the **General** sub-tab, set the sender details and BCC recipients. 4. On the **Mail content** sub-tab, toggle individual mails on or off and edit their content per language. 5. On the **Layout options** sub-tab, upload the logo and header image and set colors and typography. 6. Click **Save channel**. --- ## General The **General** sub-tab contains channel-wide mail settings. | Field | Description | | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | | **Disable all transaction mails** | When enabled, this channel will not send any transaction mails. Overrides the per-mail toggles on the **Mail content** sub-tab. | | **Sender name** | The name shown as the sender in the recipient's inbox. | | **From email address** | The address mails are sent from. Read-only when locked by configuration. | | **BCC emails for order confirmation** | A comma-separated list of addresses that also receive the order confirmation mail. | | **Advanced mail settings** | Exposes core mail behavior. Only change these if you know what you are doing. | --- ## Mail content The **Mail content** sub-tab lists every transaction mail the channel can send. Use the toggle on each row to enable or disable a mail, and the edit button to open its content editor. ::note The list shows every transaction mail available in the platform. Which mails are actually sent depends on your configuration, an active mail may not be used if the related feature isn't enabled on the channel. :: ### Order mails | Mail | Sent when | | ---------------------------- | --------------------------------------- | | **Order confirmed** | An order is placed. | | **Order is being processed** | An order is being processed. | | **Order delivered** | An order has been delivered. | | **Order cancelled** | An order is cancelled. | | **Item removed from order** | A product row is removed from an order. | | **Item returned** | A product row is returned. | ### Customer mails | Mail | Sent when | | ---------------------------------- | ---------------------------------- | | **Wishlist product back in stock** | A wishlist item is back in stock. | | **Refund issued** | A refund has been processed. | | **Account created** | A new customer account is created. | | **Account deleted** | A customer account is deleted. | | **New message** | A new message is available. | | **Password reset** | A password reset is requested. | ### Product mails | Mail | Sent when | | ------------------------------ | ------------------------------------- | | **Share product** | A product is shared with someone. | | **Product item back in stock** | A requested size is available. | | **Product back in stock** | A monitored product is back in stock. | ### Edit mail content Click the edit button on a mail to open the content editor. 1. Select a **Language**. Content is edited per language, switch to update each one separately. 2. Fill in the fields shown for the mail. Common fields include **Title**, **Subtitle**, **Inbox preview**, and **Subject**. Some mails include additional fields, such as **Message has backordered rows** or **Message cancelled**. 3. Click **Save**. Switch to **Live preview** to see the rendered mail with the current layout options applied. Save your changes first, the preview reflects the saved content. ::tip Placeholders like `{site_name}` are replaced with channel values when the mail is sent. Use them in subjects and body fields to personalize content without hardcoding. :: --- ## Layout options The **Layout options** sub-tab controls the visual design shared by all transaction mails on this channel. ### Images | Field | Description | | ---------------- | ---------------------------------------------------------------- | | **Logo** | Logo shown in the mail header. Recommended size 200×50px. | | **Header image** | Banner image shown above the mail body. Recommended width 600px. | Click an image slot to browse, or drop an image onto it to replace. ### Colors Colors are grouped into backgrounds, text, and buttons. | Group | Fields | | --------------- | -------------------------------------------------------------------------------------------------------------------------------- | | **Backgrounds** | Background color, Body color, Secondary body color, Header color, Footer color. | | **Text** | Text color, Footer text color, Sale text color, Not included text color, Previously shipped text color, Back ordered text color. | | **Buttons** | Button color, Button text color. | ### Typography | Field | Description | | -------------------- | ----------------------------------------------------------------------------------------------------- | | **Font family** | Font used across the mail templates. | | **Font URL** | URL the font is loaded from (e.g. a Google Fonts stylesheet). Read-only when locked by configuration. | | **Font size small** | Small text size, in pixels. | | **Font size medium** | Default body text size, in pixels. | | **Font size large** | Headings and emphasized text size, in pixels. | | **Line height** | Line height applied to body text, in pixels. | ### Shape | Field | Description | | ---------------------- | ---------------------------------------------------------------- | | **Border radius** | Corner radius for buttons and boxes, in pixels. | | **Product image size** | Size used for product images in mail product rows (e.g. `180w`). | ### Product display Control which product details appear in mail product rows. | Field | Description | | ----------------------- | ------------------------------------------------------------- | | **Show brand** | When enabled, the product brand is shown in product rows. | | **Hide article number** | When enabled, the article number is hidden from product rows. | | **Product parameters** | Comma-separated attribute keys to show in mail product rows. | --- ## Related settings - [Base configuration](https://geins.io/base-configuration), channel name, languages, and markets. - [Storefront settings](https://geins.io/storefront-settings), storefront-specific behavior for this channel. # Storefront settings ## Key features - Configure the storefront connected to the channel from inside Studio - Group settings by purpose across **Base settings**, **Layout options**, **SEO**, and **Contact** - Preview the storefront before saving ## Quick guide 1. Go to **Channels** under Settings, select a channel, and open the **Storefront settings** tab. 2. Work through the sub-tabs: **Base settings**, **Layout options**, **SEO**, **Contact**. 3. Click **Preview** at the top right to see the storefront with the current settings. 4. Click **Save** when you're done. --- ::note Storefront settings are driven by a schema. The fields available are defined by the storefront connected to the channel, so what you see in your Studio may differ from what is described here. The reference page below documents the default schema. :: --- ## About the settings schema The fields shown in **Storefront settings** are defined by a schema attached to the storefront. Different storefronts can ship with different schemas, which is why your Studio may expose different sections than the [reference](https://geins.io/storefront-settings-reference) describes. Editing the schema is an advanced operation reserved for storefront setup. Documentation for the schema editor will be added separately. --- ## What you can configure The settings are grouped into four sub-tabs. | Sub-tab | Purpose | | ------------------ | ------------------------------------------------------------------------------------------------------- | | **Base settings** | Storefront mode (Commerce or Catalogue) and access requirements for prices, order placement, and stock. | | **Layout options** | Branding (logo and favicon), corner style, fonts, and theme colors. | | **SEO** | Default metadata, robots policy, and analytics identifiers. | | **Contact** | Public contact details and address. | ### Field reference For the full field-by-field reference of the default schema, see [Storefront settings reference](https://geins.io/storefront-settings-reference). --- ## Preview Click **Preview** at the top right of the page to see the storefront rendered with the current settings before saving. --- ## Related settings - [Base configuration](https://geins.io/base-configuration), channel name, languages, markets, and payments. - [Transaction mails](https://geins.io/transaction-mails), configure transactional emails sent from this channel. - [Storefront settings reference](https://geins.io/storefront-settings-reference), field-by-field reference for the default schema. # Storefront settings reference ::note This page documents the default storefront settings schema. The fields available in your Studio depend on which storefront the channel is connected to, so your view may differ. :: For an overview of the Storefront settings tab and how it works, see [Storefront settings](https://geins.io/storefront-settings). --- ## Base settings ### Storefront mode Choose how the storefront behaves. | Mode | Description | | ------------- | ------------------------------------------------------------------------------------------------ | | **Commerce** | Visitors can purchase products directly on the storefront, with buy buttons and a checkout flow. | | **Catalogue** | Products are shown without commerce functionality, no buy buttons or checkout. | ### Access requirements Define which actions require login. These settings are global and may be overridden by roles or permissions. | Setting | Description | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------ | | **Price visibility** | Controls whether prices are shown on the storefront. When enabled, choose **Authenticated users only** or **All users**. | | **Order placement** | Controls whether orders can be placed from the storefront. When enabled, choose **Authenticated users only** or **All users**. | | **Stock status** | Controls whether stock levels are visible on the storefront. | ::note **Authenticated users only** means visitors must be logged in to access the content or perform the action. :: --- ## Layout options ### Branding | Field | Description | | ------------ | ---------------------------------------------------------------------------- | | **Logotype** | Logo shown on the storefront. Click to browse, or drop an image to replace. | | **Favicon** | Icon shown in the browser tab. Click to browse, or drop an image to replace. | ### Corner style Choose between rounded or square corners for interface elements. | Option | Description | | ---------- | ----------------------------------------- | | **Square** | Gives interface elements square corners. | | **Round** | Gives interface elements rounded corners. | ### Font settings | Field | Description | | ------------- | ---------------------------------------------------------------- | | **Headings** | Font used for heading elements on pages and content. | | **Body text** | Font applied to body text, descriptions, and supporting content. | ### Theme colors Set background and text colors for selected interface elements. #### Buttons | Group | Fields | | -------------------- | ----------------- | | **General buttons** | Background, Text. | | **Purchase buttons** | Background, Text. | #### Site background Pick the storefront background. | Option | Description | | -------------- | ----------------------------------------------------- | | **White** | The background of your storefront will be white. | | **Light gray** | The background of your storefront will be light gray. | #### Navigation bar background Pick the navigation bar background. | Option | Description | | -------------- | --------------------------------------------------------- | | **White** | The background of your navigation bar will be white. | | **Light gray** | The background of your navigation bar will be light gray. | #### Site top bar | Field | Description | | -------------- | ------------------------------------- | | **Background** | Background color of the site top bar. | | **Text** | Text color of the site top bar. | #### Footer | Field | Description | | -------------- | ------------------------------- | | **Background** | Background color of the footer. | | **Text** | Text color of the footer. | --- ## SEO Default metadata, robots policy, and analytics identifiers used across the storefront. | Field | Description | | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | **Default title** | Used when a page does not provide its own title. | | **Title template** | Pattern applied to page titles, e.g. `%s | My Store`. | | **Default description** | Used as the meta description fallback. Recommended max \~160 characters. | | **Default keywords** | Comma-separated list of fallback meta keywords. | | **Robots policy** | Controls the default `robots` meta tag value across the storefront. Choose **Index, follow** or **No index, no follow**. | | **Google Analytics ID** | Google Analytics measurement ID, e.g. `G-XXXXXXXXXX`. | | **Google Tag Manager ID** | Google Tag Manager container ID, e.g. `GTM-XXXXXX`. | | **Search console verification** | Verification token, e.g. the Google Search Console meta value. | ::tip Set **Robots policy** to **No index, no follow** while you're building or staging the storefront. Switch to **Index, follow** before launch. :: --- ## Contact Public contact information shown on the storefront. ### Contact details | Field | Description | | --------- | ---------------------------------------------------- | | **Email** | Public contact email. | | **Phone** | Public contact phone number, including country code. | ### Address | Field | Description | | --------------- | ------------------------ | | **Street** | Street address. | | **Postal code** | Postal or ZIP code. | | **City** | City. | | **Country** | Country code, e.g. `GB`. | # Profile To view or edit your profile: Click on your name at the bottom of the navigation and there click on **Account**. Your profile shows your basic contact details, first name, last name, email, and phone. ### Login credentials Under login credentials, you can update your password that you use to sign in to Geins Studio. #### Username The username is assigned by an administrator in your organization and is not automatically the same as the email shown in your profile. Updating the email field will not change your username. ::note Contact a administrator in your organization if you need to update your username. :: --- ::tip Other account functions such as dark/light mode preference and sign out are also found under your name at the bottom of the navigation. :: # Export functionality ## Key features - Export data from most Merchant Center views, including products, categories, brands, properties, customers, subscribers, orders, and refunds - Choose between **Export all** and **Export this** - Include product items (sizes) in product exports - Receive your export as a .csv file ## Quick guide 1. Open a view that supports exporting (for example **Products**). 2. Click **Export all** or **Export this**. 3. For products, optionally check **Include items in export** to also include sizes. 4. The selected data is exported to a .csv file. --- Most views in Merchant Center allow you to export data whether it's products, categories, brands, properties, customers, subscribers, orders and refunds etc. For all of these you are given two options, either **Export all** or **Export this**. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2024-04-04-kl.-13.05.14_cccfebd3.png) **Export all** means that all the data and columns will be exported to a .csv file while **Export this** means that all the columns which are visible and all the filters made will be exported to a .csv file. Under **Products** there is a third option where there is a checkbox called **Include items in export** meaning all the items (sizes) will also be included in the .csv file. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2024-04-04-kl.-14.25.55_edf99bda.png) ## Additional export columns The following additional columns will be included in the .csv file: | Column | Description | | --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **ProductItemId** | A unique identifier for each product item in the inventory. | | **SizeArticleNumber** | A specific identifier that combines both the product and its size variant, enabling unique identification of inventory items that differ only in size. | | **Size** | The size of the product, which can be crucial for apparel, footwear, and other products where size is a significant variant. This could be numerical (e.g., 8, 10, 12) or descriptive (e.g., S, M, L). | | **StockThreshold** | A set point that triggers a notification when the stock level falls to or below this number. It's used to alert administrators to restock to prevent stockouts. | | **StaticStock** | The number of units of a product item that are consistently available. This refers to a baseline stock level that is maintained at all times, not accounting for fluctuations due to sales or restocking. | | **OversellableStock** | The quantity of a product that can be sold even if it exceeds the actual stock available. | | **Shelf** | The specific location within a warehouse or storage area where the product is stored. This could be an alphanumeric code indicating a shelf number, facilitating easy retrieval. | | **ItemWeight** | The weight of the individual item, typically measured in kilograms or pounds. This is essential for shipping cost calculations and logistics planning. | | **ItemHeight** | The height of the item, usually measured in centimeters or inches. This dimension is crucial for determining the packaging and shipping requirements. | | **ItemWidth** | The width of the item, also measured in centimeters or inches, contributing to understanding the space it occupies for storage and shipping. | | **ItemLength** | The length of the item, measured in similar units to height and width. Together with height and width, this defines the product's dimensional space. | # Dashboard ## Key features - Get an overview of total sales for the day, the week, or the past month - See the average order value, number of orders, and revenue for the selected period - Track the latest orders with their date, order ID, value, and state - See the most sold products to spot what's trending right now ## Quick guide 1. Log in to Merchant Center to open the **Dashboard**. 2. Choose a period (day, week, or month) to view the sales figures. 3. Review the latest orders and their current state. 4. Check **Most sold products** to see what's trending. --- The date dimension is based on the order placement date, showing what customers intended to buy, including any canceled orders or products. All amounts are shown excluding tax. ![image](https://geins.io/../../img/merchantcenter/10057205402524_5F1245CC.png) You can see the total sales for the day, the week or the past month and also get an overview of the average order value, number of orders and the amount the orders generated during the selected period. ![image](https://geins.io/../../img/merchantcenter/10057212427676_6CB51AA8.png) You may also see an overview of the latest orders, which date they were created, the order ID, the order value and which state the order is in: **Pending**, **Completed**, **Returned**, **Cancelled**, and **Backorder**. To the right you can see the **Most sold products**, which gives you an overview of which products are trending right now: how many items sold per product, the revenue on each product, and the % margin you have on each product. This could be an inspirational source for campaigns. # How to add a new administrator in Merchant Center ## Key features - Add a colleague as an administrator in Merchant Center - Set the new administrator's details and activate the account - The new administrator sets their own password through a password reset ## Quick guide 1. Go to **Settings > Administrators** in the left menu. 2. Select **New** in the upper left corner. 3. Fill in the **First name**, **Last name**, **Phone**, and **Email**. 4. Tick the **Active** checkbox and click **Save**. 5. Ask the new administrator to open your Merchant Center URL, click **Forgot your password?**, and enter the email you used. 6. They follow the link in the email to set a password, and can then log in. --- Go to **Settings > Administrators** in the left menu. ![image](https://geins.io/../../img/merchantcenter/10030585862812_E6B37943.jpeg) Select **New** in the upper left corner. ![image](https://geins.io/../../img/merchantcenter/10030555569052_96416087.png) Fill in the First name, Last name, Phone and Email for the user you want to add, then tick the checkbox for **Active** and click **Save**. ![image](https://geins.io/../../img/merchantcenter/10030538732956_CFE7D13E.png) The new administrator now has to go to your Merchant Center URL and click on the **Forgot your password?** option and type in the email address which you entered in the previous step. This will generate an email with a link to reset their password. When the user has typed in the new password twice, he or she is able to log in to Merchant Center. # Search bar ## Key features - Search for **Products**, **Customers**, **Orders**, and **Return cases** - Find products by product name or product ID - Find customers by full name, customer ID, or email address - Find orders by order ID, and return cases by order number ## Quick guide 1. Click the search bar in Merchant Center. 2. Enter your search term: a product name or ID, a customer name, ID or email, or an order ID. 3. Review the matching results. --- In Merchant Center you as a user are able to search for **Products**, **Customers**, **Orders**, and **Return cases**. ![image](https://geins.io/../../img/merchantcenter/searchbar_BA868BB0.png) Searching for a customer also shows all the orders they've placed, making it easier to manage their account. Return cases become searchable by order number once the return has been handled in Geins Warehouse (WMS). # Working with the grid ## Key features - Customize how product data is displayed, sorted, filtered, and searched - Add, remove, and reorder columns to match your workflow - Filter column data and export the filtered view, or the entire catalog - Control how many items are shown per page ## Quick guide 1. Open a view that uses the grid (for example **Products**). 2. Use **Column Options** in the upper right corner to add, remove, or reorder columns. 3. Right-click a column to filter the data. 4. Export the filtered view with **Export**, or the full catalog with **Export All**. 5. Use the dropdown in the lower left corner to set how many items are shown per page. --- ![image](https://geins.io/../../img/merchantcenter/10288155475100_B47CB43B.png) The grid gives you full control over your product data. You can customize how it's displayed, sort, filter, and search, and add or remove columns to suit your workflow. ![image](https://geins.io/../../img/merchantcenter/10288303664924_9461EE41.png) ### Customizing columns Use the **Column Options** menu in the upper right corner to tailor the grid to your workflow: - Add or remove columns. - Drag and drop columns to reorder them. ![image](https://geins.io/../../img/merchantcenter/10288303665820_1A1746B8.png) ### Filtering data 1. Right-click the column you want to filter. 2. The grid instantly updates to show the matching data. 3. Click **Export** to export the filtered view, or **Export All** to export your entire product catalog. In the example below, a filter on the **Image** column shows products that have an image, are missing one, or either. ![image](https://geins.io/../../img/merchantcenter/10288303666460_9174C370.png) ### Choosing display preferences Use the dropdown in the lower left corner of the grid to set how many items are shown per page: 50, 100, 200, 500, or 1000. Higher values may increase the grid's loading time. ![image](https://geins.io/../../img/merchantcenter/10288775292828_52C3F8B4.png) # Cancel an order ## Key features - Cancel an order by locking it permanently - Choose whether to restore inventory when cancelling - Cancel orders whose delivery has already started - Notify the customer by email when an order is cancelled ## Quick guide 1. Open the order you want to cancel. 2. Tick **Lock Permanently**. 3. To keep stock counts unchanged, also tick **Do Not Restore Stock Counts**. 4. Click **Save**. --- When you cancel an order, the inventory balance is restored for the products it contained. If you don't want this, for example if an item was defective or missing from the shelf, tick **Do Not Restore Stock Counts** before you click **Save**. ![image](https://geins.io/../../img/merchantcenter/order_lock_perma_121A75A4.jpg) A permanent lock can't be undone. The order stays in the system but is cancelled and locked permanently. ## Cancel an order whose delivery has started If a delivery has started, you can't lock the order permanently from the order view, you'll see the text *Save unavailable while order is processed*. You need to cancel the delivery first: 1. Go to the delivery the order belongs to. From the order view, click the parcel group number in the **Fulfillment history** box. 2. Find the order in the delivery, click **Report**, then **Report order as suspect**. This removes the order from the delivery for further investigation. 3. The delivery is interrupted. Back in the order view, tick **Lock Permanently** and click **Save**. ![image](https://geins.io/../../img/merchantcenter/order_fullfilllment_link_A61F7C38.jpg) ## Notify the customer To tell a customer their order is cancelled, send an email directly from the order view using the **Order Removed** button that appears once an order is permanently locked. Click the button to preview the email, then click **Send mail** to send it to the email address on the order. ![image](https://geins.io/../../img/merchantcenter/order_remove_mail_130BCEA5.jpg) # Change carrier on an order ## Key features - Change the carrier on an existing order - Find the order from the order list or the search bar - Continue processing the order with the new shipping method ## Quick guide 1. Open the order from **Warehouse (WMS) > Orders**, or search for the order ID in the search bar. 2. In the **Shipping** field on the right, open the dropdown. 3. Select the carrier you want to use. 4. Click **Save**. --- Open the order you want to change from **Warehouse (WMS) > Orders**. ![image](https://geins.io/../../img/merchantcenter/10120222428956_3ABE138B.png) You can also find the order with the search bar by typing in the order ID. ![image](https://geins.io/../../img/merchantcenter/10120232115484_5756C4DC.png) In the selected order, open the **Shipping** dropdown in the field on the right. ![image](https://geins.io/../../img/merchantcenter/10120206349084_EC68C2A5.png) Select the carrier you want to use instead of the old shipping method, then click **Save**. ![image](https://geins.io/../../img/merchantcenter/10120222432796_B2BDD36C.png) The order now has a new shipping method and you can continue finalizing it. # Edit order rows ## Key features - Edit the rows of an existing order - Add products to an order - Adjust order totals, with refunds handled to the customer's balance ## Quick guide 1. Open the order: search the order ID, or go to **Orders** under **Warehouse (WMS)**. 2. Click the **Edit order rows** tab. 3. To add a product, click **Add product**, search by product ID or name, and press **+**. 4. Review all changes and click **Save**. --- ## Before you edit Editing depends on the order's stage and the payment method used. Keep these limitations in mind: - **Payment method limitations** — some payment methods don't allow automatic updates after the order is submitted. - **Value modification** — some payment methods don't permit increasing the order value after submission. To add items or raise the total, you may need an alternative method or to contact support. - **Reduction in order total** — if you reduce the total, the excess is usually added to the customer's balance automatically. Double-check the balance for accuracy. - **Manual refunds** — if you're issuing a refund, make the necessary corrections manually during editing before saving. ## Edit order rows Open the order by searching the order ID, or go to **Orders** under **Warehouse (WMS)**. ![image](https://geins.io/../../img/merchantcenter/10224023266844_18BEFCEB.png) Click the **Edit order rows** tab. ![image](https://geins.io/../../img/merchantcenter/10224039773724_C5A6AA17.png) At the bottom you'll see the order's items. To add a product, click **Add product**. ![image](https://geins.io/../../img/merchantcenter/10224031890716_174C8F0B.png) Search for the product by its internal product ID or name, then press **+** to add it to the order. ![image](https://geins.io/../../img/merchantcenter/10224007843356_5AFB014B.png) Make all your changes in one go before saving. This keeps the order accurate and prevents missed adjustments later on. # Find an order in Merchant Center ## Key features - Find orders quickly from the main search - Filter the order list by any column - Choose which columns are visible in the list ## Quick guide 1. In the main search, enter the customer name or order ID (tick only **Orders** for the most effective search). 2. Or go to **Warehouse (WMS) > Orders** and right-click a column heading to filter. 3. Use **Column options** in the upper right to show or hide columns. --- ## Search from the main search In the main search, enter either the customer name or the order ID to quickly find current orders. Tick only **Orders** for the most effective search. ![image](https://geins.io/../../img/merchantcenter/orders_search_CE903A18.jpg) ## Filter the order list 1. Go to **Warehouse (WMS) > Orders** in the left menu. 2. Right-click a column heading to filter it. For example, right-click the **Id** heading and enter the ID you're looking for, the list filters to the matching orders. ![image](https://geins.io/../../img/merchantcenter/orders_list_34ACB0AE.gif) Control which columns are visible with **Column options** in the upper right. There you can show or hide the columns you want to work with. ![image](https://geins.io/../../img/merchantcenter/orders_colopt_82240BE7.jpg) To clear all filtering, right-click a heading and click **Clear all filters**. # How to work with wildcard * in the order filter ## Key features - Use the `*` wildcard to match any combination of characters in the order filter - Catch groups of orders by partial values, such as a carrier or an email domain - Available in all filter fields except **Payment**, **Max Sum**, and **Max orders** ## Quick guide 1. Open the order filter. 2. In a supported field, enter a value using the `*` wildcard (for example `*DHL*` or `*@mail.com`). 3. Matching new orders are locked and moved to the **Pending - Filter** list for review. --- The order filter automatically sorts and locks new orders, moving them to the **Pending - Filter** list for manual review. This helps you identify specific types of orders based on criteria you set, such as orders made with a specific email, above a maximum sum, or with a specific carrier. The `*` symbol, known as a wildcard, matches any combination of characters, making it a flexible filtering tool. You can use `*` in all fields except **Payment**, **Max Sum**, and **Max orders**. ## Examples ### Filter all orders from a specific carrier Adding the value `*DHL*` filters all orders created with any DHL option set as carrier, no matter which DHL shipping option the customer chose (service point, package, and so on). ![image](https://geins.io/../../img/merchantcenter/image-png_4C9C6630.png) ### Filter all orders from a specific email domain Adding `*@mail.com` in the **Email** field filters all orders where the customer's email contains the domain @mail.com (, , and so on). ![image](https://geins.io/../../img/merchantcenter/image-png-2_A7E9B4C1.png) # Managing an order that contains product that's out of stock (Oversellable) ## Key features - Identify orders held in Pending - Unstocked because a product is out of stock - Deliver the order by updating the product's inventory balance - Or remove the out-of-stock product and deliver the rest of the order ## Quick guide 1. Find the held order under **Pending - Unstocked** (or Not ready - orders) in **Warehouse (WMS)**. 2. Either restock the product by updating its inventory balance, or remove it from the order with **Edit order rows**. 3. Click **Save**. The order moves to **Fulfill orders** and can be delivered. --- When an order comes in that contains products which are out of stock in the normal inventory, it lands under **Pending - Unstocked** (or Not ready - orders) in the menu under **Warehouse (WMS)**. Inside the order, the product list shows the item as *remaining listed*. ![image](https://geins.io/../../img/merchantcenter/6189434022044_F76D6051.jpeg) There are two main ways to deliver these orders: - Update the inventory balance on the product and deliver - Remove the product from the order and deliver the rest ## Update the inventory balance and deliver If you've received products that were *remaining listed* and want to deliver the order, update the inventory balance, either directly on the product or via the inventory view. ### Directly on the product Open the product and update the available inventory balance in the **In stock** field in the product list box. ![image](https://geins.io/../../img/merchantcenter/6190418490012_2DE92ECC.jpeg) Click **Save**. The order leaves **Pending - Unstocked** and appears under **Fulfill orders** (or deliver orders), ready to deliver, either individually via the **Fulfill order** button or in a delivery batch. ### Via the inventory view 1. Go to **Inventory** under **Products (PIM)** and search for the product, for example by its ID. 2. In the **Change** field, enter the amount to add, choose a **Reason** from the dropdown, and click **Save**. The inventory balance updates and the order can be delivered. ## Remove the product and deliver the rest If the order contains other products and you want to deliver them without the *remaining listed* items, open the order and click the **Edit order rows** tab. ![image](https://geins.io/../../img/merchantcenter/6189917719708_6B11CC3E.jpeg) Remove the *remaining listed* product or products. ![image](https://geins.io/../../img/merchantcenter/6189956516252_8C16F6E4.jpeg) Click **Save**. You may need to check or update the chosen delivery method, for example if you removed a large product that affects how you want to deliver. The order leaves **Pending - Unstocked** and appears under **Fulfill orders** (or deliver orders), ready to deliver individually via the **Fulfill order** button or in a delivery batch. In the order confirmation email sent to the customer, the removed product is struck out. ![image](https://geins.io/../../img/merchantcenter/6190119162140_4B5858F3.jpeg) If the order contains only one product that you know won't come back in stock, you need to cancel the order. See [how to cancel an order](https://geins.io/../../FAQs/Productpercent20andpercent20Categories/how-do-i-cancel-a-order). # Order filter ## Key features - Set up filters to safeguard your shop from fraudulent orders - Target orders by value, individual, location, payment, shipping, and more - Review flagged orders in the Pending - Filter section before they ship ## Quick guide 1. Create a filter and give it a descriptive name. 2. Set the parameters you want to match (see the table below). 3. Activate the filter. 4. Review matching orders under **Pending - Filter** in the WMS, then handle or permanently lock them. --- Filters help keep your store secure by automatically catching orders that match criteria you define, such as specific order values, individuals, or countries associated with fraudulent behavior. ## Step 1: Create your filter Give your filter a descriptive name and a short note about its purpose, so you can easily identify it later. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2023-10-19-kl.-11.37.07_88729a26.png) ### Filter parameters Choose from the following parameters to match orders to your business requirements: | Parameter | Description | | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **First name** | First name of a specific customer, for example one who has shown fraudulent behavior. | | **Last name** | Last name of a specific customer. | | **Email** | A specific customer's email address. To block an entire domain, place a `*` before it, for example `*@mail.se` catches all orders with an email ending in @mail.se. | | **Personal number** | The personal number (social security number) of a specific customer. | | **Address** | Postal address, often a home address, of a specific customer. | | **Zip code** | Zip code of a customer, or a whole area if the filter blocks a region. | | **City** | City of a customer, or a whole city if the filter blocks it. | | **Market** | The market the filter is active on, for example webshop.se or webshop.com. | | **IP** | IP address of a specific user. | | **Member type** | Target a whole customer group set up under **Customer (CRM) > Groups**. | | **Payment** | Filter on a specific payment method. | | **Shipment** | Filter on a specific shipping method. | | **Max sum** | Orders above this value end up in **Pending - Filter**. | | **Max orders per day** | Maximum number of orders per day and user. | | **Has message** | Whether an order has a message, if a message is configured on the checkout page. | | **Zero order sum** | Whether users can place a zero-value order, often used for influencers. | Once you've set the name and parameters, activate the filter. Your store will then apply the criteria automatically to incoming orders. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2023-10-19-kl.-11.38.02_13ccf55d.png) ## Step 2: Test and monitor After setting up filters, monitor their effectiveness regularly. Review the settings periodically to make sure they match your fraud-prevention goals, and run test orders for various scenarios to confirm the filters work without unintended disruptions. Once a filter is active, orders that meet the criteria appear in the **Pending - Filter** section in the WMS. You can handle the order as normal or permanently lock it, choose **Yes** or **No**. ![image](https://geins.io/../../img/merchantcenter/10288717723932_7A98D032.png) # Paper format for shipping documents ## Key features - Print shipping documents directly from Geins Warehouse Management System - Return slip, shipping label, and order confirmation on a single sheet ## Quick guide 1. Use a laser printer with a full duplex module. 2. Use paper in the 210x99 mm format. 3. Depending on your setup, use either two or three labels per sheet. --- If you deliver your orders through Geins Warehouse Management System, you need a laser printer with a full duplex module and specific paper. Depending on your initial setup, you'll use either two or three labels. The shipping documents are placed on one side, with both the return slip and the standard shipment, and the order confirmation is printed on the other side. The paper format should be 210x99 mm. ![image](https://geins.io/../../img/merchantcenter/10406495525276_0EE4BC55.jpeg) For Swedish merchants, [this supplier](https://www.officedepot.se/produkter/packa-skicka-3596/adresslappar-fraktsedlar-6481/transportetikett-a4-500ark-fp-2656101){rel="nofollow"} is one example of where you can buy suitable paper. # Pending orders ## Key features - Understand the three pending order states: Unstocked, Locked, and Filter - Manually inspect and handle orders that need attention - Spot pending orders by the red marker on each box ## Quick guide 1. Watch for the red marker on the **Pending** boxes in **Warehouse (WMS)**. 2. Open the relevant pending section to inspect the orders. 3. Resolve the issue (restock, fix the error, or review the filter match), then unlock or handle the order. --- When an order triggers **Pending - Unstocked**, **Pending - Locked**, or **Pending - Filter**, you have to manually inspect and handle it. A red marker appears on each box when an order is pending. ## Pending - Unstocked An order containing one or more missing products lands under **Pending - Unstocked**. The product is not in stock and needs to be ordered from the supplier. The order moves automatically to **Fulfill orders** once the product is back in stock. Depending on your setup, you may be able to split the order into separate shipments, shipping the in-stock products first and the rest once they're available. ![image](https://geins.io/../../img/merchantcenter/10134865117596_FCC76689.png) ## Pending - Locked When an order has an error, it ends up under **Pending - Locked**. The error could be a payment problem or a shipping error. Investigate the order, then unlock it by clearing the **Locked** checkbox and clicking **Save**. ![image](https://geins.io/../../img/merchantcenter/10134833385628_284B6787.png) ## Pending - Filter Orders that meet the criteria you set under the order filter move to **Pending - Filter**. The order is ready to ship but locked. After analyzing the reason for the lock, you can handle it by clearing the **Locked** checkbox. ![image](https://geins.io/../../img/merchantcenter/10134860545564_3BB3C711.png) ## Order filter Set up filters to prevent fraud in your shop by targeting a certain order value or specific individuals. For example, you can block orders above 1000 SEK, prevent a specific person from ordering, or block orders from a certain country. Name your filter and fill in the parameters you want to use. Orders that meet your criteria are placed under **Pending - Filter** and can be handled manually after inspection. ![image](https://geins.io/../../img/merchantcenter/10134946804764_467498E9.png) # Register return ## Key features - Register a return for an order in Merchant Center - Choose how each returned row is refunded - Handle returns on orders that include a campaign ## Quick guide 1. Go to **Handle returns** under **Warehouse (WMS)**. 2. Enter the **Order ID** and search. 3. Click **Mark row as returned** on the product being returned. 4. Choose the return code and refund method, adjust the amount if needed, and click **Save**. --- ## Register a return Go to **Handle returns** under **Warehouse (WMS)** in the menu. In the large field, enter the **Order ID** of the products being returned and press Enter or click the search icon. ![image](https://geins.io/../../img/merchantcenter/return_7DBFEA96.png) The products in the order are listed below. In the **Return/Refund/Restock** column, click **Mark row as returned** on the product being returned. ![image](https://geins.io/../../img/merchantcenter/return_btn_1BB402CF.jpg) Choose the correct return code and how the refund is handled: | Option | Description | | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | No refund | No refund is made to the customer. | | Refund to balance | The refunded amount is added to the customer's balance, which is used for future purchases they make while logged in. The customer can see their balance on their My Pages. | | Refund | The customer is refunded via the payment method they used for the purchase. | Then: - If a refund is to be made, adjust the amount in the **Amount** field. It defaults to the product's full amount. - If the product won't be restocked, for example if it has a defect, clear the **Restock** checkbox. - To include the shipping cost in the refund, tick **Refund Shipping fee**. ![image](https://geins.io/../../img/merchantcenter/register_return_88EE10EC.gif) ## Returns on an order with a campaign If an order has a campaign, it's shown in the information column. How the discount is distributed depends on the campaign type. A fixed discount amount is distributed proportionally across the return lines, so more expensive products get a larger share of the discount deducted. See the example below. ![image](https://geins.io/../../img/merchantcenter/return_campaign_7F83B75F.jpg) When you're done with the rows being handled, click **Save**. The customer then gets their money back. When the money reaches them depends on the handling you chose and the payment method they used. # Return document to customer ## Key features - Two ways to give customers their return documents - Include the return label and slip directly with the delivery - Or create and send a return document on demand ## Quick guide 1. To send documents on demand, open the order and click **Create return lading**. 2. A PDF with the return slip and label downloads, ready to send to the customer. --- There are two ways to configure how customers get their return documents: sent directly with the order on delivery, or sent on demand when the customer contacts you (by post or email). ## Return document included with the order The return label and return slip are sent directly with the delivery. The return label sits beside the shipping label on the three-part, double-sided label paper, so the customer can easily stick it to their package for a possible return. A return slip is on the same document, placed under the delivery note, where they fill in the correct return code before attaching it to their package. ## Send on demand If you've configured documents to be sent when the customer contacts you, open the order (see [how to find an order](https://geins.io/../../Orders/General/find-a-order-in-merchant-center)) and click **Create return lading**. The **Create return lading** function works by pointing to a print favorite in nShift that's used when the return shipping slip is created. It therefore works with one return shipping method, regardless of which shipping method is used for the delivery. ![image](https://geins.io/../../img/merchantcenter/return_lading_AA841BB9.jpg) A PDF containing the return slip and return label downloads, so you can send it to the customer. # Deliver a single order ## Key features - Deliver a single order at a time - Download the pick list and shipping documents for the order - Complete the delivery to charge the customer and send the confirmation email ## Quick guide 1. Open the order to be delivered and click **Fulfill order**. 2. Once the order is processed, download the pick list with **Item list** and the shipping documents with **Documents**. 3. Print the documents, pack the order, and attach the label and delivery note. 4. Click **Deliver** to complete the delivery. --- To print labels you need a laser printer with a full duplex module and the correct printing paper. The shipping label layout is based on a three-part, double-sided label paper. ## Deliver a single order Open the order to be delivered (see [how to find an order](https://geins.io/../../Orders/General/find-a-order-in-merchant-center)). To start a delivery, click **Fulfill order**. ![image](https://geins.io/../../img/merchantcenter/order_fullfill_btn_AF5FA996.jpg) The delivery starts and you enter the delivery view (Fulfillment status). Started deliveries are always available under **Fulfillment History** in the menu. If you leave the delivery and want to return to it, open the order and click the parcel group number in the **Fulfillment history** box. ![image](https://geins.io/../../img/merchantcenter/order_fullfilllment_link-1_6CCE1448.jpg) Once the order has been processed with no obstacles, all the documents are available to complete the delivery. ![image](https://geins.io/../../img/merchantcenter/order_fullfillview_55ECF751.jpg) Download the pick list by clicking **Item list**. Download the shipping documents by clicking **Documents**. They contain the shipping label and delivery note, and can also include the return label and return slip, depending on how the document is configured. For a single order, you can use either the **Documents** button in the top bar or the one beside the order in the list, both contain the same thing. For a batch of many orders, the button in the top bar contains the shipping documents for every order. Print the downloaded PDF, then complete the package by attaching the label and adding the delivery note. When the package is ready, complete the delivery by clicking **Deliver**. The money is then charged from the customer and an order confirmation email is sent automatically, letting them know the order is on its way. ![image](https://geins.io/../../img/merchantcenter/order_fullfill_btn-1_B8E6FAF0.jpg) The delivery is now made and the package is ready to be sent to the customer. # Deliver orders in a batch ## Key features - Deliver many orders at once in a single batch - Select which orders to include by market, shipping method, date, and more - Download a combined pick list and shipping documents for the whole batch ## Quick guide 1. Go to **Warehouse (WMS)** and click **Fulfill orders**. 2. Click **Deliver orders**, then choose which orders to include. 3. Click **Deliver** to start the delivery. 4. Download the pick list (**Item list**) and shipping documents (**Documents**). 5. Pack the orders, then click **Deliver** to complete. --- To print labels you need a laser printer with a full duplex module and the correct printing paper. The shipping label layout is based on a three-part, double-sided label paper. ## Start the batch Go to **Warehouse (WMS)** and click **Fulfill orders**. The list shows orders that haven't been sent out yet. Click **Deliver orders**, you make your order selection in the next step. ![image](https://geins.io/../../img/merchantcenter/order_deliver_batch_B480591F.jpg) ## Select which orders to include Choose which orders to deliver using the options below. ![image](https://geins.io/../../img/merchantcenter/order_delivery_opt_2DF3D092.jpg) | Option | Description | | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Market | Which market or markets to deliver orders from. | | Shipping | Which shipping method or methods the orders must have set. Must be chosen. | | Date | Deliver orders from a specific date. The list contains dates with placed orders that can't be sent out yet. *Retrieve existing* is the default. | | Priority | The order in which orders are retrieved. *Oldest first* is the default. For example, if you have a large number of orders and retrieve 20 at a time, they're retrieved by this priority. *Group by shipping*, if ticked, orders the pick list by shipping method. | | Tag History | Saves and shows earlier shelf spaces you specified as black- or whitelisted. | | Shelf | Pick more effectively by including or excluding orders with products on a specific shelf in the warehouse. For example, if part of your assortment is in a distant part of the warehouse, you can exclude those orders from deliveries and deliver them in their own batch. | Use the shelf filters to narrow the batch by warehouse location: - **Blacklist** removes orders containing products on specific shelf spaces (comma-separate to list several). - **Whitelist** includes only orders containing products on specific shelf spaces (comma-separate to list several). | Option | Description | | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Limit | The maximum number of orders that can be included in the delivery. | | Serial number start | Every order in the delivery is assigned a serial number, which can represent, for example, a compartment in a pack wagon. Enter the serial number the delivery should start with. By default, the last number from the latest ongoing delivery + 1 is used. | When you've made your selection, click **Deliver** to start the delivery. The number in parentheses on the button shows how many orders will be included. ![image](https://geins.io/../../img/merchantcenter/order_deliver_dialog_41A9AB21.jpg) Once each order is processed, the documents are available to complete the delivery. If an order can't be completed for any reason, it's removed from the delivery, you'll see a summary in the **Discrepancies** box. [Read more about error messages and deviations](https://geins.io/../../Orders/Orderpercent20fullfillment/discrepancies-during-a-delivery). To edit or remove an individual order from a delivery, see [Remove individual orders from a delivery](https://geins.io/../../Orders/Orderpercent20fullfillment/remove-individual-orders-from-a-delivery). ![image](https://geins.io/../../img/merchantcenter/order_batch_CE887853.png) ## Complete the delivery 1. Download the pick list by clicking **Item list**. Products are sorted by shelf space, and any order you removed is crossed out. 2. Download the shipping documents by clicking **Documents** in the top bar. They contain shipping labels and packing slips for every order, and can also include return labels and return slips, depending on how the document is configured. To get documents for a single order, click **Documents** on that order's row instead. 3. Print the PDF, then complete each package by attaching the label and adding the delivery note. 4. When the packages are ready, click **Deliver**. The customers are charged and an order confirmation email is sent automatically, letting them know their order is on its way. ![image](https://geins.io/../../img/merchantcenter/order_deliver_38B7AECA.jpg) The delivery is now made and the packages are ready to be sent. # Deliver the bulk split shipment (pallet booking) ## Key features - Book one or several delivered batches into a consolidated bulk shipment - Share documents across the shipment: one pallet label, a consolidated customs declaration, and a waybill - Designed for international bulk shipments with a consolidated customs invoice ## Quick guide 1. Go to **Warehouse (WMS)** and click **Bulk shipments**. 2. Click **Create bulk shipment**. 3. Select the batches to include, then click **Create bulk shipment** again. 4. Download the shared documents from the last column in the list. --- This feature requires specific services configured in nShift, and the Bulk Shipments feature activated in Merchant Center with special configuration. Bulk Shipment lets you book one or several delivered batches into a consolidated bulk shipment, which then has shared shipping documents: one pallet label, a consolidated customs declaration, and a waybill. ## Conditions for batches to be included - All orders in the batch must be addressed to the same recipient country. - All shipping methods in the batch must be valid for bulk shipping. - Only a single common shipping provider can be included in the batch, for example only Bring or only Postnord. All products included in the batches must have these fields filled in: - Intrastat code - Country of origin ## Deliver the bulk shipment Go to **Warehouse (WMS)** and click **Bulk shipments**. Any existing bulk shipments are listed. Click **Create bulk shipment** to start, you make your batch selection in the next step. ![image](https://geins.io/../../img/merchantcenter/7316405352604_AA4AC08F.png) Select the batches to include by ticking the box in the first column. The example below has only one batch, but there could be more if multiple batches meeting the bulk conditions have been picked and delivered. Click **Create bulk shipment** to proceed. ![image](https://geins.io/../../img/merchantcenter/7316445109404_677B42B4.png) ![image](https://geins.io/../../img/merchantcenter/7316490773916_EF322E70.png) A new bulk shipment is created and you return to the list of bulk shipments, with the newly created one at the top. The documents are available for download in the last column. ![image](https://geins.io/../../img/merchantcenter/7316571401244_1A005ED6.png) # Discrepancies during a delivery ## Key features - Understand the discrepancies that can stop an order during delivery - See what each error message means and how to resolve it ## Quick guide 1. Open the delivery view (Fulfillment status). 2. Check the **Discrepancies** box for any orders that couldn't be delivered. 3. Find the message in the table below and follow the suggested action. --- During a delivery, an order may sometimes not be carried out for various reasons. You can see these in the **Discrepancies** box in the delivery view (Fulfillment status). Below is a summary of the discrepancies you may encounter, what they mean, and how to handle them. ## Discrepancies | Discrepancy | What it means and how to handle it | | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Reported as suspect | The order is manually removed by the administrator for further investigation. | | Item Missing | The order is manually removed when one or more products were out of stock. | | Unable to create shipment: Unable to generate PDF | An error occurred when creating the PDF file. Contact technical support. | | Unable to create shipment: Connection error, please try again | Temporary problem with the connection to nShift. Unlock the order and try again. | | Unable to create shipment: Postal code XXX is out of range | Invalid postal number (`ZipCodeNotExists`, field `Zipcode`). Open the order, correct it, unlock, and try to deliver again. | | Unable to create shipment: Value changed | Invalid intrastat number (field `StatNo` or `SourceCountry` in the customs declaration line). Check that the number is correct on all products in the order. | | Unable to create shipment: Mandatory value missing | The intrastat number is missing on one product in the order (field `StatNo` in the customs declaration line). | | Unable to create shipment: Checking for valid destination failed. UPS validation service did not respond | Temporary error at UPS (`UPSWebServiceFailed`). Try again later by opening the order and starting a new delivery. | | Unable to create shipment: Error in agent code | Disruption or error at a specific carrier (`ErrorInAgentReceiverNumber` / `ErrorInAgentReceiverCountryCode`). Contact nShift or the carrier for more information. | | Unable to create shipment: Error in agent code. Invalid agent | The delivery point is no longer valid (field `AgentNo`, `InvalidAgentReceiver`). Try changing the shipping method and then switching back, this resets the delivery point to the default for the postal code. | | Unable to create shipment: 250003: Invalid Access License number | Generated by nShift. Contact nShift support for further investigation. | | Unable to create shipment: Customs net weight higher than gross weight | Generated by nShift (`CustomsNetWeightIsHigherThanShipmentGrossWeight`). Contact nShift support for further investigation. | | Max number of lines exceeded | Generated by nShift (`TooManyLines`, field `ALL`). Contact nShift support for further investigation. | # How to Adjust an Order After Fulfillment Has Started ## Key features - Adjust an order even after fulfillment has started - Cancel the ongoing fulfillment, edit the order, then restart fulfillment ## Quick guide 1. In the **Fulfillment Batch**, click **Report** on the order and select a reason. If it's not a single out-of-stock product, choose **Report as Suspect**. The order is removed from fulfillment and locked. 2. In the order view, click **Unlock**, then **Save**. 3. Go to the **Edit Order Rows** tab, make your changes, and click **Save**. 4. Return to the **Edit** view and click **Fulfill Order** to start a new fulfillment. --- ## Cancel the ongoing fulfillment Locate the order in the **Fulfillment Batch** it belongs to. You can find a *Fulfillment batch* link to the batch in the order view, under the **Shipping** box. On the order in the fulfillment batch's order list, click **Report** and select the reason for review. If it does not involve a single product being out of stock, click **Report as Suspect**. The order is now removed from fulfillment and locked. ## Unlock the order Go to the order view, click **Unlock**, then **Save**. ## Adjust order rows Go to the **Edit Order Rows** tab, make the necessary adjustments (for example, change the price of an item), and click **Save**. ## Restart fulfillment Return to the **Edit** view and click **Fulfill Order** to start a new fulfillment for the order. # Handle locked orders ## Key features - Find and investigate orders flagged as Pending - Locked - See why each order was locked in the comment column and information log - Unlock and handle an order, or permanently lock it to cancel ## Quick guide 1. Go to **Pending - Locked** in Geins Warehouse (WMS). 2. Open an order to investigate, the **Locked** checkbox is checked. 3. Uncheck **Locked** and click **Save** to handle it normally, or check **Permanently locked** to cancel it. --- When an order gets locked, it could be for several reasons, perhaps the payment method failed or some postal information is inaccurate. These orders are flagged in Geins Warehouse (WMS) as **Pending - Locked**. ![image](https://geins.io/../../img/merchantcenter/10480765825052_A8CD1065.png) You'll find a list of orders flagged as locked, and you can handle and investigate them one by one. A comment column gives a short summary of what might have gone wrong. ![image](https://geins.io/../../img/merchantcenter/10480765827612_E435A9E9.png) Once you've chosen which order to investigate, you'll see that the **Locked** checkbox is checked. You can either uncheck the box and click **Save** to handle the order as normal, or check the **Permanently locked** checkbox to cancel the order. ![image](https://geins.io/../../img/merchantcenter/10481484050460_FE36CB7B.png) At the bottom of the screen you'll find an Information box with a log of why the order was locked. ![image](https://geins.io/../../img/merchantcenter/10481468378140_CB4CBA81.png) # Remove individual orders from a delivery ## Key features - Remove a single order from an ongoing delivery using the Report function - Choose Report (item missing) or Report as suspect depending on the reason - Removed orders lock automatically and land under Pending - Locked ## Quick guide 1. On the order's row in the delivery, click **Report**. 2. Choose **Report order as suspect** or **Report** on the product. 3. The order is removed from the delivery, locks automatically, and lands under **Pending - Locked**. --- There are different reasons to remove an order from a delivery. If the customer regrets their choice, use the report function, then open the order, tick **Lock permanently**, and save to cancel it. Another case is inventory variances, after reporting, open the order, unlock it, make the needed changes, and deliver it again. ## Remove an individual order from a delivery To remove an order from a delivery, click **Report** on the order's row. ![image](https://geins.io/../../img/merchantcenter/order_report_CAB09163.png) You can remove the order by clicking either **Report order as suspect** or **Report** on the current product. ![image](https://geins.io/../../img/merchantcenter/order_report_as_920CF859.png) Both buttons remove the entire order from the delivery, but give different messages to clarify: - **Report** , clicking Report on a product removes the entire order, and you get the message *Item missing* under **Discrepancies**. - **Report as suspect** , the order is removed and you get the message *Reported as suspect* under **Discrepancies**, so you can take it for further investigation. ![image](https://geins.io/../../img/merchantcenter/order_desc_C54E2D8A.png) If you report an order and remove it from the delivery, it locks automatically and lands under **Pending - Locked**. # Order refunds ## Key features - Refund customers once a returned item is received - Refund from the Handle Returns menu or directly on the order - Restock items, refund part or all of the amount, and optionally refund the shipping fee - Track refund status: settled (green dot) or manual settle required (red dot) ## Quick guide 1. Search for the order in the search bar. 2. Select the returned item or items. 3. To restock, tick **Restock**, then choose the refund option from the dropdown. 4. Set the amount, optionally tick **Refund Shipping Fee**, and click **Save**. --- You can process refunds for returned items in two ways: under the **Handle Returns** menu, or on the customer's order. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2024-02-08-kl.-13.53.28_8d5e8a5b.png) ## Refund a returned item 1. Search for the order in the search bar to display all its items. 2. Select the returned item or items. Customers often note the reason on the return slip, such as a regretted purchase or the size being too small. 3. If the product isn't defective, tick **Restock** so it's available for the next customer. 4. Choose the refund from the dropdown, then set the full amount or a suitable lower amount. Optionally tick **Refund Shipping Fee** to include the shipping cost. 5. Click **Save**. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2024-02-08-kl.-14.03.02_220f5981.png) You'll get a detailed refund history and a log showing whether the payment provider has confirmed the refund. Because the item was returned and the refund processed during return registration, the refund is settled automatically. A green dot under the **Refund** menu means it's settled. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2024-02-08-kl.-14.08.04_323ac230.png) ## Refund before the items are returned You can also refund before receiving the items, directly on the order page under the **Refund** section: 1. Click **New refund**. 2. Enter the amount you'd like to refund, in the same currency as the order. 3. Click **Save**. These refunds get a red dot, meaning you still have to settle the payment manually. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2024-02-08-kl.-14.07.46_d48d4d08.png) # Refunds information in the statistics views ## Key features - Find refund data in the Sales Demand and Revenue views - See the number of refunds, the total amount refunded, and the tax refunded - Single-sum refunds are recorded as compensations ## Quick guide 1. Go to **Statistics > Sales Demand** or **Accounting ERP > Revenue**. 2. View the refund columns, shown daily or monthly at order row level. --- Refund data is available in: - **Statistics > Sales Demand** - **Accounting ERP > Revenue** The refund columns are: | Column | Description | | --------------------- | ---------------------------- | | **Refunds** | Number of refunds processed. | | **Refunds Amount** | Total amount refunded. | | **Refund Amount Tax** | Total tax refunded. | Data is displayed daily or monthly and is based on refunds processed at order row level. ## Compensations If a refund is issued as a single sum for an order, it is recorded as a compensation and can be found in the **Compensation** column. # Add products in a category ## Key features - Add products to a category in three ways: from the product view, inside the category, or via the import tool - Set a product's main category, which its store URL and breadcrumbs are based on - Place a product in up to four categories at once with the import tool ## Quick guide 1. From the product view, tick the categories in the **Product categories** box and click **Save**. 2. Or, inside a category, use the **Product selection** tab to add products in batch. 3. Or, use the import tool with a product import to assign categories. --- Placing products in a category can be done in three different ways: - **On the product view** , add a product to one or more categories from the product view. - **Inside a category** , select products in batch from inside the category. - **Via the import tool** , add products to a category with a product import. ## On the product view 1. Go to the product you want to add to one or more categories. 2. In the **Product categories** box, tick the categories the product should be in. 3. Click **Save**. ![image](https://geins.io/../../img/merchantcenter/test2_34C47EA5.gif) If a product is in more than one category, choose which is the product's *main category* using the **Category** dropdown at the top of the product view. The main category is what the product's store URLs and breadcrumbs are based on. A product must have a main category to be visible in the store. ## In a category Go into the category you want to add products to and click the **Product selection** tab, where you can add products from the existing assortment. ![image](https://geins.io/../../img/merchantcenter/kategori-produktsel_D4478861.jpg) Click **Browse** to choose which products to add. ![image](https://geins.io/../../img/merchantcenter/product_Selection_CD6BF2AB.gif) You have two options: - **Product** , search for the products you want to add, tick them in the list, and click **Save selection**. - **Import** , run an article import if you want to prepare an assortment in an Excel file. A few field choices you can make: - **ID type** , whether the file is matched on the product ID (product ID in Merchant Center) or the article number (the **Article number** field on the product). - **ID column number** , which column the ID or article number is in. This article import is for adding existing products to the assortment. To create new products via import, use the import tool (see [Import products](https://geins.io/../../Importpercent20tool/Workpercent20withpercent20imports/import-products)). When you've made your selection, click **Save** to save the products in the category. ## Via the import tool To place products in one or more categories via the import tool, use a product import. You can place a product in up to four categories in one import, using the fields *Category*, *AdditionalCategory1*, *AdditionalCategory2*, and *AdditionalCategory3*. The **Category** field becomes the product's main category. The additional categories let you place a product in more categories beyond the main one, and they don't need to be sub-categories of the chosen main category. The main category is what the product's store URLs and breadcrumbs are based on. A product must have a main category to be visible in the store. 1. In Merchant Center, go to **Import tool** in the left menu and click **New**. 2. Choose the file you want to import. 3. Choose template type **Product**, then choose the import mode. 4. Make sure the category field is matched and contains existing categories. 5. Click **Start import**. The products are placed in the chosen categories when the import is done. # Create new category ## Key features - Create a new category under Products (PIM) - Make a category visible by giving it a name, setting it active, and adding active products - Position the category in the category tree by drag and drop ## Quick guide 1. Go to **Products (PIM) > Categories > New**. 2. Enter the category's information and content. 3. Set the category active and add active products so it's visible in the store. 4. Save, then drag and drop it to the desired position in the category tree. --- ## Create a category 1. Navigate to **Products (PIM) > Categories > New**. 2. Enter the desired information and content for the category. Category field descriptions are [here](https://geins.io/../../Products/Categories/description-of-fields-on-categories). 3. To make a category visible in the store, it must have a name, be set as active, and contain active products. An empty category isn't visible by default. 4. To position a category in the category tree, save it first, then drag and drop it to the desired position in the **Product Category** tree list box. # Create or update categories with import tool ## Key features - Create new categories or update existing ones with the import tool - Use the category import template, or match fields from your own file - Match only the fields you want to update, to avoid overwriting data ## Quick guide 1. Go to **Import Tool > New**. 2. Select your file, set the **File Extension**, choose template type **Category**, and click **Next**. 3. Match the required fields (those with a padlock icon). 4. Click **Start import**. The import is done when it shows 100%. --- In Merchant Center, go to **Import Tool > New**. ![image](https://geins.io/../../img/merchantcenter/import_ny-2_00EC05C5.jpg) If you already have a file ready, click **Select file** and choose it. Set the file type in the **File Extension** dropdown, choose template type **Category**, then click **Next**. ## Using the import template for categories To work with the category import template, first download it: in the **Template Type** dropdown, choose **Category**, then click **Download template file**. ![image](https://geins.io/../../img/merchantcenter/import_upload-2_1F7B5223.jpg) Populate the file with the data to import. You can create new categories or update existing ones: - Leave the **ID** field empty to create a new category. - Fill in the **ID** to update an existing category. For a description of the fields, click **View template description**. If you're on a Mac, save the file with the correct encoding (UTF-8) when saving in Excel. When the file is ready, upload it: click **Select file** and choose the file, set the file type in the **File Extension** dropdown, choose **Category** in the template type list, and click **Next**. ## Match fields in the import tool Fields with a padlock (requires match) icon are mandatory and must be matched for the import to run. When updating a category, only match the fields you want to update. If you match an empty field, for example **Name**, it will replace the existing name and make it empty. If you use the import template, the existing fields are matched automatically. Below is an import using the template with existing fields matched. ![image](https://geins.io/../../img/merchantcenter/impot_kat_match-2_CBED9E27.jpg) To exclude certain fields from the import, remove them by dragging the fields under your file into the **Not matched from your file** box. The example below includes the fields metaTitle, MetaDescription, and MetaKeywords. ![image](https://geins.io/../../img/merchantcenter/import_kategori_remove-2_E80BBC23.jpg) If your file isn't based on the import templates, the columns may be named differently and need to be matched manually. Drag the names in **Not matched from your file** to the field you want each to match. ![image](https://geins.io/../../img/merchantcenter/impot_kat_no_template-1_7BD52D0D.jpg) After matching the fields you want (required fields must be matched), click **Start import**. ![image](https://geins.io/../../img/merchantcenter/impot_kat_no_template_matched-2_DDB9CBE1.jpg) The import is done when it shows 100%. A summary of the import is in the column to the right. ![image](https://geins.io/../../img/merchantcenter/impot_kat_done-2_24B3779B.jpg) # Description of fields on categories ## Key features - Reference for every field on the category page in Merchant Center - Understand how Name, Metadata, Status, and the category tree affect the store ## Quick guide 1. Go to **Products (PIM) > Categories** and open a category. 2. Use the table below to understand what each field does. --- | Field | Description | | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Name | Name of the category. Becomes the category's URL, for example `https://www.store.se/c/categoryname`. | | Description | Text that can be used in the store if configured, for example as descriptive (SEO) text on a category's product listing page. | | Default Metadata | Metadata generated from set-up rules. Rules can be found and changed under **Settings > Metadata > Category**. | | Metadata | Lets you override the rules and set your own specific metadata for the category. | | Products | Total number of products the category contains, including products in the category plus all products in its sub-categories. | | Google category | Simplifies mapping against the Google product taxonomy feed. | | Product category tree | The category's placement and hierarchy. :br Yellow = the category you're in. :br Grey cursive = hidden category. :br Red text = inactive. | | Status | **Active** = shown in the store. :br**Inactive** = not shown in the store. :br**Hidden Category** = hidden in menus and filtering, but still active and reachable via URL and indexed by search engines. | # Hidden categories ## Key features - Hide a category so it's excluded from menus and filtering but stays active - Hidden categories remain reachable via URL and indexed by search engines - Useful for categories like popular Google searches that you don't want in the category tree ## Quick guide 1. Open the category. 2. Check **Hide category** in the status box. 3. Click **Save**. --- You can set a category as hidden. A hidden category is excluded from menus and filtering in the web store, but stays active and can be reached via URL and indexed by search engines. This lets you create categories such as popular Google searches without showing them in the category tree, navigation, and filtering in the shop. Hidden categories appear in cursive and a lighter grey in the category tree. To hide a category, open it, check **Hide category** in the status box, and click **Save**. You can tell a category is hidden in the category list by its cursive, lighter grey text. ![image](https://geins.io/../../img/merchantcenter/4417392650258_991BA15D.jpeg) # Inventory history ## Key features - View a chronological record of a product's inventory changes - See when each change was made, how large it was, and who made it - Review a summary of returns, including quantities and reasons ## Quick guide 1. Open the product. 2. Go to the **Inventory History** tab. 3. Review the inventory changes and the returns summary. --- The **Inventory History** tab shows a chronological record of how a product's inventory has changed, including when changes were made, the extent of those changes, and who made them. ![image](https://geins.io/../../img/merchantcenter/10044783170716_460FDBC6.png) A summary of returns is also available, showing the quantity of items returned and the reasons for those returns. This gives a comprehensive view of the inventory's past and its management. ![image](https://geins.io/../../img/merchantcenter/10044750097436_737C85DC.png) # Package Configurator (BETA) ## Key features - Create product packages (bundles) in Products (PIM) - Group products into categories within a package, with optional and default choices - Package price reflects the lowest possible sale price; stock follows the lowest-stock included product ## Quick guide 1. Go to **Products (PIM)** and click **New**. 2. Give the product a **Name** and click **Save**. 3. Click **Convert to package**. 4. Click **Configure package** to add products. 5. Add and configure the products, then click **Save**. --- ## Create a package To create a product package, go to **Products (PIM)** and click **New**. This product is the container that includes the package products and is the one shown in categories and so on in the webshop. When a package is purchased, the order rows include the products separately, the package isn't a single item in the order. 1. Give the product a **Name**. 2. Add a name in the name field of the product's items list. It can be a "-", for example. This is only needed to create the product. 3. Click **Save**. 4. Click **Convert to package**. Now the fields relevant for the package remain. Here you give the package its product information, upload images, and so on. - **Price** , the price shown corresponds to the lowest price the package can be sold for. For example, if one product is 100 kr and another is 50 kr, the price shows 150 kr. If the 50 kr product is optional, the price shows 100 kr. - **Stock** , a package's stock is based on the included product with the lowest available stock. Click **Configure package** to add the products the package should include, then click **Add category**. A category can contain a single product or a collection of products, depending on how complex the package is. For example, a package with just a notebook and a pencil would have the notebook as one category and the pencil as another. For a simple bundle like this, the Category name, Description, and Optional fields often aren't relevant. For a more advanced package where the customer chooses options, for example a poster and a frame where they pick which poster and which frame, the poster is one category and the frame another. ## Description of fields on a category **Main fields** | Field | Description | | ------------- | ----------------------------------------------------------------------------- | | Category name | The name of the product group. | | Description | A describing text of the product group. | | Optional | If checked, the customer isn't required to choose a product in this category. | **Product item fields** All these fields are filled automatically with information from the product. Name, Amount, Price, and Description can be changed. | Field | Description | | ----------- | ----------------------------------------------- | | Image | The product's image. | | Name | The product's name. | | Amount | The number of items of this product to include. | | Price | The price the item is sold for in this package. | | Description | Describing text of the product. | | Default | If checked, the item is preselected in a list. | Click **Save** when you're done setting up your package. ## Examples An example of a package containing a poster and a frame, where you can choose the frame color: ![image](https://geins.io/../../img/merchantcenter/image-png-Oct-15-2024-06-29-16-8218-AM_1907FB6A.png) An example of a package containing a chair and a cushion: ![image](https://geins.io/../../img/merchantcenter/image-png-Oct-15-2024-07-01-59-8424-AM_2FB48509.png) # Using Tags on Product Images in Merchant Center ## Key features - Assign attributes to product images with tags (up to 100 characters each) - Retrieve specific images for the same product across different storefront listings - Use tags for ALT text to improve accessibility and SEO ## Quick guide 1. Open the product page in Merchant Center. 2. Click **Tags** for the relevant image. 3. Enter the tag or tags and save the product. --- ## Use cases - Retrieve specific images for the same product in different storefront listings. - Use tags for **ALT text** to improve accessibility and SEO. ## How tags work - Tags are added in **Merchant Center**, but their functionality depends on how they're configured in your storefront or app. - To display or use tags, further setup may be required in the storefront. ## How to add a tag to a product image 1. Open the **product page** in Merchant Center. 2. Click **Tags** for the relevant image. 3. Enter the desired tag or tags and **save** the product. ![image](https://geins.io/../../img/merchantcenter/tags_26173ED8.jpg) # Product monitoring ## Key features - Let end customers get an email when an out-of-stock product is restocked - See active and total monitors in the products list, product view, and customer view - Export a list of active monitors from the product view ## Quick guide 1. Make sure the store shows products with 0 inventory balance (required for monitoring). 2. View monitors in the **Active monitors** / **Total monitors** columns, the product's **Monitors** box, or the customer's **Monitors** box. 3. When stock is updated and published, active monitors are emailed automatically. --- ## In Merchant Center You can see product monitoring information in three places. ### Products list Two columns relate to monitoring: **Active monitors** and **Total monitors**. If you don't see them, enable them in the column options on the right of the list view. - **Active monitors** , email addresses waiting to be notified when the product is back in stock (regardless of size level, if any). - **Total monitors** , the total number of email addresses ever registered for monitoring on the product (regardless of sizes, if any). ![image](https://geins.io/../../img/merchantcenter/colum_options_D7222526.jpg) ### Product view If a product has any monitors (active or previous), the information is in the **Monitors** box, showing active and total monitors at item level. You can also export a list of all active monitors here. ![image](https://geins.io/../../img/merchantcenter/monitors_300C0B78.jpg) ### Customer view If an existing customer has active monitorings registered on their account, the information is in the **Monitors** box. ![image](https://geins.io/../../img/merchantcenter/product_monitors_750DEC9D.jpg) ## Automatic mail When a product's inventory balance is updated in Merchant Center and published in the store, an automatic email is sent to the **Active monitors**. If 20 people monitor a product and 10 come back in stock, an email is still sent to all 20. Once emailed, they move from active monitors to total monitors. - One email address can only exist once in total monitors. - A monitoring email address doesn't need to be connected to a customer in the system. - You can't see which size or type a monitoring applies to, only a total amount. - Total monitors never reset to zero. ## In the store For example, on a product without sizes, the purchase button can be replaced with a monitoring button that opens a form for the customer's email address. If a product has sizes and one is out of stock, a monitoring link can be placed next to the size choice. ![image](https://geins.io/../../img/merchantcenter/produktbevakningar_6AC1F58A.jpg) ## Configuration The function requires the store to be configured so products with 0 inventory balance are shown. How it's used and looks depends on how the store is designed and built. # Related products ## Key features - Connect products to each other with related products - Choose the relation type for each connection - Display related products in your store, for example on the product card ## Quick guide 1. On the product, open the **Related products** tab. 2. Search for products in the **Add Products** box and click the green plus to add them. 3. Choose the relation type, then click **Save**. --- A related product is a connection you create to another product. Make sure all products have their essential fields enriched with data before creating a connection. On the product you want to enhance, click the **Related products** tab. ![image](https://geins.io/../../img/merchantcenter/6790645475996_7CEAA201.jpeg) Find the products to connect with by searching in the **Add Products** box, and click the green plus sign to add them. ![image](https://geins.io/../../img/merchantcenter/6790742187292_5F79693D.jpeg) Choose the relation type for the products. Which relationship types exist may vary depending on how your system is set up. Once you've made your selections, click **Save**. ## Example of usage Related products can be displayed in your store, for example on the product card of the product you enriched with one or more connections. ![image](https://geins.io/../../img/merchantcenter/6906340045724_A3DF263B.png) # How to Create a Variant Group in Merchant Center ## Key features - Group products with different options (size, material, color) into a variant group - Add all desired dimensions when creating the group (you can't add more later) - Control the group key and whether the group is collapsed in lists ## Quick guide 1. Open the product, click the **Variants** tab, and select **Create Variant Group**. 2. Choose the dimensions (for example size, material) and click **Add**. 3. Click **Create**, add other products, and assign dimension values. 4. Click **Save**. --- ## Create a variant group 1. Open the product you want to create a variant group for. Click the **Variants** tab and select **Create Variant Group**. 2. Select the dimensions you want (for example size, material) from the dropdown and click **Add**. - Add all desired dimensions at this step. You can't add dimensions to an existing group, you would have to remove the products and create a new group. 3. Click **Create** to set up the group. The current product is added automatically. 4. Add more products by searching for their name or ID in the **Add Product** field, and assign values for the selected dimensions to each product. 5. Click **Save** to finalize the group. *Example of a variant group in Merchant Center:* ![image](https://geins.io/../../img/merchantcenter/variations3_3A991B65.jpg) ## Group settings Under **Group Settings** you'll find **Group Key** and **Collapsed State**. **Group Key** - A unique identifier for the group (text or numbers). Products with the same key belong to the same variant group. - A product can only belong to one group. Adding a different key via import removes the product from its current group. **Collapsed State** - If enabled, only the **Main Product** appears in product lists and search results. Other products in the group aren't displayed. # What does it mean to blacklist a product? ## Key features - Restrict a product from being sold in a specific market - Blacklisting excludes the product from the chosen country but keeps it visible in other markets ## Quick guide 1. Go to **Product (PIM)** and open the product. 2. Open the **Countries** tab. 3. Check the country to blacklist the product for, then click **Save**. --- Blacklisting a product for a certain market means deliberately restricting or prohibiting its sale and distribution in a specific market segment. This can happen for several reasons: - **Legal and regulatory compliance** , some products are illegal or require specific licenses in certain countries or regions. A product that's legal in one country might be banned in another due to local safety, health, or morality laws. - **Cultural sensitivity** , products that are offensive or culturally insensitive to certain groups or regions are often blacklisted to avoid offending customers or violating social norms. - **Brand strategy** , a company may restrict certain products in specific markets to align with its brand strategy, such as maintaining a luxury image or targeting a specific demographic. - **Economic sanctions** , sanctions imposed by governments or international bodies may require halting sales of certain products to specific countries or regions. - **Risk management** , companies might blacklist products in markets with a high risk of fraud or intellectual property theft, or where legal systems make it hard to enforce contracts and protect rights. ## Blacklist a product 1. Go to **Product (PIM)** and click the product you want to blacklist for a certain market. 2. Open the **Countries** tab. 3. Check the box next to the country you want the product blacklisted for, then click **Save**. The product is now excluded from your chosen country but stays visible in your other markets. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2024-02-29-kl.-13.46.15_4210fc80.png) # Add a new product ## Key features - Add and publish a new product in Merchant Center - See what's required to publish in the Publication requirements box - Enrich the product with categories, parameters, feeds, variants, and related products ## Quick guide 1. Go to **Products (PIM) > Products** and click **New**. 2. Fill in the product fields to enrich it with information. 3. Check the **Publication requirements** box to see what's still needed. 4. Set the product to **active** and click **Save**. --- To publish a product, you need a few things in place, including at least one category to assign the product to (see [Create new category](https://geins.io/../../Products/Categories/create-new-category)) and the appropriate trademarks. ## Place a new product Go to **Products (PIM) > Products** and click **New**. ![image](https://geins.io/../../img/merchantcenter/add-new-product_2e54362b.jpeg) Fill in the fields to enrich the product with information. See [Description of fields on product view](https://geins.io/../../Products/Productpercent20editing/description-of-fields-on-product-view) for what each field does. The **Publication requirements** box shows what information needs to be in place for the product to go on sale in the store. ![image](https://geins.io/../../img/merchantcenter/publication-requierments_2ab09b5d.jpeg) When the product has the information you want and you're ready to publish, set it to *active* and click **Save**. The product becomes visible in the store in a moment. ![image](https://geins.io/../../img/merchantcenter/publish-product_3263c9d3.jpeg) ## Further information and functions Beyond the mandatory fields, there are other parts you can use to enrich your product. Some of the most common are below. - **Categories** , place the product in the categories you want in the Product categories box. See [Add products in a category](https://geins.io/../../Products/Categories/add-products-in-a-category). - **Product parameters** , parameters let you specify information with values used for things like product specifications and filtering. On the product view you fill in the values for each parameter. See [Create parameters and parameter groups](https://geins.io/../../Products/Productpercent20parameters/create-parameters-and-parameter-groups). - **Feeds** , to include the product in a configured feed, check it on the product view. See [Manage products in your feeds](https://geins.io/../../Products/Productpercent20editing/feeds). - **Publishing date** , to publish a product live on a specific date, set a publishing date. See [Placing publish date](https://geins.io/../../Products/Productpercent20editing/placing-publish-date). - **Product variants** , if the product exists in several variants, such as colors, you can connect them. See [How to create a variant group](https://geins.io/../../Products/Otherpercent20productpercent20functionality/variations-for-products). - **Related products** , connect products together, for example to show relevant accessories on the product page. See [Related products](https://geins.io/../../Products/Otherpercent20productpercent20functionality/related-products). # Description of fields on product view ## Key features - Reference for every field and box in the product view - Understand which fields are required to publish a product - Covers the Product fields, the Product list (items), and the other boxes ## Quick guide 1. Go to **Products (PIM) > Products** and open a product. 2. Use the tables below to understand what each field and box does. --- ## Product Fields marked with **\*** are required for a product to be published live in the store. | Field | Description | | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Name **\*** | Name of the product. Used throughout the store and becomes part of the product's URL. | | Article Number (SKU) | The product's article number. | | External Id | Allows more IDs on the product. Usually added by an integration, for example an ERP connection. | | Brand/Manufacturer **\*** | The product's brand. | | Supplier | The supplier (can be left empty). | | Intrastat Code | Field with built-in autocomplete that shows the description for the current code. For selling abroad. In the EU the code is only for intrastat reporting (required after a certain amount). For Norway/Switzerland the number is needed for customs. | | Weight | The product's weight. | | Width | The product's width. | | Height | The product's height. | | Length | The product's length. | | Country of Origin | The product's country of origin. | | Price | The product's ordinary price. | | Discount price | The product's discount price. If filled, it's used in the store above the price. | | Purchase Price (SEK) | The purchase price recalculated in SEK. | | Purchase price | The product's purchase price (in the current currency). | | Purchase currency | The currency of the purchase price. If the preferred currency is missing, add it under **Settings > Currencies**. | | Max discount (%) | The maximum discount % the product should be sold for. If filled, a warning shows when creating campaigns that exceed it. | | VAT rate | The product's VAT rate. Only for the main market (Sweden by default). VAT for foreign sites comes from the VATs configured on the channel. | | Freight class | Used for bulky products or those that always have free shipping, for example. Each freight class can have a different type and is calculated on the whole order in the checkout (requires configuration). | | Text 1 | Product text field, usually used as text under specification. Where, how, and whether it's shown depends on the store's design. | | Text 2 | Usually a short descriptive summary of the product. Where, how, and whether it's shown depends on the store's design. | | Text 3 | Usually the product's primary description text. Where, how, and whether it's shown depends on the store's design. | ## Product list The product list contains the product's items: either a single row if the product has no sizes (like a water bottle or a book), or multiple rows for sizes (S, M, L, etc.). | Field | Description | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Name | Name of the size, for example (S, M, L). Shown in the store in filtering and the size choice on the product page. | | In stock | Stock status at item level. :br**In stock** , current stock balance. :br**Oversellable** , sell a product that isn't in stock, for example with a longer delivery time. :br**Static Stock** , a static stock balance for products not in stock. For example, if you sell cakes and can always produce 10, set static stock to 10. | | Shelf | Shelf location of the product in the warehouse. | | Weight (g) | The product's weight. Taken primarily from this field; if missing, the product-level weight field is used. | | Reserved | The amount in current orders. The amount sold beyond available stock is shown in parentheses (oversold). Oversold is only available if you work with oversellable. | | Art Nr | Article number for the item. | | EAN | EAN code for the item. | | Id | The item ID (SKU id). | | incoming | Expected delivery date for the product. Filled automatically when the product is in purchase orders created in Merchant Center, and can also be filled manually. | ## Other boxes A short overview of the other boxes in the product view. Most have extended information in separate articles. | Box | Description | | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Images | Product pictures. Upload one or more at once and use drag & drop to order them for the product page. The main image is the one shown in product listings. | | Active | Status of the product. :br**Active** , published in the shop if publication requirements are met. :br**Inactive** , not available for sale in the store. | | Feeds | Contains the configured feeds. Select which feeds the product is in. :br**On sale** , sends a discount price if one is set. :br**Active** , include the product in the active feed. :br**Fetch** , downloads the active feed file (updates every hour). | | Parameters | Contains the created parameter groups. Enrich the product with information and values. | | Markets | Which market the product is sold on, for example a .se and a .com site. | | Product categories | Click which categories the product is in. The dropdown at the top of the box sets the main category. | | Meta data | Set specific metadata for a product beyond the base metadata rules. | | Information | Box where administrators can write relevant information. Also includes automatic system updates, such as when the product is imported. | # Manage products in your feeds ## Key features - Add or remove a product from your configured feeds on the product view - Include the product's discount price in a feed - Changes apply when the feed syncs (most feeds update every hour) ## Quick guide 1. Open the product page in the PIM section. 2. In the **Feeds** box, check the feeds to include the product in. 3. To remove the product, uncheck the **Active** column for that feed. 4. Click **Save**. --- In the **PIM section**, on a product page, you'll find the **Feeds** box. It contains the feeds you've configured. Add the product to a feed by checking the boxes: - **On Sale** , include the product's discount price in the feed. - **Active** , include the product in the active feed. - **Fetch** , download the active feed file. ![image](https://geins.io/../../img/merchantcenter/feedsbox_89736DB9.jpg) ## Remove a product from a feed 1. Go to the product page of the item you want to remove. 2. In the **Feeds** box, uncheck the checkbox in the **Active** column for the feed you want to exclude the product from. 3. Click **Save** to apply the changes. ## Feeds sync Changes, such as price updates or product removals, apply when the feed syncs. Most feeds update every hour, though timing may vary based on the feed's type or version. # Find products in Merchant Center ## Key features - Find products quickly from the main search - Filter the product list by any column - Choose which columns are visible in the list ## Quick guide 1. In the main search, enter the product name, product ID, or article number (tick only **Products** for the most effective search). 2. Or go to **Products (PIM) > Products** and right-click a column heading to filter. 3. Use **Column options** in the upper right to show or hide columns. --- ## Search from the main search In the main search, enter the product name, product ID, or article number of the product you want to reach. Tick only **Products** for the most effective search. ![image](https://geins.io/../../img/merchantcenter/main_search_1BCDCA3D.jpg) ## Filter the product list 1. Go to **Products (PIM) > Products** in the left menu. 2. Right-click a column heading to filter it. For example, right-click the **Id** heading and enter the ID you're looking for, the list filters to the matching product. ![image](https://geins.io/../../img/merchantcenter/list_filter_EF04C68A.gif) Control which columns are visible with **Column options** in the upper right. There you can show or hide the columns you want to work with. ![image](https://geins.io/../../img/merchantcenter/List_colopts_74B41207.jpg) To reset all filters, right-click any heading in the list and click **Clear all filters**. # Managing Product Items (Sizes) on a product with the import tool ## Key features - Add or update product items (sizes) in batch with the import tool - Manage stock, shelf, article numbers, and more per item - Items are matched by exact size text, so spelling matters to avoid duplicates ## Quick guide 1. Prepare an import file with at least the **Id**, **Name**, and **Size** columns. 2. Go to the import tool and run a product import. 3. Match the columns and start the import. --- The product list contains individual product items where you can add sizes and manage stock. Each product always has at least one row, either a single row for items without sizes (like a water bottle or a book), or multiple rows for products with sizes (S, M, L, etc.). ![image](https://geins.io/../../img/merchantcenter/product-items_f337e3a4.png) You can add or edit items directly in the product view, or use the **import tool** for batch updates. Learn more about general product import: [Import products](https://geins.io/../../Importpercent20tool/Workpercent20withpercent20imports/import-products). ## Key columns for importing or updating items - **Id**, **Name**, **Size** , required for adding or updating items. - Additional columns , **Stock**, **Oversellable**, **StaticStock**, **Shelf**, **SizeExternalId**, **SizeArticleNumber**, **ItemWeight**. ::note ItemHeight, ItemLength, and ItemWidth can be saved per item and accessed via our APIs, but not through the Merchant Center interface. :: ## Creating new or updating existing products When creating new products, if no value is entered in the **Size** column, an item with the size "one size" is added automatically. For existing products with specified sizes, make sure the size column is filled when updating fields like stock, shelf, or article number. The system matches the value in the Size column exactly by text. For example, if the existing size is "one size" and you enter "One size" (with a capital O), the system creates a new row, so double-check spelling to avoid duplicates. For a full list of product import columns, see the [Product import template](https://geins.io/../../Importpercent20tool/Importpercent20templates/import-template-for-products). For more about product stock, see [Product stock options](https://geins.io/../../Products/Productpercent20editing/product-stock-options). # Managing Product pricing and discounts ## Key features - Set the four pricing aspects: Price, Discount Price, Purchase Price, and Max Discount (%) - Discount price is shown to customers; purchase price is internal, for margin calculations - Max Discount (%) warns you when a campaign discount would exceed it ## Quick guide 1. Open the product. 2. Set the **Price**, and optionally a **Discount Price**. 3. Enter the **Purchase Price** for margin calculations. 4. Set **Max Discount (%)** to cap campaign discounts. --- This guide covers the different pricing aspects for your products: Price, Discount Price, Purchase Price, and Max Discount (%). ![image](https://geins.io/../../img/merchantcenter/10031370088348_7324E8AA.png) | Field | Description | | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Price** | The base cost you sell the product at, the standard price customers see. | | **Discount Price** | An optional discounted price. Shown in the product list and on the product page, usually styled differently from the ordinary price (for example, red text). | | **Purchase Price** | What you pay your supplier or manufacturer to acquire the product. Used to calculate your margin and not shown to customers. Enter it accurately for correct margin calculations. | | **Max Discount (%)** | The highest percentage a product's price can be discounted. Helps you control discount levels and calculate potential margins when applying discounts. | ## Max discount in campaigns When creating marketing campaigns or promotions, the Max Discount (%) helps prevent excessive discounting. The system warns you if you try to add a product to a campaign with a discount exceeding the Max Discount (%), but it won't remove it automatically. ::note Exceeding the Max Discount (%) in a campaign triggers a warning, but the product isn't removed automatically. :: # Placing publish date ## Key features - Set a future publish date so a product goes live automatically - Prepare assortments without manually activating each product - See publish status in the product list ## Quick guide 1. Open the product and check it as **active**. 2. Click **Set specific publication date** and pick a date. 3. Click **Save**. --- Adding a publish date makes a product visible in your store from 00:01 on that day. This lets you prepare assortments for sale without manually activating each product, for example when releasing new collections. 1. Open the product you want to publish and check it as **active**. 2. Click **Set specific publication date** and use the date picker to choose when the product becomes visible and purchasable. 3. Click **Save**. ![image](https://geins.io/../../img/merchantcenter/Slide_16_9_-_2_2752AE8A.jpg) For the product to be visible, make sure all publication requirements are met. If you have specific Publication requirements configured, they may affect your publishing process. ## Set a publish date on an already active product If you click Save on a product with **Active** checked, you can no longer set a date on it, active products count as products you want visible and for sale. To set a later date, inactivate the product, save, and then set the date. ## Status descriptions | Status | Description | | --------------------- | ----------------------------------------------------------------------------------------------------------------- | | Not published | The product is not published in the store. | | Published: n/a | Active product that's published but missing date information. Can happen for products created in earlier imports. | | Published: 2021-01-01 | The product was published for the first time in the store on 2021-01-01. | ## Publish date in the product list You can see whether and when a product is published in the product list (Products), via the **Published** and **Publication date** columns. If you don't see them, enable them in column options. # Product pictures ## Key features - Upload, reorder, deactivate, or delete product images on the product view - Import images in batch with the import tool - Configure the file-name format and image tags for advanced use ## Quick guide 1. Open the product and go to the **Images** box. 2. Click **Add** and choose one or more images. 3. Drag and drop to order them, then click **Save**. --- You find a product's pictures in the **Images** box on the product view, where you can upload pictures, change their order (drag & drop), and deactivate or delete them. ![image](https://geins.io/../../img/merchantcenter/4c774bd3479cab4bf4954dbadf8a147d_EDD9583D.gif) ## Guidelines - The recommended upload format is **.jpg** (required for WebP converting). - The proportions and measurements product pictures should have are controlled by the store's design. If you have questions, contact your project manager at your agency. - Product pictures should have a resolution (width x height in pixels) at least twice as large as the biggest pictures used in the store. (Usually that's the magnified view on the product page, but this also depends on the store's design.) ## Upload pictures on an individual product 1. Open the specific product in Merchant Center. 2. In the **Images** box, click **Add** and choose one or more pictures to upload. 3. Place the pictures in the order you want. The first picture (main image) is shown in listings. 4. Click **Save**. The pictures appear in the store soon. ## Import product pictures with the import tool To import pictures via the import tool, the pictures must be uploaded somewhere they're available via a link. 1. Click **Import Tool** in the left menu, then click **New**. 2. If you have a file ready, upload it, choose the right file format and template type **Product Images**, and click **Next**. 3. To use the import template first, open the **Template type** dropdown, choose **Product Images**, and click **Download template file**. See the [picture import template article](https://geins.io/../../Importpercent20tool/Importpercent20templates/import-template-for-pictures) for field descriptions. 4. When your file is ready, click **Next**. 5. Make sure the columns are mapped correctly and click **Start Import**. Depending on how many pictures you import, this can take a while as pictures are automatically scaled to the needed sizes. You can let it run in the background while you work elsewhere in Merchant Center. When the import is done, the pictures are in place on the products. ## Settings and extended functionality There are many settings and extended functions for product pictures. These may require specific configuration. - **Product picture file-name format** , set up how product picture file names are built, useful for SEO optimization. The default format is *trademark+productname.jpg*. (Setting: `ProductImageNameFormat`) - **ImageTags** , tag specific pictures on a product, for example to show a different main picture in listings depending on the category or grouping. Also needs to be configured in the store. (Feature toggle: `ProductImageTags`) # Product stock options ## Key features - Choose the right stock option for a product: In Stock, Oversellable, or Static Stock - Add stock from the In Stock field in the product list - Each option controls how availability and delivery time are shown ## Quick guide 1. Open the product and find the **In Stock** column in the product list. 2. Make sure the product has at least one item, then enter the stock amount. 3. Click **Save**. --- When managing products for sale, choose the appropriate stock option for your inventory situation. There are three main options, each serving a specific purpose. ## How to add stock 1. Go to the product page and find the **In Stock** column in the product list. 2. Make sure the product has at least one item, then enter the desired stock amount in the **In Stock** field. 3. Click **Save** to update the stock. ![image](https://geins.io/../../img/merchantcenter/image-png-Dec-09-2024-08-55-02-9758-AM_8443511C.png) ## Stock options ### In Stock - Used when the product is physically available in your inventory. - Enter the available quantity to display the product as "In Stock" on the storefront, so customers know it's ready for purchase and immediate delivery. ### Oversellable - Used when you want to sell a product even if it's not currently in stock. - The product is still listed as "in stock" on the product page. - Customers can buy it, but the delivery time automatically adjusts to the timeframe set for oversellable items. For example, if your standard delivery is 1-3 days, oversellable items might show 5-10 days. This keeps customers informed of potential delays before they order. ### Static Stock - Used for products that are produced on demand and always available for purchase. Enter "1" to keep the product consistently available and shown as "in stock". - Static stock isn't counted down, but you can only buy as many as are in the field. - The value is the maximum amount available per purchase. For example, if you set 4, customers can add up to 4 to the cart, but there's no limit on how many orders they can place. - Particularly useful for items created upon order, so customers are aware of their immediate availability. By using In Stock, Oversellable, or Static Stock, you can manage your inventory and meet customer expectations, whether products are physically on hand, oversold with adjusted delivery times, or produced on demand. # Apply parameter values on a product ## Key features - Enrich a product with information and characteristics using parameters - Choose which parameter groups to apply to a product - The available value type depends on the parameter's type ## Quick guide 1. Open the product and find the **Parameters** box. 2. Click the parameter groups you want to enrich the product with. 3. Fill in or choose the values, then click **Save**. --- To enrich a product with information and characteristics using the parameters you've created: 1. Open the product you want to fill with parameter information. 2. On the product view, find the created parameter groups in the **Parameters** box. ![image](https://geins.io/../../img/merchantcenter/product_paramters_DDCAF9C4.jpg) The upper part lists the created parameter groups. Click the groups you want to enrich with information and characteristics. Below them you'll find the parameters the group or groups contain. In the value fields, fill in or choose the value you want the parameter to have for the product. ![image](https://geins.io/../../img/merchantcenter/parameters_add_FD88E48A.jpg) What you can fill in or choose depends on the parameter's type. This is controlled by the **Type** field when you create your parameters and parameter groups. See [Create parameters and parameter groups](https://geins.io/../../Products/Productpercent20parameters/create-parameters-and-parameter-groups) for more about the types. When you've filled in the information you want, click **Save**. # Create parameters and parameter groups ## Key features - Create parameter groups and parameters to give products characteristics and filtering attributes - Choose a parameter type (Text, Number, Date and Time, Picker, Multi choice picker) - Control filtering (NoFilter, MultiFilter, Range Filter) and whether values show on the product page ## Quick guide 1. Go to **Products (PIM) > Parameters / Filters** and click **New**. 2. Name the parameter group, set it active, and click **Save**. 3. Click **Add Parameter** to add parameters, choosing the type, filter, and show-on-site settings. --- To customize the characteristics and filtering attributes of your products, create the parameter groups and parameters first. Once created, they're available in the product editing view. ## Create a parameter group 1. Go to **Products (PIM) > Parameters / Filters** and click **New**. ![image](https://geins.io/../../img/merchantcenter/paramters_6F324CB5.jpg) Here you create the parameter group and add the parameters you want. ![image](https://geins.io/../../img/merchantcenter/paramterpage_583FFA2B.jpg) 2. Give the parameter group a name in the **Group Name** field. It's shown in Merchant Center and can appear in the store as a title on product specifications. (The External id field can usually be left empty in a base configuration.) 3. Set the parameter group active and click **Save** to start adding parameters. ## Add parameters to the group Click **Add Parameter** to start adding parameters to the group. There are different parameter types and filtering settings. ![image](https://geins.io/../../img/merchantcenter/parameter_ny_F2605F8E.jpg) | Field | Description | | ------------ | ----------------------------------------------------------------------------------------------------------------- | | Name | The name of the parameter, for example "Color". Shown in the store if the Label field isn't filled in. | | Label | Lets you show a different name than Name in the store. Shown in the store if filled in. Usually the same as Name. | | Type | Which type of parameter. Controls the editing type the parameter has in the product editing view. | | Filter | Filter setting for the parameter. | | Show on site | Controls whether the parameter is visible on your product page in the store. | ### Parameter types - **Text** , an empty box in the product view where you fill in the values yourself (can't be filtered on). - **Number** , for numeric values. - **Date and Time** , a date. - **Multi choice picker** , a list in the product view with predefined values, like "red", "green", and "blue". The values are what you add when creating the parameter. Use this when you want more than one value. - **Picker** , a list with predefined values, like "1990", "2001", and "2022", where you can choose only one. Use this when a single value is appropriate. ![image](https://geins.io/../../img/merchantcenter/parameter_multi_exempel_FFE186DF.jpg) ![image](https://geins.io/../../img/merchantcenter/parameter_picker_exempel_C3444A65.jpg) ### Filter choices - **NoFilter** , the parameter only appears as information on the product page. It doesn't show up in filter choices in product listings. - **MultiFilter** , same as NoFilter, but the values can be used in a filter search. Choose this if you want the values to be filters in product listings. - **Range Filter** , only works with "Number". Enables a slider to filter values. ### Show on site The **Show on site** checkbox controls whether the parameter values are shown on the product page in the store. If checked, the values are visible on the product page. Leave it empty if you only want the parameter as a filter in product listings, or for information used elsewhere without appearing on the product page. # Apply / update product parameter values via the import tool ## Key features - Update product parameter values in batch with the import tool - Use the ready-made product parameters import template - Match values to existing values for picker and multipicker parameters ## Quick guide 1. Go to **Import Tool > New**. 2. Choose your file, set the **File Extension**, and choose template type **Product Parameters**. 3. Match the columns and click **Start import**. --- In Merchant Center, go to **Import Tool > New**. If you have a file ready, click **Select file** and choose it. Set the file type in the **File Extension** dropdown and click **Next**. ## Use the import template for product parameters To work with the product parameters import template, first download it: in the **Template Type** dropdown, choose **Product parameters**, then click **Download template file**. ![image](https://geins.io/../../img/merchantcenter/import_template_parameters_B4B7FEBA.jpg) The columns are described below. There's also a short description in Merchant Center under **View template description**. | Column | Description | | -------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | ProductId | ID of the product the parameters should be imported to. | | ProductName | The product's name. Mandatory if the ID isn't filled. Can be left empty if the ID exists. | | ParameterGroup | The name of the parameter group, set in the **Group Name** field on a parameter group. | | ParameterName | The name of the parameter, the **Name** field on a parameter. | | Value | The value you want the product to have for its parameter. Must be matched to existing values if it's a picker or multipicker type. | Example of a filled import file: ![image](https://geins.io/../../img/merchantcenter/parameters_import_example_FFA5002C.jpg) This is how it looks inside the product after a successful import: ![image](https://geins.io/../../img/merchantcenter/parameters_box_AAA32D3B.jpg) ## When your file is done 1. Click **Import Tool** in the menu, then click **New** to make a new import. 2. Choose the file you want to import. 3. Choose the file type in the **File Extension** dropdown. 4. Choose template type **Product Parameters**. 5. Click **Next**, then make sure the columns described above are mapped to the system's columns. 6. Click **Start import**. When the import is done, the products' parameters and parameter values are updated. # Create customer group ## Key features - Give a percentage discount on the entire assortment to a selected set of customers - Customers must be logged in to see and get the discounted prices - Read in price lists for different customer groups - Create customer group specific content, such as start pages, in the CMS ## Quick guide 1. Go to **Customers (CRM) > Groups > New**. 2. Enter a **Name** for the group. 3. Set the **Discount %** for the group. 4. Click **Save**. --- In Merchant Center, go to **Customers (CRM) > Groups > New**. ![image](https://geins.io/../../img/merchantcenter/vector-93_d4c82d5e.png) ## Settings | Field | Description | | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Name** | The group name. It is shown in Merchant Center when you choose a customer group on a customer. | | **Discount** | The discount percentage applied to the whole assortment. For example, 20 gives customers in the group a 20% discount on all orders placed while logged in to the store. | Click **Save** to create the customer group. Once the group is created, you can place customers in it, either from the customer view under **Customers** or via the import tool. See [Place customer in customer group](https://geins.io/place-customer-in-customer-group). # Place customer in customer group ## Key features - Place a customer in a group one at a time from the customer view - Add many customers to a group at once using the import tool - Match customers to a group by customer Id and customer group Id ## Quick guide 1. Open the customer view for the customer. 2. In the **Customer group** field, choose the group. 3. Click **Save**. --- ## On the customer view 1. Go to the customer view for the customer you want to place in a group. 2. In the **Customer group** field, choose the group you want the customer to be in. The field lists all created customer groups. 3. Click **Save**. ![image](https://geins.io/../../img/merchantcenter/vector-94_0be72f4a.png) ## Via the import tool To add several customers to a group at once, use the import tool. Merchant Center provides an import template we recommend you use. To download the template: 1. In Merchant Center, go to **Import tool** in the left menu and click **New**. 2. Choose template type: **Customer/Member (Beta)**. 3. Click **Download file template**. Fill in at least the **Id** column to match a customer, and the **Customer Group** column with the Id of the customer group. The group Id is shown in the **Member ID** column in the groups list. ![image](https://geins.io/../../img/merchantcenter/vector-95_185af525.png) To run the import: 1. In Merchant Center, go to **Import Tool** in the left menu and click **New**. 2. Choose the file you want to import. 3. Choose template type: **Customer/Member (Beta)**. 4. Make sure the **Id** field and **Customer group** field have matches. 5. Click **Start import**. When the import is done, the result is shown on the right so you can confirm the rows were imported correctly. ![image](https://geins.io/../../img/merchantcenter/customers_import_E0388EAC.jpg) # Balance to customers account ## Key features - Add funds to a customer's balance from the customer view - Choose a balance type, such as for a return - Each balance entry is logged with a timestamp, who made it, and why ## Quick guide 1. Go to **Customers (CRM) > Customers**, or search for the customer. 2. Open the customer and click the **Balance** tab. 3. Fill in **Text**, **Balance type**, and **Balance**. 4. Click **Save**. --- In Merchant Center, go to **Customers (CRM) > Customers** in the left menu, or search for the customer in the search bar. ![image](https://geins.io/../../img/merchantcenter/10130650561820_3D4BDF17.png) Choose the customer you want to add funds to and click the **Balance** tab. ![image](https://geins.io/../../img/merchantcenter/10130650563612_9986BFF5.png) Fill in the following fields: | Field | Description | | ---------------- | ---------------------------------------------------------------------------------------------------- | | **Text** | A reason for the refund, for internal purposes. | | **Balance type** | The most common type is when a return is made. The options can vary depending on your initial setup. | | **Balance** | The amount you want to credit to the customer's account. | Click **Save** to make the balance appear on the customer's account. ![image](https://geins.io/../../img/merchantcenter/10130650565276_2811B40F.png) Once saved, a log of the added balance appears in the **Information** box on the right, with a timestamp, who in your organization made the change, and why. ![image](https://geins.io/../../img/merchantcenter/10130689187100_5BA3165C.png) # Blacklist a customer ## Key features - Blacklisting an account blocks purchases made with that account or email address - The email address stays reserved by the blacklisted account, so it cannot be used to create a new account ## Quick guide 1. Open the customer view in Merchant Center. 2. Set the customer as blacklisted in the **Blacklisted** box. --- When a customer is set as **blacklisted**, purchases using that account or email address cannot be completed. The email address also remains reserved by the blacklisted account, meaning it cannot be used to create a new account. You set this on the **customer view** in Merchant Center, in the **Blacklisted** box. # Find a customer in Merchant Center ## Key features - Find customers quickly from the main search - Filter and search the customer list by column - Choose which columns are visible in the list ## Quick guide 1. In the main search, enter the customer's name, Id, or email address. 2. Click **Customers** to narrow the search to customers. --- ## Search in the main search In the main search in Merchant Center, enter the customer's name, Id, or email address to quickly find them. ![image](https://geins.io/../../img/merchantcenter/5496448937874_E483A626.jpeg) Click **Customers** for the most effective search. ## Filter the customer list 1. Go to **Customers (CRM) > Customers** in the left menu. 2. Right-click a column heading to filter it. For example, right-click the **Email** heading and enter the email to match. The list filters to the matching customer. 3. Control which columns are visible via **Column options** at the top right of the list, where you can turn columns on and off. ![image](https://geins.io/../../img/merchantcenter/10383524867612_00F65B6C.jpeg) To reset all filtering, right-click any heading in the list and click **Clear all filters**. # Generate new password to customers ## Key features - Generate and send a new password to a customer who forgot theirs - The new password is sent to the customer's registered email address - The password is auto-generated ## Quick guide 1. Go to **Customers (CRM) > Customers**. 2. Find the customer and click **Send new password**. 3. In the pop-up, click **Send**. --- Go to **Customers (CRM) > Customers**. ![image](https://geins.io/../../img/merchantcenter/10057610573468_88AE810F.png) Find the customer who wants a new password in the list, then click **Send new password**. ![image](https://geins.io/../../img/merchantcenter/10057604776604_86649081.png) A pop-up window appears with the option to send a new password to the customer's registered email address. Click **Send**, and an auto-generated password is sent to the customer. # How to remove a customer ## Key features - Anonymize a customer to permanently remove their personal data - The account remains for statistics, but all identifiable data is removed - The action cannot be undone ## Quick guide 1. Find the customer via search or **Customers (CRM) > Customers**. 2. On the customer view, click **Anonymize user** at the top right and confirm. --- ## Anonymize a customer Anonymizing a user permanently removes all personal data associated with that customer, including their name, email address, and any other identifiable information. This protects their privacy and ensures their data cannot be accessed or misused. To remove a customer's data: 1. Search for the customer's email address or name in the header search field, or go to **Customers (CRM) > Customers**. 2. On the customer view, click **Anonymize user** at the top right and confirm. ![image](https://geins.io/../../img/merchantcenter/bild-1_46403929.jpg) Once anonymized, the customer's personal data is irreversibly deleted. The account remains for statistics, but all customer data is permanently anonymized, so the customer can no longer log in. If they shop again with the same email address, a new account is created. This action cannot be undone, so use the **Anonymize user** function with caution. # Merge customer accounts ## Key features - Combine two customer accounts into one in the **Customers (CRM)** area - Orders transfer to the active account (can take up to two minutes to show in the orders list) - The merged account is set to inactive but remains in the system ## Quick guide 1. Go to the customer account you want to merge. 2. Click **Merge**. 3. Enter the ID of the account you want to merge with. 4. Select the correct account and click **Merge**. --- The **Merge** function combines two customer accounts in the **Customers (CRM)** area. 1. Go to the customer account you want to merge. 2. Click the **Merge** button. 3. Enter the ID of the account you want to merge with. 4. Select the correct account and click **Merge** to complete the process. The selected accounts are combined into one. Any existing orders are transferred to the active account, which can take up to two minutes to show in the orders list. The account that was merged is set to inactive but remains in the system. ![image](https://geins.io/../../img/merchantcenter/Mergemerge_7E226CA7.jpg) # Customer Count ## Key features - Customers are registered automatically once they complete an order or create an account - Each customer gets a profile on their first order - View all customers and their order counts in one grid - Filter and customize columns, for example by order count, name, or latest login ## Quick guide 1. Go to **Customers (CRM)** in the left menu. 2. View all customers and their order counts. 3. Filter or customize the columns as needed. --- In Merchant Center, open **Customers (CRM)** in the left menu. Customers are registered here automatically once they complete an order or create an account, and each customer gets a profile on their first order. If a customer does not finish creating a password, you can still access their details under **Customers**. ![image](https://geins.io/../../img/merchantcenter/10057610573468_88AE810F.png) This view gives you an overview of all customers and their order counts. Like other grid views in Geins, you can filter and customize the columns displayed. For example, filter by **Order Count** to find customers who have placed multiple orders, or filter by name or latest login to refine your search. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2023-12-13-kl.-13.41-1_35da199b.png) # Campaign performance The **Campaign Performance** section displays a campaign's progress through two key metrics: **Demand** and **Revenue**. All amounts are presented excluding VAT. | Metric | Description | | ----------- | ---------------------------------------------------------------------------------------------------------------------------------- | | **Demand** | Total quantity of products customers were willing to purchase, including fulfilled and canceled orders. Based on the *order date*. | | **Revenue** | Actual sales where products were successfully delivered and paid for. Based on the *delivery date*. | --- ## Performance metrics ![image](https://geins.io/../../img/merchantcenter/6457900189084_016A6073.jpeg){width="300"} | Metric | Description | | ----------------------- | ------------------------------------------------------------------------------------ | | **Products sold** | Number of products sold with the current campaign. | | **Placed orders** | Number of orders containing products included in the current campaign. | | **Total** | Total sales value made with the current campaign. | | **Average margin** | Average margin on products sold with the current campaign. | | **Degree of return** | Return rate, returns with campaign divided by total amount sold. | | **Average order value** | Average order value for orders containing products included in the current campaign. | # Create a cart campaign (cart based campaign) ## Key features - Activate offers in the cart when products that meet the campaign criteria are added - Choose from cart campaign types, such as 3 for 2, percentage, fixed amount, or free shipping - Build the product selection by category, brand, product, price, or import - Limit campaigns to specific customers or customer groups - Prioritise and combine campaigns when products match more than one ## Quick guide 1. Enter a **Campaign title**. 2. Select a **campaign type**. 3. Set the **product selection**. 4. Configure **settings**. 5. Set the **date and time**, then click **Save Campaign**. --- Go to **Products (PIM) > Campaigns** and click **Create Campaign**. ![image](https://geins.io/../../img/merchantcenter/cart-based_F81687AD.jpg){width="600"} ## Step 1 - Title ![image](https://geins.io/../../img/merchantcenter/kampanj_cart_title_0C9B205A.jpg){width="600"} Give the campaign a name in the **Campaign title** field. The name is shown in the store in product listings, on the product page, in the cart, checkout, and order emails. How the information is displayed depends on how the store is designed and built. | Option | Description | | -------------------------------------------------- | ------------------------------------------------------------------------------------------ | | **Hide title in product list and on product page** | The name will not be shown in listings or on the product page in the store. | | **Add internal description** | A short description for the campaign in Merchant Center. For administrative purposes only. | --- ## Step 2 - Type ![image](https://geins.io/../../img/merchantcenter/campaigns_97790DC1.jpg){width="600"} Select the campaign type. These campaigns activate in the cart when products that fulfil the criteria are added. | Type | Description | | ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Cheapest item(s) for free** | E.g. 3 for 2, the cheapest item is set to 0. | | **Buy x pay y (amount)** | E.g. 5 for 100, the discount is distributed across the products. Supports multiple currencies, see [Multilingual and multi-currency support](https://geins.io/docs/merchant-center/cross-border/products-and-pricing/multilingual-and-multi-currency-support). | | **Percentage** | % discount on the entire order, e.g. 20%. Choose to apply the discount on **Selling price** or **Price**. | | **Fixed amount** | Fixed amount deducted from the order, e.g. 50kr. Supports multiple currencies, see [Multilingual and multi-currency support](https://geins.io/docs/merchant-center/cross-border/products-and-pricing/multilingual-and-multi-currency-support). | | **Free shipping** | Free shipping on the order. Also available as an add-on setting with other campaign types. | | **Percentage on most expensive item** | % discount on the most expensive item in the order. | | **Percentage on cheapest item** | % discount on the cheapest item in the order. | | **Buy x get y %** | E.g. buy 5 products in the campaign and receive the set % discount on those products in the cart. | ::note For the **Percentage** type, **Selling price** uses the current selling price including any discounts or campaign prices. **Price** uses the product's original price, ignoring existing discounts or campaigns. :: --- ## Step 3 - Product selection Set which products are included in the campaign. Click **Browse** under **Include selection**. ![image](https://geins.io/../../img/merchantcenter/kampanj_brows_E09B5779.jpg){width="600"} | Selection type | Description | | ----------------- | ----------------------------------------------------------------------------------------------------------------------- | | **Category** | Include all products in one or more categories. | | **Brand** | Include all products from one or more brands. | | **Product** | Select products manually from the list. | | **Product price** | Include products based on price conditions, e.g. all products over 500kr. Multiple conditions can be combined. | | **Import** | Import a product selection from an Excel file. Set the ID type (product ID or article number) and the ID column number. | Click **Save selection** when done. You can update the selection at any time. ![image](https://geins.io/../../img/merchantcenter/product_select_55888423.jpg){width="600"} ::note If no selection is made, the campaign applies to all products. :: ### Exclude products To exclude specific products from the selection, for example a campaign on all jackets except brand X and Y, click **Exclude products from selection** and choose which products to exclude (using the same method as the include selection). ![image](https://geins.io/../../img/merchantcenter/kampanj_exclude_2DFFD0D5.jpg){width="600"} ### Create a landing page If you want a page with the campaign's products at a specific URL, click **Create landing page for selected products** below the selected products list. You can create a separate URL for each market. ![image](https://geins.io/../../img/merchantcenter/kampanj_landingpage_create_E22538B5.jpg){width="600"} Give the page a title, which forms the URL. You can also add a descriptive text shown under the headline in the store. To add custom metadata, click **Add customized metadata (Recommended)** and enter title, keywords, and description. If nothing is added, the store's default metadata is used. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2024-01-15-kl.-14.14.33_f21132d5.png){width="600"} --- ## Step 4 - Settings ![image](https://geins.io/../../img/merchantcenter/settings_C7D72ACC.jpg){width="600"} Available settings depend on the campaign type selected. | Setting | Description | | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | | **Exclude products already on sale** | Products with discount prices are excluded from the campaign. | | **Only include discounted products** | Campaign applies only to products with discounted prices (discount price or included in a product price campaign). | | **Apply free shipping** | Free shipping is applied to orders that include products in the campaign. | **Only include discounted products** has three sub-options: | Option | Description | | ------------------------------------- | -------------------------------------------------------------- | | **All discounted products** | Applies to all discounted products. | | **Only products with discount price** | Applies only to products with a set discount price. | | **Only products with campaign price** | Applies only to products included in a product price campaign. | ### Limit use **Exclusive campaigns** | Option | Description | | ------------------------------- | --------------------------------------------------------------------------------------------------------- | | **Customer exclusive campaign** | Makes the campaign available to specific customers by email address. Customers must be logged in. | | **Group exclusive campaign** | Directs the campaign to specific customer groups created in Customers (CRM). Customers must be logged in. | ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2023-10-18-kl.-11.14.52_2fa991d4.png){width="600"}![image](https://geins.io/../../img/merchantcenter/skarmavbild-2023-10-18-kl.-11.15.15_248711e6.png){width="600"} To find out how to create customer groups click [here](https://geins.io/docs/merchant-center/customers/customer-groups/create-customer-group). To find out how to add customers to a customer group click [here](https://geins.io/docs/merchant-center/customers/customer-groups/place-customer-in-customer-group). ### Requirements | Setting | Description | | -------------------------------- | -------------------------------------------------------------------------------------------------------------- | | **Minimum purchase amount** | The total cart amount (excl. shipping) required for the campaign to apply. | | **Base amount on** | Whether the required amount is calculated before or after other discounts and campaigns are applied. | | **Calculate from (amount)** | Whether the amount is calculated on the entire cart or only on products in the campaign's product selection. | | **Minimum quantity of products** | The minimum number of products required in the cart for the campaign to apply. | | **Calculate from (quantity)** | Whether the quantity is calculated on the entire cart or only on products in the campaign's product selection. | ### Priority Cart-based campaigns can be prioritised and combined when products match more than one campaign. | Setting | Description | | ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------- | | **Priority level** | Value between 1 and 10000. Priority is descending, so 1 has the highest priority and is applied first. | | **Combining campaigns** | Campaigns with a set priority are combined by default, applied in priority order. | | **Do not combine with lower-priority campaigns** | Prevents lower-priority campaigns from applying to products already discounted by a higher-priority cart campaign. | | **Equal priorities** | If multiple campaigns share the same priority and match the same products, the most recently created one is applied. | | **No priority set** | Defaults to the same lowest value. Only the most recently created campaign is applied. | ![image](https://geins.io/../../img/merchantcenter/prio_70AC9F80.jpg){width="600"} Read more about campaign types and priorities: - [Campaign types and priorities](https://geins.io/docs/merchant-center/campaigns/create-campaigns/understanding-campaign-types-and-prioritizations) - [Exceptions where combining cart-based campaigns is not possible](https://geins.io/docs/merchant-center/campaigns/create-campaigns/exceptions-where-combining-cart-based-campaigns) --- ## Step 5 - Date & time ![image](https://geins.io/../../img/merchantcenter/kampanj_time_3E402F22.jpg){width="600"} Set when the campaign will be active. Enter the date and time you want the campaign to go live. To add an end date, enable **Set end date & time** and choose the date and time. Click **Save Campaign** when done. ::note If the campaign is set to go live immediately, it will be active in the store within a few minutes (max 5 minutes). :: # Create a Product price campaign (price campaign) ## Key features - Give included products a reduced price, shown directly in the store as a sale price - Set one discount percentage for the whole campaign, or specific prices and percentages per product - Apply the discount to the product's ordinary price or sale price - Build the product selection by category, brand, product, price, or import - Optionally create a landing page for the campaign's products ## Quick guide 1. Go to **Products (PIM) > Campaigns** and click **Create Campaign**. 2. Enter a **Campaign title** and set the discount. 3. Set the **product selection**. 4. Set the **date and time**, then click **Save Campaign**. --- A product price campaign reduces the price of the included products, shown directly in the store as a sale price. Go to **Products (PIM) > Campaigns** and click **Create Campaign**. ![image](https://geins.io/../../img/merchantcenter/skapa_priskampanj_CF00D278.jpg){width="600"} ## Step 1 - Settings ![image](https://geins.io/../../img/merchantcenter/kampanj_price_setting_B732ACE2.jpg){width="600"} | Field | Description | | -------------------------------- | ------------------------------------------------------------------------------------------------- | | **Campaign title** | The campaign name. Used internally and shown in campaign listings in Merchant Center. | | **Discount percentage** | The discount percentage for the campaign. | | **Apply discount percentage to** | Whether the discount is taken from the product's ordinary price or its sale price, if one is set. | ## Step 2 - Product selection Set which parts of the assortment are included in the campaign. Click **Browse** under **Include selection**. ![image](https://geins.io/../../img/merchantcenter/kampanj_brows-2_F9ECCDCB.jpg){width="600"} | Selection type | Description | | ----------------- | --------------------------------------------------------------------------------------------------------------------- | | **Category** | Include all products in one or more categories. | | **Brand** | Include all products from one or more brands. | | **Product** | Select products manually from the list. | | **Product price** | Include products based on price conditions, for example all products over 500kr. Multiple conditions can be combined. | | **Import** | Import a product selection from an Excel file. | ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2024-01-16-kl.-15.36.34_62c219ff.png){width="600"} For **Import**, set the following file options: | Option | Description | | ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **ID type** | Whether the file identifies products by product ID (Merchant Center) or article number. | | **ID column number** | Which column the ID or article number is in. | | **File includes discount column** | Discount prices or percentages are imported from the specified column(s). With percentages and multiple currencies, you can specify the same column for each currency. | | **File includes header row** | The file has a header row, so import starts at row 2. | | **Append products to existing selection** | Appends imported products to the current selection. By default, the import replaces the full selection. | The article import reads in products to a selection. To create new products via import, use the import tool. See [Working with article import](https://geins.io/docs/merchant-center/campaigns/create-campaigns/working-with-article-import-in-an-product-price-campaign-price-campaign) for more detail. Click **Save selection** when done. You can update the selection at any time. ![image](https://geins.io/../../img/merchantcenter/campaign_add_665-2_528C87A7.gif){width="600"} ::note If no selection is made, the campaign applies to all products. :: ### Edit price on individual rows You can set specific percentages or campaign prices on individual products directly in the product selection list, in the **Discount (%)** or **Campaign price** columns. ![image](https://geins.io/../../img/merchantcenter/a8649be8f73fd0938b0386a106144f41_B8D11180.gif){width="600"} ### Exclude products To exclude specific products from the selection, for example a campaign on all jackets except brand X and Y, click **Exclude products from selection** and choose which products to exclude (using the same method as the include selection). ![image](https://geins.io/../../img/merchantcenter/kampanj_exclude-2_CE2B8B2D.jpg){width="600"} ### Create a landing page If you want a page with the campaign's products at a specific URL, click **Create landing page for selected products** below the selected products list. ![image](https://geins.io/../../img/merchantcenter/pricecampaing_landingpage_662DC7F2.jpg){width="600"} Give the page a title, which forms the URL. You can also add a descriptive text shown under the headline in the store. ![image](https://geins.io/../../img/merchantcenter/kampanj_ladningsida-1_E1E19231.jpg){width="600"} To add custom metadata, click **Add customized metadata (Recommended)** and enter title, keywords, and description. If nothing is added, the store's default metadata is used. ## Step 3 - Date & time ![image](https://geins.io/../../img/merchantcenter/kampanj_time-2_F1155006.jpg){width="600"} Set when the campaign will be active. Enter the date and time you want the campaign to go live. To add an end date, enable **Set end date & time** and choose the date and time. Click **Save Campaign** when done. ::note If the campaign is set to go live immediately, it will be active in the store within a few minutes (max 5 minutes). :: # Create promo codes (discount codes) ## Key features - Create discount codes customers enter at checkout - Enter a code manually or generate one automatically - Choose from several campaign types, such as percentage, fixed amount, or free shipping - Limit use per customer or set a total usage limit - Make codes customer or group exclusive ## Quick guide 1. Go to **Products (PIM) > Campaigns** and click **Create Campaign**. 2. Enter or generate a **Promotion code**. 3. Select a **campaign type**. 4. Set the **product selection** and **settings**. 5. Set the **date and time**, then click **Save Campaign**. --- Go to **Products (PIM) > Campaigns** and click **Create Campaign**. ![image](https://geins.io/../../img/merchantcenter/promo_466D4FF8.jpg){width="600"} ## Step 1 - Promotion code ![image](https://geins.io/../../img/merchantcenter/rabattkod_Steg1_D96D9C16.jpg){width="600"} Enter your code in the **Promotion Code** field, or use **Generate Code** to create one automatically. Avoid using these characters: `/`, `\`, `#`, `?`. Optionally, add an **Internal Description** for administrative use. ## Step 2 - Type ![image](https://geins.io/../../img/merchantcenter/campaigns_97790DC1.jpg){width="600"} Select the campaign type. These campaigns apply when the customer enters the discount code at checkout. | Type | Description | | ------------------------------------- | --------------------------------------------------------------------------------------------------------- | | **Cheapest item(s) for free** | E.g. 3 for 2, where the cheapest item is set to 0. | | **Buy x pay y (amount)** | E.g. 5 for 100, the discount is distributed across the products. | | **Percentage** | % discount on the entire order, e.g. 20%. Choose to apply the discount on **Selling price** or **Price**. | | **Fixed amount** | Fixed amount deducted from the order's total amount. | | **Free shipping** | Free shipping on the order. Also available as a setting with other campaign types. | | **Percentage on most expensive item** | % discount on the order's most expensive item. | | **Percentage on cheapest item** | % discount on the order's cheapest item. | ::note **Selling price** uses the current selling price including any discounts or campaign prices. **Price** uses the product's original price (from the Price field), ignoring existing discounts or campaigns. :: ::note If your promo code results in a price of 0 or below, your PSP may not accept the transaction, preventing the customer from completing their purchase. :: ## Step 3 - Product selection Set which part of the assortment is included in the campaign. Click **Browse** under **Include Selection**. ![image](https://geins.io/../../img/merchantcenter/kampanj_brows-1_04D2BBE0.jpg){width="600"} | Selection type | Description | | ----------------- | ---------------------------------------------------------------------------- | | **Category** | Include all products in one or more categories. | | **Brand** | Include all products from one or more brands. | | **Product** | Select products manually from the list. | | **Product price** | Include products based on price conditions, for example products over 500kr. | Click **Save selection** when done. You can update the selection at any time. ::note If no selection is made, the campaign applies to all products. :: ### Exclude products To exclude specific products from the selection, for example a campaign on all jackets except brand X and Y, click **Exclude products from selection** and choose which products to exclude (using the same method as the include selection). ![image](https://geins.io/../../img/merchantcenter/kampanj_exclude-1_87AB2289.jpg){width="600"} ## Step 4 - Settings ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2023-10-19-kl.-10.11.47_d9a5494f.png){width="600"} | Setting | Description | | ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- | | **Exclude products already on sale** | Products with discounted prices are excluded from the campaign (discount price on the product view, or included in a product price campaign). | | **Only include discounted products** | The campaign applies only to products with discounted prices (a discount price or included in a product price campaign). | **Only include discounted products** has three sub-options: | Option | Description | | ------------------------------------- | -------------------------------------------------------------- | | **All discounted products** | Applies to all discounted products. | | **Only products with discount price** | Applies only to products with a set discount price. | | **Only products with campaign price** | Applies only to products included in a product price campaign. | ### Limit use | Option | Description | | ------------------------ | --------------------------------------------------------------- | | **Once per customer** | The customer must be logged in, and can use the code only once. | | **Limit number of uses** | Set a limit on how many times the code can be used. | ### Exclusive campaigns | Option | Description | | ------------------------------- | --------------------------------------------------------------------------------------------------------- | | **Customer exclusive campaign** | Makes the campaign available to specific customers by email address. Customers must be logged in. | | **Group exclusive campaign** | Directs the campaign to specific customer groups created in Customers (CRM). Customers must be logged in. | ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2023-10-18-kl.-11.14.52_2fa991d4.png){width="600"}![image](https://geins.io/../../img/merchantcenter/skarmavbild-2023-10-18-kl.-11.15.15_248711e6.png){width="600"} To find out how to create customer groups, see [Create customer group](https://geins.io/docs/merchant-center/customers/customer-groups/create-customer-group). To find out how to add customers to a customer group, see [Place customer in customer group](https://geins.io/docs/merchant-center/customers/customer-groups/place-customer-in-customer-group). ### Requirements | Setting | Description | | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | | **Minimum purchase amount** | The minimum cart total required for the campaign to apply, for example 500kr. | | **Base amount on** | Whether the required amount is calculated before or after other discounts and campaigns are applied to the cart total. | | **Minimum quantity of products** | The minimum number of products required in the order for the code to apply. | ## Step 5 - Date & time ![image](https://geins.io/../../img/merchantcenter/kampanj_time-1_D967965A.jpg){width="600"} Set a **start date and time**. Optionally, set an **end date and time** by enabling **Set end date & time**. Click **Save Campaign** when done. If set to start immediately, it activates in the store within 5 minutes. # Example of using priority for customer and group exclusive campaigns This article shows an example of how to manage priority when setting up customer-exclusive campaigns. ## Set high priority for customer exclusives If you want a customer-exclusive discount to always apply, assign it a high priority, such as 3. This leaves room for higher priorities (1 and 2) for future exceptions. Use the levels you prefer. ## Prevent double discounts To avoid multiple discounts on products in the cart, check **Don't combine with lower-priority cart-based campaigns**. No lower-priority campaign will then apply to the same products. ## Example scenarios - **Wide discount:** a customer-exclusive 10% discount on all products always applies, since it covers your entire product range. - **Targeted discount:** a customer-exclusive 50% discount on shoes still lets the customer benefit from another campaign, such as "Buy 2 for 1" on shirts, since it applies to different products. # Exceptions where combining cart-based campaigns is not possible If a cart contains products with campaigns that cannot be combined, the campaign with the highest priority is applied. If no priority is set, the campaigns apply in default order, with the most recently created campaign taking effect. Campaigns are applied based on their priority, and if a campaign can't be combined with those already applied, it is skipped. ## Example 1 - Percentage campaigns on different base prices - Campaign 1 (Priority 1): 10% off, calculated on discount price. - Campaign 2 (Priority 2): 5% off, calculated on regular price. Since different price fields are used, these campaigns are incompatible and cannot be combined. This also applies when combining a cart-based campaign and a promo code based on different base prices. ## Example 2 - Cheapest item(s) for free The **Cheapest item(s) for free** campaign can only be combined with percentage (%), fixed amount, or free shipping campaigns. For example, you cannot combine two "Buy 3 for the price of 2" offers. ## Example 3 - Percentage off the cheapest or most expensive **Percentage off the cheapest** or **Percentage off the most expensive** cannot be applied if another campaign is already active, except for free shipping or fixed amount campaigns. # Understanding Campaign Types and Prioritizations There are three types of campaigns you can use: price campaigns, promo codes, and cart-based campaigns. How they are prioritised depends on their type and the settings you choose. ## Price campaigns When multiple price campaigns are active, the campaign that offers the highest discount on each product is applied automatically in the store. You choose whether the percentage discount applies to the product's price or discount price. ## Promo codes Promo codes always have the highest priority. If a promo code is entered at checkout, it applies even on top of a cart-based campaign with the highest set priority value. To prevent double discounts, check the **Can't be combined with Cart campaigns** option in settings. The promo code will then not apply to products in the cart that are already discounted by a cart campaign. ::note Percentage (%) campaigns based on different base prices cannot be combined. When combining cart-based campaigns, or combining a cart-based campaign with a promo code, they must apply to the same base price (both selling price or both price) to combine. :: ## Cart-based campaigns Cart-based campaigns let you set discounts based on what's in a customer's cart, with the option to prioritise and combine them when products match more than one campaign. | Setting | Description | | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Priority levels** | A value between 1 and 10000. Priority is descending, so 1 has the highest priority and is applied first. | | **Combining campaigns** | By default, campaigns with a set priority are combined, applied in the cart in priority order. | | **Preventing double discounts** | Check **Do not combine with lower-priority Cart-based campaigns** to stop lower-priority campaigns from applying to products already discounted by a cart campaign. | | **Equal priorities** | If multiple campaigns share the same priority and match the same products, the most recently created one is applied. | | **No priority set** | Campaigns without a priority default to the same lowest value. Only the most recently created one is applied. | Multiple cart campaigns can apply to a cart. They are combined and ordered by priority only when products in the cart match more than one campaign. ## Example 1 You have two cart-based campaigns: - **Customer specific:** specific members get a 5% discount on everything when logged in. Priority value 3. - **VIP members:** VIP members, in customer group "VIP" and also logged in, get a 40% discount on everything. Priority value 2. Since the members are also VIP, they first receive the 40% VIP discount, followed by an additional 5% discount on the already reduced price. To give only the 40% VIP discount without the extra 5%, check **Do not combine with lower-priority Cart-based campaigns**. Only the VIP discount is then applied. ## Example 2 - Campaign 1 - Priority 1 - **applied** - Campaign 2 - Priority 2 - **applied** - Campaign 3 - no priority set, created 2023-01-01 - **not applied** - Campaign 4 - no priority set, created 2023-01-05 - **not applied** - Campaign 5 - no priority set, created 2023-01-07 - **applied after campaigns 1 and 2** ## Example 3 - Campaign 1 - Priority 1 - **applied** - Campaign 2 - Priority 2, **Do not combine with lower-priority cart-based campaigns** checked - **applied** - Campaign 3 - no priority set, created 2023-01-05 - **not applied** - Campaign 4 - no priority set, created 2023-01-07 - **not applied** - Campaign 5 - no priority set, created 2023-01-07 - **not applied** # How do promo codes work with priority? Promo codes always have the highest priority. If a promo code is entered at checkout, it applies even if there is a cart-based campaign with the highest priority set. ## Example - **Campaign 1:** 10% off all products (Priority 1) - **Promo code:** SPECIALDEAL, 50% off all jackets Campaign 1 applies first, and when the promo code is entered, its discount is applied on top of all jackets in the cart. ## Prevent double discounts To avoid double discounts, select **Can't be combined with Cart campaigns** when creating the promo code. The promo code then won't apply to items already discounted by other campaigns. # Working with article import in a Product price campaign (price campaign) ## Key features - Use article import to build the product selection for a product price campaign - Apply many different discount prices or percentages across products in one campaign - Identify products by product ID or article number ## Quick guide 1. Prepare an Excel file with at least a product ID or article number column. 2. In a product price campaign, go to **Product selection** and open the article import. 3. Set the **ID type**, **ID column number**, and other file options. 4. Upload the file and click **Save selection**. --- Article import is an effective way to build your product selection when creating a product price campaign. It makes it easy to manage many different discount prices or percentages on products in the same campaign. To create new products via import, use the import tool instead. ## Prepare the file To run an article import you need an Excel file. If all products in the campaign share the same discount (the percentage set in step 1 when you create the campaign), the file only needs a column with the product's Merchant Center ID or article number. To set specific campaign prices or percentages per product, add a column for it (see [Set specific discount prices or percentages](https://geins.io/#set-specific-discount-prices-or-percentages) below). ## Article import settings The article import is in the **Product selection** step when you create your campaign. Set the following options: ![image](https://geins.io/../../img/merchantcenter/6434022035484_5887AFAE.jpeg) | Option | Description | | --------------------------------- | ------------------------------------------------------------------------------------------------ | | **ID type** | Whether the file identifies products by product ID (Merchant Center) or article number. | | **ID column number** | Which column the ID or article number is in. | | **File includes discount column** | The file contains a column with specific campaign prices or percentages per product (see below). | | **File includes header row** | The file has a first header row. | When you upload the file, matching products appear under **Selected Products** on the right. Click **Save selection**. ## Set specific discount prices or percentages When you create a price campaign, you set the campaign's discount percentage in step 1 (Settings). You can override this with specific percentages in the product selection list, either manually in the list or via your import file. To do this with an article import: 1. Add a column to the import file containing either the discount price or the percentage to discount. A number like 150 is set as a campaign price; a percentage is set as the discount %. :br![image](https://geins.io/../../img/merchantcenter/6428216731420_889872CC.png) 2. Check **File includes discount column** and state which column the discount is in. In the example file above, the column number is 2. :br![image](https://geins.io/../../img/merchantcenter/6428318073116_CE2E6AE6.jpeg) 3. If the file has a header row, check **File includes header row**. The example file above has a header row, with the column names Id and Discount. 4. Under file upload, choose your file and upload it. 5. Click **Save selection** at the bottom right. In the **Product selection** list, the imported products show the discount applied. ![image](https://geins.io/../../img/merchantcenter/6428383073564_366C308B.jpeg) Click **Save Campaign** to save. # Campaign information on laid order ## Key features - See which campaigns were active on an order in the **Included campaigns** box - See the campaign type and name - Click a campaign name to go directly to the campaign --- When an order is placed with a campaign active, you can see it in the order in the **Included campaigns** box. It shows the campaign type and the campaign's name. Click a campaign name to go directly to the campaign. ![image](https://geins.io/../../img/merchantcenter/order_campaings_DCE777CE.jpg) # Create campaign pages ## Key features - Show a campaign's products on a dedicated campaign page - **Landing page** created directly on the campaign, with filtering, sorting, and pagination - **Stand-alone CMS page** with full content flexibility using the Product list widget ## Quick guide 1. For a quick page, create a landing page directly on the campaign. 2. For a custom page, create a stand-alone page in **Content (CMS) > Pages** and add a Product list widget. --- Products in one or more campaigns are shown in the store as normal in the categories they belong to. Depending on the campaign type, the products can be distinguished in different ways, such as badges or discount prices. To collect and show a campaign and its products on a campaign page, there are two ways: | Option | Description | | -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Landing page directly on campaign** | A page created directly on a campaign. It lists the products included in the campaign and has the same base functions as a category listing page, including filtering, sorting, and pagination. | | **Stand-alone page (Page) in the CMS** | A page with full flexibility to work with content and create a living campaign page. Products can be shown and listed in many ways with the Product list widget. | ## Landing page directly on campaign On the campaign, click **Create landing page for selected products** under the selected products list. ![image](https://geins.io/../../img/merchantcenter/pricecampaing_landingpage-1_43B71F6D.jpg) Enter the page's title, which forms the URL. You can also add a descriptive text. ![image](https://geins.io/../../img/merchantcenter/kampanj_ladningsida-2_16C09379.jpg) To add custom metadata, click **Add customized metadata (Recommended)** and enter title, keywords, and description. If nothing is added, the store's default metadata is used. The landing page is reached in the store via the URL created when the campaign is saved and set as active. To remove the landing page but keep the campaign, clear the **Create landing page for selected products** checkbox and save the campaign again. ## Stand-alone page (Page) in the CMS Under pages in the CMS you create stand-alone content pages, such as info pages or campaign pages. To create one, go to **Content (CMS) > Pages** and click **Create new stand-alone page**. A page is always in draft status when created, so you can work on the content without it being public, then publish it when ready, either directly or scheduled. Fill in the fields, then start building the content: | Field | Description | | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Name** | Internal only, shown in listings in Merchant Center. | | **Title** | Forms the page URL. If you enter `autumnoffer3for2`, the page link becomes `www.yourstorename.se/autumnoffer3for2`. | | **Collection content** | The content of the page. You have full flexibility to build the campaign page with the different widgets. See the [Content documentation](https://geins.io/docs/merchant-center/content/widgets-library/product-list-widget) for how to work with the CMS and widgets. | To show the products included in the campaign, use the **Product list widget** with these settings so all products are retrieved: - **Show as**: Rows - **Limit number of rows**: No With these settings, products in the campaign are retrieved, and a **Load more** button is shown in listings if the campaign includes many products. Choose which campaign the products are retrieved from in the **Campaign** dropdown, which lists the other created and active campaigns. ![image](https://geins.io/../../img/merchantcenter/6464977599772_42A02FA0.jpeg) ### Publishing the campaign page To publish directly, click **Save and Publish**. To schedule publishing, set it under **Publish settings**. ![image](https://geins.io/../../img/merchantcenter/6471836180764_300408FB.jpeg) Set the page as **Active** and choose the date and time you want it published under **Schedule publish**. You can also set an end date when the page will be taken down. ![image](https://geins.io/../../img/merchantcenter/6471927036956_B73B1139.jpeg) When a date and time are set, the time is shown as above. The page is not yet live, shown by the grayed-out and crossed-out visibility icon. When you are done with the publish settings, click **Save and Publish**. # Filter through orders with specific campaign ## Key features - Filter the orders list by campaign name - Show the Campaign name column via column options - Export the filtered list to Excel ## Quick guide 1. Go to **Warehouse (WMS) > Orders**. 2. Make the **Campaign name** column visible via column options. 3. Right-click the **Campaign name** heading and enter the campaign name. 4. Optionally click **Export** to get an Excel file. --- Go to **Warehouse (WMS) > Orders**. In the list, you can filter the columns by right-clicking a column heading. To filter on campaigns, the **Campaign name** column must be visible. If it is missing, show it via column options at the top right. ![image](https://geins.io/../../img/merchantcenter/orders_colums_720568E1.jpg) Right-click the **Campaign name** column heading and enter the name of the campaign or campaigns you want to filter the order list by. ![image](https://geins.io/../../img/merchantcenter/orders_campaign_filers_60461382.gif) To export the filtered list to Excel, click the **Export** button. # Processing returns for bundled product promotions (3 for 2) ## Key features - Handle returns for orders with a bundled promotion, such as 3 for 2 - The campaign discount is divided across all products in the bundle - Choose a return reason and refund method per product - Optionally refund shipping, apply a return fee, or restock ## Quick guide 1. Go to **Handle returns** under **Warehouse (WMS)**. 2. Enter the order number and press Enter. 3. Mark the returned row, then choose a return reason and refund method. 4. Review the **Return history** summary. --- Go to **Handle returns** under **Warehouse (WMS)**. ![image](https://geins.io/../../img/merchantcenter/10129599422620_C77063FB.png) Enter the order number for the order you want to handle a return for and press Enter. ![image](https://geins.io/../../img/merchantcenter/10129599423644_64E0BCD3.png) You will see the order rows and, under the **Information** column, the discount sum divided between all three products in the 3 for 2 campaign. In this example the discounted amount is **110,00 SEK**, which gives all three products a discount of **36,66 SEK**. ![image](https://geins.io/../../img/merchantcenter/10129584064412_F0BC4895.png) Under the **Return/Refund/Restock** column, use **Mark row as returned**, pick the product that has been returned, and click the button. ![image](https://geins.io/../../img/merchantcenter/10129584065436_69F8DC76.png) Start by clicking the first dropdown menu to specify the return reason for the product. Depending on your initial setup, the choices and their language can vary. These choices are also reflected on the **Return lading** sent to the customer prior to the return. ![image](https://geins.io/../../img/merchantcenter/10129584066844_AC5316D6.png) Once you have chosen the reason, you can choose whether to refund the product: | Choice | Description | | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | | **No refund** | The customer is not entitled to a refund. | | **Refund to balance** | Refund an amount to the customer's account for use on a future order. The customer needs to log in to the account to access the balance. | | **Refund** | Refund the amount to the payment method used when placing the order. | | **Refund for investigation** | | ![image](https://geins.io/../../img/merchantcenter/10129584069788_2EDDAEAE.png) Once you have made your choices, you will see the new amount that will be refunded for the product. The discounted amount is deducted from the original price, in this example **110,00 SEK** minus **36,66 SEK** equals **73,34 SEK**. Depending on the return reason, you can restock the product by ticking the **Restock** checkbox. The product is then available for sale in your store again. ![image](https://geins.io/../../img/merchantcenter/10129584070812_5E8198E2.png) You can also choose to **Refund Shipping fee**, which adds the store's shipping fee to the refund amount, or **Apply Return fee**, which deducts a fee from the refund amount. Tick a checkbox if either applies. In this example a return fee has been applied. ![image](https://geins.io/../../img/merchantcenter/10129599434780_5368E018.png) When all is done, you get a **Return history** with a summary of the amount that will be refunded to the customer. ![image](https://geins.io/../../img/merchantcenter/10129599436956_F59F4117.png) # Show products from a campaign in a product list widget ## Key features - Highlight a campaign's products in CMS content, such as the start page, a stand-alone page, or a content area - Use the Product list widget to pull products from a specific campaign - Optionally choose products manually ## Quick guide 1. In the CMS, open the page you want (for example the start page) and add a **1 column block**. 2. Add a **Product list widget** to the block. 3. In the **Campaign** dropdown, choose the campaign. 4. Click **Save**, then **Save and Publish**. --- In the CMS, go to the page you want to add a content block with campaign products to, for example the start page. Start pages are under **Content (CMS) > Start page**. Add a new **1 column block** by dragging a block from the **Library** and dropping it into position on the page. ![image](https://geins.io/../../img/merchantcenter/cms_add_block_5C9A3B19.gif) Name the block and set the settings you want. Click **Click to select new widget** and choose the **Product list widget**. ![image](https://geins.io/../../img/merchantcenter/cms_add_widget_27501115.jpg) In the **Campaign** dropdown, choose the campaign you want to show products from. You can also choose products manually under the **Manually** tab. ![image](https://geins.io/../../img/merchantcenter/cms_produclist_campaigns_6C93BCD0.jpg) When you have chosen the products, filled in the heading (optional), and set the settings you want, click **Save**. To publish the start page with the new product listing, click **Save and Publish**. # Add a content page (Stand-Alone collection) ## Key features - Create stand-alone pages, from informational pages to campaign pages - Filter a page to a specific market, or leave it open to all sites - Use tags, such as **Menu**, to attach a menu to the page - Schedule when the page is available ## Quick guide 1. Go to **Content (CMS) > Pages**. 2. Click **Create new stand-alone collection**. 3. Name the page and set a **Title** (which generates the URL). 4. Optionally add tags and schedule publishing. 5. Click **Save draft** or **Save and Publish**. --- Go to **Content (CMS) > Pages**. ![image](https://geins.io/../../img/merchantcenter/10529089300124_AC348A61.png) You see a list of all your stand-alone pages. Edit an existing one, or click **Create new stand-alone collection**. ![image](https://geins.io/../../img/merchantcenter/10529089303836_FEA45BC7.png) Name your page so you can easily come back and edit it later. If you have several markets, use the filter settings to create a page for a specific one. If left unfiltered, the page applies to all sites. Under **Title**, give the page a name, which also generates a page URL with the same name. ![image](https://geins.io/../../img/merchantcenter/10529089308956_4CD5E60E.png)![image](https://geins.io/../../img/merchantcenter/10529057146652_2314F884.png) Depending on your initial setup, you may use different tags. For example, the **Menu** tag is used to attach a menu to the page, often to the left of the page. Pages with the same tag are bundled together. Type **Menu** in the **Tags** box. See [Create a content page with included menu](https://geins.io/docs/merchant-center/content/create-content/create-a-content-page-with-included-menu) for the full flow. ![image](https://geins.io/../../img/merchantcenter/10534959824412_BD4651A7.png) An example of how a menu could look, with pages stacked for easy navigation: ![image](https://geins.io/../../img/merchantcenter/10533137670300_C151BE4D.png) As with all content areas and pages, you can schedule your page to be available at a specific time. Click **Schedule publish** and set the dates and times between which you want the page published. ![image](https://geins.io/../../img/merchantcenter/10535153530652_0BF286C1.png) When the content is as you want it, click **Save draft** to keep editing before publishing, or **Save and Publish** to go live right away. # Add content to a product ## Key features - Add content to a specific product's page, or to several products, a category, or a brand - Filter to choose which products the content appears on - Content is placed below the product's main information ## Quick guide 1. Go to **Content (CMS) > Content Areas**. 2. Click **Create new collection for Product**. 3. Use **Edit filter** to choose the products, categories, or brands. 4. Drag a block template into the **Product detail page** area and add widgets. 5. Click **Save and publish**. --- Go to **Content (CMS)** in the left menu and click **Content Areas**. ![image](https://geins.io/../../img/merchantcenter/10112416604060_1DECDC33.png) You see a list of all your product content. Edit an existing one, or click **Create new collection for Product**. ![image](https://geins.io/../../img/merchantcenter/10112619140764_4B263F27.png) A product collection is an area filled with content on a specific product's PDP or several products. You can also enrich the PDPs of a whole category or brand. Use the filters to search for products and generate content around the chosen filters. To show content on specific products, click **Edit filter**. ![image](https://geins.io/../../img/merchantcenter/10112755511196_EDD3E05C.png) You get an overview of all categories, brands, and campaigns, and can search for specific products by name or product ID. Click the products you want to create content around. ![image](https://geins.io/../../img/merchantcenter/10112755512092_9663F49A.png) Build the layout with block templates. See [Block templates](https://geins.io/docs/merchant-center/content/create-content/block-templates) for the available layouts. To add one, drag and drop it into the **Product detail page** content area. The content is placed below the product's main information. ![image](https://geins.io/../../img/merchantcenter/10112755515036_D0E0ACFC.png) For block settings such as name, mobile behavior, display, and design, see [Content Blocks settings options](https://geins.io/docs/merchant-center/content/create-content/content-blocks-settings). To plan when content goes live, see [Scheduling content](https://geins.io/docs/merchant-center/content/general-settings-for-content-management/scheduling-content). Once the content for the product's PDP is set up, click **Save and publish**. # Add content to the product list ## Key features - Add content to product list views, such as category, campaign, or brand pages - Filter to choose which categories, campaigns, or brands - Place content above or below the main product list ## Quick guide 1. Go to **Content (CMS) > Content Areas**. 2. Click **Create new collection for Productlist**. 3. Use **Edit filter** to choose categories, campaigns, or brands. 4. Drag a block template into the top or bottom area and add widgets. 5. Click **Save and publish**. --- Go to **Content (CMS)** in the left menu and click **Content Areas**. ![image](https://geins.io/../../img/merchantcenter/10104567803676_EC179685.png) You see a list of all your product list content. Edit an existing one, or click **Create new collection for Productlist** in the upper left corner. ![image](https://geins.io/../../img/merchantcenter/10104567805596_3F36AF47.png) A product list collection is an area filled with content such as category pages, campaign pages, or brand pages. Use the filters to tick the correct categories, campaigns, or brands and generate content around the chosen filters. To show content on specific categories or brands, click **Edit filter**. ![image](https://geins.io/../../img/merchantcenter/10104567808668_1DD20753.png) You get an overview of all categories, brands, and campaigns to populate with relevant content. ![image](https://geins.io/../../img/merchantcenter/10104579645340_5CD05D21.png) Build the layout with block templates. See [Block templates](https://geins.io/docs/merchant-center/content/create-content/block-templates) for the available layouts. To add one, drag and drop it into one of two content areas: **The top part of the product list** (before the main products in the category) or **The bottom part of the product list** (below them). You can add as many blocks as you want. ![image](https://geins.io/../../img/merchantcenter/10104665052444_59788F25.png) For block settings such as name, mobile behavior, display, and design, see [Content Blocks settings options](https://geins.io/docs/merchant-center/content/create-content/content-blocks-settings). To plan when content goes live, see [Scheduling content](https://geins.io/docs/merchant-center/content/general-settings-for-content-management/scheduling-content). Once the content for the product list page is set up, click **Save and publish**. # Block templates ## Key features - Set layouts for arranging widgets in your content - Choose between one, two, three, or four column blocks - Combine blocks to build a page layout --- Geins CMS provides a range of block templates to facilitate content creation. Each has a set layout and a different functional purpose: | Block | Description | | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | | **One Column Block** | Occupies the entire width of the screen and holds a single widget, for a focused, impactful display. | | **Two Column Block** | Occupies half the screen's width and holds two widgets side by side, for a balanced presentation. | | **Three Column Block** | Uses one-third of the screen's width and holds up to three widgets, ideal for showing multiple pieces of content in a compact space. | | **Four Column Block** | Uses one-fourth of the screen's width and holds up to four widgets in one row, suited to a grid-style layout. | ![image](https://geins.io/../../img/merchantcenter/10112829103260_3ADD19D3.png) # Content Blocks settings options ## Key features - Name each block for easy identification - Set how a block behaves on mobile - Control which devices a block is visible on - Choose the block's design width --- Every content block serves a specific purpose. Assign each block a meaningful name to manage and tell them apart, for example "Hero Banner" for a block containing a prominent banner. This is especially useful when a page has multiple blocks. ## Mobile presentation How a content block behaves on mobile devices: | Option | Description | | ------------- | ---------------------------------------------------------------------------------------------------------------------------- | | **Stack** | The default. The block's content stacks vertically on mobile screens to keep it readable. | | **Collapsed** | Shows the block's content in a condensed form to optimize space. Must be configured during the initial setup of your system. | ![image](https://geins.io/../../img/merchantcenter/10112517282460_07EC9801.png) ## Display preferences Which devices a content block appears on: | Option | Description | | --------------------------- | ---------------------------------------------------------- | | **Always Visible** | The default. The block is visible on all devices. | | **Only Visible on Desktop** | The block appears only on desktop and is hidden on mobile. | | **Only Visible on Mobile** | The block appears only on mobile and is hidden on desktop. | ![image](https://geins.io/../../img/merchantcenter/10112517287068_D36051C7.png) ## Design configuration The block's width on the page: | Option | Description | | -------------- | ---------------------------------------------------------- | | **Default** | The block occupies the standard width of the page. | | **Narrow** | The block is slimmer than the default page width. | | **Full Width** | The block stretches across the entire width of the screen. | How each state is displayed depends on the layout and configuration of your design. ![image](https://geins.io/../../img/merchantcenter/10112450126492_F217E2FE.png) # Content types ## Key features - Manage all store content under **Content (CMS)** in the Merchant Center menu - Work with start pages, content areas, stand-alone pages, and menus --- Content management is collected under **Content (CMS)** in the Merchant Center menu, where you can work with a range of content types: | Type | Description | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Startpage** | Create the content for the store's start page or start pages. You can have different start pages for different needs, such as different markets or customer types. | | **Content Areas** | Create content on existing views in the store. You can create content (collections) on product listings, such as categories, and on product pages. Where these spaces appear is controlled by how the store is designed. | | **Pages** | Stand-alone content pages, such as campaign or information pages. | | **Menus** | Menu editor for creating and editing navigation in the store, such as the top bar in the header, the main menu, or footer links. | # Create a content page with included menu ## Key features - Add a menu to a stand-alone content page - Two steps: tag the page with **menu**, then link it in the menu editor ## Quick guide 1. In **Content (CMS) > Pages**, add or open a page, add the tag **menu**, and save. 2. In **Content (CMS) > Menus**, create or edit a menu on the **info pages** location and add the page links. --- When creating a stand-alone page, you can choose whether it contains a menu. Example of a menu applied on a page in a storefront: ![image](https://geins.io/../../img/merchantcenter/cms_page_,menu1_50890EA8.jpeg) To include a menu on a content page, two steps are needed: add a page that contains a menu, then link the page in the menu editor. ## Add a menu space on a content page 1. Go to **Content (CMS) > Pages** and open an existing page or click **Create new page**. 2. To set up a page that includes a menu space, enter the tag **menu** in the **Tags** field. 3. Save the page. ![image](https://geins.io/../../img/merchantcenter/cms_tags2_ABDC9963.gif) The page now supports showing a menu. The next step is to link the page in the menu editor (and create the menu if it's the first time). ## Create a menu and add links with the menu editor 1. Go to **Content (CMS) > Menus** and click **Create menu**. If you have already created the menu on the info pages location, open it and add a link to the page instead. 2. Give the menu a name. 3. Choose which channels it is shown on. 4. Under locations, select **info pages**. The menu location must be configured. 5. Add the links by clicking **Add menu items**, then under pages add the content pages to show in the menu. 6. Click **Save menu**. ![image](https://geins.io/../../img/merchantcenter/cms_menu_infolocation3_9BA61E7B.jpeg) The menu now appears on content pages that have the **menu** tag, and shows the links added in the menu. # Create and edit a menu with the menu editor ## Key features - Create and edit menus for various storefront locations - Add categories, brands, pages, or custom links - Import the whole category tree from Products (PIM) - Assign the menu to a location, channel, and language ## Quick guide 1. Go to **Content (CMS) > Menus** and click **Create Menu**. 2. Name the menu. 3. Add menu items (categories, brands, pages, or custom links). 4. Choose the location, channel, and language. 5. Click **Save**. --- The following example creates a main menu. Go to **Content (CMS) > Menus** and click **Create Menu**. ![image](https://geins.io/../../img/merchantcenter/8515256480284_7F0593D8.jpeg) Name your menu, for example **Main Menu**. ![image](https://geins.io/../../img/merchantcenter/10045165387036_61DA74E6.png) Add **Categories**, **Brands**, **Pages** (created as stand-alone pages in the CMS), or a **Custom link** by clicking **Add menu items**. ![image](https://geins.io/../../img/merchantcenter/10045165389980_519813B8.png)![image](https://geins.io/../../img/merchantcenter/10045156400924_A4CA2B76.png) You can also import the whole category tree created in **Products (PIM) > Categories**, which gives you the existing structure directly. You can rename the categories and drag and drop them into a different structure. Renaming and dragging categories does not change the breadcrumb or the category structure created in **Products (PIM) > Categories**. ![image](https://geins.io/../../img/merchantcenter/10045165394204_754B26A8.png) Next, decide where the menu is placed in your storefront. The available locations are set by your page design and configuration. Base locations are **Main - Desktop**, **Main - Mobile**, **Footer - First**, **Footer - Second**, **Footer - Third**, **Top bar**, and **Info pages**. You can use the same menu in all locations, though it is not recommended. Last, decide which channel and language the menu belongs to. ![image](https://geins.io/../../img/merchantcenter/10045322153628_2D21F2CA.png) Click **Save** and your menu is published in your store. # Create and edit the start page ## Key features - Create and edit start pages, with support for multiple start pages - Build the layout with block templates and widgets - Add as many blocks as you want ## Quick guide 1. Go to **Content (CMS) > Start Page**. 2. Click **Create new collection for Frontpage**. 3. Drag block templates onto the page and add widgets. 4. Click **Save and publish**. --- Go to **Content (CMS)** in the left menu and click **Start Page**. ![image](https://geins.io/../../img/merchantcenter/10089675131292_0B98B69D.png) You see a list of all your front pages. Edit an existing one, or click **Create new collection for Frontpage** in the upper left corner. ![image](https://geins.io/../../img/merchantcenter/10089675133724_ECA1C7D9.png) Build the layout with block templates. See [Block templates](https://geins.io/docs/merchant-center/content/create-content/block-templates) for the available layouts. To add one, drag and drop it onto the content area. You can add as many blocks as you want. In the example below there are two blocks: the first, titled **Hero**, is a 1 column block, and the second, titled **Banners**, is a 2 column block. ![image](https://geins.io/../../img/merchantcenter/10089960997916-1_76437916.png) For block settings such as name, mobile behavior, display, and design, see [Content Blocks settings options](https://geins.io/docs/merchant-center/content/create-content/content-blocks-settings). To plan when content goes live, see [Scheduling content](https://geins.io/docs/merchant-center/content/general-settings-for-content-management/scheduling-content). Once the content for the front page is set up, click **Save and publish**. # Adding a menu location in the Menu builder ## Key features - Add a new menu location in the Menu builder - The location must be implemented in the storefront to display ## Quick guide 1. Go to **Menus** under **Content (CMS)**. 2. Click **Manage Menu Locations**. 3. Enter a **Name** and **ID** for the new location. 4. Click **Add**, then **Done**. --- To add a new menu location in the CMS: 1. Go to **Menus** under **Content (CMS)**. 2. Click the **Manage Menu Locations** button, located next to the create new menu button. 3. At the bottom of the list, enter a **Name** and **ID** for the new location. 4. Click **Add**, then click **Done** to complete the process. The new location now appears in Merchant Center. Note that it must be implemented in the storefront to be displayed, and how and where it shows depends on the implementation. # Working with drafts ## Key features - Create drafts to develop content without publishing it live - Create a draft from scratch or from an existing page - Preview changes, including at a spoofed future date and time - Publish and delete, or publish and convert the live version to a draft ## Quick guide 1. On a live page, click **Create Draft > Create Draft for this Collection**. 2. Make your changes. 3. Use **Preview** (and **Set Spoofed Date and Time**) to check. 4. Click **Save and Publish** and choose **Publish and Delete** or **Publish and Convert**. --- The draft feature lets you work on content in advance, preview changes, and ensure everything looks right before going live. Drafts can be created from scratch or from an existing page. ## Example: updating the start page To update your start page but preview the changes first: 1. Go to your live start page and click **Create Draft > Create Draft for this Collection**. :br![image](https://geins.io/../../img/merchantcenter/create_draft_F2A4F8B2.jpg) 2. You now have a draft identical to your live page. Make the changes you want. 3. Use the **Preview** button to see how your changes will appear. If you have content with specific publication dates and times, use **Set Spoofed Date and Time** to preview how the page will look at that exact time. 4. When you're ready to go live, click **Save and Publish**. You have two options: | Option | Description | | ----------------------- | ------------------------------------------------------------------- | | **Publish and Delete** | Publishes the draft and deletes the current live version. | | **Publish and Convert** | Publishes the draft and converts the live version into a new draft. | ![image](https://geins.io/../../img/merchantcenter/draft_converte_C97A258F.jpg) The preview function depends on it being implemented in your storefront. # Working with images and image upload ## Key features - The CMS automatically scales and compresses uploaded images - Upload images at least twice the width of your widest content block - Prefer .jpg over .png unless transparency is needed --- ## Primary guidelines - The image width should be at least twice your widest content block (your widest is the 1 column block). The height is fully dynamic. - Always upload .jpg files instead of .png, unless transparency is needed, which is very rare. - Do not compress the image with external services before uploading. The system handles compression during upload. ## Automatic compression and image scaling When an image is uploaded, the CMS image service compresses it and serves the dimensions needed for various content areas on the storefront. The browser then determines which dimension to display based on screen size (responsiveness), for example 2560px, 900px, or 425px wide. This all happens automatically, so the uploaded image only needs to be at least twice the width of the largest area (for example, 1360px x 2 = 2720px). If you're unsure of the width you need, about 2800px wide is usually sufficient. You therefore don't need to worry about anything other than ensuring the image is wide enough during upload, whether it's for a quarter-column or a full-width hero banner. This keeps images large enough to maintain good quality, regardless of the column width they're placed in. # List views in the CMS ## Key features - **Quick search** to find content by name, filters, or status - A **status column** showing whether content is existing, active, inactive, or a draft - **Tabs for content areas**, one per area above the list, to toggle between the content created for each --- The CMS list views show the content you created, with a layout that makes it easier to manage. | Feature | Description | | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | **Quick search** | Find content in the lists easily. Search by name, filters, or status. | | **Status column** | Shows the status: existing, active, inactive, or draft. | | **Tabs for content areas** | On the content areas page, one tab per content area appears above the list. Toggle between them to view the content created for each area. | ![image](https://geins.io/../../img/merchantcenter/cms-listview_ff7e7997.jpg) # Filter settings for Content ## Key features - Filter content based on the type of content area you are working on - For a product list, create content around a specific category or brand - For a product, search and select the specific products to enrich ## Quick guide 1. Click **Edit filter**. 2. Select the categories, brands, or products to create content around. --- In Geins CMS you can filter your content depending on the type of content area you are working on. For example, when enriching a **productlist**, you can create content around a specific category or brand, making the category more attractive and letting you show the right content at the right time. Start by clicking **Edit filter**. ![image](https://geins.io/../../img/merchantcenter/10112959032348_A73A5DD7.png) Select the categories or brands you want to create content around. ![image](https://geins.io/../../img/merchantcenter/10113003288604_7A43DF1B.png) When enriching a specific **product** or products, you can search and select the products you want to create content around. ![image](https://geins.io/../../img/merchantcenter/10113003289756_223AD794.png) # Scheduling Content ## Key features - Schedule when a whole page or individual blocks go live - Set both a start and a stop date and time for availability - Preview content as it will appear at a scheduled date and time --- | Feature | Description | | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Schedule page and block publication** | Use the **Schedule Publish** button to set precise dates and times for the whole page, or individual blocks within it, to become publicly accessible. Content goes live automatically on your schedule. | | **Setting start and stop times** | Set both a start date and time and a stop date and time for the content's availability. Useful for time-sensitive information, or to limit visibility of certain content after a timeframe. | | **Previewing scheduled content** | The scheduling tool offers a spoofed preview, letting you visualize the page at the scheduled date and time before it goes live, so you can make any adjustments first. | ![image](https://geins.io/../../img/merchantcenter/10112782151452_85C9AC1A.png) # Preview/View your content ## Key features - Preview draft content before publishing - View live content as it appears on your site - Use **Set Spoofed Time** to check scheduled content at a specific date and time --- ## Preview Preview is available when the content is a draft. Read more in [Working with drafts](https://geins.io/docs/merchant-center/content/create-content/working-with-drafts-in-geins-cms). If you have scheduled content for a specific date, use the **Set Spoofed Time** feature to see how it will look at that time. The preview function depends on it being implemented in your storefront. ## View For content that is **live** (such as a start page or content area), click **View** to see it as it appears on your site. You can also use **Set Spoofed Time** to view content scheduled for a specific date. ![image](https://geins.io/../../img/merchantcenter/view2_76207C15.jpg) ### View on Pages - For content pages (not the start page or content areas), click the link in the **Page URL** section to view the live version. - To use **Set Spoofed Time** on a content page, first convert it to a draft. # Banner widget ## Key features - Combine an image or video with text and a button - Set different media for desktop and mobile - Link the banner to an internal or external URL - Position text and button left, middle, or right --- This widget sets up banners with links, text, media, and format recommendations. ![image](https://geins.io/../../img/merchantcenter/banner_DE80FC9F.jpg) ## Settings | Setting | Description | | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Banner Link** | The URL the banner links to, for example `/your-campaign-page`. For internal links, use only the last part of the URL (e.g. `/minicampaign` for `yourstore.se/minicampaign`). | ## Text & button | Setting | Description | | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | | **Text 1** | First row of banner text. Hidden if left empty. | | **Text 2** | Second row of banner text. Hidden if left empty. | | **Text Color** | Black or white, for both texts. | | **Button Text** | Call-to-action text. The button is hidden if empty. | | **Text & Button Placement** | Position the text and button **left**, **middle**, or **right**. Placement depends on how it's implemented in your storefront. | ## Media You can combine video and images by device type (desktop or mobile). For video on both, save the **Vimeo ID** in both fields. | Setting | Description | | -------------------------------- | ------------------------------------------------------------------------------------------ | | **Image (Desktop)** | Upload your desktop image first. This becomes the default. | | **Image (Mobile)** | Upload a separate mobile image. If none is set, the desktop image displays on all devices. | | **Image Description (Alt Text)** | A description for SEO and accessibility. | | **Desktop Video** | Vimeo ID for desktop. Supports Vimeo Pro (or higher) accounts. | | **Mobile Video** | Vimeo ID for mobile. | Only Vimeo is supported for video backgrounds. For a placeholder while loading, upload an image in the **Image** tab. Keep videos short to optimize loading times. ## Picture & video format Use **JPEG** for best performance. GIFs are allowed but won't be optimized, so note the potential impact on page speed. Optimal image width depends on your site's design; height is dynamic. For best results, align images with columns of equal height. # Buttons widget ## Key features - Place one or more linked buttons in a row - Link each button to a category, product, info, or campaign page - Add more buttons and reorder them by drag and drop --- ![image](https://geins.io/../../img/merchantcenter/cms_buttonswidget_6B726A1F.jpg) ## Settings | Setting | Description | | --------------- | --------------------------------------------------------------------------------------------------------------------- | | **Button text** | The call-to-action text on the button. Keep it clear and concise so visitors understand what happens when they click. | | **Button link** | The page the button links to, such as a category, product, info, or campaign page (e.g. `/shoes`). | How the buttons look depends on the store's design and how it's built. ## Functions | Function | Description | | ----------------- | --------------------------------------------------------------------------------------------------- | | **Add buttons** | Click **Add button** at the bottom right, under the other buttons. | | **Sort ordering** | The order matches how the buttons appear in the store. Change a button's position by drag and drop. | ![image](https://geins.io/../../img/merchantcenter/cms_buttonswidget_8F63C2C0.gif) # Create widget ## Key features - Develop custom widgets tailored to your design and functionality needs - Create widget editors that correspond to your wireframes and design - Add a custom widget from the Select widget panel --- The **Create Widget** feature lets you develop custom widgets tailored to your specific design and functionality needs. Geins CMS includes a variety of pre-configured widgets, and you can also create your own that correspond to your wireframes and design. ![image](https://geins.io/../../img/merchantcenter/create2_A15D8781.jpg) Geins Merchant Center offers a way to create custom widget editors. Select **Create widget** in the top left corner when adding a widget through the Select widget panel. ## Technical documentation For guidance on developing custom widgets, see our technical documentation. # HTML widget ## Key features - Place your own HTML markup with CSS styling in the store - Name the widget for administrative use --- ![image](https://geins.io/../../img/merchantcenter/cms_HTMLwidget_C437A9E9.jpg) ## Settings | Setting | Description | | -------- | ----------------------------------------------------------------------------- | | **Name** | The widget name. Not shown in the store, only for administrative purposes. | | **HTML** | Your HTML markup. | | **CSS** | The CSS for the HTML. Give all elements class names and use them for styling. | ::note Test your markup carefully. Faulty markup can have serious consequences for the whole store, so check that the code is correct before you save or publish. :: # Image widget ## Key features - Place pictures in the store - Link a picture to an internal or external URL - Set different pictures for desktop and mobile - Schedule when the widget is shown --- ![image](https://geins.io/../../img/merchantcenter/cms_imagewidget_1AC57A16.jpg) ## Settings | Setting | Description | | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Active** | Controls whether the widget is shown. Schedule time allows time-controlled publishing. | | **Link URL** | The URL the picture links to. Can be external (e.g. `https://www.example.com`) or internal (e.g. `/your-campaign-page`). | | **Content** | Upload the pictures to use. Upload a desktop picture first, which is the default. Upload a separate mobile picture if wanted; if none is set, the desktop picture is shown throughout. | | **Image description (Alt text)** | A description of the picture, read by search engines and by screen readers for people with visual impairment. | ## Picture and video format Only Vimeo is supported for video backgrounds. For a placeholder while the video loads, upload a fitting picture in the image tab. Keep videos short to account for users' internet speeds. Recommended picture format is JPEG for best performance. GIFs are allowed but won't be optimized, so note the effect on page speed. Optimal picture widths depend on your page's design. # Product list widget ## Key features - Place a block of products, as a horizontal slider or in rows - Fetch products from a category, brand, or campaign, or choose them manually - Show products dynamically based on a logged-in user's latest viewed or favorites - Available in the full-width content block (one column block) --- ![image](https://geins.io/../../img/merchantcenter/cms_produclist_D4B3D197.jpg) ## Settings | Setting | Description | | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Title** | The heading shown above the products. | | **Show as** | How the product list is shown, such as a slideshow or in rows. | | **Limit number of rows** | For rows, choose whether to limit the number of rows. If set to **No**, all products from your selection are fetched, shown as rows with a **Show more** button after a number of rows. | | **Number of rows** | How many rows are shown (if **Limit number of rows** is set to **Yes**). | | **Slideshow navigation** | Choose dots, arrows, or both to navigate the slideshow. | How many products are fetched per page is controlled by how the store is configured. ![image](https://geins.io/../../img/merchantcenter/cms_prodlist_test_FC2E81B0.jpg) ## Content Choose which products to show: | Source | Description | | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **From criteria** | Fetch products from a **category**, **brand**, or **campaign**, and set the order in the **Sort by** dropdown. If no criteria is selected, all products are shown, sorted by the **Sort by** option (for example, latest products). The campaign dropdown appears if you have cart campaigns or product price campaigns created. | | **Manually** | Choose products manually. Search for the ones you want and order them by drag and drop. | | **Dynamically** | Show products based on a logged-in user's latest viewed or favorites. | # Rich text widget ## Key features - Create richer, more precise text blocks - Choose paragraph, quotation, or heading formats - Apply formatting such as bold, italic, lists, and alignment - Insert images, links, tables, and symbols --- ![image](https://geins.io/../../img/merchantcenter/10118429481884_05CCC08C.png) ## Format - Paragraph - Quotation - Heading 1 to Heading 5 ## Formatting tools - **Bold**, **Italic**, **Underline**, and **Strikethrough** - **Alignment**: left, center, right, or justify - **Bulleted and numbered lists** ## Insert elements - **Insert Image**: add an image to the text - **Insert Link**: create hyperlinks to web pages or other resources - **Insert Table**: add tables for organizing information - **Insert Symbol**: insert special characters or symbols # Text widget ## Key features - Place text content separated into title, subheading, and body - Render the title and subtitle as heading types for SEO - Useful for information pages, such as purchase conditions --- ![image](https://geins.io/../../img/merchantcenter/cms_textwidget_CEF31F80.jpg) ## Settings | Setting | Description | | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Name** | An internal name, visible only in the widget overview in Merchant Center. | | **Text alignment** | How the text is shown. **Default** is set by the store's design. | | **Title + Title render mode** | The heading. You can render the title as a header type, which is useful for SEO. | | **Subtitle + Subtitle render mode** | You can render the subtitle as a subheading type, which is useful for SEO. | | **Text** | The body text. Use the return key for new rows. The field also accepts HTML, but use HTML with discretion, only if you know what you're doing, as it can break your markup. | You can leave any field empty. # Video widget ## Key features - Place a video on the website from Vimeo or YouTube - Play the video directly on the page or in a modal/popup - Set a custom placeholder image --- ![image](https://geins.io/../../img/merchantcenter/cms_videowidget_2F09585D.jpg) ## Settings | Setting | Description | | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Video provider** | The video provider you use. Vimeo and YouTube are supported. | | **YouTube ID / Vimeo ID** | The ID for the video you want to play (see below). | | **Play** | Whether the video plays directly on the page in its space, or opens in a popup/modal. | | **Placeholder image** | Optionally upload a placeholder image for the video. If none is set, the widget uses the image from the video provider. A custom placeholder gives more flexibility and is recommended for page speed. Add alt text describing the image, which is read by search engines. | **YouTube ID** is the last part of the video link. For example, in `https://www.youtube.com/watch?v=12345`, the ID is the part after `=` (12345). You can also click **share** on the YouTube video and copy the last part of the link, for example `https://youtu.be/12345`. **Vimeo ID**: click **share** on the Vimeo video and copy the last part of the link. For example, in `https://vimeo.com/25451551` the ID is 25451551. ## Picture format Recommended picture format is JPEG for best performance. GIFs are allowed but won't be optimized, so note the effect on page speed. Optimal picture widths depend on your page's design. The picture's height is always dynamic. Make sure pictures in adjacent columns have the same height for the best result. # Handling of currencies ## Key features - Add and edit currencies under **Settings > Currencies** - Set the exchange rate, symbol, decimals, and rounding method per currency - Use a price multiplier to adjust prices for a market - Connect a currency to a market and enable it on products ## Quick guide 1. Go to **Settings > Currencies** and click **New**. 2. Enter the required information and click **Save**. 3. Connect the currency to a market under **Settings > Markets**. 4. Enable the currency on products, manually or via the import tool. --- Under **Settings > Currencies** you find a list of available currencies, where you can add new currencies or edit existing ones. ## Field descriptions | Field | Description | | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Name** | The full name of the currency. | | **Rate** | The exchange rate. This rate is static and must be updated manually when changes are needed. | | **Symbol** | The text or symbol representing the currency (for example € for Euro instead of EUR), often displayed alongside prices. | | **Abbreviation** | The three-letter code for the currency (for example USD for US Dollar). | | **Decimals** | Up to 2 decimals for all currencies, except the default currency. The default currency's decimals are based on the product's set prices, which overrides this setting. | | **Rounding Method** | How the currency rounds (see below). | | **Price Multiplier** | Used alongside the exchange rate to adjust prices for a specific currency, letting you account for VAT or set lower or higher prices in a market (for example a multiplier of 0.8). | | **Space for symbol** | If checked, a space is applied between the symbol and the price. | | **Put symbol behind** | If checked, the symbol is placed after the numbers in the price. | ### Rounding methods | Method | Description | | -------------------- | ------------------------------------------------------------------------------------------------ | | **Default rounding** | Rounds to the defined number of decimals. | | **Nearest 9** | Rounds to the nearest 9. For example, 36 rounds up to 39, or 31 rounds down to 29. | | **Nearest integer** | Rounds to the nearest integer. For example, 36 rounds up to 40, or 31 rounds down to 30. | | **Nearest point 9** | Rounds to the nearest point 9. For example, 19.7 rounds up to 19.9, or 19.2 rounds down to 18.9. | ## Adding a new currency 1. Go to **Settings > Currencies** and click **New**. 2. Enter the required information and click **Save**. 3. Connect the currency to a market: go to **Settings > Markets**, find the market, select the new currency in the currency dropdown, and click **Save**. 4. Enable the currency on products, either manually under the **Prices** tab for each product, or via the import tool for batch updates. To see the currency under the **Prices** tab on a product, you must save the product first, since the new currency is calculated based on the default price on save. After saving, the new currency appears in the prices list. To add the new currency to multiple products via the import tool: 1. Do a product import with the import/update mode. 2. Map the columns **ID**, **Name**, and **Price** (the current price). 3. Start the import to update the products. ::tip First export a list of all your products from the Products (PIM) list. Show only the **ID**, **Name**, and **Price** columns via column options and click **Export this**, then use that file in the product import to enable the new currency. :: ## Rate change 1. Enter the desired rate in the **Rate** field and click **Save**. 2. Changing the rate affects future orders, but does not automatically update existing product prices in Merchant Center. 3. To apply the new rate to a product's prices, save the product first (as when adding a new currency). This recalculates the price based on the new rate. For more detail, see the steps above on updating prices manually or via the import tool. ::note Changing the rate does not apply to or recalculate locked prices. :: # Markets ## Key features - Add and edit markets under **Settings > Markets** - Set the channel, country, VAT rate, and currency per market - Group markets, for example by region, for use in a location selector - Activate or deactivate a market as a country of sale ## Quick guide 1. Go to **Settings > Markets** and click **New**. 2. Fill in the required information and set the market to **Active**. 3. Click **Save**. --- Under **Settings > Markets** you find a list of available markets, where you can add a new market or edit existing ones. ## Field descriptions | Field | Description | | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Channel** | The channel the market should be eligible in. | | **Country** | The country of sale. | | **VAT Rate** | The standard VAT rate for the selected country. | | **Currency** | The currency set on products and used for purchases when the market is selected in checkout. If not set, the default currency applies. | | **Group** | Group identifier. Set the same value on markets you want grouped, for example Europe or Scandinavia. Can be used to display markets together in a location selector. | | **In checkout only** | If checked, the market is only displayed in checkout. How and whether the market is used elsewhere, such as a country selector, depends on your webshop implementation. | ## Add new market 1. Go to **Settings > Markets** and click **New**. 2. Fill in the required information and set the market to **Active**. 3. Click **Save**. ## Inactive market An inactive market is not available as a country of sale. ::note It may take up to 30 minutes for a change to take effect when adding, deactivating, or updating markets. :: ## Example: working with market groups To display grouped markets in a country selector, use the **Group** field to organize them. This simplifies the selection for customers by grouping certain markets together. Example groups: - **Scandinavia**: Sweden, Denmark, Finland, and Norway. - **North America**: the United States and Canada. To add a market to a group: 1. Go to **Settings > Markets**. 2. Open the market you want to add (for example, Sweden). 3. In the **Group** field, enter the group identifier (for example, "Scandinavia"). 4. Repeat for all other markets you want in the same group. All markets with the same identifier are now grouped. ::note How these groups are used and displayed depends on how your webshop is configured. :: # Managing product prices for multiple currencies ## Key features - Manage product prices per currency and channel under the **Prices** tab - Other currency prices are calculated from the default currency and exchange rate - Lock a price so it does not recalculate - Update prices across currencies in bulk with the import tool --- ## Current prices Under **Current Prices** you find a list of the product's prices for each active currency and channel. - The **Price** column shows the price for each currency, based on the default currency price (first row) and calculated using the currency's exchange rate. - When the default currency price changes, other currency prices update automatically on save, unless they are locked. If a currency is available in multiple markets, hover over the information icon in the **Vat info** column to view the different VAT rates for each market. ### Locked prices If you manually adjust a price in any currency other than the default, the price is marked as **Locked**. - Locked prices do not update when the default currency price or exchange rate changes. - To unlock a price, uncheck the **Locked** box. The price then reverts to the default currency calculation. If any prices are locked, a yellow icon appears on the prices tab to indicate it. ## Bulk updates with the Import Tool To update prices across multiple currencies in bulk, use the import tool. See [Updating prices using the import tool](https://geins.io/docs/merchant-center/import-tool/work-with-imports/update-prices-using-the-import-tool). # Multilingual and multi-currency support on campaigns ## Key features - Name campaigns in different languages from the same creation view - Set specific campaign prices per currency - Import products in multiple currencies from one file - Create language-specific landing pages --- ## Language and campaigns In the top-right corner, you can switch between supported languages and currencies. This is especially helpful when creating campaigns for multiple markets. - Use the **language toggle** to name campaigns in different languages, so they appear in each market with the correct language. - Switch languages when creating or editing campaigns using the dropdown next to the campaign title field. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2024-01-15-kl.-14.09.21_55dfcbee.png) ## Currency and campaign pricing - If you support multiple currencies, set specific prices for each one. For example, a campaign where customers pay 10 SEK, 1 EUR, or 10 NOK depending on their currency. - Leave the boxes blank if the campaign doesn't apply to a certain market or currency. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2024-01-15-kl.-14.54.40_a23ef0be.png) ## Import products with multiple currencies You can import products into the campaign in multiple currencies from the same .csv or .xlsx file. Specify the column where the discount price in percentage is located for each currency, and add the column number in the boxes. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2024-01-16-kl.-15.36.34_62c219ff.png) ## Creating language-specific landing pages - Create unique landing pages for each language by specifying a language-specific URL. - Set the page title and a descriptive text shown under the headline in the store. - Use the **flag dropdown** to switch between languages. If you don't set a title in another language, a landing page won't be created for that language. - Once your landing pages are set, find the different URLs under the **Campaign Summary**. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2024-01-15-kl.-14.21.48_cf5ce8c5.png) # Creating language specific CMS content ## Key features - Publish content based on the storefront language - Set language filters on start pages, content areas, and pages - Apply a language filter to menus --- ## Start pages, content areas, and pages You can set language filters in the **Filter settings** for these content types. For example, a start page can be set to display only when the storefront is in Swedish. ![image](https://geins.io/../../img/merchantcenter/lang-filter_5423515c.jpg) ::note The available filters depend on your storefront's configuration. If the language filter isn't implemented, it won't appear in the options. :: ## Menus You can apply the same language filter to menus. The language option is in the **Display Settings** on the right. ![image](https://geins.io/../../img/merchantcenter/lang-menus_d1434c2c.jpg) ### Languages and translations on a menu - The **view translations** select lets you see what the menu will look like and include for each language. - Menus can include both items with predefined values, such as a category name or brand, and custom links with text added directly in the menu, so how menu items are translated will differ. An extended article on menus and translations will be available shortly. # How to edit product texts in other languages ## Key features - Edit default-language texts directly on the product view - Edit other languages on the **Translate** tab - Update texts in bulk with the import tool --- ## Editing on the product page **Default language:** edit the default-language text using the text fields on the main product view. These fields are usually named Text1, Text2, Text3, but can have different names in your system. **Other languages:** go to the **Translate** tab. The default-language texts appear on the left, and the translation fields for the selected language on the right. 1. Click the **Translation to** dropdown and select a language. 2. After editing, click **Save**. ![image](https://geins.io/../../img/merchantcenter/translate-tab_1815eee6.jpg) ## Editing via the import tool Prepare a file with the required columns: **Name**, **Language**, and the text fields (Text1, Text2, Text3). Then: 1. Go to the **Import Tool** and click **New**. 2. Upload your file. 3. Choose **Product** as the template type and select **Insert/Update** for the import mode. 4. Map the columns you want to update. 5. Start the import. Make a test import on one product to verify which text fields match the columns Text1, Text2, Text3 in the product import for you. ::note Be careful not to map empty fields, as this may delete existing texts. :: # Working with translations ## Key features - Translate products, categories, and brands on their **Translate** tab - Update translations in bulk with the import tool (products and categories) - Translate campaign titles and landing page fields, depending on campaign type --- If your webshop supports multiple languages, you can manage translations in Merchant Center in a few ways: translate specific pages such as products, categories, or brands, or use the import tool to update translations in bulk. ## Translating products, categories, and brands Each product, category, or brand has a **Translate** tab to manage text translations. 1. Go to the **Translate** tab. The default-language text appears on the left and fields for the selected language on the right. 2. Use the **Translation to** dropdown to choose your target language. 3. Edit the fields and click **Save**. Basic text fields and meta information can be translated for products, categories, and brands. For products, additional free-text fields (parameter type: Text) are also eligible. ![image](https://geins.io/../../img/merchantcenter/translate_3BB61C35.jpg) ## Bulk translations via the import tool Bulk translation updates via the import tool are available for products and categories. **For categories:** prepare a file with the columns **Name**, **LanguageId**, and the text fields you wish to translate (for example **Name**, **Description**, **MetaTitle**, **MetaDescription**). Go to **Import Tool > New**, upload your file, choose **Category** as the template type, map the columns, and start the import. **For products:** prepare a file with the columns **Name**, **Language**, and text fields (**Text1**, **Text2**, **Text3**). Go to **Import Tool > New**, upload your file, select **Product** as the template, choose **Insert/Update**, map the columns, and start the import. ## Campaign translations The ability to translate campaigns varies by type: | Campaign type | Translatable fields | | --------------------------- | ---------------------------------------------------------------------------------------------- | | **Promo Codes** | No translatable fields. | | **Cart-based Campaigns** | The campaign title. Use the language selector (flag icon) next to the title. | | **Product Price Campaigns** | The campaign title and, if a landing page is created, the title, description, and meta fields. | ![image](https://geins.io/../../img/merchantcenter/landingpage_DC6B8F06.jpg) ::note A landing page can only be created if the campaign includes a specific product selection (not all products). :: ## Menus Menus can include predefined items (like category names) and custom links with text added directly in the menu, so translation methods vary by item type. A detailed article on menu translations will be available soon. # Will multiple cart-based campaigns apply based on priority if they target different products? Multiple cart-based campaigns will apply based on set priority if they target the same product selection. If the campaigns apply to different products, both will be applied. For example: - **Campaign 1:** Buy 2, get 1 free on shoes. - **Campaign 2:** 10% off on jackets (priority 1). Both campaigns will apply if the cart includes at least two pairs of shoes and a jacket. However, if two campaigns target the same product, priority determines the order of application. For instance: - **Campaign 1:** Buy 2, get 1 free on shoes. - **Campaign 2:** 10% off on jackets (priority 1). - **Campaign 3:** 100kr off all orders including jackets (priority 2). In this case, all three campaigns will apply as above, and the campaigns that target the category Jackets will be applied in order of priority: first the 10% off (Campaign 2), then 100kr off total order (Campaign 3). # Difference between a product price campaign based on regular price or discount price After creating a product price campaign, users are presented with two options for the Apply Discount Percentage feature in the initial campaign settings. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2023-12-14-kl.-10.14.05_d4c82071.png) If you choose to apply the discount percentage to the **Price**, all products selected for the campaign will receive a percentage off the regular price. However, if a product already has a discount applied, whether it is higher or lower, the discount percentage will not be applied to those products. Nevertheless, these products will still be included in the campaign with their prices remaining unchanged. On the other hand, if you choose to apply the discount percentage to the **Discount price**, all products that are already on sale will receive an additional discount percentage. # How can I create a promo code valid to all members? #### Using Once per customer Check the **Once per customer** option under settings. This allows all logged-in customers to use the promo code once. Make sure this is the only limit use setting checked to ensure it applies to all eligible customers. ![image](https://geins.io/../../img/merchantcenter/campaign_once__98CE5688.jpg) #### Group exclusive campaign If you want to allow several purchases with the same code per logged in customer, you can achieve this with "Group exclusive campaign" and check the member groups that are relevant. **Note** - this requires that the customers are placed in a customer group. A customer can only be placed in one customer group. So if all groups are added, all customers that are placed in a group should be able to use the code. When a customer becomes a member either if they created the account themself or if they were added after their first order, default is that they are assigned to your set default customer group. Exceptions to this can occur if your implementation is configured in a different way. ![image](https://geins.io/../../img/merchantcenter/campaign_group_7A358306.jpg) The customer groups (except the default group ) available are the ones created by your organisation. Here you can read more on how to create customer groups [Create a customer group](https://geins.io/docs/merchant-center/customers/customer-groups/create-customer-group) [Place a customer in a created customer group](https://geins.io/docs/merchant-center/customers/customer-groups/place-customer-in-customer-group) # In campaign performance, is the campaign margin calculated before or after discounts on the products? # It says there are products with warnings in my selection when I create my campaign, what does that mean? ![image](https://geins.io/../../img/merchantcenter/campaings_warning_8F333D39.jpg) This warning message is displayed when the percentage discount you have set for the price campaign exceeds the maximum discount specified for the products it applies to. It serves as a notification to alert you about this inconsistency. In addition to the warning message, the product list will also indicate which specific products are affected by this discrepancy. If you wish to remove these products from the campaign, you can easily do so. It is important to note that if you choose to keep the products, they will still be displayed in your shop with the campaign price. However, you have the option to adjust the percentage discount for individual products in the "discount (%)" column. To locate the maximum discount field for a particular product, you can refer to the product view. From there, you can make the necessary adjustments to ensure that the discount aligns with the specified maximum discount for that product. ![image](https://geins.io/../../img/merchantcenter/campaign_maxdiscount_warning_BC647237.jpg) It is important to consider that if you choose to keep the products, they will be displayed in the shop with the same campaign price. If desired, you have the option to adjust the percentage discount for specific products in the discount (%) column. You can locate the max discount field within the product view. ![image](https://geins.io/../../img/merchantcenter/product_max_discpunt_40449140.jpg) # What does the campaign's different status mean? **Active**: The campaign is currently live and will apply to products or conditions as configured. **Inactive**: The campaign is not active, meaning it won't influence prices or promotions in the store. **Scheduled**: The campaign is set to active and will apply in store at a future set date and time. **Expired**: The campaign has had a set schedule with an end date and time, which has ended and is no longer applied. It won't influence prices or promotions in the store. **Scheduled campaigns need to be set as active.** A campaign needs to be active when scheduled. An inactive campaign won't be applied in store when set date/time is reached. # What happens if a customer uses a promotion code on products which are already on sale? When you have distributed promotion codes to your customers and there are already products on sale in your shop, it is important to consider the implications this may have on your profit margins and other factors. Although the promotion code will still be applicable to the campaign price, it may lead to complications. For example, if a product is already marked with a red price to indicate a sale, the promotion code will subtract the price from the campaign price. This can potentially result in a lower profit margin than anticipated. To address this issue and ensure that your promotion codes are applied correctly, it is crucial to take advantage of the "Exclude products already on sale" checkbox when configuring your promotion code in the campaign editor. By selecting this option, you can prevent the promotion code from being applied to products that are already discounted. This ensures that your profit margins are protected and that the promotion code is applied only to the products you intend. It's important to note that this exclusion also applies to cart-based campaigns. Whether you are running a promotion for specific products or offering discounts on the entire cart, the "Exclude products already on sale" checkbox should be selected to avoid any complications with profit margins and to ensure accurate application of the promotion code. By carefully considering the impact of promotion codes on sale items and utilizing the "Exclude products already on sale" feature, you can effectively manage your pricing strategy and maximize the benefits of your promotional campaigns. # What happens if a customer uses a promotion code on products which are already on sale? If you have sent out promotion codes to your customers and you already have products on sale in your shop, please be aware that the promotion code will still be valid for use on the campaign price. When a product is already on sale, the promotion code will deduct the price based on the campaign price. #### Avoid double discounts To avoid double discounts, make sure to check the checkbox titled "Exclude products already on sale" when setting up your promotion code. This also applies to cart-based campaigns. # What is an exclusive campaign? **Customer exclusive campaign** - This option makes the campaign available to specific customers, simply add their email addresses. Customers must be logged in to use the discounted products. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2023-10-18-kl.-11.14.52_2fa991d4.png) **Group exclusive campaign** - If you have created one or multiple customer groups under the Customers (CRM) section, you can effortlessly direct your group exclusive campaign towards these groups. In order for customers to participate in the campaign, they must be logged in to their accounts. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2023-10-18-kl.-11.15.15_248711e6.png) To find out how you can create customer groups click [here](https://geins.io/docs/merchant-center/customers/customer-groups/create-customer-group). To find out how to add customers to a customer group click [here](https://geins.io/docs/merchant-center/customers/customer-groups/place-customer-in-customer-group). # What is the difference between Discount price and Product price campaign? Discount price and Product price campaign have a distinct difference. Discount price is set under Products (PIM) > Products and immediately puts the product on sale, often marked with a red price. ![image](https://geins.io/../../img/merchantcenter/campaign_BA18CCD0.png) A **Product price campaign** is set under *Products (PIM) > Campaigns*. A **Product price campaign** allows you to schedule a campaign and make multi-selection of products to be included in the campaign. You can choose a percentage on the regular price or the already discounted price on products. ![image](https://geins.io/../../img/merchantcenter/campaign2_ED588175.png) # Why is a product's discount greater than what is set in the Max discount field on the product? If a product that you have set a maximum discount percentage on in Products (PIM)>Products still appears in a campaign, it may be because you forgot to remove the product when setting up the campaign. A warning will appear indicating that the product exceeds the set percentage for the campaign. If no action is taken, the product will still appear in the campaign. You can easily review or remove products from the selection, or adjust the specific product to the correct maximum percentage in the Discount(%) column. You have the option to remove all products at once or remove them individually. An exclamation mark (!) indicates that a product does not meet the criteria. ![image](https://geins.io/../../img/merchantcenter/vector-85_8f21dc0a.png) # Why is my cart campaign triggered even if the requirement "Minimum purchase amount" is not reached? *Minimum purchase amount* is calculated based on the total cart value **before** campaign discounts are applied. So, if you set the minimum to **350 SEK** and the cart meets that amount before any active campaigns are applied, the campaign will still be applied even if the final cart total drops below the minimum after discounts. # How can I change the Meta text on the start page? The start page Meta title and Meta description texts uses the default meta settings, which can be updated under **Settings > Meta**. Keep in mind that any changes made to the default meta settings will affect all areas that use these settings. If the meta text doesn't update as expected, you may have a custom implementation. In that case, please reach out to your implementation partner for further assistance. # How do I manage ALT texts on images? ALT texts for product images are managed in your app, such as a storefront. Therefore, we recommend reaching out to your implementation agency handling the storefront to understand how this is set up and what options are available. In the Merchant Center, there is a **Tags** feature for product images. This function could potentially be used for ALT texts if you want the ability to add text via the Merchant Center. Each tag can contain up to 100 characters. This is also something you can discuss with your agency to explore implementation possibilities if relevant. # Image uploads support JPG and PNG, can I also upload WebP images? Images are compressed and optimized through our image service. Then, via our CDN provider (Cloudflare), images are automatically converted to WebP format. # Is it possible to have a Media Library with all images and videos? When working with content that includes images in the CMS, such as using the Image widget, previously uploaded images are available. Existing images will be located where you choose which image to upload in the widget. Product images are uploaded individually for each product. # Product is missing when choosing sort by latest on the product list widget? The **Latest products** option in the **Sort by** selection is based on the date the product was first made available on the webshop. If a product was unpublished and then republished, it won’t change its position in the "Latest products" sorting. Newly added products will appear in the Latest products sort after the product list updates, which is in general every 20 minutes. ![image](https://geins.io/../../img/merchantcenter/image-png-Oct-10-2024-10-00-28-3409-AM_F9BC72EB.png) # Which widgets are there? - **Image widget** - Show a picture. You can upload different picture formats for desktop and mobile. - **Text widget** - Show a text. Here you can fill in Title, Subtitle and text if you want to. - **Rich text widget** - **Product list widget** - Show a product list. Here you can hand pick products or choose dynamically from brands/categories/campaigns. You can also set in if they shall be shown as a slideshow or a static list. - **Slideshow widget** - Make a slideshow of the pictures you want to show and set in how long each picture shall be shown and if it should autoplay and how it should change between the pictures. - **Banner widget** - Add a picture and write a text and add a CTA-button on it. Choose where the text and button will be. - **Buttons widget** - Make a row of buttons/menu to, for example, different under categories. - **Video widget** - Add a video from Vimeo or Youtube. Choose if the placeholder picture should be picked from the video or upload your own. - **Richtext widget** - **HTML widget** - **JSON widget** # Why does my uploaded image have a low quality? There are different possible reasons for lower image quality, below are a few examples: - **Original Image Size:** If your original image is small (in pixels), it may be scaled up to fit the content, which can reduce quality. To avoid this, we recommend using larger original images. For more details, see [Working with images and image upload](https://geins.io/docs/merchant-center/content/create-content/working-with-images-and-image-upload). - **Implementation:** How the image is implemented in your storefront can affect its quality. - **Image Scaling:** When you upload an image, it first undergoes a quick, lower-quality scaling, followed by a high-quality scaling that improves image resolution. If the high-quality scaling takes longer, the lower-quality version may be displayed temporarily until the process completes. In some cases, you may need to do a hard reload of the page if the lower-quality image is still being displayed # Why is the category missing in the menu builder? # Does the customer have to create an account? When a customer makes their first purchase from the webshop an account will be automatically created for that customer, however the customer is not forced to continue the account process if they don't want to. In order for the account to be activated the customer needs to choose a password for their account. # How do I manually remove a balance from a customer? 1. Search for and open the customer. 2. Go to the **Balance** tab. 3. Add a balance adjustment with a **negative amount** (for example, **-100 SEK**). 4. Select a suitable type, such as **Manual correction**. 5. Save the change. This will manually reduce the customer's balance by the specified amount. # What Does Active/Inactive Status on a Customer Mean? ### Inactive Status If a customer is set to **Inactive**, they will **not be able to log in** using the email address linked to their account. They **cannot reset their password** using the "Forgot Password" function. It is **not possible to create a new account** using the same email address while it's tied to an inactive customer. *However, the customer **can still place orders** using the same email address, they just won't be able to log in and view their order history.* ### Login Sessions Deactivating a customer in Merchant Center does **not automatically log them out** from the storefront. If they are already logged in, their session may remain active until it expires. ### Newsletter Impact Deactivating a customer **may affect newsletter delivery**, depending on how your system is implemented. Please check your specific setup for details. # What does Customer Count mean? # What happens when a customer ends their membership via my pages? When a customer's account becomes **inactive**, they will no longer be able to log in to my pages. *However, it's important to note that ending the membership does not automatically remove the customer's personal data.* This means that even though the customer can no longer access their account, their personal information will still be stored in our system. To ensure complete privacy and compliance with data protection regulations, it is necessary to utilize the "**anonymize user**" function. **Anonymizing** a user means that all personal data associated with that customer will be permanently removed from our system. This includes their name, email address, and any other identifiable information. By anonymizing the user, we not only protect their privacy but also ensure that their data cannot be accessed or misused in any way. To anonymize a user, follow these steps: 1. Search for the customer's mail address or name in the search field in the header or via **Customers (CRM) > Customers** and open the customer it applies to. 2. On the customer view, click the **Anonymize user** button up to the right and confirm. Once the user has been anonymized, their personal data will be irreversibly deleted from our system. It's important to note that this action cannot be undone, so please exercise caution when using the "anonymize user" function. By anonymizing inactive users, we demonstrate our commitment to data privacy and security. It ensures that customer information is handled responsibly and in accordance with applicable laws and regulations. For more detailed instructions and information on how to anonymize a user, see [How to remove a customer](https://geins.io/docs/merchant-center/customers/customer-management/how-to-remove-a-customer). # Why can’t I find a customer when searching by customer number? Try searching using a combination such as **customer number + first name**, and the correct customer should appear. # Why can't I log in as a customer via Merchant Center? After a customer has placed their first order in your shop, an account is automatically created for them. However, the customer must take the necessary steps to choose a password, which will enable you, as the merchant, to log in as that customer. If your customers have logged in to their account you can easily log in as that particular customer through Geins built in **CMS > Customers**. ![image](https://geins.io/../../img/merchantcenter/10404935493148_A471C6AD.png) Click on the tab **Log in as customer** and you'll see all the orders which have been placed by that particular customer. ![image](https://geins.io/../../img/merchantcenter/10404956622620_CD3F436B.png) ::note You can't see the customer's password in Merchant Center since it's encrypted for your customers' safety. :: # I can’t see the "Log in as Customer" button? # Why can’t I see the columns in the Product List box on the product view? ![image](https://geins.io/../../img/merchantcenter/item-add_7869daca.jpg) # Where do I find my feeds? In the **PIM section**, on a product page, you'll find the "Feeds" box. This box contains the configured feeds. Here's what you can do: - **On Sale:** Check this to include the product's discount price in the feed. - **Active:** Check this to include the product in the active feed. - **Fetch:** Download the active feed file. ![image](https://geins.io/../../img/merchantcenter/feedsbox_6EB29884.jpg) Any changes made will apply when the feed updates, which happens every hour. # Can I revert an import that has been made? Here you can consider making a new import to correct any updates that did not go as intended. # Why does my properties/filters import fail? There are several reasons why a property import may fail in the Geins **Import Tool**. One common error is that property groups, properties, or property values do not exist or are misspelled in the import file. It is crucial to set up properties in the Geins Merchant Center under the **Products (PIM)** section before importing them using the **Import Tool**. Additionally, it is vital to ensure that all values for property groups, properties, and property values are spelled correctly and exactly match the ones added in the **Products (PIM)** section. # Can I update existing products and create new ones in the same import? If the **ID** column is empty and the product name doesn’t match any existing product, a **new product** will be created. If the name matches an existing product, that product will be **updated**. **Recommendation:** - For existing products, always fill in both the **ID** and **Name** columns to ensure accurate updates. - Test the import with one or a few products first to ensure the expected result before running a larger import. # How do I change the layout, such as logo and images, in transactional emails? The ability to manage and update transactional email layouts directly in Merchant Center is planned for the future. # Does the statistics include cancelled orders? Under **Sales Demand**, the amounts reflect what customers intended to buy, including both completed and cancelled orders. The data is based on the order date, and amounts are shown excluding VAT (except in the Order Total column, which includes VAT). Under **Sales Demand** it is possible to display a column showing the number of cancelled orders by adding it from the column options in the upper right corner of the grid. Under the **Accounting > Revenue** view, the sales revenue is based on the delivery date, showing orders fulfilled on that day, regardless of when they were placed. Amounts are also shown excluding VAT, except for the Order Total column. # Reactivate an administrator To access a list of administrators, navigate to the **Settings** section in the left menu of Geins Merchant Center. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2023-12-13-kl.-15.00.17_38cc78ec.png) In this section, you will find a comprehensive list of both active and inactive administrators. An administrator marked with a *red dot* is set as **inactive**, while an administrator marked with a *green dot* is **active**. ![image](https://geins.io/../../img/merchantcenter/vector-97_1e12d544.png) Click on the name of the administrator you wish to reactivate, and you will be directed to a more detailed view of that particular administrator. ![image](https://geins.io/../../img/merchantcenter/vector-98_b3c6e542.png) Click on the checkbox named **Active**, once it is checked **save** your progress and the individual is once again allowed to login. # Managing texts in the Legacy platform When you want to manage and change some system texts in a Geins Legacy platform you can find this option under **Content (CMS) > Text Management**. Simply type the text you want to change in the search box and make the changes you want. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2024-02-23-kl.-13.18.56_9e8ad9bd.png) To change these text in the latest platform, please contact the support through the support form in Merchant Center. # User has been locked out of Merchant Center If an user enters an incorrect password multiple times, they will be automatically locked out of the Merchant Center. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2024-01-31-kl.-11.11.45_e045c7db.png) You can easily unlock the account under **Settings** **> Administrators** option in the left menu. Find the user you want to unlock in the list. In the right hand side you'll see a check box which you need to uncheck and press **Save.** ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2024-01-31-kl.-11.13.02_5ce210e8.png) The user can click on the *Forgot your password?* option and choose a new password password. An automated email will be sent to the user with a password reset link. # Can I increase the order value/add products when using Klarna? If a customer has chosen to use the invoice or part payment option in Klarna, it is not possible to add additional products to their order. This limitation exists because Klarna conducts a credit check on the customer to assess the risk of not getting paid. By allowing customers to increase the order value, it could potentially exceed the credit limit granted by Klarna, which would result in the rejection of the additional products. To address this issue, you have the option to cancel the order in the Merchant Center. By doing so, you can kindly request the customer to place a new order with the desired additional products. This way, the customer can still benefit from the flexibility of Klarna's invoice or part payment option, while also being able to include the additional items they initially wanted to purchase. For more comprehensive information and answers to any other questions you may have about Klarna, we recommend referring to the FAQ section found here. It provides detailed explanations and guidance on various Klarna features, payment options, and customer queries. # Can I customize my order confirmation to customer? Certainly! Geins offers the option to have a personalized order confirmation, but this is a service provided by your agency and may involve an additional cost. To get an idea of the expenses involved, kindly reach out to your agency for an estimate. Geins provides a standard order confirmation format that can be enhanced with logos and some text. Please note that the format is fixed and cannot be altered out of the box. # Can I place an order for a customer in Merchant Center? No, unfortunately not. In order to ensure a seamless and secure shopping experience, customers are required to place their orders directly through our web shop. This allows us to efficiently process and track orders, ensuring that they are fulfilled in a timely manner. By placing orders through our web shop, customers can also take advantage of our user-friendly interface, which provides detailed product information, pricing, and availability. Additionally, our web shop offers convenient payment options and the ability to track the status of your order, providing you with peace of mind throughout the entire purchasing process. We apologize for any inconvenience this may cause, but rest assured that our web shop is designed to provide you with the best possible shopping experience. # Deliver orders via an external WMS If you are unsatisfied with the built-in Warehouse Management System (WMS) in Geins, you have the option to utilize an external WMS. Geins, being an API-First solution, offers seamless integration with any system of your choosing, although there could be a corresponding integration cost for such a project. It is important to note, however, that when employing an external WMS, printing batches of order documents will not be possible. Instead, orders will need to be managed and delivered one at a time. # What is the difference between compensation and refund? #### Refund - A refund is created when processing a return for a specific order row (e.g., via **WMS > Handle Returns**). - If an amount is set to be refunded during this process, it will appear in the **Refunds** and **Refunds Amount** columns in the **Sales Demand** and **Revenue** views. ![image](https://geins.io/../../img/merchantcenter/image-png-Jan-20-2025-02-16-41-8409-PM_D6A75874.png) #### Compensation - A compensation is issued when a refund is made as a single sum on an order, without being tied to a specific product or order row. - Compensation amounts are displayed in the **Compensation** column in the **Sales Demand** and **Revenue** views ![image](https://geins.io/../../img/merchantcenter/image-png-Jan-20-2025-02-06-16-0020-PM_A9BF0488.png) Example of compensation and refunds data in a statistcs view in Merchant Center: ![image](https://geins.io/../../img/merchantcenter/image-png-Jan-20-2025-02-12-35-9767-PM_D2769DAE.png) # Common questions regarding how to handle discrepancies PSP SVEA In this section, we address common questions regarding how to handle changes to invoice and delivery addresses for your order when these details come from Svea. Read on to understand how to manage this situation and what consequences it may have for your order. **Question 1: Can I change the invoice and delivery address for my order?** Yes, you can unlock your order and modify the address details in the Merchant Center. This gives you flexibility to update your order as per your preferences. However, it's important to remember that these changes will only be reflected in the Merchant Center and will not automatically update on your order with Svea. **Question 2: Why are my changed address details not updated with Svea?** Svea typically does not allow changes to invoice and delivery addresses once an order has been placed. While we understand that there may sometimes be minor errors, it's essential to note that Svea has its own rules and limitations regarding address modifications. **Question 3: Can I deliver my order to a different address than the one specified by Svea?** Yes, it is technically possible to deliver your order to a different address than the one specified by Svea. However, it's crucial to be aware that this may have consequences for the level of risk Svea is willing to assume in case of unexpected events with your order. It's best to reach out to Svea to understand their policy and assess any potential risks. **Conclusion:** We understand that it can be confusing when invoice and delivery addresses come from Svea, and you want to make changes. With our assistance, you can still update the address details in the Merchant Center, but remember that this does not directly affect your order with Svea. If you are considering changing the delivery address, it's always advisable to consult Svea to understand the potential consequences. We are here to assist you with any further questions and concerns. # How can I get a list of orders placed with a specific payment method, such as invoice, during a certain period? 1. Go to **Orders**. 2. In the **Payment** column, right-click the column header and filter by the payment method, for example **ManualInvoice**. 3. In the **Created** column, apply a date filter for the desired time period. This will show all orders placed with the selected payment method within the chosen date range. If the columns do not show in your grid, look to the upper right corner where you'll find the "Column Options" menu. Here, you can easily search, add, or remove columns. # How do I resend the order confirmation to a customer? To find the order you are looking for, follow these steps: 1. First, locate the corresponding order in the system. 2. Once you have found the order, go to the order page. On the action bar, you will see an option called "View / Send Email." Click on it. 3. A new window will open, displaying the most recent email associated with the order's lifecycle. 4. If you need to resend an email related to the order, simply click on the "Send" button. This feature allows you to access and send emails conveniently from the order page. ![image](https://geins.io/../../img/merchantcenter/360026327960_B223724C.png) **Please note** that choosing "View / Send Email" will only show the most recent email associated with the order's lifecycle. If the order has not yet been fulfilled, shipping information will not be available. # I started to deliver an order and now I can't find it? If you have commenced the delivery of an order and encountered a need to temporarily halt the process, you will discover the orders that have not been completed yet under the section labeled "Fulfillment history" in Geins Warehouse (WMS). ![image](https://geins.io/../../img/merchantcenter/10405632295580_3546B08A.png) You will be presented with a comprehensive list of all your handled and unhandled deliveries, including a delivery status column that indicates the current state of each order. ![image](https://geins.io/../../img/merchantcenter/10405632300956_0F2A4BF9.png) To continue the delivery process, simply select the order or orders you wish to proceed with. If necessary, print out the item list and delivery documents. Finally, click on "Deliver" to prepare your order for shipment. ![image](https://geins.io/../../img/merchantcenter/10405632303900_4BD82504.png) # Is a permanently locked order removed from the orders list and revenue? If you do not want the sales amount to be included in **Demand**, you can set the prices on the order to **0**. # Is it possible to add a return fee? When registering a return, you can choose whether the return fee should be applied or not. The return fee is **enabled by default**, so make sure to uncheck it for returns where no fee should be charged. If you want help setting up a return fee, please contact our support. # Is it possible to get an invoice for a specific order? # Missing stock When a product has been sold that is classified as an oversellable item, which refers to products not currently available in stock but still available for purchase, they are flagged as **Pending - Unstocked.** ![image](https://geins.io/../../img/merchantcenter/10404209463324_E57F4FEF.png) Tracking the missing products for your orders can sometimes be challenging. However, there is an **optional addon module** called **Incoming Stock** (PO) that can be purchased to provide you with a helpful feature called **Missing Stock**. This feature allows you to easily keep track of which items are missing and how many are needed. It will assist you in making informed purchasing decisions to ensure timely delivery of orders to your customers. ![image](https://geins.io/../../img/merchantcenter/10404188491548_6E55CB9E.png) With the Missing Stock feature provided by the Incoming Stock (PO) addon module, you will have a comprehensive overview of the items that are currently missing from your inventory and the exact quantity needed. This valuable information will make it effortless for you to identify what items you need to purchase in order to fulfill your customers' orders promptly. By having this insight, you can make informed purchasing decisions and ensure that you have the necessary stock available to meet your customers' demands. This feature empowers you to streamline your inventory management process and optimize your order fulfillment, ultimately enhancing customer satisfaction. ![image](https://geins.io/../../img/merchantcenter/10404194525084_DCE2CE72.png) # Pick list 101 ![image](https://geins.io/../../img/merchantcenter/10436727089948_DCB8C532.png) Depending on if you want to deliver an order one by one or in bulk you will get an Item list for either all orders or one at a time. ![image](https://geins.io/../../img/merchantcenter/10436748160540_F0B2E99A.png) You'll find the item list in the top left corner and will be downloaded as a PDF once you clicked it. The list contains the product, the shelf, order id, serial number and the remaining stock after the order is delivered. ![image](https://geins.io/../../img/merchantcenter/10436717827740_6BF8F9A6.png) - The picking list in this example is not styled in anyway. # What does backorder mean? This could be due to your stock balance being set as an **Oversellable stock** on the product(s). These orders will end up in the **Pending Unstocked** section within **Warehouse (WMS).** To handle and deliver these orders you need to fill your stock with the missing product(s), once the new stock is delivered in the system you may handle the order as normal. # What do the different statuses for an order mean - active, locked and permanently locked **Active** - The order is currently active and will be ready for delivery if all products are available in stock. **Locked** - If you are unable to deliver the order directly and it requires manual editing, such as when a product in the order is out of stock, you can choose the "locked" status. When an order is locked, it cannot be delivered and must be unlocked by crossing out the locked status and saving the order. All locked orders can be found under Administration -> Pending orders - Manual. The order will be temporarily locked. **Permanently locked** - The order will be canceled, and this action cannot be reversed. It is possible to cancel the order if it cannot be delivered, for example, if the customer has regretted their order. However, this can only be done if the order has not already been delivered. # What is shippingToken in the order metadata? # When shall I use Settled when refunding customers? When creating a regular refund, do not check **Settled**, as it will not be sent to the payment provider. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2024-04-24-kl.-14.31.13_4f8ded33.png) # Why is a product's discount greater than what is set in the Max discount field on the product? If a product which you have set a **Max discount** percentage on in *Products (PIM)>Products* still shows up in a campaign it could be because you haven't removed the product when you set up your campaign. A warning will appear indicating that a product/products exceeds the set percentage of the campaign. If no action is taken the product will still appear in your campaign. You can easily review or remove product/products from selection or adjust specific product to the correct max percentage in the **Discount(%)** column. ![image](https://geins.io/../../img/merchantcenter/max_7F8C9224.png) # Is it possible to have ALT-texts on Images? Unfortunately, it is not currently possible to add ALT-texts for images in Geins Merchant Center. The ALT-text is automatically set to the product name. If you wish to modify the name and structure, please reach out to your agency for the necessary adjustments. # Can a product item (size) be set as inactive? It is *not* possible to set a product item (size) as inactive in Merchant Center. To remove an item, click the red cross next to it. This will permanently remove the item but its history will be maintained. ![image](https://geins.io/../../img/merchantcenter/items-1_8CB8DE60.jpg) Keep in mind that once removed, the item cannot be restored through the Merchant Center. If you’re looking to hide a specific item or size in your storefront, a custom solution might be possible for you to develop in your storefront with your implementation partner. # Can I publish a product that has 0 as price? If you want to allow products with a zero price to be published, please contact **Geins Support** via the **support form in Merchant Center** for more information and assistance. # Categories not showing up in the menu - **Category is inactive or is missing active products.** If the category is added in the menu, you can see if it's not shown in the store by an icon with a crossed-out eye on the category. - **Category is set as hidden.** - **The category isn't added in the menu.** For a category to be visible in the menu it needs to be added in the menu. To do this: - Go into the current menu under **Content (CMS) > Menus**. - Click **+Add menu Items** (or the + sign if you want to add a sub-category on an existing list). - Choose the category or categories you want to place out and click **Add selected items**. - Ensure the categories are in their wished place, then click **Save Changes** up to the left to publish it live in your store. ![image](https://geins.io/../../img/merchantcenter/menueditor_add_4D917401.jpg) # Can I export a list of active monitors on a product? ![image](https://geins.io/../../img/merchantcenter/monitors_export_CF020638.jpg) # How can I create a category with a .no URL instead of .se that is our default? Go to **Products > Categories** and click **New** to create the category. In the first view, you enter texts for the default language (usually Swedish). To make the category available on the Norwegian site (.no), go to the **Translate** tab and add at least the category name in Norwegian. Once a Norwegian name is added, a URL is automatically generated based on that name and will be used for the .no market. *In the example above we refer to a .no URL with Norwegian as language, the process is the same for other domains and languages.* # How can I display only inactive products in Merchant center? A red dot indicates that the product is inactive and a green dot that the product is active. # How can I see if a product is monitored? You can check product monitoring in three areas within **Geins PIM**: **Product List View:** - Use the columns **Active Monitors** (current email notifications) and **Total Monitors** (all-time registrations). - If these columns aren't visible, enable them via **Column Options** in the list view. **Product View:** - The **Monitors** box shows active and total monitors per item (the box only shows if a product has had any monitors, active or previous). - You can also export a list of all active monitors. **Customer View:** - If a customer has active product monitoring, it appears in the **Monitors** box on their account. # How do I add a new product relation? To create a product relation that will appear on a product card, you need to start by clicking on the **"Related products"** tab on the product you want to enhance with one or more product connections. ![image](https://geins.io/../../img/merchantcenter/slide-16_9-12_ef090cee.jpg) Afterward, you need to find the tag on the product or products to which you want to create a product connection and click on the green plus sign to the left of the product. ![image](https://geins.io/../../img/merchantcenter/relation_0EA74B7A.jpeg) # How do I add a variation to a product? To add a variation to a product, go to the **Variations** tab in *Geins Products (PIM) > Products*. In this example we will add a color variation to a product. ![image](https://geins.io/../../img/merchantcenter/10625560170780_8237046F.png) 1. Utilize the search function to the far right in the **Variations** tab to find the product either by its name or ID number. 2. Once located, select the product that aligns with your search. 3. Incorporate this chosen product into the variation by clicking the plus sign. ![image](https://geins.io/../../img/merchantcenter/10625576126108_5D618137.png) 4. You have the flexibility to repeat this process and include as many products as needed. 5. Remember to apply the hexcode input to the new product to maintain color consistency. ![image](https://geins.io/../../img/merchantcenter/10625592722716_2E3EC7E8.png) # How do I cancel an order? To cancel an order, follow these simple steps: 1. Access the current order by navigating to the designated section. 2. Locate the checkbox labeled "Lock Permanently" within the order details. 3. Click on the checkbox to activate it, indicating your intention to cancel the order. 4. After making the selection, remember to save the changes by clicking on the "Save" button. For more detailed instructions on canceling an order, refer to the comprehensive article titled "Cancel an Order." This article provides further insights and guidance on the cancellation process. # How do I disable a brand on one of our channels? To remove a product from a channel: 1. Go to the **product page**. 2. In the **Channels box**, under Included in shops, remove the product from the relevant sales channel. When a brand no longer has any products assigned to a sales channel, it will automatically be removed from that channel after a few minutes. # How do I remove a product from a feed? - Go to the product page of the item you want to remove. - In the **Feeds** box, uncheck the checkbox in the **Active** column for the feed you want to exclude the product from. - Click **Save** to apply the changes. ![image](https://geins.io/../../img/merchantcenter/feeds_62E666D8.jpg) Any changes made will apply when the feed updates, which happens every hour. # How does hidden category work? Hidden category makes it possible to have a category active on the site without it being shown in the menu or in filter. A hidden category can still be reached via an URL and indexed and searchable on google if on sitemap. This makes it possible to have categories that are popular searches on google without it needing to be in menus and filtering. # Intrastat code If your business engages in cross-border sales of products to other countries within the European Union (EU), it's important to familiarize yourself with the concept of Intrastat codes. These codes play a crucial role in the context of Intrastat declarations, helping to accurately identify and classify the products you're trading. An Intrastat code is a unique identifier associated with a particular product that you're selling to EU member states. When you conduct transactions with other EU countries, these codes become essential in the process of compiling an Intrastat declaration, which is a statistical report detailing the movement of goods between EU member states. Including the appropriate Intrastat code for each product you sell facilitates the accurate recording and reporting of your cross-border trade activities. This code functions as a standardized label that signifies the specific type of product being traded. By attaching the correct Intrastat code to your products, you enable authorities to track and analyze trade patterns across the EU effectively. To enter a product's intrastat code go to **Products (PIM) > Products**. ![image](https://geins.io/../../img/merchantcenter/10190601751580_DF37C9EE.png) Then choose the product you want to enrich with an intrastat code, go to the **Intrastat code** block, and enter the correct intrastat code for the product. ![image](https://geins.io/../../img/merchantcenter/10190601752988_1EB1A4D8.png) *NOTE: The intrastat codes updates every year and if your code is invalid you can find the new code [here](https://www.tariffnumber.com/){rel="nofollow"}* # Is it possible to set so that new products are automatically added to existing feeds? If you want this to be configured so that newly added products are automatically included in feeds, please contact our support team via **Merchant Center**, and we’ll help you set it up. # What is "main category"? The main category determines the canonical URL and breadcrumbs for products. In order for a product to be visible in the store, it must have a main category assigned to it. Each category is designed to have one main category assigned to it. To select the main category for a product, simply choose from the available options in the Category dropdown located within the Product Categories box in the product view. ![image](https://geins.io/../../img/merchantcenter/main-category_9b75fce3.jpg) If a category that is assigned as the **main category** on a product is set to **inactive**, any product using that category as its main category will automatically become **unpublished**. To republish the product, you must assign a new **main category** to it. # How can I identify which products are missing images? To find products missing images, you can create a custom list in the product list view. Here's how: - Go to **Products (PIM)** list. - Right-click on the **Image** column header *(if the column isn't visible, add it through the column options).* - Choose to filter by the value **Missing**. - Click on **Export this** to download the list of products without images. # Should the value in the purchase price field on a product be incl. or ex VAT? In the field **Purchase price** on a product the price added should be excluding VAT. # What are “publication requirements”? Publication requirements are a square that's shown inside the product view if the product is missing basic requirements to be shown in your store. E.g the product must have a name, a price, a picture and inventory balance to be able to publish. ![image](https://geins.io/../../img/merchantcenter/publcation_requierments_C0BD0C77.jpg) # What Data Does the "Color" Column in the Product List Contain? Below is an example of a parameter, where the value Red is displayed in the list: - **Parameter Group:** General - **Parameter Name:** Color Group - **Value:** Red # What is the difference between Picker and Multipicker? When you work with properties you are able to choose between several types of functionalities, two of them are **Picker** and **Multipicker**. ![image](https://geins.io/../../img/merchantcenter/10610846148124_00C7A56C.png) A **Picker** allows you to choose only one of the presets you've created, for example, *Is this product vegan? Yes/No*. Since the product can't be both yes and no you have to pick one of the two. As for **Multipicker**, it allows you to choose several options. For example *Ingredients: Almond, Flour, Egg.* Those three ingredients are all in the same product and the **Multipicker** allows you to choose more than one option. # What's the difference in stock, oversellable and static stock? - **In stock** - Current inventory balance. - **Oversellable** - If you want to sell a product that's not in stock. E.g. the product isn't in stock but you still want to sell it in your shop with a longer delivery time. - **Static Stock** - Static inventory balance on products that aren't in stock. E.g. you sell cakes and you always know you can make 10 pieces, so you set static stock to 10. # Why can't I place a publish date on a product? When you click on the "Save" button for a product that has the "Active" option crossed out, the ability to enter a date disappears. In this case, active products are considered as items that you want to make visible and available for sale in your store. If you wish to schedule a later date for the product to be available, you will need to deactivate the product first. After deactivating, make sure to save the changes. Then, you will be able to set a new date for the product to become active again, allowing you to choose a date further in the future. By following these steps, you can effectively manage the visibility and availability of your products in your store, ensuring that they are displayed and sold at the appropriate times. # Why can´t I see all changes in the product pricelog? ![image](https://geins.io/../../img/merchantcenter/changelog_64600EBF.jpg) # Why does my product redirect me to a 404 page? It is crucial to have an accurate menu structure for each market and ensure that there are active products in each category. To edit a market specific menu got to **Content > Menus**. # Why doesn't my product properties show up as filters in the product list? If your product properties are not appearing as filters, it may be because you forgot or missed setting the correct filter value in Geins (PIM)>Properties/Filters. This step is crucial for ensuring that your product properties can be easily filtered and searched by your customers. If the filter value is set to NoFilter, it will not show as a filter in your product list, making it difficult for customers to narrow down their search results. To avoid this, make sure to carefully set the appropriate filter value for each property in the Geins platform. It's important to note that not all property types can be transformed into filters. However, most property types, except for Text, can be converted into filters by selecting the MultiFilter option under the Filter settings. This will enable your customers to refine their search based on specific product attributes such as size, color, or brand. By properly configuring the filter values in Geins, you can enhance the overall user experience on your platform and make it easier for customers to find the products they are looking for. So take the time to double-check and ensure that the correct filter values are set for your product properties, and make use of the MultiFilter option for applicable property types. ![image](https://geins.io/../../img/merchantcenter/10625068963868_83E247CA.png) # Why doesn't my stock balance change when using the import tool? The most common issue occurs when the Size column is not present in the Excel/Csv file. If you have not specified the sizes in Geins PIM, it will be filled with "One size". Otherwise, it will be written exactly as you have named the size on the product. # Why doesn’t the Sales Price update when I change it? # Why isn't my product visible in the shop? There are several reasons why a product may not be visible in the shop. Below, we have provided a list of the most common factors that can cause your product to be invisible in the shop. - Is the product active? - Does the product have an inventory balance? - Is the product's brand and main category active? - Have the "publication requirements" been fulfilled? You can find more information about publication requirements here. # How do I make changes in the Language key for currencies? ::note The changes take up to 30 minutes to be applied in the storefront. :: # How is the numbers under Sales demand view calculated? | Column | Description | | ---------------- | --------------------------------------------------------------------------------------------- | | **Order Value** | Order Value in SEK, excluding Tax, excluding Fees, including Discounts | | **Cost** | Cost (Purchase Price) in SEK | | **Compensation** | Total Compensation Amount (Refund amount added directly to order) | | **Discount** | Order Discount Amount excluding Tax. Does not include discounts on individual products (rows) | | **Order Total** | Order Total in SEK including Tax, Fees and Discounts (Money in) | *Refunds are counted on the orders placed/shipped on the given date* *All fees are excluding Tax* *Two types of date dimensions are used: Order placement Date (Demand) and order shipping date (Revenue)* # Usage fees Fees for usage over plan limits, by plan tier: | What | Starter | Growth | Enterprise | | ------------------------ | -------- | -------- | ---------- | | Extra transaction | 0,5€ | 0,3€ | Custom | | WMS with TA | 50€ / m | 50€ / m | Custom | | Additional 5000 SKU's | 75€ / m | 50€ / m | Custom | | Additional Sales channel | 180€ / m | 180€ / m | Custom | | Extra seat | 25 € / m | 25 € / m | Custom | | Extra API-user | 50 € / m | 50 € / m | Custom | # Geins Terms & Agreements ### 1. Introduktion **1.1** Dessa avtalsvillkor (**"Användarvillkoren"**) reglerar ditt företags användning av Tjänsterna (som definieras nedan). Genom att du godkänner Användarvillkoren ingås ett avtal mellan det bolag som har angetts i samband med att du godkände villkoren (**"Kunden"**) och Geins Solutions AB, organisationsnummer 556691-7422 med adress Heliosgatan 13, 120 78 Stockholm (**"Geins"**). **1.2** Tjänsterna tillhandahålls antingen via att Kunden erhåller administrationsuppgifter från Geins eller via Kundens domän. Genom att du uttryckligen godkänner Användarvillkoren eller använder Tjänsterna accepterar Kunden dessa Användarvillkor. På Startdagen får Kunden tillgång till Tjänsterna genom att du från Geins erhåller login­uppgifter till Kundens administrationskonto. **1.3** Tjänsterna är inte avsedda för konsumenter utan enbart för personer som agerar inom ramen för en näringsverksamhet. Genom att godkänna dessa Användarvillkor, garanterar du att du har rätt att med bindande verkan ingå avtal med Geins om Tjänsterna för Kundens räkning. ### 2. Definitioner De termer som listas nedan ska ha följande innebörd. **2.1 "Avtalet"** avser dessa Användarvillkor och det skriftliga försättsblad som signeras av Kundens representant digitalt. Särskilda villkor kan gälla för Tilläggstjänster och dessa accepteras i samband med beställningen av sådana tjänster och blir därmed en del av Avtalet. Efter Avtalet har ingåtts tillgängliggörs en kopia av Avtalet för Kunden och det kommer även finnas tillgängligt inom ramen för Tjänsterna. **2.2 "Avtalsdagen"** avser den dag då Kunden skriver under Avtalet. **2.3 "Bastjänsten"** avser Geins (tidigare under namnet Geins Commerce) som är (i) en e­handelsplattform som tillhandahålls som en Software as a Service (ii) ett administrationsgränssnitt (kallat Merchant Center) för access till e-handelsplattformen med hosting hos Molnleverantören samt (iii) ett Management API som möjliggör för Kunden att ansluta till e-handelsplattformen. Följande ingår inte i Tjänsterna: (x) Appar eller tjänster som Geins eller 3\:e part bygger på uppdrag av Kunden **2.4 "CDN"** avser *Content Delivery Network* eller innehållsleveransnätverk; ett geografiskt utspritt nätverk av proxy-servrar och deras datorhallar. **2.5 "DNS"** avser *Domain Name System* eller domännamnssystemet; ett system för förenkling av adressering av datorer på IP-nätverk. **2.6 "Konfidentiell Information"** har den betydelse som framgår av punkt 16.1 nedan. **2.7 "Kundens Data"** avser Kunden tillhörig information vilken matas in och lagras Webbshoppen av Kunden via Tjänsterna. **2.8 "Molnleverantören"** avser den av Geins utvalda moln leverantören som hostar samtliga eller del av Tjänsterna. **2.9 "Servicenivå"** avser mellan Parterna överenskommen servicenivå för Geins's tillhandahållande av Tjänsterna enligt Avtalet. **2.10 "SSL"** avser *Secure Sockets Layer* Certifikatet som kan användas för kryptering, digitala signaturer och autentisering. **2.11 "Startdag"** avser den dag då Kunden får tillgång till Tjänsterna. **2.12 "StoreFront"** avser Kundens butik/webbsidan som Kundens slutkund ser; denna del kan Kunden själv programmera och editera i och den är open source. **2.13 "Tilläggstjänster"** eller **"Tilläggstjänsten"** avser ytterligare funktioner utöver Bastjänsten som Geins erbjuder Kunden från tid till annan. **2.14 "Tjänsterna"** avser Bastjänsten och Tilläggstjänsterna. **2.15 "Tredjepartsprodukt"** avser programvara eller annan lösning som tillhör annat företag än Geins. **2.16 "Webbshop"** eller **"Säljkanal"** avser den mjukvara som tar in beställningar i Bastjänsten och är tillgänglig för Kundens webbtrafik. Kunden har själv ägandeskap över denna mjukvara. ### 3. Omfattning **3.1** Tjänsterna erbjuds i form av prenumerationer. Genom att ingå Avtalet, påbörjar Kunden en prenumeration på Bastjänsten. Prenumerationstiden för Bastjänsten är två år där prenumerationstiden förlängs med två år i taget om inte uppsägning skett med tre månaders uppsägningstid dessförinnan. **3.2** För respektive Tilläggstjänst anges prenumerationstiden i samband med att Kunden beställer Tilläggstjänsten. För Tilläggstjänster förnyas prenumerationen automatiskt vid upphörandet av den då pågående prenumerationstiden om inte prenumerationen i fråga eller Avtalet i dess helhet har sagts upp innan dess. Förlängningen görs med ett sådant tidsintervall som har angetts vid beställningen av Tilläggstjänsten i fråga. Kunden har möjlighet att säga upp en prenumeration på en Tilläggstjänst genom att meddela Geins minst en (1) månad före förnyelsen av prenumerationen att Kunden önskar säga upp prenumerationen. Sådant meddelande ska ske skriftligen i enlighet med punkt 21 nedan. Uppsägning av Bastjänsten utgör också en uppsägning av Avtalet och regleras därför i punkt 19. Utebliven betalning är inte att jämställa med uppsägning av prenumerationen. **3.3** Bastjänsterna omfattar ett obegränsat antal användare. Tilläggstjänsterna har ett begränsat antal användare i enlighet med överenskommelse mellan Parterna. ### 4. Geins's skyldigheter **4.1** Geins åtar sig att under avtalstiden, på de villkor som framgår av Avtalet tillhandahålla Tjänsterna i enlighet med specifikationen för de respektive Tjänsterna. Tjänsterna tillhandahålls och produceras hos Geins via Geins's system. Med iakttagande av punkten 12 får Geins tillhandahålla Tjänsterna eller del av Tjänsterna från annat land. Tjänsterna inkluderar arbete på plats hos Kunden eller liknande först efter särskild överenskommelse mellan Parterna. **4.2** Geins ska, med undantag för uppdateringar i Bastjänstens front end, på egen bekostnad, uppdatera och uppgradera den i Bastjänsten ingående programvaran i den utsträckning som Geins anser nödvändig för Bastjänstens utförande. För front end ska Kunden erlägga den avgift som gäller från tid till annan enligt Geins's gällande prislista. Detsamma ska gälla för funktioner och utveckling beställda av Kunden, inklusive kopplingar mot Kundens övriga system. **4.3** Geins ska tillse att back-up av Bastjänsten görs motsvarande sju dagar tillbaka i tiden med 10 minuters intervall. Back-up sparas således under en period om sju (7) kalenderdagar. Back-up är geo-redundant innebärande att Kundens Data replikeras till en närliggande Molnleverantörsregion. För väsentlig brist i sådant åtagande svarar Geins enligt punkt 14 nedan. **4.4** Geins har ingen skyldighet att tillse att back-up sker av Kundens Data som laddas upp i Bastjänsten. Kundens Data kan dock skyddas genom lokal redundant lagring innebärande att Molnleverantören (men inte Geins) garanterar att Kundens Data sparas redundant på flera ställen. Kunden har även möjlighet att, som Tilläggstjänst, replikera Kundens Data till annat datacenter i aktuell region (zone redundant storage) eller till en annan region (geo redundant storage). **4.5** Geins har rätt att anlita underleverantörer för fullgörande av Geins's åtaganden enligt Avtalet. Geins ansvarar för utförandet av de avtalsförpliktelser som utförs av underleverantörer såsom om de hade utförts av Geins själv. **4.6** I den mån Tredjepartsprodukter ingår i Tjänsterna, ska produktleverantörens villkor gälla för licens och nyttjande, felrättning och ansvar samt immateriella rättigheter i stället för vad som anges i Avtalet. Vad gäller ansvar för fel och immaterialrättsligt intrång, är Geins's ansvar vidare begränsat till att Geins ska anmäla felet till produktleverantören och installera av produktleverantören tillhandahållen lösning om det inte innebär att Tjänsterna påverkas negativt. Geins äger även rätt att utnyttja ändringsrätten enligt punkt 7 nedan. Därutöver har Geins inte något ansvar för Tredjepartsprodukt. **4.7** Geins ska vidare tillhandahålla supporttjänster i enlighet med ”Bilaga 2 Support” ### 5. Kundens skyldigheter **5.1** Kunden åtar sig att vid användning av Tjänsterna: - (i) nyttja Tjänsterna i enlighet med tillämplig lag och god branschpraxis; - (ii) inte sprida information eller försäljning av produkter och tjänster som skäligen kan bedömas vara olagliga eller som sker i syfte att begå brott, att uppmana, möjliggöra eller underlätta för annan att begå brott; - (iii) inte begå annat handlande som medför att avsevärd olägenhet uppstår för Geins, Geins's system, tillhandahållandet av Tjänsterna eller Geins's övriga kunder; - (iv) sprida eller publicera immaterialrättsligt skyddat material utan tillstånd från berörda rättighetshavare; - (v) ha tillgång till sådan programvara och utrustning vilken skriftligen har anvisats av Geins; - (vi) ha tillgång till vid var tid fungerande kommunikationstjänster vilka skriftligen har anvisats av Geins; - (vii) vidta de eventuella åtgärder som är Kundens ansvar enligt Avtalet i övrigt; - (viii) tillse att Kundens Data som matas in i Geins's system är i överenskommet format samt inte behäftade med virus eller på annat sätt kan skada eller inverka negativt på Geins's system eller Tjänsterna; - (ix) omgående lämna sådan information och/eller dokumentation med anledning av Tjänsterna som Geins särskilt efterfrågar; - (x) följa av Geins vid var tid lämnade instruktioner för Tjänsternas användande; och - (xi) bistå Geins med rimlig assistans samt i övrigt vidta sådana åtgärder som rimligen kan krävas för att Geins ska kunna fullgöra sina skyldigheter enligt Avtalet. **5.2** De inloggningsuppgifter som Kunden använder för att bereda sig tillgång till Tjänsterna i enlighet med punkten 6 nedan ska förvaltas av Kunden med sekretess i enlighet med vad som framgår av punkt 16 nedan. Kunden åtar sig att om en anställning upphör för en person som innehar inloggningsuppgifter inaktivera dessa konton och omöjliggöra inloggning i Tjänsterna för sådan person. Kunden åtar sig vidare att meddela Geins om någon har eller kan befaras ha fått obehörig tillgång till inloggningsuppgifter eller andra anvisningar. Kunden ansvarar för sina användares användning av Tjänsterna. **5.3** Kunden är införstådd med att Tjänsterna endast får användas för lagliga ändamål och Kunden åtar sig att hålla Geins skadeslös avseende samtliga krav från tredje man som riktas mot Geins med anledning av Kundens användning av Tjänsterna i strid med denna bestämmelse, innefattande men inte begränsat till anspråk avseende intrång i tredje parts immateriella rättigheter. **5.4** Kunden åtar sig att använda Tjänsterna på ett sätt som inte överbelastar Geins’s system eller Tjänsterna. Kunden får särskilt inte: - (i) initiera en sådan mängd API-anrop att Geins’s system eller Tjänsterna överbelastas eller störs; - (ii) använda automatiserade system eller script som skickar fler förfrågningar till Geins’s API än vad som rimligen kan anses vara normalt vid sedvanlig användning; - (iii) på annat sätt agera på ett sätt som kan försämra Geins’s Tjänsters prestanda eller tillgänglighet för andra användare. - (iii) på annat sätt agera på ett sätt som kan försämra Geins’s Tjänsters prestanda eller tillgänglighet för andra användare. - (iv) använda API\:er på ett sätt som inte är förenligt med deras avsedda syfte, exempelvis genom att använda Management API i en publik webbshop. Vid brott mot denna punkt 5.4 förbehåller sig Geins rätten att vidta åtgärder såsom att begränsa, tillfälligt stänga av eller säga upp Kundens tillgång till Tjänsterna. Geins ska om möjligt meddela Kunden innan sådan åtgärd vidtas. Vidare ska Kunden, om överbelastningen innebär att Geins behöver vidta åtgärder utanför ordinarie kontorstid, ersätta Geins enligt priset för ett serviceärende till Beredskap i enlighet med ”Bilaga 2 Support” ### 6. Uppstart av Tjänsterna Geins ska tillhandahålla Kunden Tjänsterna från och med Startdagen, vilket sker genom att Geins först sätter upp Tjänsterna för Kunden; därefter erhåller Kunden login-uppgifter från Geins varvid Tjänsterna kan börja användas. Startdagen inträder således när Geins gjort det möjligt för Kunden att logga in på Tjänsterna och tillhandahållit eventuella anvisningar för åtkomst av Tjänsterna. Om Tilläggstjänster beställs i samband med Bastjänsten ska Tilläggstjänsterna göras tillgängliga från Startdagen men om Tilläggstjänster beställs vid ett annat tillfälle görs dessa tillgängliga vid den tidpunkt som Parterna överenskommit om. ### 7. Ändringar och tillägg Geins äger rätt att utan föregående meddelande till Kunden genomföra ändringar av Bastjänsten, Tilläggstjänsterna och hur Tjänsterna tillhandahålls. Om sådan ändring innebär olägenhet för Kunden, ska Geins meddela Kunden om förändringen senast tre (3) månader före ändringens ikraftträdande. Kunden äger rätt att säga upp Avtalet till upphörande om ändringen innebär väsentlig olägenhet för Kunden. Sådan uppsägning ska meddelas med 30 dagars varsel och upphörandet ska ske per den dag som anges i uppsägningen, vilken dag ska vara tidigast vid ikraftträdandet av ändringen och senast tre (3) månader därefter. ### 8. Pris och betalningsvillkor **8.1** Kunden ska betala det pris som gäller enligt Geins's vid var tid gällande prislista för tillhandahållande av Tjänsterna. **8.2** Kunden ska betala för Tjänsterna från och med Avtalsdagen. Betalningsvillkoren anges i Avtalet. Olika betalningsvillkor kan vara tillämpliga för olika Tjänster. Betalning för Tjänsterna ska erläggas i förskott innan Startdagen. **8.3** För betalning som erläggs enligt faktura gäller 20 dagars betalningstid. **8.4** Vid dröjsmål med betalningen är Geins berättigad till dröjsmålsränta med 24 procentenheter över vid var tid gällande referensränta samt påminnelseavgift och inkassokostnad enligt lag. **8.5** Om Kunden helt eller delvis dröjer med betalning mer än 5 dagar efter det att Geins tillställt Kunden påminnelse, har Geins rätt att med omedelbar verkan stänga av Tjänsten och säga upp Avtalet till omedelbart upphörande. Om sådan uppsägning sker äger Geins också rätt att debitera avgifter för återstående avtalstid. **8.6** Priserna är angivna exklusive mervärdesskatt, skatter och andra avgifter. **8.7** Kunden ska snarast reklamera fel i faktura. Om inte Kunden reklamerat fakturan inom åtta (8) dagar från fakturadatum ska Kunden anses ha godkänt fakturan. **8.8** Om det under avtalstiden genomförs lagändringar, myndighetsbeslut, beslut om ändring eller införande av skatter eller offentliga avgifter, eller om offentlig rättstillämpning i övrigt påverkar leveransen av Tjänsterna, äger Geins rätt att höja avgiften för Tjänsterna i syfte att täcka Geins's ökade kostnader. **8.9** Om Geins förorsakats merarbete eller merkostnad på grund av omständighet som Kunden ansvarar för, har Geins rätt till ersättning för sådana kostnader enligt Geins's vid var tid gällande prislista. **8.10** Geins äger rätt att justera priset för en Tilläggstjänst när prenumerationen för en sådan Tjänst förnyas. Geins ska meddela Kunden om prisjusteringen minst trettio (30) dagar före prishöjningen träder i kraft. Uppsägning av prenumerationer regleras i punkt 3.1. ### 9. Support och underhåll **9.1** Kunden är medveten om att Tjänsterna från tid till annan kan komma att göras otillgängliga med anledning av, planerade och eller oplanerade, driftsstopp för nödvändig service och underhåll av Tjänsterna och eller Geins's system. **9.2** För det fall inget annat särskilt överenskommits avseende planerade driftstopp åtar sig Geins att meddela Kunden inom skälig tid före ett planerat driftstopp av Tjänsterna och Geins's system. **9.3** Geins ska vidta skäliga ansträngningar för att minimera tiden för driftstopp av Tjänsterna och eller Geins's system samt de eventuella störningar som detta medför för Kundens verksamhet. **9.4** Support tillhandahålls i enlighet med **Bilaga - Support**. 10. Ansvar för fel och dröjsmål **10.1** Bastjänsten ska tillhandahållas i enlighet med Servicenivån i Bilaga 1 - Servicenivå. **10.2** För den händelse fel föreligger i Tjänsterna som Geins ansvarar för och som inte omfattas av Servicenivån, åtar sig Geins att med den skyndsamhet omständigheterna kräver med hänsyn till felets art och omständigheterna i övrigt på egen bekostnad avhjälpa felet. **10.3** Geins's skyldigheter enligt denna punkt gäller endast under förutsättning att Kunden har levt upp till de samtliga åtaganden som anges i punkten 10.2 ovan. Vidare är Geins inte ansvarig för bristande uppfyllelse av avtalade krav om bristen direkt eller indirekt förorsakas av: - (i) Kunden eller omständighet för vilken Kunden ansvarar; - (ii) omständighet utanför Geins's ansvarsområde för Tjänsterna som exempelvis avbrott i kommunikationstjänst eller andra produkter eller tjänster från tredje man som Geins uttryckligen inte tagit ansvar för; - (iii) omständighet som är hänförligt till Tredjepartsprodukt; - (iv) planerade uppehåll i Tjänsterna med anledning av underhåll och service av Tjänsterna och eller Geins's system; - (v) omständighet som Geins inte skäligen kunnat undvika, innefattande men inte begränsat till, force majeure-omständighet enligt punkt 17 nedan och virus, överbelastningsattacker, domänstörningar eller andra utifrån kommande angrepp; - (vi) att Kundens hemsida belastas med mycket hög datatrafik; - (vii) avbrott eller förändring i Tjänsterna som görs av Geins på grund av risk för att tillhandahållandet av Tjänsterna orsakar skada som är mer än ringa för Kunden, annan kund till Tjänsterna eller Geins; - (viii) virus eller annat angrepp på säkerheten under förutsättning att Geins vidtagit skyddsåtgärder enligt avtalade krav eller om sådana saknas, vidtagit skyddsåtgärder på ett fackmannamässigt sätt; eller - (ix) att Kunden begränsats åtkomst till Tjänsterna med stöd av Avtalet. **10.4** Geins's ansvar enligt denna punkt 10 gäller endast under förutsättning att: - (i) felet i Tjänsterna reklameras till Geins av Kunden inom trettio (30) dagar efter det att Kunden upptäckt eller bort upptäcka felet; samt - (ii) Kunden tillhandahåller Geins de data som är nödvändiga för Geins's analys av felet. **10.5** Denna punkt 10 utgör Geins's enda ansvar med anledning av fel och dröjsmål i Tjänsterna. **10.6** Om Kunden (eller Kundens samarbetspartners, underleverantörer, leverantörer eller andra som Kunden anlitar och ansvarar för) orsakar eller önskar att Startdatumet skjuts framåt i tiden (”**Försening**”), måste Kunden meddela Geins om Förseningen senast 30 dagar innan Startdagen. Om Kunden meddelar Geins om Förseningen först efter 30 dagar innan den planerade Startdagen är Kunden skyldig att ersätta Geins för samtliga kostnader (inklusive men ej begränsat till personalkostnader) som Förseningen orsakar. ### 11. Immateriella rättigheter **11.1** Geins, och/eller Geins's licensgivare, innehar samtliga rättigheter, inklusive immateriella rättigheter, till Tjänsterna och däri ingående programvara, innefattande men inte begränsat till patent, upphovsrätt, mönsterskydd och varumärken. Inget i Avtalet ska tolkas som att ovan nämnda rättigheter, eller del därav, överlåtes till Kunden. **11.2** Kunden och/eller Kundens licensgivare, innehar samtliga rättigheter, inklusive immateriella rättigheter, till Kundens Data och övrigt material som Kunden publicerar på sin hemsida med stöd av Tjänsterna innefattande men inte begränsat till upphovsrätt, mönsterskydd och varumärken. Inget i Avtalet ska tolkas som att ovan nämnda rättigheter, eller del därav, överlåtes till Geins. **11.3** Utan beaktande av vad som anges i denna punkt 11 ska Geins ha rätt att använda Kundens namn och varumärke/logotyp i marknadsföringssyfte utan att på förhand erhålla Kundens samtycke. Kunden har dock rätt att återkalla denna rätt genom skriftligt meddelande till Geins. Vidare ska Geins ha rätt att utan att särskild ersättning erläggs placera Geins's logotyp samt länk till Geins's hemsida på Kundens hemsida/hemsidor. **11.4** Geins åtar sig att, med de begränsningar som anges nedan, hålla Kunden skadeslös avseende krav från tredje part som grundas på att Kundens användning av Tjänsterna, eller del därav, i Sverige och i andra mellan Parterna skriftligen överenskomna länder, utgör intrång i sådan tredje parts immateriella rättigheter. Geins's ansvar enligt denna punkt 11 förutsätter dock att Kunden har använt Tjänsterna i enlighet med samtliga villkor i Avtalet. **11.5** Geins's skyldighet enligt denna punkt 11 gäller endast under förutsättning att: - (i) Kunden utan dröjsmål skriftligen underrättar Geins om de intrångskrav som har riktats mot Kunden; - (ii) Geins ges rätt att besluta hur processen ska bedrivas och ensam ges rätt att besluta i alla förlikningsförhandlingar; och - (iii) Kunden agerar i enlighet med Geins's instruktioner och ger Geins den skäliga assistans som Geins begär. **11.6** Förutsatt att samtliga förutsättningar enligt punkterna 11.4-11.5 är uppfyllda, åtar sig Geins att ersätta Kunden för sådana belopp som Kunden tvingas utge med anledning av lagakraftvunnen dom eller på grund av Geins skriftligen godkänd förlikning. **11.7** Om intrång i tredje parts immateriella rättigheter slutligen visar sig föreligga ska Geins efter eget val: - (i) tillförsäkra Kunden en fortsatt rätt att använda Tjänsterna; - (ii) ändra Tjänsterna så att intrång inte längre föreligger; - (iii) ersätta Tjänsterna, eller del därav, med annan motsvarande tjänst vilken inte begår intrång; eller - (iv) avsluta Tjänsterna och, med avdrag för Kundens skäliga nytta, återbetala av Kunden erlagd avgift för Tjänsterna, utan ränta. Denna punkt 11 utgör Geins's enda ansvar gentemot Kunden med anledning av intrång i tredje parts immateriella rättigheter ### 12. Personuppgifter **12.1** Avseende behandling av personuppgifter i Tjänsterna gäller vad som anges i det mellan parterna ingångna personuppgiftsbiträdesavtalet. **12.2** Geins har rätt till skälig ersättning med anledning av åtgärder som följer av Geins's åligganden enligt gällande personuppgiftsbiträdesavtal. ### 13. Kundens Data **13.1** Kunden innehar samtliga rättigheter till Kundens Data och Geins erhåller inga rättigheter till Kundens Data, eller del därav, under Avtalet. Geins äger rätt att under avtalstiden använda Kundens Data för att leverera Tjänsterna till Kunden. Geins äger även rätt att under avtalstiden och därefter använda Kundens Data i aggregerad form utan att det går att särskilja särskild information, för ändamålen statistik och produktutveckling. **13.2** Om inget annat framgår av Avtalet har Geins rätt till ersättning för arbete med att överföra data till Kunden under avtalstiden i enlighet med Geins's vid tidpunkten för överföringen tillämpliga prislista för motsvarande tjänster. ### 14. Ansvar **14.1** Geins ansvarar med nedan angivna begränsningar för skada som Geins orsakat Kunden genom försummelse vid utförandet av Tjänsterna. Geins ansvarar inte för skada förorsakad av Tredjepartsprodukt. **14.2** Geins ansvarar inte under några omständigheter för indirekt förlust, inkluderande men inte begränsat till Kundens uteblivna vinst, intäkt, besparing eller goodwill, förlust på grund av driftavbrott, förlust av data, Kundens eventuella ersättningsskyldighet gentemot tredje man eller annan indirekt skada eller följdskada av vad slag det vara må. **14.3** Geins är inte under några omständigheter ansvarigt för skador som uppkommer på grund av buggar, överbelastningsattacker, virus, felinmatningar eller liknande fel, var sig de härstammar från Geins produkter och Tjänster eller Tredjepartsprodukter. **14.4** Geins's sammanlagda och totala ansvar under Avtalet avseende en eller flera händelser (oavsett om dessa har samband med varandra eller inte) ska inte i något fall överstiga ett belopp motsvarande de avgifter Kunden erlagt för Bastjänsterna under den tremånadersperiod som föregått den skadegrundande händelsen. **14.5** Denna punkt 14 är inte tillämplig i förhållande till Geins's ansvar för intrång i immateriella rättigheter enligt punkt 11 eller om Geins har varit grovt oaktsam eller agerat uppsåtligen. **14.6** Kunden ska, för att inte förlora sin rätt, framställa skadeståndsanspråk senast tre (3) månader efter det att Kunden märkt eller borde ha märkt grunden för kravet, dock senast sex (6) månader från det att skadan uppstod. ### 15. Rättighetsklarering Part som tillhandahåller material, svarar för att erforderliga rättigheter för aktuellt nyttjande har inhämtats från rättighetshavaren. ### 16. Sekretess **16.1** Vardera parten förbinder sig att inte till tredje man utan motpartens skriftliga medgivande utlämna sådana uppgifter om motpartens verksamhet som kan vara att betrakta som affärs- eller yrkeshemlighet eller som enligt lag omfattas av sekretesskyldighet (”Konfidentiell Information”). Information som parten angivit vara konfidentiell, samt Geins's prisinformation, ska till förtydligande alltid anses utgöra Konfidentiell Information. Parts åtagande om sekretess enligt denna punkt 16 gäller inte sådan Konfidentiell Information som: - (i) vid mottagandet redan var känd för mottagande part; - (ii) är eller blivit allmänt tillgänglig eller känd utan att mottagande part har brutit mot detta sekretessåtagande; - (iii) mottagande part på behörigt sätt erhållit från en tredje part som inte är bunden av sekretessåtagande i förhållande till motparten; eller - (iv) det åligger mottagande part att göra allmänt tillgängligt genom domstolsutslag, myndighetsbeslut eller i övrigt enligt föreskrift i lag eller tvingande börsregler. **16.2** Part ansvarar för sina respektive anställdas och konsulters iakttagande av häri angivna bestämmelser och ska genom sekretessförbindelse med dessa eller andra lämpliga åtgärder tillse att Avtalets sekretess iakttas och brott mot sekretessen av sådana representanter ska anses vara ett avtalsbrott begånget av den part som delade informationen med en sådan representant. **16.3** Parts sekretesskyldighet enligt Avtalet gäller under avtalstiden samt även för en period om fem (5) år efter det att Avtalet har upphört att gälla. ### 17. Force majeure Om Avtalets fullgörande helt eller delvis förhindras, eller i väsentlig grad försvåras, av omständighet som ligger utanför parts skäliga kontroll eller av arbetskonflikt ska part befrias från underlåtenhet att fullgöra viss förpliktelse enligt detta Avtal under den tid som hindret föreligger, förutsatt att Part som inte kan fullgöra utan oskäligt uppehåll meddelar den andra parten därom. Detsamma ska gälla vid fel eller försening i tjänst eller leverans från underleverantör på grund av omständigheter som faller under denna punkt. Om Avtalets fullgörelse förhindras mer än sex (6) månader äger part säga upp Avtalet. Geins har vid sådan uppsägning rätt till ersättning enligt Avtalet för utfört arbete och styrkt nödvändig kostnad. ### 18. Avtalstid Prenumerationstiden för Bastjänsten är två år där prenumerationstiden förlängs med två år i taget om inte uppsägning skett med tre månaders uppsägningstid dessförinnan. Avtalet träder i kraft i enlighet med vad som anges i punkt 1.2 där även giltighetstiden regleras. Uppsägning ska ske skriftligen enligt punkt 21 nedan. ### 19. Förtida uppsägning **19.1** Part har rätt att, genom skriftligt meddelande till motparten, säga upp Avtalet till upphörande med omedelbar verkan eller till det datum som uppsägande part anger om: - (i) den andra parten i väsentligt avseende åsidosätter sina skyldigheter enligt Avtalet och inte vidtager full rättelse inom trettio (30) dagar efter skriftlig anmodan därom; eller - (ii) den andra parten försätts i konkurs, träder i likvidation, ställer in sina betalningar eller på annat sätt skäligen kan antas ha kommit på obestånd; eller - (iii) om den andra parten blir föremål för företagsrekonstruktion, dock med sådan tvingande inskränkning som följer av lag. **19.2** Kunden är vid uppsägning av Avtalet enligt ovan inte berättigad att återfå någon överskjutande del av i förskott erlagd ersättning eller eventuella övriga kostnader avseende tid efter Avtalets upphörande. **19.3** Om Kunden helt eller delvis dröjer med betalning mer än 5 arbetsdagar efter det att Geins tillställt Kunden påminnelse, har Geins rätt att med omedelbar verkan, efter eget gottfinnande, permanent eller tillfälligt stänga av Tjänsterna samt spärra Kundens inloggning till Tjänsterna och/eller säga upp Avtalet till omedelbart upphörande. Om sådan uppsägning av Avtalet sker äger Geins också rätt att debitera samtliga avgifter för Tjänsterna för återstående avtalstid samt, för tydlighets skull, även under den tid om Tjänsterna tillfälligt är avstängd eller inloggningsuppgifterna är spärrade. ### 20. Avveckling **20.1** Geins kommer vid Avtalets avslut destruera eller anonymisera Kundens Data. Kunden ansvarar själv för att ha kopierat ut Kundens Data innan destruering. **20.2** Geins ska äga rätt till ersättning för det arbete som Geins utför enligt punkt 20.1 ovan, i enlighet med Geins's vid tidpunkten för överföringen tillämpliga prislista för motsvarande tjänster. ### 21. Meddelanden **21.1** Uppsägning eller andra meddelanden ska ske genom bud, rekommenderat brev eller elektroniskt meddelande till parterna vid nyttjande av de kontaktuppgifter som anges häri eller som Kunden har meddelat i samband med accepterandet av Användarvillkoren eller senare genom skriftligt meddelande till motpartens ändrade adress. **21.2** Vid frågor om Tjänsterna, klagomål eller meddelanden till Geins, kan Geins kontaktas via Ärenderegistrering i Merchant Center. **21.3** Meddelandet ska anses ha kommit mottagaren tillhanda: - (i) om avlämnat med bud: vid avlämnandet; - (ii) om avsänt med rekommenderat brev: två (2) dagar efter avlämnandet för postbefordran; - (iii) om avsänt som e-mejl: vid mottagandet då e-mejl anlänt till mottagarens e-mejladress. - (iv) om avsänt som ärende i Merchant Center: vid mottagandet då ärende anlänt till Geins. **21.4** Kunden accepterar att ta emot information om ändringar eller uppdateringar i produkt-/tjänstvillkor, funktionalitet, funktioner eller kontoinformation; detta inkluderar även garantier, återkallelse, säkerhet, systemstatus eller säkerhetsinformation om Tjänsterna eller Tilläggstjänster, via samtliga e-mejl adresser registrerade som administratörer i Merchant Center. ### 22. Övrigt **22.1** I händelse av motstridiga villkor mellan dessa Användarvillkor och Avtalets övriga dokument, ska de övriga dokumenten äga företräde om inte annat uttryckligen har angetts i Avtalet. **22.2** Avtalet utgör parternas fullständiga reglering av alla frågor som Avtalet berör. Alla skriftliga eller muntliga åtaganden och utfästelser som föregått Avtalet ersätts av innehållet i Avtalet. **22.3** Geins ska ha rätt att med en (1) månads föregående notis ändra Avtalet. Om ändringen innebär en väsentlig nackdel för Kunden och Kunden inte godtar en sådan ändring, äger Kunden rätt att inom en (1) månad från det att denne mottagit meddelandet, säga upp Avtalet med verkan det datum ändringen annars skulle ha trätt Kunden rätt till återbetalning av de avgifter som har erlagts för den period som inte kan utnyttjas på grund av uppsägningen. Vid sådan uppsägning av Kunden kan Geins dock välja att i stället tillämpa tidigare gällande allmänna villkor vid vilket Kundens uppsägning ska vara utan verkan. **22.4** Avtalet får inte överlåtas till en tredje part utan den andra partens föregående skriftliga samtycke. Med undantag av vad som framgår ovan äger Geins dock rätt att överlåta Avtalet till en tredje part om det sker i samband med överlåtelse av Geins's verksamhet eller del därav samt till bolag inom samma koncern som Geins. Geins äger vidare rätt att överlåta sin rätt till betalning till tredje part. ### 23. Tillämplig lag och tvister **23.1** Tvist rörande tolkning och eller tillämpning av Avtalet ska avgöras enligt svensk lag med undantag för internationella privaträttsliga regler. **23.2** Tvist ska avgöras av Stockholms tingsrätt. **23.3** Geins ska utan hinder av punkt 23.2 ovan efter eget val ha rätt att vända sig till allmän domstol eller kronofogdemyndighet för utfående av förfallen fordran avseende ersättning mot vilken den andra parten inte framställt skriftlig anmärkning inom sju (7) dagar från förfallodagen för aktuell fordran. ![image](https://geins.io/../../img/merchantcenter/frame-507_46815259.jpg) ### 1. Översikt Detta är en bilaga till Användarvillkoren och utgör en integrerad del av Avtalet. Vid motstridighet mellan denna bilaga och Användarvillkoren ska Användarvillkoren ha företräde. Alla definitioner ska ha samma betydelse i denna bilaga som i Användarvillkoren om inte annat anges. Tidzon som används är (GMT+01:00) Stockholm. ### 2. Kundens ansvar Kunden ansvarar enligt Avtalet för att utnyttja Geins's resurser enligt god praxis. Detta inkluderar, men begränsar sig inte till: - Att till Geins skyndsamt meddela eventuella brister i Tjänsterna som kommer Kunden till kännedom. - Att Kunden använder sig av ett CDN framför alla publika applikationer som nyttjar Geins API\:er och/eller data som serveras från Geins. - Att inte överutnyttja Tjänsterna, till exempel genom att använda automatiserade upp och nedladdningsfunktioner. - Att inte försöka få olovlig tillgång till resurser inom Tjänsterna (”hacking”). - Att hantera inloggningsuppgifter och annan viktig information med hög säkerhet. ### 3. Avisering om driftstopp - Planerade driftsstopp aviseras via av kunden angiven e-post. - Oplanerat driftsstopp aviseras via av kunden angiven e-post. ### 4. Tillgänglighet Bastjänsten är, om inte annat stipuleras i Avtalet, garanterat tillgänglig dygnet runt, 7 dagar i veckan med följande undantag: - Ett servicefönster för Merchant Center varje vecka, tisdagar mellan 04.00 – 06.00. - Planerade driftsstopp under kontorstid, helgfri måndag till fredag, kl. 07.00 - 21.00 som meddelas minst en vecka i förväg. - Planerade driftsstopp efter kontorstid, kl. 21.00 - 08.00 helgfri måndag till fredag samt helger som annonserats minst ett dygn i förväg. Bastjänsten räknas som tillgänglig om det inte föreligger några kritiska serviceärenden. ### 5. Servicenivå Geins strävar efter bästa möjliga servicenivå. | Column | Description | | ------------ | ------------------------------------------------------------------------------------------------------ | | **Mätvärde** | \*\* Utmärkt\*\* \*\* Bra\*\* \*\* Dåligt\*\*Tillgänglighet inom mätt tid, se avsnitt 4 Tillgänglighet | > 99,8% | > 99% | Ärendehantering, antal ärenden som ska ha besvarats inom sin responstid kritisk >99% hög >99% medel >90% kritisk >95% hög >95% medel >70% kritisk >95% hög >90% medel >70% Dessa värden mäts på månadsbasis. Ett utmärkt resultat innebär att inga förbättringar behöver göras. Ett bra resultat innebär att det finns utrymme för förbättringar. Ett dåligt resultat innebär att förbättringar måste ske till nästa månad. ![image](https://geins.io/../../img/merchantcenter/Support_E4653EE1.jpg) ### Serviceärenden Serviceärenden som gäller Bastjänsterna delas in i fem prioritetsgrader. | Column | Description | | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | \*\* Prioritet\*\* | \*\* Effekt\*\* \*\* Exempel\*\* | | Kritisk | Bastjänsten är otillgänglig eller avgörande felaktig för samtliga. Användare kan inte logga in. Kommer inte åt Bastjänsternas sida. | | Hög | - Funktioner i Bastjänsterna är otillgängliga eller avgörande felaktiga för mer än 5% av användarna. - Bastjänsternas funktion är otillgänglig eller avgörande felaktig för samtliga användare, men workaround finns beskriven. - Funktioner i Bastjänsternas är otillgängliga eller avgörande felaktiga för samtliga användare. - Användare kommer inte åt Vissa funktioner. - Importer av data är ur funktion. - Användare kan inte skapa rapporter. | | Medel | - Funktioner i Bastjänsterna är otillgängliga eller avgörande felaktiga för enstaka användare Eller - Funktioner i Bastjänsterna är otillgängliga eller avgörande felaktiga för samtliga användare, men workaround finns beskriven. Eller - Funktioner i Bastjänsterna är otillgängliga eller avgörande felaktiga för mer än 5% av användarna Eller - Funktioner i Bastjänsterna är felaktiga, men inte avgörande felaktiga. - Bastjänsterna visar fel rapport. - \*\* \*\* Felmeddelande visas, men funktioner fungerar som de ska. | | Låg | Funktioner i Bastjänsterna är otillgängliga eller felaktiga för enstaka användare. | | Fråga | Begära nya funktioner. Fråga hur en funktion fungerar. Begära hjälp med inställningar import av data, etc | Geins hanterar inkomna serviceärenden som har kommit tillhanda via Ärenderegistrering i Merchant Center. Efter kontorstid har Kunden tillgång till Beredskap. Varje enskilt serviceärende till Beredskap debiteras en startkostnad på 4150 kronor, samt 2150 kronor per påbörjad timme, med en minimidebitering på 1 timme (minimikostnad av 6300 kronor per serviceärende). För tydlighets skull, även eventuella frågor eller support via Beredskap räknas som ett serviceärende. **Kostnadsfria åtgärder** - Åtgärder vilka kategoriserats som "Prioritet Kritisk" samt är 1. orsakade av Geins och 2. faller inom ramen för Geins kontroll, är kostnadsfria. **Icke kostnadsfria åtgärder** - Åtgärder vilka kategoriserats som "Prioritet Kritisk", och som inte är kostnadsfria, inkluderar bland annat serviceärenden där; - Fel orsakat av Kunden själv. - Fel som ligger utanför de API\:er som Geins tillhandahåller. - Fel orsakat av externa tjänster eller 3\:e partstjänster. - Fel som ej ligger inom ramen för Geins's ansvar. - Driftstörningar orsakade av överbelastning på grund av högt besökarantal, hackerattacker, virusattacker, DDOS attacker, randsomware, eller liknande driftstörningar som ligger utanför Geins's kontroll. - Samtliga Serviceärenden som är av ”Prioritet Hög” eller lägre. Efter att ett ärende har prioriterats av Geins gäller följande beroende på prioritetsnivå. Observera att åtgärdstidsambitionen är just en ambition och inte en garanti. Ärendets komplexitetsgrad gör att det är svårt att förutse hur lång tid det tar att åtgärda. | Column | Description | | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | \*\* Prioritet \*\* | \*\* Responstid\*\* **Åtgärdstid** | | Kritisk | Påbörjas inom 1 timme, 24/7 Åtgärdas inom 4 timmar. Nytt e-post till samtliga användare med statusuppdatering var 4\:e timme. När ärendet är avslutat skickas ett nytt e-post. | | Hög | E-post till den som rapporterat ärendet och samtliga användare inom 4 timmar, helgfri dagar måndag till fredag 9-17. Tidzon (GMT+01:00) Stockholm. Åtgärdas inom 2 arbetsdagar. Nytt e-post till samtliga användare med statusuppdatering dagligen. När ärendet är avslutat skickas ett nytt e-post | | Medel | E-post till den som rapporterat ärendet inom 24 timmar, helgfri dagar måndag till fredag 9-17. Tidzon (GMT+01:00) Stockholm. Åtgärdas inom 5 arbetsdagar. Nytt e-post till den som rapporterat ärendet när ärendet är avslutat skickas ett nytt e-post. | | Låg | E-post till den som rapporterat ärendet inom 48 timmar, helgfri dagar måndag till fredag 9-17. Tidzon (GMT+01:00) Stockholm. Åtgärdas beroende på svårighetsgrad och prioritet. | | Fråga | E-post till den som rapporterat ärendet inom 48 timmar, helgfri dagar måndag till fredag 9-17. Tidzon (GMT+01:00) Stockholm. Åtgärdas beroende på svårighetsgrad och prioritet. | Geins kan prioritera om ett serviceärende i efterhand som ny information tillkommer. Samtliga som tidigare har kommunicerats med samt de som berörs efter omprioriteringen kommer då att upplysas om detta via ärendesystemet eller via e-post. # Import parameters ## Key features - Apply parameters and parameter values to products via import - Requires parameter groups and their parameters to be created first ## Quick guide 1. Go to the **Import Tool** in the menu and click **New**. 2. In the **Template type** dropdown, select **Product Parameters**. 3. Click **Download file template**. --- This requires that you have created parameter groups and their parameters beforehand. See [Create parameters and parameter groups](https://geins.io/docs/merchant-center/products/product-parameters/create-parameters-and-parameter-groups). Download the import template by going to the **Import Tool** in the menu, clicking **New**, choosing **Product Parameters** in the Template type dropdown, and clicking **Download file template**. ![image](https://geins.io/../../img/merchantcenter/10207878938396_FC153828.jpeg) A description of the columns follows. There is also a short description in Merchant Center under **View template description**. | Column | Description | | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **ProductId** | Id of the product to import the parameters to. | | **ProductName** | The product's name. Mandatory if the Id is not filled in. Can be left empty if there is an Id. | | **ParameterGroup** | Name of the parameter group, as set in the **Group Name** field on the parameter group. | | **ParameterName** | Name of the parameter (the field name on a parameter). | | **Value** | The value you want the product to have for its parameter. Must match an existing value if the parameter is a picker or multi-picker type. If the value includes a decimal, separate it with a point, for example 2.2 (not 2,2). | Once you click **Next**, match the columns to each field. In this example, the column **Namn** needs to be dragged to **name**. ![image](https://geins.io/../../img/merchantcenter/10208182357148_D1914526.png) When you have matched all the columns, click **Start import**. Your products are then enriched with parameters. Repeat the process to add the next parameter. When the import is finished, you get a summary. If all products were imported correctly, it says **Inserted** or **Updated**. If something went wrong, it shows how many products were **Ignored** or **Failed**. ![image](https://geins.io/../../img/merchantcenter/10219317892508_130E9D7D.png) ::tip Rule of thumb: if you are importing many parameters to products at once, always start with one product to confirm everything lands in the right place. :: # Import template for categories ## Key features - Create or update categories via import - Set parent category, language, active state, and meta fields ## Quick guide 1. Go to the **Import Tool** in the menu and click **New**. 2. In the **Template type** dropdown, select **Category**. 3. Click **Download file template**. --- Download the import template by going to the **Import Tool** in the menu, clicking **New**, choosing **Category** in the Template type dropdown, and clicking **Download file template**. ![image](https://geins.io/../../img/merchantcenter/import_template_cat_44122051.jpg) A description of the columns follows. There is also a short description in Merchant Center under **View template description**. | Column | Description | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Id** | The category's Id in the system. If set to 0, a new category is created. If empty, an existing category is updated when a match is found on the name, otherwise a new one is created. | | **Name** | Name of the category. Mandatory. Include the name if the category exists: if the Id is present but the Name is left empty, the existing name is cleared. | | **Description** | The category's description. Applies to the Description 1 field on the category. | | **ParentId** | Id of the parent category. If filled in, the category is placed as a sub-category. If empty, it is imported at the highest level. | | **Parent** | Name of the parent category. If filled in, the category is placed as a sub-category. If empty, it is imported at the highest level. | | **Language Id** | Language Id (default 1, Swedish). Used in translations. | | **Active** | Whether the category is active. 1 for active, 0 for inactive (default 1, active). If left empty, set as active. | | **MetaTitle** | Meta title for the category. | | **MetaDescription** | Meta description for the category. | | **MetaKeywords** | Meta keywords for the category. | # Import template for GoogleTaxonomy ## Key features - Map your categories to Google Taxonomy categories via import - View or change the mapping per category afterward ## Quick guide 1. Go to the **Import Tool** in the menu and click **New**. 2. In the **Template type** dropdown, select **Google Product Taxonomy**. 3. Click **Download file template**. --- Google Taxonomy lists the categories Google uses to help distribute products into departments in a shopping flow. Download the import template by going to the **Import Tool** in the menu, clicking **New**, choosing **Google Product Taxonomy** in the Template type dropdown, and clicking **Download file template**. ![image](https://geins.io/../../img/merchantcenter/import_template_google_5D93F274.jpg) Here is a link to the [Google taxonomy list](https://www.google.com/basepages/producttype/taxonomy-with-ids.en-US.txt){rel="nofollow"}. A description of the columns follows. There is also a short description in Merchant Center under **View template description**. | Column | Description | | -------------------- | -------------------------------------------------- | | **Id** | The category's Id in the system. | | **GoogleTaxonomyId** | Id of the Google taxonomy category to map against. | When the import is done, you can view or change which Google category a category maps against in the **Google category** box on the category. ![image](https://geins.io/../../img/merchantcenter/category_googteax_CAE57B9E.jpg) # Import template for pictures ## Key features - Import product pictures to existing products via URL - Control the order of pictures, including which becomes the main picture ## Quick guide 1. Go to the **Import Tool** in the menu and click **New**. 2. In the **Template Type** dropdown, select **Product Images**. 3. Click **Download file template**. --- This requires that the pictures you want to import are available via a URL. Download the import template by going to the **Import Tool** in the menu, clicking **New**, choosing **Product Images** in the Template Type dropdown, and clicking **Download file template**. ![image](https://geins.io/../../img/merchantcenter/import_template_img_B34D0BA5.jpg) A description of the columns follows. There is also a short description in Merchant Center under **View template description**. | Column | Description | | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Id** | Id of the product to import the pictures to. | | **Name** | The product's name. Mandatory if the Id is not filled in. Can be left empty if the Id is there. | | **ImageUrl** | Link to the picture to import. The complete URL must be included. | | **ImageOrder** | Placement order of pictures. **0** or **blank** = the picture is added last. **1** = the picture becomes the main picture, shown in product listings. **>1** = the picture is ordered with the supplied value. If other pictures already exist at the supplied order value, those pictures and any after them are bumped up one step. | # Import template for product parameters ## Key features - Apply parameters and parameter values to products via import - Requires parameter groups and their parameters to be created first ## Quick guide 1. Go to the **Import Tool** in the menu and click **New**. 2. In the **Template type** dropdown, select **Product Parameters**. 3. Click **Download file template**. --- Download the import template by going to the **Import Tool** in the menu, clicking **New**, choosing **Product Parameters** in the Template type dropdown, and clicking **Download file template**. ![image](https://geins.io/../../img/merchantcenter/5658046701084_3FF8987A.jpeg) A description of the columns follows. There is also a short description in Merchant Center under **View template description**. | Column | Description | | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- | | **ProductId** | Id of the product to import the parameters to. | | **ProductName** | The product's name. Mandatory if the Id is not filled in. Can be left empty if there is an Id. | | **ParameterGroup** | Name of the parameter group, as set in the **Group Name** field on the parameter group. | | **ParameterName** | Name of the parameter (the field name on a parameter). | | **Value** | The value you want the product to have for its parameter. Must match an existing value if the parameter is a picker or multi-picker type. | For the full import walkthrough, see [Import parameters](https://geins.io/docs/merchant-center/import-tool/import-templates/import-parameters). # Import template for product variants ## Key features - Create or change product variants via import - Connect products into a variant group by a shared group key - Set collapsed state and a main product for a group ## Quick guide 1. Go to the **Import Tool** in the menu and click **New**. 2. In the **Template Type** dropdown, select **Variant**. 3. Click **Download File Template**. --- This requires that you have existing variant types configured. Use the template to create or change variants, then upload your file to apply the changes. ![image](https://geins.io/../../img/merchantcenter/import-variants-1_603a3723.jpg) A description of the columns follows. There is also a short description in Merchant Center under **View template description**. | Column | Description | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **ProductId** | Id of the product. | | **GroupKey** | Unique identifier for the group. Can be text or numbers. Products with the same key are connected to the same variant group. A product can only be part of one group; if a product already exists in a group and you specify a different key, it is removed from the first group. Located under group settings in the variants tab in Merchant Center on existing groups. | | **Dimensions** | The variation dimension names. A comma-separated list of the dimensions for the variant group (example: color,material). Only matches existing dimensions in a variant group; cannot add new dimensions to an existing group. All dimensions in the group must be specified. | | **Values** | The variant dimension values. A comma-separated list of the dimension values for this variant, in the same order as the dimensions (example: red,wood). | | **Collapsed** | Value: True / False. **True** sets the variation group as collapsed if applied to any product in the group. **False** removes the collapsed state, so all products in the group show in product lists. Requires a value in GroupKey. | | **MainProduct** | Value: True. Sets the product as the main product if the group is collapsed. Overrides an existing main product. Requires a value in GroupKey. | | **Remove** | Value: Remove. If set, the product is removed as a variation. Requires a value in GroupKey. | # Import template for products ## Key features - Create or update products via import - Set prices, currencies, texts, categories, and meta fields - Manage stock and size/model (item) level fields - Set markets, dimensions, supplier, and classification ## Quick guide 1. Go to the **Import Tool** in the menu and click **New**. 2. In the **Template type** dropdown, select **Product**. 3. Click **Download file template**. --- ![image](https://geins.io/../../img/merchantcenter/import_template_1C105705.jpg) A description of the columns follows. There is also a short description in Merchant Center under **View template description**. | Column | Description | | -------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Id** | The product's Id in Merchant Center. | | **Name** | The product's name. Can be left empty if the Id is present, but must be filled in if the Id column is empty. | | **Article number** | Article number, applies to the Article Number (SKU) field on the product view. | | **Price** | The product's price (in the default currency if the Currency column is missing). | | **SalePrice** | The product's sale price (in the default currency if the Currency column is missing). | | **Currency** | The currency of the price to add or update in the Price or SalePrice column. Use the three-letter abbreviation, for example SEK. | | **InPrice** | The product's purchase price. | | **InPriceCurrency** | Currency for the purchase price (three-letter abbreviation). Default price is set if left empty. | | **Text1** | Product text, field Text 1 on the product view. Where the text is used in the store depends on the store's design (earlier tech text). | | **Text 2** | Product text, field Text 2 on the product view. Where the text is used in the store depends on the store's design (earlier short text). | | **Text 3** | Product text, field Text 3 on the product view. Where the text is used in the store depends on the store's design (earlier long text). | | **Brand** | The product's brand. The brand must be set up in Merchant Center. | | **Category** | Main category. The product's URL breadcrumbs are based on the main category. A product must have one main category to be visible in the shop. | | **AdditionalCategory1** to **AdditionalCategory3** | Additional categories. Lets you add products to more categories. They do not need to be sub-categories of the main category. | | **MetaTitle** | Meta title for the product. | | **MetaDescription** | Meta description for the product. | | **MetaKeywords** | Meta keywords for the product. | | **Active** | Whether the product is active. TRUE for active, FALSE for inactive. If left empty, set as active. | | **ExternalId** | External Id, applies to the external id field on the product view. An additional identifier for matching by name: both name and External Id must then be unique. | | **Markets** | Ids for the markets the product is sold in, as a comma-separated list (1,2,3,4 and so on). If left empty, the product is set as available on market Id 1 by default. | | **Weight** | The product's weight. | | **Height** | The product's height. | | **Width** | The product's width. | | **Length** | The product's length. | | **Size** | Product name (size/model) on a product item. A new article is created if the name is not found or the product is new. A standard name is used if left unspecified. | | **OldSize** | The product article's (size/model) old name. If provided, matching product articles have their name changed to the value in the Size column. | | **Stock** | Inventory balance. Requires the Size, Name, and Id fields. | | **OversellableStock** | Oversellable inventory balance. Requires the Size, Name, and Id fields. | | **StaticStock** | Static inventory balance. Requires the Size, Name, and Id fields. | | **StockThreshold** | The stock threshold. Requires the Size, Name, and Id fields. | | **SizeExternalId** | External Id on size/model level. Requires the Size, Name, and Id fields. | | **SizeArticleNumber** | Article number on size/model level. Requires the Size, Name, and Id fields. | | **Shelf** | Shelf place. Requires the Size, Name, and Id fields. | | **GroupName** | For product relations, the name of the relation type the product belongs to. | | **GroupKey** | Identifier for a product relations group (any number). Products with the same number in the import become related products. | | **GS1EANNumber** | GS1 number (EAN number) on size/model level. Requires the Size, Name, and Id fields. | | **ItemWeight** | Weight on size/model level. Requires the Size, Name, and Id fields. | | **ItemHeight** | Height on size/model level. Requires the Size, Name, and Id fields. | | **ItemWidth** | Width on size/model level. Requires the Size, Name, and Id fields. | | **ItemLength** | Length on size/model level. Requires the Size, Name, and Id fields. | | **MaxPercent** | The maximum percentage discount a product should have (for example 70%). Applies to the Max Discount (%) field on the product view. | | **Supplier** | Name of the supplier. | | **LanguageId** | Language Id, used for translations. Fill in the Id for the language if you want to add translations on fields like Text1, Text2, and Text3. Leave empty for the default language. | | **IntrastatCode** | Intrastat code. | | **CountryOfOrigin** | The product's country of origin, either country name or country code. | | **ProductClassificationId** | Id for the classification the product belongs to. | | **ProductGuideIds** | Ids for the product guides the product belongs to (comma-separated list 1,2,3,4 and so on). | | **FreightClassName** | Name of the freight class the product belongs to. Requires freight classes to be configured. | # Import template for related products ## Key features - Create relations between products via import - Relate products by the related columns or a comma-separated list - Remove relations with the Remove column ## Quick guide 1. Go to the **Import Tool** in the menu and click **New**. 2. In the **Template Type** dropdown, select **RelatedProducts**. 3. Click **Download File Template**. --- This requires that you have existing relation types configured. Use the template to add relations, then upload your file to apply the changes. ![image](https://geins.io/../../img/merchantcenter/import-related_14e95745.jpg) A description of the columns follows. There is also a short description in Merchant Center under **View template description**. | Column | Description | | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **ProductId** | Id of the product. | | **ProductName** | Name of the product. Used to find the first matching product Id if Id is not specified (use Id for performance). | | **Type** | Name of the relation type. Must match an existing relation type. | | **Related1** to **Related6** | Product Id of a product to relate. | | **RelatedCSV** | Additional relations as comma-separated product Ids, with no quantity limit. Can also be used on its own instead of the Related1 to Related6 columns. | | **Remove** | If value **Remove** is added: without Ids in any related column, all related products for the specified relation type are removed from the product; with Ids in any related column, only the specified products are removed from the relation. | # Import Tool URLHistory Template ## Key features - Redirect old URLs to your existing shop via import - Redirects use status code 301 - Useful for managing redirects during a migration project ## Quick guide 1. Go to the **Import Tool** in the menu and click **New**. 2. In the **Template type** dropdown, select **URLHistory**. 3. Click **Download file template**. --- After launching your webshop, some URLs often still point to your previous webshop. Use the import tool to redirect them to your existing shop. The redirect uses status code 301. Download the import template by going to the **Import Tool** in the menu, clicking **New**, choosing **URLHistory** in the Template type dropdown, and clicking **Download file template**. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2024-01-31-kl.-10.56.35_0f14659f.png) A description of the columns follows. There is also a short description in Merchant Center under **View template description**. | Column | Description | | -------------- | -------------------------------------- | | **OldUrl** | The old URL. | | **NewUrl** | The new URL. | | **SiteId** | The site ID the URL belongs to. | | **Extra Info** | Any extra information you want to add. | This template can be used to manage any 301 redirects that arise during a migration project. # Create or update categories via import tool ## Key features - Create or update categories in batches - Use the category import template, or your own file - Match the file's columns to the system fields before importing ## Quick guide 1. Go to **Import Tool > New**. 2. Use the **Category** template (download it), or upload your own file. 3. Set the **File Extension** and choose template type **Category**, then click **Next**. 4. Match the fields and click **Start import**. --- In Merchant Center, go to **Import Tool > New**. ![image](https://geins.io/../../img/merchantcenter/import_ny-1_C8E5CF20.jpg) If you already have a file ready, click **Select file**, choose your file, set the file type in the **File Extension** dropdown, choose template type **Category**, and click **Next** (skip to [Match the fields](https://geins.io/#match-the-fields) below). ## Using the import template for categories To use the category import template, first download it: in the **Template Type** dropdown choose **Category**, then click **Download template file**. ![image](https://geins.io/../../img/merchantcenter/import_upload-1_4A0C6CD7.jpg) Fill in the data to import. You can create new categories or update existing ones. A new category is created automatically if the Id field is empty. A description of each field is available by clicking **View template description**. See also [Import template for categories](https://geins.io/docs/merchant-center/import-tool/import-templates/import-template-for-categories). ::note If you are working on a Mac, save the file with the correct encoding (UTF-8) in Excel. :: When your file is ready, upload it: click **Select file**, choose your file, set the file type in the **File Extension** dropdown, choose **Category** in the template type list, and click **Next**. ## Match the fields Fields with padlock icons are mandatory and must be matched for the import to work. ::note When updating a category, match only the fields you want to update. If you match an empty field such as Name, it replaces the existing name with an empty value. :: If you use an import template, fields are matched automatically. Below is an import with the template where the fields are matched. ![image](https://geins.io/../../img/merchantcenter/impot_kat_match-1_30A70CD2.jpg) To exclude fields from the import, remove them by dragging them from under **Your file** into the box under **Not matched from your file**. The picture below shows an import where metaTitle, MetaDescription, and MetaKeywords are excluded. ![image](https://geins.io/../../img/merchantcenter/import_kategori_remove-1_D5796C61.jpg) If your file isn't based on the existing template, the columns may be named differently and you need to match them yourself by dragging the names from **Not matched from your file** to the field you want to match. ![image](https://geins.io/../../img/merchantcenter/impot_kat_no_template_7C157C85.jpg) After matching the fields (required fields must be matched), click **Start import**. ![image](https://geins.io/../../img/merchantcenter/impot_kat_no_template_matched-1_DD3E8303.jpg) The import is done when it says 100%. The column on the right shows a summary of the import. ![image](https://geins.io/../../img/merchantcenter/impot_kat_done-1_E6D0316B.jpg) # How the import tool works ## Key features - Create or update data in batches - Start from a complete import template, or use your own file - Map your file's columns to the system fields - See a summary when the import completes ## Quick guide 1. Go to **Import tool** in the menu and click **New**. 2. Choose a **Template type** and download the template, or upload your own file. 3. Set the **File Extension** and template type, then click **Next**. 4. Map the columns and click **Start Import**. --- Click **Import tool** in the menu, then **New** to create a new import. If you want to start from an import template, you do that in the next step. ![image](https://geins.io/../../img/merchantcenter/import_ny_D3F058BE.jpg) In the next step you upload the file you want to import. The available import templates are also here. ![image](https://geins.io/../../img/merchantcenter/import_steps_9938B422.jpg) ## Download an import template To download an import template, choose the type of import in the **Template type** dropdown. See the separate articles for a thorough description of each template. The available templates are: | Template | Description | | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | **Category** | Create new categories or update existing ones. | | **Customer / member (Beta)** | Update data on existing customers, such as placing a customer in a customer group. Can also create new customers. | | **Google Product Taxonomy** | Map existing categories against the Google taxonomy categories. | | **Price list** | Read in a price list with product prices for specific customer groups, for quantity discount prices. Requires customer groups in the system. | | **Product** | Create or update products. | | **Product Images** | Import product pictures to existing products. Requires the pictures to be available via a URL. | | **Product parameters** | Enrich existing products with parameter values and attributes from existing parameter groups. | | **Purchase** | Create purchase orders via the import tool. | | **URL history** | Manage reassignment of old URLs. Used primarily when changing from another platform. | When you have chosen the template type, click **Download file template**. ![image](https://geins.io/../../img/merchantcenter/import_upload_161F8DDB.jpg) The file is downloaded and can be completed for import. You can also work with a file that isn't based on any existing template, then map your columns in the next step. ## Upload the file When your file is ready, click **Select file** and choose it. Set the file type in the **File Extension** dropdown, choose the template type, and click **Next**. | File Extension | Description | | -------------- | ----------------------- | | **ExcelPlus** | Files of filetype .xlsx | | **Excel** | Files of filetype .xls | | **Csv** | Files of filetype .csv | ## Map the fields Map the fields in your file against the system. Fields with padlock icons are mandatory and must be matched for the import to work. If you use an import template, all fields are matched automatically. Below is an example of a category import with the template where all fields are matched. ![image](https://geins.io/../../img/merchantcenter/impot_kat_match_A079D560.jpg) To exclude fields from the import, remove them. The picture below shows an import where metaTitle, MetaDescription, and MetaKeywords have been excluded. To remove a field, drag it from under your file and drop it in the box under **Not matched from your file**. ![image](https://geins.io/../../img/merchantcenter/import_kategori_remove_2DE5A13C.jpg) If your file isn't based on an existing template, the columns may be named differently and you need to match them yourself by dragging the names from **Not matched from your file** to the field you want to match. ![image](https://geins.io/../../img/merchantcenter/import_example_63DABD6E.gif) After matching the fields (all required fields must be matched), click **Start Import**. ![image](https://geins.io/../../img/merchantcenter/impot_kat_no_template_matched_F8CD2FA8.jpg) The import is complete when it says 100%. The column on the right shows a summary of the import. ![image](https://geins.io/../../img/merchantcenter/impot_kat_done_532244EE.jpg) # How to add a new product with multiple sizes via the import tool ## Key features - Create a single new product with the **Insert/Create New** mode - Create a product with multiple sizes with the **Insert/Update** mode - The first row creates the product; subsequent rows add items (sizes) --- ## Single product Use the **Insert/Create New** import mode to create a single product. This mode creates new products where the **ID** does not exist, regardless of the name, and does not update existing products. ## Product with multiple sizes Use the **Insert/Update** import mode. This mode creates a product if no matching **ID** or **Name** exists, and updates an existing product if there is a match. How it works: - The first row creates the product with its **Name** and assigns an **ID**. - Subsequent rows match the **Name** from the first row to add additional product items (for example, sizes). ### Example The import file below creates a product named **Black Shoe** with an auto-generated **ID** and **Article Number 40331**. Two sizes (**S** and **M**) are added, each with its own unique article number. ![image](https://geins.io/../../img/merchantcenter/image-png-Jan-27-2025-08-35-56-1519-AM_6065A555.png) The product view in Merchant Center after the import: ![image](https://geins.io/../../img/merchantcenter/image-png-Jan-27-2025-08-39-06-9248-AM_3EB911BF.png) # How to handle 404 pages via the Import tool ## Key features - Find 404 pages under **Settings > 404 pages** and export the list - Redirect them to the correct URLs with the **URLHistory** template - Important for SEO and reducing bounce rates ## Quick guide 1. Go to **Settings > 404 pages** and export the list of URLs. 2. Build a file with the new URLs, or download the **URLHistory** template. 3. Import the file via the **Import Tool**, mapping each column. --- In the left menu of Merchant Center, open **Settings**, where you find **404 pages**. This section shows which pages need adjustment and lets you export a list of URLs to help build a list of new URLs to import. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2023-12-13-kl.-13.59.32_63adb53a.png) Once you have identified the 404 pages to redirect, use the **Import Tool**. You can create your own .xlsx or .csv file, or download the **URLHistory** template directly from the Import Tool. ![image](https://geins.io/../../img/merchantcenter/skarmavbild-2023-12-13-kl.-14.00.13_34e949d6.png) If you are unsure which fields to include, click **View template description** for a description of the columns the system recognizes. ![image](https://geins.io/../../img/merchantcenter/template_url_popup_C641CA1F.png) Once you have mapped each column to the system requirements and started the import, the 404 pages are changed to the correct address from your file. # Import products ## Key features - Create or update products in batches - Choose an import mode to control how existing products are handled - Match the file's columns to the system fields before importing ## Quick guide 1. Go to the **Import tool** in the menu, click **New**, select **Product**, and click **Download file template**. 2. Fill in the file and choose an **Import mode**. 3. Click **Next**, match the columns, and start the import. --- Download the import template by going to the **Import tool** in the menu, clicking **New**, selecting **Product** in the Template type dropdown, and clicking **Download file template**. ![image](https://geins.io/../../img/merchantcenter/10209644738844_468DB7E9.jpeg) For a full description of the columns, see [Import template for products](https://geins.io/docs/merchant-center/import-tool/import-templates/import-template-for-products). There is also a short description in Merchant Center under **View template description**. ## Import mode When you have filled in the fields, choose an **Import mode**: | Mode | Description | | -------------------------- | ------------------------------------------------------------------------------------------------------ | | **Insert/Update** | Creates or updates existing products matching either id or name. | | **Insert/Create new** | Creates new products where the id does not exist, regardless of name. Never updates existing products. | | **Insert/Ignore existing** | Creates new products where neither id nor name exists. Never updates. | When you have chosen your import mode, click **Next**. You can then match the columns to each field. In this example, the column **Storlek (Size)** needs to be dragged and matched to the **Size** column. If the columns in your file match the system template, they are placed automatically. ![image](https://geins.io/../../img/merchantcenter/10219307773212_DFEB96E6.png) When the import is finished, you get a summary. If all products were imported correctly, it says **Inserted** or **Updated**. If something went wrong, it shows how many products were **Ignored** or **Failed**. ![image](https://geins.io/../../img/merchantcenter/10219321260316_19783BC9.png) ::tip When importing a large number of products, always start with one product to confirm all the information is correctly aligned. :: # Manage Product Relations with the Import Tool ## Key features - Create, update, or remove product relations in bulk - Relate products by the Related columns or a comma-separated list - Remove all relations of a type, or specific related products ## Quick guide 1. Go to **Import Tool > New**, choose **RelatedProducts**, and download the template. 2. Fill in the product, relation type, and related product Ids. 3. Upload the file via the import tool to apply the changes. --- ## 1. Access the template 1. Go to **Import Tool** in the menu and click **New**. 2. Choose **RelatedProducts** from the template type dropdown. 3. Download the template file to your computer. ## 2. Complete the template | Column | Description | | ---------------------------- | ----------------------------------------------------------------------------- | | **ProductId** | The Id of the main product. | | **ProductName** | Include the name if you prefer matching by name (Id matching is faster). | | **Type** | The name of the existing relation type (must match exactly). | | **Related1** to **Related6** | Up to six product Ids to link. | | **RelatedCSV** | For more than six related Ids, use comma-separated values in this field only. | | **Remove** | Add the value Remove to remove all or specific relations (see below). | ## 3. Upload and apply Save your updated file and upload it via the import tool to apply the changes. The relationships are created or updated as specified. ## How to remove product relations You can remove product relations in two ways using the **Remove** column. **Remove all relations of a specific type:** 1. Fill in the `ProductId` (or `ProductName`). 2. Add the `Type` of relation to remove. 3. Set the `Remove` column to `Remove`. 4. Leave the related product columns (`Related1` to `Related6` or `RelatedCSV`) empty. All relations of that type are removed from the product. **Remove specific related products:** 1. Fill in the `ProductId` (or `ProductName`). 2. Add the `Type` of relation. 3. Add the Id(s) of the specific related products to remove in `Related1` to `Related6`. 4. Set the `Remove` column to `Remove`. Only the listed related products are removed from that relation type. # Update inventory stock ## Key features - Update inventory balance on products in a batch - Update regular, oversellable, or static stock - Uses the product import with the Insert/Update mode ## Quick guide 1. Prepare a file with the columns **Id**, **Name**, **Size**, and **Stock**. 2. Go to **Import Tool > New** and choose your file. 3. Set template type **Product** and import mode **Insert/Update**. 4. Map the columns and click **Start import**. --- With the import tool you can update the inventory balance on products in a batch, using the product import. The columns to map are **Id**, **Name**, **Size**, and **Stock**. For oversellable or static stock, fill in the **OversellableStock** and **StaticStock** columns. | Column | Description | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Id** | The product's Id in the system. | | **Name** | Name of the product. Can be left empty if it has an Id. | | **Size** | Name of the size/model (the field name in the product list inside the product view). A new size/model is created if the value isn't already available. Spell the size/model name exactly, for example "One size" written consistently, since "one size" would create a separate size/model. | | **Stock** | The amount to update the inventory balance to. | | **OversellableStock** | The amount to update your oversellable inventory to. | | **StaticStock** | The amount to update your static inventory to. | ![image](https://geins.io/../../img/merchantcenter/impor_stock_7103CDF9.jpg) Example of an import file based on the product import template with correctly filled in fields: ![image](https://geins.io/../../img/merchantcenter/import_example_stock_1E1E7F20.jpg) ## When your file is done 1. Go to **Import Tool** in the menu and click **New**. 2. Choose the file you want to import. 3. Choose the file type in the **File extension** dropdown. 4. Choose template type **Product**. 5. Choose import mode **Insert/update**. 6. Click **Next** and ensure the columns named above are mapped to the system columns. 7. Click **Start import**. When the import is done, the products' inventory balance is updated. You can see it on the product, in the **In Stock** column in the **Product list** box. # Update prices using the import tool ## Key features - Update regular price (Price), sale price (SalePrice), and purchase price (InPrice) in batches - Set prices per currency and per sales channel - Uses the product import with the Insert/Update mode ## Quick guide 1. Prepare a file based on the product import template with the price columns. 2. Go to **Import Tool > New** and choose your file. 3. Set template type **Product** and import mode **Insert/Update**. 4. Map the columns and click **Start import**. --- In the product import you can set or update the regular price (Price), sale price (SalePrice), and purchase price (InPrice). If you work with multiple currencies or sales channels, you can update prices differently for each. | Column | Description | | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Price** | Product price (in the default currency if the Currency column is not specified). Should not be mapped if empty. | | **SalePrice** | The product's sale price (in the default currency if the Currency column is not specified). | | **InPrice** | The product's purchase price. | | **Currency** | The currency of the price you want to update. | | **Channel** | Which sales channel the price applies to (for example, site.se, site.com). Price is set for the default sales channel if empty. When working with multiple channels and currencies, always set a value in both the Currency and Channel columns. | ## Example import files Price set in the default currency on the default sales channel: ![image](https://geins.io/../../img/merchantcenter/10304941233052_71E9ADF6.png) Sale price updated in the product's default currency (do not map the Price field if it's empty): ![image](https://geins.io/../../img/merchantcenter/10304953561884_B5BF44A2.png) Price set for a specific sales channel and currency: ![image](https://geins.io/../../img/merchantcenter/10304941241372_0ED5C6A5.png) Price set for two different sales channels with two different currencies: ![image](https://geins.io/../../img/merchantcenter/10304953568156_3C09C146.png) ## When your file is ready 1. Click **Import Tool** in the menu and click **New**. 2. Choose the file you want to import. 3. Select the file type in the **File extension** dropdown. 4. Choose template type **Product**. 5. Choose import mode **Insert/Update**. 6. Click **Next** and ensure the columns mentioned above are mapped to the system columns. 7. Click **Start import**. When the import is complete, the product prices are updated. Verify this on a product by checking the price fields, or under the **Prices** tab. ![image](https://geins.io/../../img/merchantcenter/6876301553180_EC259E99.jpeg) In the product view, **Price** corresponds to the Price column in the import template, **Discount price** to SalePrice, and **Purchase price** to InPrice. ![image](https://geins.io/../../img/merchantcenter/6876286013084_8EFEA17A.jpeg) # Working with product variants in the import tool ## Key features - Create and manage variant groups via import - Group products by a shared group key - Update multiple dimensions, or remove a product from a group ## Quick guide 1. Go to the **Import Tool** in the menu and click **New**. 2. In the **Template Type** dropdown, select **Variant**. 3. Click **Download File Template**, fill it in, and upload it to apply the changes. --- This requires that you have existing variant types configured. For a description of all columns in the variants template, see [Import template for product variants](https://geins.io/docs/merchant-center/import-tool/import-templates/import-template-for-product-variants). ## GroupKey **GroupKey** is the unique identifier that groups products together as a variant group. Products with the same key are connected to the same group. A product can only be part of one group; if a product is in an existing group and you specify a different key, it is removed from the first group. ## Create a variants group The example below creates a variants group with one dimension: - Two products are grouped under the group key `ram1` with the dimension Material set. - The group is collapsed, and the product with id 110063 is set as the main product. ![image](https://geins.io/../../img/merchantcenter/image-png-Jan-09-2025-12-04-38-9141-PM_32AB9AD8.png) Once a group is created, you cannot add new dimensions to it. To make changes, you must remove all products and create a new group. ::tip Ensure all desired dimensions are added when setting up the group initially. :: The variants view in Merchant Center after import: ![image](https://geins.io/../../img/merchantcenter/variations3_3A991B65.jpg) ## Update multiple dimensions All dimensions and values must be included when updating a product in a variants group. - List multiple dimensions and their values in a single row, separated by commas. - Ensure the values match the dimensions in the same comma-separated order. ![image](https://geins.io/../../img/merchantcenter/image-png-Jan-09-2025-01-05-18-8324-PM_84B35DC7.png) In the example above: - Product id 31 has **Shape: Rectangle** and **Type: Hang**. - Product 210 has **Shape: Square** and **Type: Stand**. List the values in the same comma-separated order as the dimensions to avoid errors. ## Remove a product from a variants group Enter the productId, groupKey, and the value **remove** in the remove column for the product you want to remove. ![image](https://geins.io/../../img/merchantcenter/image-png-Jan-09-2025-01-13-25-7336-PM_37421109.png) # Creating a Purchase Order ## Key features - Create a purchase order via the Reorder Points view or manually - Generate a PDF version of the order - Created orders are added to incoming stock ## Quick guide 1. Go to **Incoming Stock PO > Suppliers**. 2. Create a purchase order via the **Reorder Points PO** tab or the **New** button. 3. Add products and quantities, then save. 4. Open the purchase order and click **Create** to generate a PDF. --- You can create a purchase order in two ways: through the **Reorder Points view** or manually via the **New** button under Purchase Orders. ## Create via the reorder points view 1. Go to **Incoming Stock PO > Suppliers**. 2. Select the supplier you want to order from. 3. Click the **Reorder Points PO** tab. 4. In the **Purchase** column, enter the quantity to order for each product. 5. Click **Save and Create Purchase Order**. The purchase order is now saved under **Purchase orders**. Open it and click **Create** to generate a PDF version for printing or further processing. ## Create manually 1. Go to **Incoming Stock PO > Suppliers**. 2. Click **New** to create a new purchase order. 3. Choose the supplier and fill in the relevant information. 4. In the **Add Products** box, search by product ID or name, then click the green **Add** icon. 5. Enter the quantity in the **Amount** column for each product. 6. Click **Save**. The purchase order is now saved under **Purchase orders**. Open it and click **Create** to generate a PDF version for printing or further processing. ## After order creation On creation, the purchase order is also added under **incoming stock**. If a desired date is chosen, it is added in the **incoming** column in the product's item list on the product view. # Description of the Purchase order view ## Key features - Add supplier, delivery date, and other order information - Add products and set the amount to order for each - Generate a PDF and track the order in incoming stock - Track discrepancies between ordered and received items ## Quick guide 1. Add the relevant information (supplier, delivery date, etc.). 2. Add products in the **Product List** using the **Add Products** box, and enter the amount for each item. 3. Click **Save**, then **Create** to generate a PDF. --- The order is added to **Incoming Stock**. If a **desired delivery date** is set, it appears in the **Incoming** column in the product's item list. ## Main fields | Field | Description | | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------- | | **Supplier name** | The supplier the purchase order is for. | | **Customer number** | Optional. The value is included on the purchase order. | | **Desired delivery date** | The date you want the delivery to arrive. The date is automatically added in the incoming column in the products list (items) on the product view. | | **Language on purchase order** | The language the purchase order PDF is created in. | | **Currency** | The currency the purchase order is based on. | **Supplier & Customer information:** details added here are included on the order PDF. ## Product list and add products box The product list is where you add the products to include on the purchase order. To add products: 1. Search by **product name** or **ID** in the **Add Products** box. 2. Click the green **add** icon to include the product in the product list below. 3. Set the **amount** to order in the amount column. ### Columns in the product list | Column | Description | | ------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | | **Size** | The name of the item. | | **Stock Count** | Current stock level. | | **Amount** | Quantity to order. | | **Amount in** | Incoming stock amount. | | ![image](https://geins.io/../../img/merchantcenter/image-png-May-09-2025-11-34-51-1486-AM_690F3754.png) | Add a new item to the product. The new item is added on the product automatically upon saving. | | ![image](https://geins.io/../../img/merchantcenter/image-png-May-09-2025-11-35-16-3465-AM_0E842C67.png) | View details about the item. | | ![image](https://geins.io/../../img/merchantcenter/image-png-May-09-2025-11-40-09-5879-AM_3052A977.png) | Delete the item from the list. | **Information box:** add internal notes for the purchase order. These notes are only visible in Merchant Center. ## After order creation - The order appears in **Incoming Stock**. - The **Incoming** column on the product view shows the selected delivery date. - A **Print** button appears to download the order as a PDF. ## Difference tab Used to track discrepancies between ordered and received items. ## Cancel order Click **Cancel** to permanently remove the purchase order. # Available layout and configuration for the transaction mails sent by the Geins platform The transaction mails all have a base layout and content set, with a number of configuration options for the layout and some additional settings. The available adjustments are listed below. ::note If you have any questions regarding your mail configuration, contact the Geins support team via the support form in Merchant Center. :: ## Mail layout | Type | Description | | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **BackgroundColor** | The background color of the mail background. Example: "#333333" | | **BodyColor** | The background color of the mail body. Example: "#000000" | | **SecondBodyColor** | The secondary background color of the mail body. Example: "#333333" | | **HeaderColor** | The background color of the mail header. Example: "#333333" | | **FooterColor** | The background color of the mail footer. Example: "#333333" | | **FooterTextColor** | The color of the footer texts. Example: "#333333" | | **TextColor** | The mail text color. Example: "#333333" | | **SaleTextColor** | The color of text on prices shown as sales prices. Example: "#C80000" | | **NotIncludedTextColor** | The color of text on order rows not included in the order. Example: "#C80000" | | **PreviouslyShippedTextColor** | The color of text on order rows already shipped. Example: "#C80000" | | **BackOrderedTextColor** | The color of text on order rows with backorder status. Example: "#E87F00" | | **ButtonColor** | The color of buttons in the mail. Example: "#333333" | | **ButtonTextColor** | The color of the text in buttons. Example: "#fafafa" | | **BorderRadius** | The border radius size on buttons. Example: 5px | | **FontLink** | The link to the font used in the mail, such as a Google font. Example: {rel="nofollow"} | | **FontFamily** | The font family used in the mail. Example: "Open Sans, sans-serif" | | **FontSizeSmall** | The small font size on texts, used in a variety of places. Example: "15px" | | **FontSizeMedium** | The medium font size on texts, used in a variety of places. Example: "15px" | | **FontSizeLarge** | The large font size on texts, used in a variety of places. Example: "18px" | | **LineHeight** | The text line-height in the mail. Example: "20px" | | **LogoUrl** | The url to the logo used in the mail. Example: "/Content/img/mail/logo.png" | | **HeaderImgUrl** | The url to the header mail image. Example: "/Content/img/mail/header.jpg" | | **ProdImgSize** | The size of the product images on order rows in mails such as order confirmation. Example: "180w" | ## Mail settings | Type | Description | | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **FromEmailAddress** | If an email address exists, copies of order confirmation mails are sent to this address. | | **DisplayName** | A display text shown in the email inbox header instead of the sender mail, for example: "Storename support". | | **Locale** | The language used for email, standard format. Available languages: sv-SE, da-DK, fi-FI, nb-NO. Default is English: en-US. | | **ExternalSourceVerificationTag** | Used with OrderConfirmationExternalSource. Specify a text that must be included in the html from the external source. | | **Disabled** | Disables all transaction mail from being sent. | | **Texts** | Used to override texts. | | **SmtpHost** | Host for an external SMTP server. If not specified, ours is used. | | **SmtpUser** | User for an external SMTP server. | | **SmtpPassword** | Password for an external SMTP server. | | **OrderConfirmationBCCEmail** | The email address that receives a BCC of all sent order confirmation mails. | | **OrderConfirmationExternalSource** | A URL called when the email is generated; the html from it is used instead of our email. The order's publicId is sent to this URL so data can be retrieved via our mgmtapi. | | **HideArticleNumber** | Hides the article number on products in order mails. | | **EmailReplyToCustomer** | If set to **true**, the order confirmation email is also sent to the sender of the email. | | **LoginUrl** | Relative url to the login page. Example: /login | | **PasswordResetUrl** | Relative url to the password reset page. Example: /newpassword | ## Mail texts Most of the texts in all the transaction mails, such as the order confirmation title and subtitle, can be adjusted. If you want to do this, contact the Geins support team for more information. # Transactionmails sent in the Geins platform A transactional email is an automated email triggered after a customer takes a specific action. Below are the transaction mails sent in the Geins platform. | Mail | Description | | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Customer Registered** | Automatically sent when a customer is created during the first purchase. Can be disabled. | | **Customer Refunded Automatically** | Automatically sent when a refund or compensation is created. Can be disabled. | | **Customer Password Reset** | Sent when a customer requests a new password. | | **Order Confirmation** | Sent when an order is created in the active state, or when the order state changes from inactive to active. You can submit a flag in mgmtapi when creating an order to say no email should be sent. | | **Order Delivered** | Sent when an order is delivered. Can be disabled. | | **Order Cancelled** | An administrator can cancel an order in Merchant Center, with an option to trigger an email to the customer. | | **Order Row Removed** | An administrator can remove an order row in Merchant Center, with an option to trigger an email to the customer. | | **Order Row Returned** | Automatically sent when an order return is created. Can be disabled. | | **Product Size Available** | Automatically sent when a product item with active monitors gets 1 or more in stock. Can be disabled. | By default, all mails above are available or sent automatically, but this can vary depending on how your setup is configured. The transaction mails all have a base layout and content set, with a number of configuration possibilities. See [Available layout and configuration for the transaction mails](https://geins.io/docs/merchant-center/settings/configurations/available-layout-and-configuration-for-the-transactionmails-sent-by-the-geins-platform). # Managing API users ## Key features - Create API users and keys to access the platform's APIs - Generate a new password for an API user - Inactivate or delete an API user ## Quick guide 1. Go to **Settings > API Users > Create User**. 2. Enter a **Username** and save. 3. Copy the generated API passwords and Management API Key immediately. --- To access the platform's APIs, you need an API user and API keys, managed in Merchant Center. These keys let you integrate and build custom experiences on the platform. ## Creating a new API user 1. Go to **Settings > API Users > Create User**. 2. Enter a **Username** and save. 3. The system generates API passwords and a Management API Key. ::note Copy the credentials immediately. They are not stored or accessible again once you leave the page. :: ## Generating a new password 1. Open the API user profile. 2. Click **Generate New Password**. A new password is displayed, and the old one no longer works. ## Inactivating or deleting an API user - **To inactivate:** open the API user, uncheck the **Active** box, and save. An inactive user cannot log in to the Management API. - **To delete:** click **Delete User** to permanently remove the user. # Default metadata ## Key features - Set default metadata for pages without specific metadata assigned - **Global Default Meta** for all pages without specific metadata - **Specific Default Meta** for categories, brands, and products, per channel and language ## Quick guide 1. Go to **Settings > Metadata**. 2. Select the meta set you want to edit. 3. Enter the default metadata and save. --- In Merchant Center, you can set up default metadata for pages that don't have specific metadata assigned. There are two types: | Type | Description | | ------------------------- | ----------------------------------------------------------------------------------------- | | **Global Default Meta** | Used for all pages without specific metadata. | | **Specific Default Meta** | For categories, brands, and products, with separate setups for each channel and language. | ## Where to find default metadata Go to **Settings > Metadata**. You see a list of all available default meta sets for different channels and languages. ## How to edit default metadata 1. Select the meta set you want to edit. 2. Enter the default metadata you'd like to use. Using default metadata ensures every page, product, or category has consistent meta information. ![image](https://geins.io/../../img/merchantcenter/image-png-Oct-18-2024-01-47-22-8100-PM_F72350EA.png) # Sales Demand view ## Key features - Based on the **order placement date** - Reflects what customers intended to buy, including any cancelled orders or products - All amounts exclude tax, except **Order Total** --- Under **Statistics > Sales Demand**, the data is based on the **order placement date** and reflects what customers intended to buy, including any cancelled orders or products. All amounts are displayed **excluding tax**, except the **Order Total** column, where tax is included. ## Column descriptions You can also find these clarifications in Merchant Center, by clicking the information icon next to the column options at the top right of the lists. | Column | Description | | ---------------- | ---------------------------------------------------------------------------------------------- | | **Order Value** | Order value in SEK, excluding tax, excluding fees, including discounts. | | **Cost** | Cost (purchase price) in SEK. | | **Margin** | Order Value minus Cost. | | **Margin %** | Margin divided by Order Value. | | **Order Total** | Order total in SEK, including tax, fees, and discounts (money in). | | **Compensation** | Total compensation amount (refund amount added directly to order). | | **Discount** | Order discount amount excluding tax. Does not include discounts on individual products (rows). | ::note - Refunds are counted on the orders placed or shipped on the given date. - All fees exclude tax. :: # Sales Revenue view ## Key features - Based on the **delivery date**, showing orders fulfilled that day regardless of when placed - Reflects what customers actually purchased (completed orders) - All amounts exclude tax, except **Order Total** - The daily list shows data from the last 30 days --- Under **Accounting ERP > Sales Revenue**, the orders shown are based on the **delivery date**, displaying orders fulfilled on that specific day, regardless of when the order was placed. This reflects what customers have actually purchased (completed orders). All amounts are displayed **excluding tax**, except the **Order Total** column, where tax is included. The daily list shows data from the last 30 days. ## Column descriptions You can also find these clarifications in Merchant Center, by clicking the information icon next to the column options at the top right of the lists. | Column | Description | | ---------------- | ---------------------------------------------------------------------------------------------- | | **Order Value** | Order value in SEK, excluding tax, excluding fees, including discounts. | | **Cost** | Cost (purchase price) in SEK. | | **Margin** | Order Value minus Cost. | | **Margin %** | Margin divided by Order Value. | | **Order Total** | Order total in SEK, including tax, fees, and discounts (money in). | | **Compensation** | Total compensation amount (refund amount added directly to order). | | **Discount** | Order discount amount excluding tax. Does not include discounts on individual products (rows). | ::note - Refunds are counted on the orders placed or shipped on the given date. - All fees exclude tax. :: # Developer Documentation ::tip If you log in to your Geins account, all code examples in this documentation will be pre-filled with your unique API keys and other relevant information. :: ## Developer Documentation Welcome to the Geins developer documentation. Here you'll find everything you need to integrate with our API-first commerce platform. ### Quick Links ::card-group :::card --- icon: i-lucide-rocket title: Getting Started to: https://geins.io/developers/getting-started/getting-started --- Make your first API call in under 5 minutes ::: :::card --- icon: i-custom:api title: API Playground to: https://geins.io/developers/getting-started/api-playground --- Interactive API testing environment ::: :::card --- icon: i-custom:mcp title: MCP Server to: https://geins.io/developers/getting-started/mcp-server --- AI-powered assistance for your Geins projects ::: :: ### Two APIs for Every Use Case | API | Type | Endpoint | Best For | | ------------------ | ------- | ------------------------------ | ------------------------------------- | | **Merchant API** | GraphQL | `merchantapi.geins.io/graphql` | Storefronts, carts, checkout | | **Management API** | REST | `mgmtapi.geins.io/API` | Integrations, back-office, automation | ### Example: Fetch Products ```graphql query GetProducts { products(take: 10) { products { productId name alias unitPrice { sellingPriceIncVat } } } } ``` ### SDKs & Tools - **TypeScript SDK** — Full type safety for GraphQL queries - **Python SDK** — For backend integrations and scripts - **MCP Server** — AI assistant integration for Cursor, VS Code, Claude ::callout{icon="i-lucide-github" to="https://github.com/geins-io"} Explore our open-source SDKs and example projects on GitHub. :: # Getting Started ## Getting Started with Geins Follow these steps to make your first API call. ### 1. Get Your API Key 1. Sign up or [login](https://geins.io/login) to your existing account 2. Open the Merchant Center 3. Go to **Settings** → **API Users** 4. Create a new user ### 2. Choose Your API | I want to... | Use this API | | -------------------------- | -------------------------- | | Build a storefront | **Merchant API** (GraphQL) | | Display products & prices | **Merchant API** (GraphQL) | | Handle cart & checkout | **Merchant API** (GraphQL) | | Sync with ERP/WMS | **Management API** (REST) | | Update inventory | **Management API** (REST) | | Automate back-office tasks | **Management API** (REST) | ### 3. Make Your First Call ::code-group ```bash [Merchant API (GraphQL)] curl -X POST 'https://merchantapi.geins.io/graphql' \ -H 'Content-Type: application/json' \ -H 'X-ApiKey: {MERCHANT_API_KEY}' \ -d '{"query": "{ products(take: 3) { products { productId name alias } } }"}' ``` ```bash [Management API (REST)] curl 'https://mgmtapi.geins.io/API/Product/List' \ -H 'Authorization: Basic YOUR_BASE64_CREDENTIALS' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` :: ### 4. Explore Further ::card-group :::card --- icon: i-custom:api title: API Playground to: https://geins.io/developers/getting-started/api-playground --- Test queries interactively in your browser ::: :::card --- icon: i-lucide-github title: GitHub Examples to: https://github.com/geins-io --- Sample projects and starter templates ::: :: ## Common First Steps ### Display a Product List ```graphql query ProductList { products(take: 12) { products { productId name alias brand { name } unitPrice { sellingPriceIncVat } } } } ``` ### Create a Cart ```graphql mutation CreateCart { cartCreate(channelId: "1", languageId: "en", currencyId: "USD") { id } } ``` ### Add Item to Cart ```graphql mutation AddToCart($cartId: String!, $skuId: Int!) { cartAddItem(id: $cartId, item: { skuId: $skuId, quantity: 1 }) { id items { productName quantity } summary { totalIncVat } } } ``` ## Authentication & Personalization Create logged-in experiences with personalized content and customer-specific pricing. ### User Authentication Authenticate users to unlock personalized features: ```graphql mutation Login($email: String!, $password: String!) { authLogin(email: $email, password: $password) { token user { id email customerType } } } ``` Use the returned token in subsequent requests: ```bash curl -X POST 'https://merchantapi.geins.io/graphql' \ -H 'Content-Type: application/json' \ -H 'X-ApiKey: {MERCHANT_API_KEY}' \ -H 'Authorization: Bearer USER_TOKEN' \ -d '{"query": "{ user { id email } }"}' ``` ### Personalized Price Lists Logged-in users automatically receive their assigned price list: ```graphql query ProductWithCustomerPricing { products(take: 5) { products { productId name unitPrice { sellingPriceIncVat # Price based on user's price list regularPriceIncVat # Original price (for showing discounts) } } } } ``` Price lists are assigned per customer or customer group in the Merchant Center, enabling: - **B2B pricing** — Different prices for business customers - **VIP tiers** — Loyalty-based discounts - **Contract pricing** — Negotiated rates per customer ### Personalized Content Deliver targeted content based on user segments: ```graphql query PersonalizedContent { widgets(areaName: "homepage-hero") { widgets { name content # Content tailored to user's segment } } } ``` ::callout{icon="i-lucide-lightbulb"} Need help? Try the **MCP Server** to get AI-powered assistance right in your IDE. :: # API Playground ## API Playground Test Geins APIs directly in your browser without writing any code. ### GraphQL Playground (Merchant API) The Merchant API uses GraphQL, which means you can explore the entire API schema and test queries interactively. #### Using the Built-in Explorer 1. Navigate to `https://merchantapi.geins.io/graphql` 2. Add your API key header: `X-ApiKey: {MERCHANT_API_KEY}` 3. Use the schema explorer to discover available queries and mutations #### Sample Queries to Try ::code-group ```graphql [List Products] query { products(take: 5) { products { productId name alias } } } ``` ```graphql [Get Channels] query { channels { id name defaultLanguageId defaultCurrencyId } } ``` ```graphql [Search Products] query { products( first: 10 filter: { freeTextSearch: "shirt" } ) { nodes { id name { texts { value } } brand { name } } } } ``` :: ### REST Explorer (Management API) For the Management API, we recommend using: - **Postman** — Import our Postman collection - **cURL** — Quick command-line testing - **Your IDE** — HTTP client extensions for VS Code, IntelliJ #### Sample REST Calls ```bash # List markets curl 'https://mgmtapi.geins.io/API/Market/List' \ -H 'Authorization: Basic YOUR_CREDENTIALS' \ -H 'X-ApiKey: {MGMT_API_KEY}' # Get product by ID curl 'https://mgmtapi.geins.io/API/Product/123' \ -H 'Authorization: Basic YOUR_CREDENTIALS' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ### Tools & Extensions | Tool | API | Features | | ----------------------- | -------- | ----------------------------------------- | | **GraphQL Playground** | Merchant | Schema explorer, auto-complete, history | | **Postman** | Both | Collections, environment variables, tests | | **Insomnia** | Both | GraphQL support, API design | | **VS Code REST Client** | Both | In-editor HTTP requests | ### Need Help? ::card-group :::card --- icon: i-lucide-book-open title: Full API Reference to: https://geins.io/developers/management-api --- Complete documentation for all endpoints ::: :::card --- icon: i-custom:mcp title: MCP Server to: https://geins.io/developers/getting-started/mcp-server --- AI-powered help in your IDE ::: :: # MCP server ## What is the Model Context Protocol (MCP)? The Model Context Protocol (MCP) is an open-source standard that connects AI applications to external systems. Think of MCP like a USB-C port for AI applications—it provides a standardized way for AI assistants like Claude or ChatGPT to access data sources, tools, and workflows. With MCP, your AI copilot can connect directly to Geins Commerce Backend, enabling it to understand our features, suggest the right tools for your project, and even scaffold code tailored to your specific needs. This transforms your AI assistant into a knowledgeable partner that understands the Geins ecosystem and can help you build faster and more effectively. ## Agentic assistance When you need help to build a feature, you can ask the MCP server to scaffold the code for you or suggest the right tool for the job. ### Developer-friendly experience Use the MCP server in your copilot to get help with your Geins projects. If you need help to build a custom experience for your customers, the MCP server can help suggesting the right features and tools to use. ## Built-in tools The MCP server comes with a set of built-in tools that you can use to get help with your Geins projects. - `list_features`: List all available features in Geins Commerce Backend - `get_feature`: Get details about a specific feature in Geins Commerce Backend - `list_how_to`: List all available how-to articles in Geins Commerce Backend - `get_how_to`: Get details about a specific how-to article in Geins Commerce Backend ## How to use To use the MCP server, you need to add the following configuration to your IDE: ```json { "mcpServers": { "geins": { "type": "http", "url": "https://www.geins.io/mcp" } } } ``` ### Clients - [Cursor](https://cursor.com/docs/context/mcp){rel="nofollow"} - [VsCode](https://code.visualstudio.com/docs/copilot/customization/mcp-servers){rel="nofollow"} - [Claude desktop](https://support.claude.com/en/articles/10949351-getting-started-with-local-mcp-servers-on-claude-desktop){rel="nofollow"} ### Example usage #### Example usage in IDE ```text [Find the right feature] I need to build a customer login feature. Can you help me find the right geins feature and scaffold the code for me? ``` #### Example usage in Claude desktop ```text [Plan a project in Claude desktop combined with Linear MCP server] Im tasked to build a webshop that has the following features: - Customer login - Personalized content - Multi-market support - Product search and filtering - Product listing page - Product detail page - Product reviews - Cart page - Checkout page - Order confirmation page Can you help me plan the project and create a implementation plan for me in Linear? ``` # Geins Studio ::presentation-text Focus on managing your commerce operations efficiently while Geins Studio provides a unified interface for products, customers, orders, wholesale accounts, and content. :: ## Why use Geins Studio? ### Comprehensive administrative interface Geins Studio is a comprehensive administrative interface designed for e-commerce solutions that seamlessly integrates Geins PIM, CRM, WMS, CMS, and other essential tools into a unified, user-friendly platform. ::note Geins Studio is in an early stage. More features and integrations are continuously being added. Read more in the [Geins Studio docs](https://docs.geins.studio){rel="nofollow"}. :: ### Developer-friendly experience Built with modern technologies and full TypeScript support, Geins Studio provides intelligent autocomplete, type safety, and excellent developer experience. The application uses a repository pattern to provide a consistent and type-safe interface for interacting with the Geins API. ### Open source and customizable Geins Studio is fully customizable and open source under the MIT License. Own your code and extend your Geins Studio to your specific business needs with the flexibility to modify and enhance any part of the application. ### Production-ready Built on Nuxt.js and compatible with modern deployment platforms, Geins Studio is production-ready and designed for real-world commerce operations. The application includes comprehensive authentication, state management, and responsive design for managing commerce operations at scale. ## Getting started ### Prerequisites Before setting up Geins Studio, ensure you have: - Node.js (v20.0.0 or higher) - A Geins account ### Installation Clone the [repository](https://github.com/geins-io/geins-studio){rel="nofollow"} to create your own project. Then install dependencies: ::code-group ```bash [npm] npm install ``` ```bash [yarn] yarn install ``` ```bash [pnpm] pnpm install ``` :: ### Environment configuration Create an `.env` file in the project root and configure the following variables: - `GEINS_API_URL` - The URL to the Geins API (required) - `AUTH_SECRET` - A secret key used to hash tokens, sign and encrypt cookies (required) - `BASE_URL` - The URL to the application (required in production) - `GEINS_DEBUG` - Debug flag (optional) ### Start development The application will be running at `http://localhost:3000`. ::tip For more details, refer to the [Getting started](https://docs.geins.studio/introduction/getting-started){rel="nofollow"} guide in the Geins Studio documentation. :: ## What can you build? Geins Studio serves as a foundation for building: - **E-commerce admin interfaces** - Manage products, categories, inventory, and pricing with a complete PIM system - **Customer management portals** - Handle customer relationships, authentication, and user management through integrated CRM - **Wholesale management systems** - Manage wholesale accounts, price lists, and B2B operations - **Order management dashboards** - Track and manage orders with comprehensive order management features - **Multi-tenant platforms** - Support multiple accounts and channels with built-in multi-account authentication ## Core features ### Authentication & User Management Geins Studio uses a JWT-based authentication system built upon `@sidebase/nuxt-auth`. The authentication flow includes: - Login with credentials and multi-factor authentication (MFA) support - Multi-account selection for users with access to multiple accounts - Automatic token refresh and session management - Global authentication middleware protecting all routes ### Repository Pattern API The application uses a repository pattern providing consistent, type-safe interfaces for API interactions. Core repositories include: - **Global Repository** - System-wide operations for accounts, channels, and currencies - **Product Repository** - Specialized repository for product-related operations - **Wholesale Repository** - Repository for wholesale operations - **Customer Repository** - Repository for customer management - **Order Repository** - Repository for order management - **User Repository** - Repository for user operations Access repositories easily through the `useGeinsRepository` composable. ### Entity Management The concept of entities is used throughout the application to dynamically handle various types of content data such as products, categories, users, and more. This provides a flexible and reusable approach to managing different data types. Entity pages follow a consistent URL pattern: `/{parent}/{entity}/{id}` for individual items, `/{parent}/{entity}/list` for list views, and `/{parent}/{entity}/new` for creation. Generic type definitions ensure type safety and consistency. ### Wholesale Management Recent enhancements include comprehensive wholesale capabilities: - Wholesale accounts management - Price lists with advanced product selection and quantity-based pricing - Global price list rules - Orders grid for wholesale accounts ### State Management The application uses Pinia for state management with dedicated stores for: - Account management - User data and authentication state - Product data - Breadcrumb navigation ## Repository structure Geins Studio follows a clean, organized structure for easy navigation and development. The main directories include: - **app/** - Core application code including components, composables, layouts, pages, and stores - **server/** - Server-side API routes and utilities including authentication handlers - **shared/** - Shared types and utilities used across the application - **docs/** - VitePress documentation site - **i18n/** - Internationalization files - **test/** - Test suites and utilities This structure promotes: - **Clear separation of concerns** - Client-side, server-side, and shared code are clearly separated - **Type safety** - Shared types ensure consistency across the application - **Documentation** - Documentation lives alongside the code using VitePress - **Developer experience** - Well-organized structure makes it easy to find and modify code ## Technology stack Geins Studio is built with modern, production-ready technologies: ### Core technologies - **Nuxt.js** - Vue.js framework for building performant web applications - **TypeScript** - Full TypeScript implementation for type safety and excellent developer experience - **Vue 3** - Modern reactive JavaScript framework ### UI & Styling - **shadcn-vue** - Re-usable component library built on Radix Vue - **Tailwind CSS** - Utility-first CSS framework for rapid UI development - **Lucide Icons** - Beautiful, consistent icon set ### State & Data Management - **Pinia** - Official state management library for Vue - **VeeValidate + Zod** - Form validation with schema-based validation - **TanStack Table** - Headless table library for building data tables ### Authentication & Security - **@sidebase/nuxt-auth** - Authentication module for Nuxt - **NextAuth.js** - Complete authentication solution - **JWT Decode** - JWT token handling ### Development tools - **ESLint** - Code linting and formatting - **Prettier** - Code formatting with Vue and Tailwind CSS plugins - **Vitest** - Unit testing framework - **Changelogen** - Automated changelog generation - **VitePress** - Documentation site generator ### Package management The application uses Yarn as its package manager and requires Node.js version 20 or higher. ## Theming and customization Geins Studio is fully customizable with Tailwind CSS and shadcn-vue. The theme can be modified in the main CSS file, and the application includes built-in color mode support with light and dark themes. For detailed theming instructions, explore: - shadcn-vue Themes - Tailwind CSS Documentation The design system documentation can be found in the getting started guide. ## Deployment Geins Studio is designed for flexible deployment options. The application is configured as a Single Page Application (SPA) and can be deployed to various platforms. A Dockerfile is included for containerized deployments. The Nuxt configuration supports custom Nitro presets for different deployment targets. ## Repository resources ### Official links - **GitHub Repository** - [github.com/geins-io/geins-studio](https://github.com/geins-io/geins-studio){rel="nofollow"} - Source code, issues, and pull requests - **Documentation Site** - Full documentation with VitePress (hosted in `docs/` within the repository) - **Geins Platform** - [Get a free trial](https://www.geins.io){rel="nofollow"} ### Contributing Geins Studio is open source, and contributions are welcome! Whether you're fixing bugs, adding features, improving documentation, or reporting issues, your contributions help make Geins Studio better for everyone. To get started: 1. **Report issues** - Found a bug or have a feature request? Open an issue on GitHub 2. **Submit pull requests** - Contribute improvements and new features 3. **Improve documentation** - Help make the documentation clearer and more comprehensive 4. **Share feedback** - Let us know what features would improve your experience ### Recent updates The latest version (0.1.1) includes enhancements to wholesale functionality, comprehensive developer documentation updates, and improved code organization. Version 0.1.0 introduced major features including wholesale accounts, price lists, responsive design, and Vercel analytics integration. ## Notes Geins Studio is currently in an early stage of development with features and integrations being continuously added. The application serves as a robust foundation and is built to be easily extendable as new features are developed. The architecture emphasizes flexibility and type safety through the repository pattern, generic entity types, and comprehensive TypeScript support throughout the codebase. This makes it straightforward to extend the application with new entity types, API integrations, and custom business logic. # TypeScript SDK ::presentation-text Focus on building unique customer experiences while the SDK handles complex commerce logic like inventory, orders, payments, and user management. No bloat, it's modular and easy to extend. :: ## Why use the Geins SDK? ### Developer-friendly experience The SDK is built with developers in mind. Full TypeScript support means you get intelligent autocomplete, type safety, and comprehensive documentation right in your IDE. No more guessing API response shapes or hunting through documentation—the types guide you every step of the way. ### Modular architecture Instead of one monolithic package, the SDK is organized into focused modules. Install only what you need, keeping your bundle size lean and your dependencies clear: - **@geins/core** - Foundation for API interactions, GraphQL client, configuration, and event management - **@geins/cms** - Content management for pages, menus, and content areas - **@geins/crm** - Customer relationship management with authentication, profile management, and order history - **@geins/oms** - Order management system with cart, checkout, and order services - **@geins/pim** - Product information management and search ### Open source and community-driven The SDK is open source under the MIT License, meaning you can contribute improvements, customize for your needs, and benefit from community-driven enhancements. We believe in transparency and collaborative development. ### Production-ready Built on Node.js and fully compatible with modern JavaScript and TypeScript environments, the SDK is battle-tested and ready for production workloads. Whether you're building server-side applications or integrating with frameworks like Next.js, Nuxt, or SvelteKit, the SDK fits seamlessly into your stack. ## Getting started ### Installation Install the core package and any modules you need: ::code-group ```bash [pnpm] pnpm add @geins/core @geins/cms @geins/crm @geins/oms @geins/pim ``` ```bash [npm] npm install @geins/core @geins/cms @geins/crm @geins/oms @geins/pim ``` ```bash [yarn] yarn add @geins/core @geins/cms @geins/crm @geins/oms @geins/pim ``` ```bash [bun] bun add @geins/core @geins/cms @geins/crm @geins/oms @geins/pim ``` :: ### Basic setup Initialize the SDK with your configuration: ```typescript [app.ts] import { GeinsCore } from '@geins/core'; import { GeinsCMS } from '@geins/cms'; import { GeinsCRM } from '@geins/crm'; import { GeinsOMS } from '@geins/oms'; const geinsCore = new GeinsCore({ apiKey: '{MERCHANT_API_KEY}', accountName: '{ACCOUNT_NAME}', channel: '{CHANNEL_ID}', locale: '{LANGUAGE_ID}', market: '{MARKET_ID}', }); const geinsCMS = new GeinsCMS(geinsCore); const geinsCRM = new GeinsCRM(geinsCore); const geinsOMS = new GeinsOMS(geinsCore); ``` With just a few lines of code, you're ready to interact with the Geins API using fully typed methods. ## What can you build? The SDK empowers you to build: - **Headless storefronts** - Create custom shopping experiences with complete control over design and UX - **Content management systems** - Build CMS-powered sites with dynamic pages and widgets - **Customer portals** - Develop account management interfaces with authentication and profile features - **Product catalogs** - Implement sophisticated product browsing and search experiences - **Multi-market applications** - Support multiple channels, markets, and languages with built-in multi-market support ## Core packages ### @geins/core The foundation package provides a unified GraphQL client for querying any commerce data, multi-channel support, event system for tracking commerce events, cookie management for sessions, and JWT token handling for secure authentication. It provides the base functionality that other packages build upon. ### @geins/cms Manage dynamic content with dedicated services for menus, content pages, and content areas. Build CMS-powered sites with navigation, marketing pages, and dynamic content blocks—all with type-safe methods. ### @geins/crm Handle customer authentication with login, logout, registration, and token refresh. Manage user profiles with create, update, and delete operations. Includes password management with change and reset functionality, plus access to customer order history. ### @geins/oms Complete order management system with cart service for adding, updating, and removing items, checkout service for handling the entire checkout flow with token-based security, and order service for creating and retrieving orders. Build complete shopping experiences without managing complex order logic. ### @geins/pim Work with product data efficiently. List products, fetch details, handle search functionality, and manage complex product information—all with type-safe methods designed for sophisticated product browsing experiences. ## Repository structure The Geins SDK is organized as a monorepo, keeping all packages and documentation in a single repository for easier maintenance and development: ```text [repository structure] geins-sdk/ ├── packages/ # Core SDK packages (@geins/core, @geins/cms, etc.) ├── apps/ # Applications (docs, examples) │ └── docs/ # SDK documentation site ├── schemas/ # Shared data schemas and type definitions ├── scripts/ # Build, test, and deployment utilities ├── test/ # Test suites and test utilities ├── .github/ # GitHub Actions workflows for CI/CD │ └── workflows/ ├── .husky/ # Git hooks for code quality checks └── .changeset/ # Changeset configuration for versioning ``` This structure promotes: - **Code sharing** - Shared types and utilities live in `schemas/` and are reused across packages - **Consistency** - Unified build, test, and release processes for all packages - **Developer experience** - Single repository makes it easier to contribute and understand the codebase - **Documentation** - Documentation lives alongside the code, keeping it always in sync ## Technology stack The SDK is built with modern, developer-friendly technologies: ### Core technologies - **TypeScript** - Full TypeScript implementation provides type safety, IntelliSense, and excellent developer experience - **Node.js** - Runtime environment ensuring compatibility with server-side JavaScript applications - **ES Modules** - Modern JavaScript module system for tree-shaking and optimal bundle sizes ### Development tools - **[Turborepo](https://turbo.build/repo){rel="nofollow"}** - High-performance build system for fast incremental builds and intelligent caching - **[Changesets](https://github.com/changesets/changesets){rel="nofollow"}** - Semantic versioning and automated changelog generation - **[Husky](https://typicode.github.io/husky/){rel="nofollow"}** - Git hooks for enforcing code quality standards before commits - **[GitHub Actions](https://docs.github.com/en/actions){rel="nofollow"}** - Continuous integration and deployment pipelines for automated testing and releases ### Build and testing - **Modern build tooling** - Optimized build processes for each package - **Comprehensive test suite** - Test coverage across all packages ensures reliability ### Package management The SDK uses **Turborepo** to power the monorepo, providing fast incremental builds, intelligent caching, and parallel task execution. Built on top of npm workspaces, Turborepo ensures consistent dependency versions while dramatically improving build performance through smart caching and task orchestration. ## Repository resources ### Official links - **GitHub Repository** - [github.com/geins-io/geins-sdk](https://github.com/geins-io/geins-sdk){rel="nofollow"} - Source code, issues, and pull requests - **Documentation Site** - Browse the full SDK documentation (hosted in `apps/docs/` within the repository) - **npm Packages** - Install from npm registry: - [@geins/core](https://www.npmjs.com/package/@geins/core){rel="nofollow"} - Core package - [@geins/cms](https://www.npmjs.com/package/@geins/cms){rel="nofollow"} - CMS module - [@geins/crm](https://www.npmjs.com/package/@geins/crm){rel="nofollow"} - CRM module - [@geins/oms](https://www.npmjs.com/package/@geins/oms){rel="nofollow"} - OMS module - [@geins/pim](https://www.npmjs.com/package/@geins/pim){rel="nofollow"} - PIM module ### Contributing The SDK is open source under the MIT License, and we welcome contributions! Whether you're fixing bugs, adding features, improving documentation, or reporting issues, your contributions help make the SDK better for everyone. To get started: 1. **Report issues** - Found a bug or have a feature request? Open an issue on [GitHub](https://github.com/geins-io/geins-sdk/issues){rel="nofollow"} 2. **Submit pull requests** - Check the contributing guidelines in the repository's README 3. **Improve documentation** - Help us make the SDK easier to understand and use 4. **Share feedback** - Let us know what features would make your development experience better ### Examples and starter templates See the SDK in action with these example projects and starter templates: - **[Geins Next.js + Vercel Starter](https://geins.io/developers/geins-nextjs-vercel-starter)** - Production-ready Next.js template # Geins Checkout ::presentation-text Geins Checkout is a modern, developer-friendly checkout solution built on the Geins SDK. Use our hosted version or clone and self-host — either way, you get a plug-and-play checkout that integrates seamlessly with your Geins e-commerce backend. :: ## Why use Geins Checkout? ### Developer-friendly experience Geins Checkout is designed with simplicity and flexibility in mind. Built on the [Geins SDK](https://github.com/geins-io/geins-sdk){rel="nofollow"}, it streamlines checkout integration and reduces development time. Customize branding, integrate payment providers, and deploy with minimal configuration. ### Flexible usage options Choose between our hassle-free hosted version or self-host the repository on your own infrastructure. Both options provide the same powerful checkout functionality, giving you the flexibility to match your deployment preferences. ### Open source and community-driven Geins Checkout is open source under the MIT License, meaning you can contribute improvements, customize for your needs, and benefit from community-driven enhancements. Full transparency and no lock-in. ### Production-ready Designed for real-world e-commerce, Geins Checkout handles payment methods, custom branding, and seamless integration with Geins services. It's ready to handle production workloads right out of the box. ## Getting started ### Prerequisites - A [Geins](https://geins.io){rel="nofollow"} account - A generated checkout token (see [token generation guide](https://sdk.geins.dev/guide/examples/generate-checkout-token.html){rel="nofollow"}) - For self-hosting: Node.js v20 or above and a package manager (npm, yarn, pnpm, or bun) ### Option 1: Hosted version Use our hosted checkout at [checkout.geins.services](https://checkout.geins.services/){rel="nofollow"}. First, generate a checkout token using the [Geins SDK](https://sdk.geins.dev/guide/examples/generate-checkout-token.html){rel="nofollow"}, then access your checkout at: ```text https://checkout.geins.services/{YOUR_CHECKOUT_TOKEN} ``` ### Option 2: Self-hosted Clone and run the checkout on your own infrastructure: ::code-group ```bash [pnpm] git clone https://github.com/geins-io/geins-checkout.git cd geins-checkout pnpm install pnpm dev ``` ```bash [npm] git clone https://github.com/geins-io/geins-checkout.git cd geins-checkout npm install npm run dev ``` ```bash [yarn] git clone https://github.com/geins-io/geins-checkout.git cd geins-checkout yarn install yarn dev ``` :: Create a `.env` file in the project root: ```ini [.env] GEINS_DEBUG=true LATEST_VERSION=v0 BASE_URL=https://localhost:3000 PRODUCT_IMAGE_DOMAIN=commerce.services PRODUCT_IMAGE_BASE_URL=https://{ACCOUNT_NAME}.{DOMAIN}/product/raw/ ``` Your checkout will be available at `http://localhost:3000/{YOUR_CHECKOUT_TOKEN}`. ## What can you build? Geins Checkout empowers you to build: - **Universal checkout experiences** - Complete checkout solution for Geins e-commerce, with or without a storefront - **Custom branded flows** - Fully customizable branding to match your unique look and feel while maintaining core functionality - **Extensive payment integrations** - Supports integration with almost every payment provider available - **Headless commerce** - Use checkout standalone or integrate with any frontend framework - **SDK-powered architecture** - Built on the robust Geins SDK for optimal performance and seamless integration ## Technology stack Geins Checkout is built with modern, developer-friendly technologies: ### Core technologies - **[Nuxt.js](https://nuxt.com){rel="nofollow"}** - Vue.js framework for building universal applications - **[TypeScript](https://www.typescriptlang.org){rel="nofollow"}** - Statically typed JavaScript for enhanced code quality - **[shadcn-vue](https://www.shadcn-vue.com){rel="nofollow"}** - High-quality Vue component library - **[Tailwind CSS](https://tailwindcss.com){rel="nofollow"}** - Utility-first CSS framework for rapid UI development ## Repository resources ### Official links - **GitHub Repository** - [github.com/geins-io/geins-checkout](https://github.com/geins-io/geins-checkout){rel="nofollow"} - Source code, issues, and pull requests - **Hosted Checkout** - [checkout.geins.services](https://checkout.geins.services/){rel="nofollow"} - Use our hosted version - **Generate Token** - [sdk.geins.dev/guide/examples/generate-checkout-token.html](https://sdk.geins.dev/guide/examples/generate-checkout-token.html){rel="nofollow"} - Learn how to generate checkout tokens ### Contributing Geins Checkout is open source under the MIT License, and we welcome contributions! Whether you're fixing bugs, adding features, improving documentation, or reporting issues, your contributions help make Geins Checkout better for everyone. To get started: 1. **Report issues** - Found a bug or have a feature request? Open an issue on [GitHub](https://github.com/geins-io/geins-checkout/issues){rel="nofollow"} 2. **Submit pull requests** - Check the contributing guidelines in the repository's README 3. **Improve documentation** - Help us make Geins Checkout easier to understand and use 4. **Share feedback** - Let us know what features would enhance your development experience # Next.js Commerce x Geins ::presentation-text Vercel's Next.js Commerce x Geins is a high-performance, server-rendered Next.js 15 ecommerce template that integrates the Geins Commerce API with Next.js Commerce, showcasing React Server Components, Server Actions, and modern React APIs. :: ## Why use Next.js Commerce x Geins? ### Server-first architecture Built on Next.js 15 RC with App Router, the template leverages React Server Components for fast, scalable UIs. Server-first rendering means better performance, reduced client-side JavaScript, and optimal Core Web Vitals scores. ### Modern React APIs The template showcases cutting-edge React features including Server Actions for simplified backend logic, `Suspense` for better loading states, and `useOptimistic` for responsive user interactions. These modern patterns enable a superior developer experience and faster development. ### Geins SDK integration Pre-configured with the open-source [Geins SDK](https://github.com/geins-io/geins){rel="nofollow"}, the template seamlessly connects to Geins' commerce backend. Product catalogs, cart management, and checkout flows are integrated out of the box, so you can focus on building your unique shopping experience. ### Open source and community-driven Next.js Commerce x Geins is open source under the MIT License, meaning you can contribute improvements, customize for your needs, and benefit from community-driven enhancements. We believe in transparency and collaborative development. ## Getting started ### Prerequisites - [Node.js](https://nodejs.org/){rel="nofollow"} (v20 or later) - [Geins API Key](https://geins.io/){rel="nofollow"} ### Installation Clone the repository: ```bash git clone https://github.com/geins-io/vercel-nextjs-commerce.git cd vercel-nextjs-commerce ``` Install dependencies: ::code-group ```bash [pnpm] pnpm install ``` ```bash [npm] npm install ``` ```bash [yarn] yarn install ``` ```bash [bun] bun install ``` :: ### Basic setup Link your local instance with Vercel and pull environment variables: ```bash npm i -g vercel vercel link vercel env pull ``` Environment variables are defined in `.env.example` and include: - `GEINS_API_KEY` - Your Geins API key - `GEINS_ACCOUNT_NAME` - Your Geins account name - `GEINS_CHANNEL` - Channel ID - `GEINS_TLD` - Top-level domain - `GEINS_LOCALE` - Language/locale - `GEINS_MARKET` - Market alias - `GEINS_IMAGE_URL` - Image CDN URL - `GEINS_CURRENCY_CODE` - Currency code - `GEINS_CHECKOUT_ID` - Checkout ID Start the development server: ```bash pnpm dev ``` Access the app on {rel="nofollow"}. ## What can you build? Next.js Commerce x Geins empowers you to build: - **High-performance storefronts** - Server-rendered ecommerce sites with optimal performance and SEO - **Modern commerce experiences** - Leverage React Server Components and Server Actions for responsive, interactive shopping experiences - **Headless commerce solutions** - Integrate with Geins backend while maintaining complete control over frontend design - **Multi-market e-commerce** - Support multiple channels, markets, and languages with Geins' built-in multi-market support ## Core features ### React Server Components Build fast, scalable UIs with Next.js's server-first approach. Server Components reduce client-side JavaScript and improve initial load times. ### Server Actions Simplify backend logic and data fetching with Server Actions. No need for separate API routes—handle mutations directly in your components. ### Geins integration The template integrates with [Geins Commerce API](https://geins.io/developers/merchant-api) using the Geins SDK, providing access to product catalogs, cart management, checkout flows, and order processing. ## Technology stack ### Core technologies - **Next.js 15 RC** - React framework with App Router, React Server Components, and Server Actions - **TypeScript** - Statically typed JavaScript for enhanced code quality and developer experience - **React** - Modern React APIs including `Suspense` and `useOptimistic` - **Geins SDK** - Open-source SDK for Geins Commerce API integration ## Repository resources ### Official links - **GitHub Repository** - [github.com/geins-io/vercel-nextjs-commerce](https://github.com/geins-io/vercel-nextjs-commerce){rel="nofollow"} - Source code, issues, and pull requests - **Deploy on Vercel** - [vercel.com/new](https://vercel.com/new/clone?repository-url=https://github.com/geins-io/vercel-nextjs-commerce){rel="nofollow"} - One-click deployment with environment variables pre-configured - **Geins Commerce API** - [Developer Documentation](https://geins.io/developers/merchant-api) - Detailed API documentation and capabilities ### Contributing Next.js Commerce x Geins is open source under the MIT License, and we welcome contributions! Whether you're fixing bugs, adding features, improving documentation, or reporting issues, your contributions help make the starter template better for everyone. To get started: 1. **Report issues** - Found a bug or have a feature request? Open an issue on [GitHub](https://github.com/geins-io/vercel-nextjs-commerce/issues){rel="nofollow"} 2. **Submit pull requests** - Check the contributing guidelines in the repository's README and submit improvements 3. **Improve documentation** - Help us make the starter template easier to understand and use 4. **Share feedback** - Let us know what features would make your development experience better ### Examples and starter templates See Next.js Commerce x Geins in action with these resources: - **[TypeScript SDK](https://geins.io/developers/open-source/type-script-sdk)** - Learn how to integrate Geins SDK packages in your application - **[Geins Checkout](https://geins.io/developers/open-source/geins-checkout)** - Explore the checkout solution that can be integrated with this starter template For more examples, check the repository's README or explore the codebase to see Next.js Commerce and Geins integration patterns. # Nuxt starter ::presentation-text Our Nuxt starter template [Ralph Storefront](https://github.com/geins-io/ralph-storefront){rel="nofollow"} is a production-ready starting point for building commerce applications. It integrates the Geins Merchant API with Nuxt and provides all the essential features needed for a modern ecommerce storefront. :: ## Why use Ralph Storefront? ### Rapid time to market Ralph Storefront eliminates weeks of initial setup and boilerplate code. By leveraging MACH technologies, this PWA launchpad provides a scalable and maintainable foundation that's ideal for optimizing your time to market and delivering a seamless user experience. ### Production-ready out of the box Everything is set up for you — start building your store right away. The launchpad comes with a test drive payment gateway and freight checkout, meaning you can test your store immediately without setting up a payment gateway or freight provider. ### Component-rich architecture Built tightly coupled with [Ralph UI](https://github.com/geins-io/ralph-ui){rel="nofollow"}, a comprehensive component and core functionality library, Ralph Storefront provides dozens of reusable, production-tested components organized according to the Atomic Design methodology. Override any component or create new ones with simple CLI commands. ### Developer-friendly experience Hot reload development server and helpful CLI tools make development fast and enjoyable. Create components, override defaults, and generate image configurations with simple npm commands. ### Open source and community-driven Ralph Storefront is open source under the MIT License, meaning you can contribute improvements, customize for your needs, and benefit from community-driven enhancements. Full transparency and no lock-in. ## Getting started ### Prerequisites - [Node.js](https://nodejs.org/en/){rel="nofollow"} (v16.x.x or higher) - A [Geins account](https://www.geins.io/){rel="nofollow"} - Get started for free ### Installation Create a new project using the Geins CLI: ```bash npx create-geins-app ``` Or clone the [repository](https://github.com/geins-io/ralph-storefront){rel="nofollow"} to create your own project. ### Environment variables In the root of the project, you will find an `.env.example` file. This file contains all the environment variables that are needed for the project to run. ::tip If you want to run your store with a multi market setup (with `/market/language` in the url), then just remove the `DOMAINS` variable and your site will default to multi market. :: | Variable | Description | Required | Example value | | ----------------------- | ------------------------------------------------------------------------------------------------- | -------- | -------------------------------------- | | `API_ENDPOINT` | The API endpoint for your Geins Merchant API | Yes | `https://url.com` | | `API_KEY` | Your Geins Merchant API key | Yes | `00000000-0000-0000-0000-000000000000` | | `AUTH_ENDPOINT` | The auth endpoint for your Geins Merchant API | Yes | `https://url.com` | | `SIGN_ENDPOINT` | The sign endpoint for your Geins Merchant API | Yes | `https://url.com` | | `BASE_URL` | The base URL for your store including http/https without ending slash | Yes | `https://url.com` | | `FALLBACK_CHANNEL_ID` | The fallback channel ID for your store | Yes | `1ǀse` | | `FALLBACK_MARKET_ALIAS` | The fallback market alias for your store | Yes | `se` | | `DEFAULT_LOCALE` | The default locale for your store | Yes | `sv` | | `RALPH_ENV` | The environment for your store (dev, qa or prod) | No | `dev` | | `DOMAINS` | The domains for your store (if you want to use different domains for different languages/markets) | No | `svǀwww.site.se,fiǀwww.site.fi` | If you only have one market, your DOMAINS variable should look like this: `DOMAINS=sv|www.site.se`. For your local dev environment the equivalent would be `DOMAINS=sv|localhost:3000`. ### Start development Install dependencies and start the development server with hot reload: ::code-group ```bash [npm] npm install npm run dev ``` ```bash [yarn] yarn install yarn dev ``` ```bash [pnpm] pnpm install pnpm dev ``` :: Your storefront will be available at {rel="nofollow"}. ## What can you build? Ralph Storefront empowers you to build: - **Progressive web applications** - Full PWA support for app-like experiences on mobile and desktop - **Multi-market storefronts** - Support multiple channels, markets, and languages with built-in internationalization - **Headless commerce solutions** - Complete freedom over frontend design while leveraging Geins backend - **B2C and B2B stores** - Customer type management for retail, wholesale, and hybrid commerce models - **Content-rich experiences** - Integrated CMS with widgets, banners, and dynamic content areas ## Core features ### Full Geins integration Ralph Storefront integrates with all major Geins systems: - **Product Information Management (PIM)** - Complete product catalogs, variants, search, and filtering - **Content Management System (CMS)** - Pages, menus, widgets, and content areas - **Order Management System (OMS)** - Cart, checkout, and order processing - **Customer Relationship Management (CRM)** - Authentication, profiles, and customer management - **Payment Gateway** - Integrated payment processing with multiple providers - **Shipping Gateway** - Freight calculation and shipping methods - **Transactional emails** - Automated email notifications ### Internationalization & Multi-market Comprehensive i18n support includes: - Multiple languages (English, Swedish, Norwegian, Danish, Finnish by default) - Translated routes and content - Multi-market support with separate domains or URL-based routing - Market and language switching - Localized currencies and formatting ### Atomic Design architecture Components are organized according to the Atomic Design methodology: - **Atoms** - Basic building blocks like buttons, inputs, and icons - **Molecules** - Combinations of atoms creating complex elements like forms and menus - **Organisms** - Larger groups forming distinct sections like headers and product cards - **Templates** - Page-level layouts combining organisms - **Pages** - Final rendered pages users interact with This structure promotes reusability, consistency, and maintainability. ### Ralph UI component library Ralph Storefront is built on [Ralph UI](https://www.github.com/geins-io/ralph-ui){rel="nofollow"}, a comprehensive component and core functionality library. All functionality in this library can be easily overridden to meet your unique business requirements. Access Ralph UI documentation locally: ```bash npm run ralph-ui-docs ``` ### Developer CLI tools Ralph Storefront includes helpful CLI commands: **Create new components:** ```bash npm run ralph-create ``` Creates a component file and SCSS file in the correct folder structure based on the Atomic Design pattern. **Override Ralph UI components:** ```bash npm run ralph-ride ``` Override existing components or styles from Ralph UI. Choose to override only styles or the full component. **Generate image sizes:** ```bash npm run ralph-image-sizes ``` Generate the `config/image-sizes.csv` file from your image configuration for import into the Geins image scaling service. ## Repository structure Ralph Storefront follows a clean, organized structure: ```text [repository structure] ralph-storefront/ ├── app/ # Core application code ├── assets/ # Logos, fonts, icons, and static assets ├── components/ # Vue components organized by Atomic Design │ ├── atoms/ # Basic building blocks │ ├── molecules/ # Combined components │ └── organisms/ # Complex component groups ├── config/ # Configuration files │ ├── channel-settings.js # Channel-specific settings │ ├── image-sizes.json # Image size configuration │ └── route-paths.js # Route path configuration ├── languages/ # i18n translation files ├── layouts/ # Nuxt layouts ├── middleware/ # Nuxt middleware ├── pages/ # Nuxt pages ├── static/ # Static files (favicon, meta images, mail assets) ├── store/ # Vuex store modules ├── styles/ # SASS styles (BEM methodology) │ ├── variables/ # SASS variables │ ├── global/ # Global styles │ └── helpers/ # Helper styles ├── nuxt.config.js # Nuxt configuration ├── .env.example # Environment variables example └── Dockerfile # Docker configuration ``` This structure promotes: - **Clear separation of concerns** - Components, pages, layouts, and configuration are clearly separated - **Scalability** - Organized structure makes it easy to add new features - **Maintainability** - Consistent patterns make code easier to understand and modify - **Developer experience** - Logical organization helps developers find what they need quickly ## Technology stack Ralph Storefront is built with modern, production-ready technologies: ### Core technologies - **[Nuxt.js](https://v2.nuxt.com/){rel="nofollow"}** - Vue.js framework for universal applications with server-side rendering - **[Vue.js](https://vuejs.org/){rel="nofollow"}** - Progressive JavaScript framework for building user interfaces - **[GraphQL](https://graphql.org/){rel="nofollow"}** - Query language for APIs providing efficient data fetching - **[Apollo](https://www.apollographql.com/){rel="nofollow"}** - GraphQL client for state management and data fetching ### Styling & Design - **[SASS](https://sass-lang.com/){rel="nofollow"}** - CSS preprocessor for maintainable stylesheets - **[BEM methodology](http://getbem.com/introduction/){rel="nofollow"}** - Block Element Modifier naming convention for CSS - **[Feather Icons](https://feathericons.com/){rel="nofollow"}** - Beautiful, customizable icon set ### Development tools - **ESLint** - Code linting and formatting - **Prettier** - Code formatting - **Stylelint** - CSS/SASS linting ## Extension modules Extend Ralph Storefront's capabilities with specialized modules available on npm. Ralph modules are built on top of Ralph and can be installed via npm to elevate your customer experience. ### Available modules You can find all Ralph modules on [npm](https://www.npmjs.com/~geins-io){rel="nofollow"}. Here are the available modules: ::npm-packages :: ### Installation Install any module via npm: ```bash npm install @geins/ralph-module-gtm ``` ::note Read each module's documentation to learn how to install and use them. Some modules depend on other modules, so make sure to read the documentation carefully. :: ## Configuration & Customization ### Channel settings Configure channel-specific settings in `config/channel-settings.js`: ```javascript [config/channel-settings.js] export const channelSettings = [ { channelId: '1|se', siteName: 'Ralph Storefront', // Change to your store name theme: { 'accent-color': '#131313', // Your brand color // Add more theme variables here }, }, ]; ``` All variables in the `theme` property convert to global CSS variables and can be used throughout the application. ### Runtime configuration Extensive runtime configuration in `nuxt.config.js` allows you to customize: - **Global settings** - Base URL, API endpoints, fallback markets, breakpoints - **Product lists** - Default sorting, page sizes, filter options - **Product pages** - Image ratios, stock limits, schema options, related products - **Checkout** - Payment methods, shipping options, multi-market support - **Cart** - Quantity changers, product image sizes - **Customer types** - B2C, B2B, wholesale configurations - **CMS/Widgets** - Banner colors, product list widgets, image sizes ### Design customization Customize your store's appearance: 1. **Add assets** - Replace logos, fonts, favicon, and meta images in `assets/` and `static/` folders 2. **Update styles** - Modify variables in `styles/variables/`, global styles in `styles/global/`, and helpers in `styles/helpers/` 3. **Configure themes** - Set brand colors and theme variables in channel settings 4. **Add icons** - Include custom icons in `assets/icons/` and use with the `CaIcon` component All styles use SASS and follow the BEM methodology for maintainability. ## Notes Ralph Storefront represents years of e-commerce development experience distilled into a production-ready template. The architecture emphasizes: - **Developer productivity** - CLI tools, hot reload, and organized structure accelerate development - **Performance** - PWA support, optimized images, and server-side rendering ensure fast load times - **Flexibility** - Override any component, customize any configuration, or extend with custom features - **Best practices** - Atomic Design, BEM methodology, and TypeScript support promote maintainable code - **Future-proof** - Built on modern, actively maintained technologies with regular updates The launchpad is actively maintained with regular updates, new features, and improvements. Check the [CHANGELOG.md](https://github.com/geins-io/ralph-storefront/blob/master/CHANGELOG.md){rel="nofollow"} for detailed release notes. # Introduction ## What is a Webhook? A webhook is an automated communication method that sends real-time information to your application when specific events occur. Unlike traditional API calls where you poll for data regularly, webhooks **push** data to your endpoint as events happen. **Simple example:** 1. A customer places an order 2. Geins immediately sends order details to your webhook URL 3. Your application processes the order (trigger fulfillment, send confirmation, etc.) ## Why Use Webhooks? ### Real-Time Efficiency Receive data instantly when events occur. No need to repeatedly check for updates. ### Reduced Server Load Polling requires constant requests. Webhooks only send data when there's something new. - **Polling:** 1,000 requests/hour, 2 orders - **Webhooks:** 2 requests/hour, 2 orders ### Instant Responsiveness React immediately to changes: - Trigger fulfillment when orders are placed - Update search indexes when products change - Send emails when customers register - Sync inventory across systems in real-time ## Quick Start ### 1. Create Your Webhook Endpoint Set up an endpoint that receives webhook POST requests: ```javascript // Example: Node.js + Express app.post('/webhooks/geins', (req, res) => { const { entity, action, id } = req.body; console.log(`${entity} ${action}: ${id}`); // Process the event // ... your logic here ... res.status(200).send('OK'); }); ``` ### 2. Register the Webhook Create a webhook in Geins Management API: ```bash curl -X POST "https://mgmtapi.geins.io/API/Webhook" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MGMT_API_KEY}" \ -u "username:password" \ -d '{ "Entity": "Order", "Name": "Order Notifications", "Actions": "create,complete", "Method": "POST", "Url": "https://your-app.com/webhooks/geins", "Body": "{\"entity\":\"{{entity}}\",\"action\":\"{{action}}\",\"id\":\"{{id}}\"}", "Retry": true }' ``` ### 3. Receive Events When an order is created or completed, your endpoint receives: ```json { "entity": "Order", "action": "create", "id": "12345" } ``` **That's it!** Your application now receives real-time order notifications. ## Common Use Cases ### E-commerce Operations **Order Management** - Trigger warehouse fulfillment when orders are placed - Send customer notifications for order status changes - Update accounting systems when orders are completed - Track returns and refunds in external dashboards **Inventory Sync** - Update stock levels across multiple sales channels - Trigger restock notifications when inventory changes - Sync product data to external marketplaces - Monitor price changes for competitive analysis **Customer Engagement** - Welcome new customers with onboarding emails - Send "back in stock" notifications (ProductMonitor) - Update CRM systems with customer changes ### Integration Scenarios **ERP/Accounting Systems** - Sync orders to accounting software - Update purchase prices and margins - Track payment captures and refunds **Marketing Automation** - Add new customers to email campaigns - Trigger personalized product recommendations - Track customer lifecycle events **Analytics & Monitoring** - Send events to analytics platforms like Google Analytics or Mixpanel - Monitor business metrics in real-time dashboards - Track conversion funnels and user behavior **Communication Platforms** - Post notifications to Slack or Microsoft Teams - Send SMS alerts for high-value orders - Update support tickets when order status changes ## What Can You Listen To? Geins supports webhooks for the following entities: | Category | Entities | | ------------- | ------------------------- | | **Products** | Product, ProductMonitor | | **Catalog** | Brand, Category, Supplier | | **Content** | PageWidget | | **Customers** | Customer | | **Orders** | Order, Capture, Refund | Each entity supports different actions (create, update, delete, etc.). See the [Entities and Actions Reference](https://geins.io/webhooks/entities-and-actions) for complete details. ### Example: Listen to Product Price Changes Use the `{{subEntity}}` placeholder to track specific product changes: ```json { "Entity": "Product", "Actions": "update", "Body": "{\"productId\":\"{{id}}\",\"changeType\":\"{{subEntity}}\"}" } ``` When a price changes, you receive: ```json { "productId": "12345", "changeType": "price" } ``` Filter in your handler to process only price changes. See [Placeholders Reference](https://geins.io/webhooks/placeholders) for details. ## Key Features ### Dynamic Placeholders Customize webhook URLs and payloads with dynamic values: ```json { "Url": "https://api.example.com/{{entity}}/{{action}}", "Body": "{\"id\":\"{{id}}\",\"env\":\"{{environment}}\"}" } ``` Learn more: [Placeholders Reference](https://geins.io/placeholders) ### Retries on Failure When `Retry` is set to `true`: - Failed webhook deliveries are retried **up to 3 times** - Retry interval: **10 minutes** between attempts - Same `x-Idempotency-Key` header used for all retry attempts ### Idempotency All webhook requests include special headers: | Header | Description | Example Value | | ------------------- | ------------------------------------------------------------------ | -------------------------------------- | | `x-Idempotency-Key` | Unique identifier for this webhook event. **Same for all retries** | `550e8400-e29b-41d4-a716-446655440000` | | `x-Timestamp` | When the webhook event was generated | `2024-01-15T10:30:00Z` | ::tip Use `x-Idempotency-Key` in your webhook handler to detect and skip duplicate events. Store processed keys in a cache or database to prevent reprocessing during retries. :: ### Granular Change Tracking The `{{subEntity}}` placeholder tells you exactly what changed (e.g., `price`, `stockBalance`, `image`) without fetching the full entity. ## Documentation Structure This webhook documentation is organized for quick reference: 1. **[Entities and Actions](https://geins.io/webhooks/entities-and-actions)** - What events can you listen to? 2. **[Placeholders](https://geins.io/webhooks/placeholders)** - How to customize webhook content 3. **[API Reference](https://geins.io/webhooks/api-reference)** - Create, update, delete, and manage webhooks 4. **Examples** - Ready-to-use examples: - [Mailchimp Integration](https://geins.io/webhooks/mailchimp) - [Slack Notifications](https://geins.io/webhooks/slack) - [Microsoft Teams Alerts](https://geins.io/webhooks/teams) # Entities and Actions Reference This page provides a complete reference of all entities that support webhooks and their available actions. Use this to understand what events you can listen to in your application. ## Supported Entities The Webhook API supports the following entities: | Entity | Supported Actions | Category | Description | | ------------------ | ----------------------------------------------------------------------------------- | ----------------- | ------------------------------------------------------------- | | **Product** | `create`, `update`, `delete` | Product Lifecycle | Track product data changes | | **ProductMonitor** | `create`, `notify` | Product Lifecycle | Customer subscriptions for product availability notifications | | **Brand** | `create`, `update`, `delete` | Catalog | Monitor brand information | | **Category** | `create`, `update`, `delete` | Catalog | Track category hierarchy and structure changes | | **Supplier** | `create`, `update`, `delete` | Catalog | Supplier information additions and modifications | | **PageWidget** | `update`, `delete` | Content | CMS widget and page content changes | | **Customer** | `create`, `update`, `delete`, `passwordreset`, `obfuscate` | Customer | Customer lifecycle, profile updates, password resets | | **Order** | `create`, `update`, `cancel`, `activate`, `complete`, `lock`, `cancelrow`, `return` | Order | Full order lifecycle from creation to fulfillment | | **Capture** | `create` | Payment | Payment capture processing notifications | | **Refund** | `create` | Payment | Refund creation and processing | ## Action Definitions Understanding what each action represents: ### Common Actions - **`create`** - Triggered when a new entity is created - **`update`** - Triggered when an entity's data is modified - **`delete`** - Triggered when an entity is removed from the system ### Order-Specific Actions - **`cancel`** - Order is cancelled - **`activate`** - Order is activated/confirmed - **`lock`** - Order is locked for processing - **`complete`** - Order fulfillment is completed - **`cancelrow`** - Individual order row (line item) is cancelled - **`return`** - Return is created for the order ### Customer-Specific Actions - **`passwordreset`** - Customer initiates password reset - **`obfuscate`** - Customer data is obfuscated (GDPR compliance) ### ProductMonitor-Specific Actions - **`notify`** - Customer notification is triggered when product becomes available ## Combining Entities and Actions When creating a webhook, you specify: 1. **Entity** - What type of object to monitor 2. **Actions** - Which events to listen for (comma-separated) **Example configurations:** ```json // Monitor all product changes { "Entity": "Product", "Actions": "create,update,delete" } // Track order lifecycle { "Entity": "Order", "Actions": "create,complete,return" } // Customer registration and updates only { "Entity": "Customer", "Actions": "create,update" } ``` ::tip Start with specific actions rather than listening to everything. This reduces noise and makes debugging easier. :: ::note Each entity type supports only specific actions. Attempting to use unsupported actions will result in a `400 Bad Request` error. Refer to the sections above for valid action combinations. :: # Placeholders ## Placeholder Syntax Placeholders use double curly braces: ```text {{placeholderName}} ``` **Example webhook body:** ```json { "event": "{{entity}}.{{action}}", "id": "{{id}}", "environment": "{{environment}}" } ``` **Becomes (when triggered):** ```json { "event": "Product.update", "id": "12345", "environment": "prod" } ``` ## Always Available Placeholders These placeholders are available for **all webhook entities**: | Placeholder | Description | Example Value | | ----------------- | -------------------------------------- | ------------------------------ | | `{{entity}}` | Entity type that triggered the webhook | `Product`, `Order`, `Customer` | | `{{action}}` | Action performed | `create`, `update`, `delete` | | `{{account}}` | Your webshop/account name | `mystore` | | `{{environment}}` | Environment where action occurred | `prod`, `dev`, `qa` | | `{{id}}` | ID(s) of affected entity | `12345` or `12345,12346,12347` | ### ID Placeholder Details The `{{id}}` placeholder can contain: - **Single ID** - When one entity is affected: `12345` - **Comma-separated IDs** - When multiple entities are affected: `12345,12346,12347` ::tip When bulk operations affect multiple entities, all IDs are included in the placeholder. Parse comma-separated values in your webhook handler. :: ## Partially Available Placeholders These placeholders are available **only for specific entities or actions**: | Placeholder | Available For | Description | Example Value | | ----------------- | ---------------------------------------------------------- | ------------------------------------- | ----------------------- | | `{{paymentName}}` | Capture, Refund | Payment method name | `Credit Card`, `PayPal` | | `{{channelName}}` | Capture, Refund, ProductMonitor, Customer (password reset) | Channel/website name | `Main Store` | | `{{channelUrl}}` | Customer (password reset) | Channel/website URL | `https://mystore.com` | | `{{resetKey}}` | Customer (password reset) | Password reset key | `abc123xyz789` | | `{{orderRowId}}` | Order (cancelrow action) | Specific order row ID | `67890` | | `{{returnId}}` | Order (return action) | Return ID | `54321` | | `{{subEntity}}` | Product, Order | What specifically changed (see below) | `price`, `stockBalance` | ### SubEntity Placeholder The `{{subEntity}}` placeholder provides **granular change tracking** for Product and Order entities. It tells you exactly what changed without needing to fetch the full entity. #### When SubEntity is Empty If the **entire entity** was updated (e.g., full product import), `{{subEntity}}` will be **empty**. This indicates a comprehensive change rather than a specific field update. #### Product SubEntity Values | Value | Description | Example Use Case | | --------------- | ---------------------------------------- | ------------------------------------------------------------ | | `stockBalance` | Stock quantity changed | Trigger restock notification, update inventory dashboard | | `price` | Product price updated | Update price comparison feeds, notify customers on watchlist | | `image` | Product image added/modified/deleted | Refresh product image cache, update CDN | | `sortOrder` | Sort order changed | Reindex product listings | | `purchasePrice` | Purchase price updated | Update margin calculations | | `variant` | Variant information changed | Sync variant options to marketplace | | `parameter` | Product parameter added/modified/deleted | Update product specifications on external sites | | `category` | Category assignment changed | Update category navigation, refresh sitemaps | | `relation` | Related products changed | Update "frequently bought together" widgets | | `item` | Product item (SKU) changed | Sync SKU data to ERP system | **Example: Track only price changes** ```json // Webhook body { "event": "{{entity}}.{{action}}", "productId": "{{id}}", "changeType": "{{subEntity}}", "environment": "{{environment}}" } // When price changes { "event": "Product.update", "productId": "12345", "changeType": "price", "environment": "prod" } ``` #### Order SubEntity Values | Value | Description | Example Use Case | | -------- | ----------------------------- | -------------------------------------------------- | | `row` | Order row (line item) changed | Update fulfillment system when items added/removed | | `status` | Order status changed | Send customer notification for status updates | ## ProductMonitor Placeholders When `entity` is `ProductMonitor`, these additional placeholders are available: | Placeholder | Description | Example Value | | ------------------ | ---------------------- | ------------------------------------------------ | | `{{email}}` | Customer email address | `customer@example.com` | | `{{language}}` | Language code | `en-US`, `sv-SE` | | `{{productId}}` | Monitored product ID | `12345` | | `{{productName}}` | Product name | `Blue Widget` | | `{{productUrl}}` | Product page URL | `https://mystore.com/products/blue-widget` | | `{{productPrice}}` | Current product price | `299.00` | | `{{productImage}}` | Product image URL | `https://cdn.mystore.com/images/blue-widget.jpg` | | `{{itemId}}` | Specific item/SKU ID | `12345-M-BLUE` | | `{{itemName}}` | Item/SKU name | `Blue Widget - Medium` | ::note If a placeholder is not available for the current entity/action combination, it will be **left unchanged** in the output (e.g., `{{unavailablePlaceholder}}`). Handle unreplaced placeholders in your webhook handler. :: # API Reference ## Base URL ```text https://mgmtapi.geins.io/API/Webhook ``` ## Authentication All webhook endpoints require: - **X-ApiKey** header with your Management API key - **Basic Auth** (username\:password) ## Create a Webhook Register a new webhook to listen for specific entity events. ### Request `POST /API/Webhook` ### Request Body | Field | Type | Required | Description | | ------------- | ------- | -------- | ----------------------------------------------------------------------------------------- | | `Entity` | string | Yes | Entity type to monitor. See [Entities and Actions](https://geins.io/entities-and-actions) | | `Name` | string | Yes | Descriptive name for the webhook | | `Description` | string | No | Detailed purpose and functionality description | | `Actions` | string | Yes | Comma-separated list of actions (e.g., `create,update,delete`) | | `Method` | string | Yes | HTTP method (typically `POST` or `GET`) | | `Url` | string | Yes | Target endpoint URL (supports [placeholders](https://geins.io/placeholders)) | | `Body` | string | No | Request payload (supports [placeholders](https://geins.io/placeholders)) | | `Headers` | string | No | Additional HTTP headers (e.g., `Content-Type: application/json`) | | `Retry` | boolean | No | Enable automatic retries on failure (default: `false`) | ### cURL Example ```bash curl -X POST "https://mgmtapi.geins.io/API/Webhook" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MGMT_API_KEY}" \ -u "{MGMT_USERNAME}:{MGMT_PASSWORD}" \ -d '{ "Entity": "Order", "Name": "Order Notification", "Description": "Webhook for order updates", "Actions": "update,cancel", "Method": "POST", "Url": "https://yourwebhookendpoint.com/notifications/{{entity}}?action={{action}}", "Body": "{\"order_id\":\"{{id}}\"}", "Headers": "Content-Type: application/json", "Retry": true }' ``` ### Response **Success (200 OK):** ```json { "Resource": "a062696f-26c8-49ed-8067-697378d60b75", "Message": "Success.", "Details": null } ``` ## Get a Webhook Retrieve details about a specific webhook using its unique ID. ### Request `GET /API/Webhook/{webhookId}` ### Path Parameters | Parameter | Type | Required | Description | | ----------- | ---- | -------- | -------------------------------- | | `webhookId` | GUID | Yes | Unique identifier of the webhook | ### cURL Example ```bash curl -X GET "https://mgmtapi.geins.io/API/Webhook/123e4567-e89b-12d3-a456-426614174000" \ -H "Accept: application/json" \ -H "X-ApiKey: {MGMT_API_KEY}" \ -u "{MGMT_USERNAME}:{MGMT_PASSWORD}" \ ``` ### Response **Success (200 OK):** ```json { "Resource": { "Id": "123e4567-e89b-12d3-a456-426614174000", "Entity": "Order", "Name": "Order Notification", "Description": "Webhook for order updates", "Actions": "update,cancel", "Method": "POST", "Url": "https://yourwebhookendpoint.com/notifications/{{entity}}?action={{action}}", "Body": "{\"order_id\":\"{{id}}\"}", "Headers": "Content-Type: application/json", "Retry": true }, "Message": "Success.", "Details": null } ``` ## Update a Webhook Modify an existing webhook's configuration. ### Request `PUT /API/Webhook/{webhookId}` ### Path Parameters | Parameter | Type | Required | Description | | ----------- | ---- | -------- | ------------------------------------------ | | `webhookId` | GUID | Yes | Unique identifier of the webhook to update | ### Request Body Same fields as [Create a Webhook](https://geins.io/#create-a-webhook). All fields can be updated. ### cURL Example ```bash curl -X PUT "https://mgmtapi.geins.io/API/Webhook/123e4567-e89b-12d3-a456-426614174000" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MGMT_API_KEY}" \ -u "{MGMT_USERNAME}:{MGMT_PASSWORD}" \ \ -d '{ "Entity": "Order", "Name": "Order Creation and Update Webhook", "Description": "Webhook for order creation and update events", "Actions": "create,update", "Method": "POST", "Url": "https://yourwebhookendpoint.com/{{entity}}/{{action}}/{{id}}", "Body": "{\"entity\":\"{{entity}}\",\"action\":\"{{action}}\",\"orderId\":\"{{id}}\"}", "Headers": "Content-Type: application/json", "Retry": true }' ``` ### Response **Success (200 OK):** ```json { "Message": "Success.", "Details": null } ``` ## Delete a Webhook Remove a webhook from the system. ### Request `DELETE /API/Webhook/{webhookId}` ### Path Parameters | Parameter | Type | Required | Description | | ----------- | ---- | -------- | ------------------------------------------ | | `webhookId` | GUID | Yes | Unique identifier of the webhook to delete | ### cURL Example ```bash curl -X DELETE "https://mgmtapi.geins.io/API/Webhook/123e4567-e89b-12d3-a456-426614174000" \ -H "X-ApiKey: {MGMT_API_KEY}" \ -u "{MGMT_USERNAME}:{MGMT_PASSWORD}" \ ``` ### Response **Success (200 OK):** ```json { "Message": "Success.", "Details": null } ``` ## List All Webhooks Retrieve all registered webhooks for your account. ### Request `GET /API/Webhook/List` ### Parameters None. Returns all webhooks without filtering. ### cURL Example ```bash curl -X GET "https://mgmtapi.geins.io/API/Webhook/List" \ -H "Accept: application/json" \ -H "X-ApiKey: {MGMT_API_KEY}" \ -u "{MGMT_USERNAME}:{MGMT_PASSWORD}" \ ``` ### Response **Success (200 OK):** ```json { "Resource": [ { "Id": "123e4567-e89b-12d3-a456-426614174000", "Entity": "Order", "Name": "Order Notification", "Description": "Webhook for order updates", "Actions": "update,cancel", "Method": "POST", "Url": "https://yourwebhookendpoint.com/notifications/{{entity}}?action={{action}}", "Body": "{\"order_id\":\"{{id}}\"}", "Headers": "Content-Type: application/json", "Retry": true }, { "Id": "987fcdeb-51a2-43f7-b829-123456789abc", "Entity": "Product", "Name": "Product Price Monitor", "Description": "Monitor product price changes", "Actions": "update", "Method": "POST", "Url": "https://analytics.example.com/product-changes", "Body": null, "Headers": "Content-Type: application/json", "Retry": false } ], "Message": "Success.", "Details": null } ``` ## Error Handling Common HTTP status codes returned by the Webhook API: | Status Code | Description | Common Cause | | --------------------------- | ---------------------------- | ---------------------------------------------- | | `200 OK` | Request successful | GET, PUT operations succeeded | | `201 Created` | Webhook created successfully | POST operation succeeded | | `204 No Content` | Webhook deleted successfully | DELETE operation succeeded | | `400 Bad Request` | Invalid request | Unsupported actions for entity, malformed JSON | | `401 Unauthorized` | Authentication failed | Missing or invalid API key/credentials | | `404 Not Found` | Webhook not found | Invalid webhook ID | | `500 Internal Server Error` | Server error | Contact support | # Mailchimp example ## Introduction Mailchimp is a popular email marketing platform. It provides a platform for sending marketing emails to customers. Mailchimp also supports webhooks, which can be used to send emails to customers. This can be useful for sending notifications about events in geins, such as when an order is locked or when a new customer is created. ## Setting up webhook for locked order This example demonstrates how to configure a webhook to send an email with mailchimp when an order gets locked. The email will include a link to the OMS for more detailed information about the order. - Step 1: Please refer to [Mailchimp documentation](https://mailchimp.com/developer/transactional/guides/send-first-email/){rel="nofollow"} - Step 2: Set up the webhook to listen for `lock` actions on the `Order` entity. #### cURL Example ```bash title="Use cURL to create the webhook" curl -X POST "https://mgmtapi.geins.io/API/Webhook" ` -H "Content-Type: application/json" ` -H "X-ApiKey: {MGMT_API_KEY}" ` -u "user:password" ` -d '{ "Entity": "Order", "Name": "Order Notification email", "Description": "Notifies when an order is locked", "Actions": "lock", "Method": "POST", "Url": "https://mandrillapp.com/api/1.0/messages/send", "Body": "{\"key\": \"YOUR_MAILCHIMP_API_KEY\", \"message\": {\"from_email\": \"me@example.com\", \"subject\": \"order {{id}}\", \"text\": \"Order Details\", \"to\": [{ \"email\": \"you@example.com\", \"type\": \"to\" }]}}", "Headers": "Content-Type: application/json", "Retry": true }' ``` # Slack example ## Introduction Slack is a popular messaging app for teams. It provides a platform for team communication and collaboration. Slack also supports webhooks, which can be used to send notifications to a Slack channel. This can be useful for sending notifications about events in geins , such as when an order is locked or when a new customer is created. ### Setting up webhook for locked order This example demonstrates how to configure a webhook to send a notification to a Slack channel when an order gets locked. The notification will include a link to the OMS for more detailed information about the order. - Step 1: Create the incoming Webhook in Slack. Please refer to [Slack documentation](https://api.slack.com/messaging/webhooks){rel="nofollow"} - Step 2: Set up the webhook to listen for `lock` actions on the `Order` entity. #### cURL Example ```bash title="Use cURL to create the webhook" curl -X POST "https://mgmtapi.geins.io/API/Webhook" ` -H "Content-Type: application/json" ` -H "X-ApiKey: {MGMT_API_KEY}" ` -u "user:password" ` -d '{ "Entity": "Order", "Name": "Order Notification to Slack", "Description": "Notifies when an order is locked", "Actions": "lock", "Method": "POST", "Url": "https://hooks.slack.com/services/00000000000/00000000000/000000000000000000000000", "Body": "{\"text\": \"An order has been locked: \"}", "Headers": "Content-Type: application/json", "Retry": true }' ``` # Microsoft Teams example ## Introduction Microsoft Teams is a popular messaging app for teams. It provides a platform for team communication and collaboration. Microsoft Teams also supports webhooks, which can be used to send notifications to a Teams channel. This can be useful for sending notifications about events in Geins, such as when an order is locked or when a new customer is created. ## Setting up webhook for locked order This example demonstrates how to set up a webhook that triggers on locked orders and sends a notification to a Microsoft Teams channel. The notification includes a button linking to the OMS for detailed order review. - Step 1: Configure the incoming webhook in teams. Please refer to the Teams [documentation](https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook?tabs=dotnet){rel="nofollow"} - Step 2: Set up the webhook to listen for `lock` actions on the `Order` entity. #### cURL Example ```bash title="Use cURL to create the webhook" curl -X POST "https://mgmtapi.geins.io/API/Webhook" ` -H "Content-Type: application/json" ` -H "X-ApiKey: {MGMT_API_KEY}" ` -u "user:password" ` -d '{ "Entity": "Order", "Name": "Locked Order Notification", "Description": "Notifies when an order is locked", "Actions": "lock", "Method": "POST", "Url": "https://company.webhook.office.com/webhookb2/0000000-0000-0000-0000-000000000000/IncomingWebhook/0000000-0000-0000-0000-000000000000/0000000-0000-0000-0000-000000000000", "Body": "{\"text\": \"Order Locked: {{id}}\", \"potentialAction\": [{\"@type\": \"OpenUri\", \"name\": \"View Order\", \"targets\": [{\"os\": \"default\", \"uri\": \"https://webshop.admin.geins.io/Admin/Order/Edit/{{id}}\"}]}]}", "Headers": "Content-Type: application/json", "Retry": true }' ``` # Authentication flow The Geins platform provides a secure authentication system for user management using a signature-based authentication flow. This guide explains the authentication concepts, flow, and available functions for managing user sessions in your application. ## Overview The authentication process in Geins follows a two-step signature-based approach that ensures secure transmission of credentials without exposing sensitive data: 1. **Challenge request**: Send username to get a signature challenge 2. **Credential verification**: Send back the signed credentials with password/action data 3. **Token management**: Receive and manage Bearer tokens and refresh tokens This method prevents credential exposure, replay attacks, and provides a robust foundation for user session management. ::warning **Important**: All calls to the auth service must be handled from the server-side to prevent CORS issues. Do not make direct calls to the auth service from client-side code. :: ## Tokens - **Bearer token**: Short-lived JWT token for API authentication (by default 15 minutes) - **Refresh token**: Longer-lived token for obtaining new Bearer token (by default 7 days) ## Authentication endpoints The Geins authentication system uses two main endpoints: - **Auth Service**: `https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod` - **Signature Service**: `https://merchantapi.geins.io/auth/sign/{MERCHANT_API_KEY}` ## Authentication functions The authentication system supports five main functions for user management: ### Registration Create new user accounts and establish initial authentication sessions. **Purpose**: Register new users with username/email and password :br**Endpoint**: `POST /register`:br**Flow**: Challenge → Signature → Registration with credentials → Commit user to Merchant API **Result**: New user account + Bearer token + Refresh token ::card --- icon: i-lucide-user-plus title: "How to: Register a user →" to: https://geins.io/../how-to/register-user --- Learn more about registering users in this how to guide. :: ### Login Authenticate existing users and establish active sessions. **Purpose**: Verify user credentials and create authenticated session :br**Endpoint**: `POST /login`:br**Flow**: Challenge → Signature → Authentication with credentials :br**Result**: Bearer token + Refresh token for authenticated requests ::card --- icon: i-lucide-user-check title: "How to: Log in user →" to: https://geins.io/../how-to/log-in-user --- Learn more about logging in users in this how to guide. :: ### Password change Allow users to securely update their passwords while maintaining active sessions. **Purpose**: Change user password with current password verification :br**Endpoint**: `POST /password`:br**Flow**: Challenge → Signature → Password change with current + new password :br**Result**: New Bearer token + Refresh token (old tokens invalidated) ::card --- icon: i-lucide-user-cog title: "How to: Change user password →" to: https://geins.io/../how-to/change-user-password --- Learn more about changing user passwords in this how to guide. :: ### Token refresh Maintain sessions by refreshing expired or soon-to-expire bearer tokens using refresh tokens. **Purpose**: Get new bearer token when current token expires or is about to expire :br**Endpoint**: `GET /login` (with refresh token header) :br**Flow**: Send refresh token → Receive new bearer token :br**Result**: New bearer token + New refresh token ::card --- icon: i-lucide-refresh-cw title: "How to: Refresh bearer token →" to: https://geins.io/../how-to/refresh-user-token --- Learn more about refreshing auth tokens in this how to guide. :: ### Logout Securely terminate user sessions and invalidate all tokens. **Purpose**: End user session and invalidate authentication tokens :br**Endpoint**: `GET /logout`:br**Flow**: Send refresh token → Server invalidates tokens :br**Result**: Session terminated, tokens invalidated ::card --- icon: i-lucide-user-x title: "How to: Log out user →" to: https://geins.io/../how-to/log-out-user --- Learn more about logging out users in this how to guide. :: ## Security considerations - **HTTPS only**: All authentication requests must use HTTPS - **Server-side processing**: Handle all auth requests server-side to prevent CORS issues - **Secure storage**: Store refresh tokens in HTTP-only cookies or secure server-side storage - **Proper cleanup**: Clear all tokens on logout and session timeout ## Merchant API integration To use the Geins Merchant API with authenticated users, include the Bearer token in the `Authorization` header of your requests: ```json [headers.json] { "Authorization": "Bearer {BEARER_TOKEN}" } ``` # Create widget When setting up your Geins CMS, you have the option to use the pre-configured widgets that come with the CMS, or to create your own custom widgets that corresponds to your wireframes and design. This page will explain everything you need to know about the **Create widget** function. ## Getting started **Geins Merchant Center** offers a way to create custom widget editors. You can do so by selecting **Create widget** in the top left corner when adding a widget through the **Select widget** panel. Start by writing or pasting the JSON structure you want the CMS to return through the API in the **JSON editor** tab. Your JSON will immediately be converted into a user-friendly editor in the **Editor** tab, with fields and options that are easy to use when later managing the content of your widget. ::tip If you are starting out with mock data in your wireframe project, it is a good idea to paste that JSON in the **JSON editor** tab to instantly get an editor that matches your JSON structure. :: ## Working with templates After getting started with creating your own custom widget editors, you will probably notice that you are creating a lot of similar editors. To make it easier to create these similar editors, you can save them as templates. You will find all your saved templates in the **Templates** tab. From here you can edit, remove and change the order of your templates. ### Creating a template Suppose you want to create a widget editor where you can add a title and then a list of cards, each with some properties. Your JSON could look something like this: ```json [template.json] { "title": "", "cards": [ { "image": "", "buttonText": "", "buttonColor": "", "product": [] } ] } ``` To create a template from this JSON: 1. Enter this in the **JSON editor** tab. 2. Click the **Save as template** button. 3. Fill in the options for your template: - **Template name** - The name of your template. This will be used in the sidebar of the **Select widget** panel, if you choose to show your template as a widget. - **Template icon** - This field is optional. You can add a custom icon for your template if you want to. This field expects a **Materials Icons** code point. You can find a list of all the available icons and their code points here: [Material Icons](https://fonts.google.com/icons?icon.set=Material+Icons){rel="nofollow"}. - **Show as widget** - If you turn this on, your template will appear as a widget in the sidebar of the **Select widget** panel, above the "Create your own" widget. 4. Click **Save template**, then reload the page to see your template in the **Templates** tab and sidebar of the **Select widget** panel (if applicable). ### Editing a saved template 1. Select the template in the **Templates** tab. 2. Make changes in the **JSON editor** tab and click **Save as template** 3. You will now see the same options as when you created the template. If you change the name of the template in this stage, the template will be saved as a new template, and the old one will still exist. 4. Click **Save template** to save your changes. ### Removing a template Navigate to the **Templates** tab and hover over the template you wish to remove. Click the delete icon (‘x’) that appears and confirm your decision to remove the template. ### Changing the order of templates In the **Templates** tab, hover over the "handle" (two horizontal lines) of the template you want to move. Click and hold, then drag the template to a new position. Release to save the new order automatically. Reload the page to view the updated order in the sidebar of the **Select widget** panel. ### Using a template To use a template, select it from sidebar of the **Select widget** panel or select **Create widget** and choose your template from the **Templates** tab. The editor for your template will then appear in the **Editor** tab. ## Settings In the **Settings** tab, you will find another JSON code editor with global input settings for all your templates. Use these settings to override default behavior or to specify custom input types and input rules for your editor. The settings for input types is an array called `inputTypes` and the settings for rules is an array called `inputRules`. In this section we will go through how to use them. ### Default behavior Here follows a specification on when some input types will be used by default. | Input type | When it will be used by default | | ---------- | ----------------------------------------------------------------------- | | `text` | If the value is a `String` | | `checkbox` | If the value is a `Boolean` | | `number` | If the value is a `Number` | | `textarea` | If the value is a `String` that are longer than 100 characters | | `image` | If your key includes 'image', for example `headerImage` or just `image` | | `color` | If your key includes 'color', for example `buttonColor` or just `color` | | `product` | If your key includes 'product', for example `products` or `product` | ### Input types If you want to override default behavior or specify the input types to be used in your templates, you can do so by adding an array called `inputTypes` to your settings JSON. Here is an example of how it could look: ::code-collapse ```json [settings.json] { "inputTypes": [ { "key": "component", "type": "hidden" }, { "keyIncludes": "img", "type": "image" }, { "key": "textAlign", "type": "radio", "options": [ { "label": "Left", "value": "left" }, { "label": "Center", "value": "center" }, { "label": "Right", "value": "right" } ] }, { "key": "darkMode", "type": "switch" } ] } ``` :: #### Properties ::field-group :::field{name="key / keyIncludes" type="string"} Every object in the array has either a `key` or a `keyIncludes` property. The `key` property is used to specify a specific key in your JSON. The `keyIncludes` property is used to specify a string that should be included in the key. If you use `keyIncludes`, the input type will be applied to all keys that includes the specified string. For example, if you use `keyIncludes` with the string "img", the input type will be applied to all keys that includes the string "img", like "img", "mobileImg", "headerImg" etc. ::: :::field{name="type" type="string"} Every object also has a `type` property. This is used to specify what input type you want to use. You can find all available input types in the table below. ::: :::field{name="options" type="array"} Some objects also requires an `options` property. This is used to specify the options for the input type. For example, if you use the `radio` input type, you need to specify the options for the radio buttons. The options property is an array of objects with a `label` and a `value` property. The `label` property is used to specify the label for the option, and the `value` property is used to specify the value that will be saved to your JSON when the option is selected. ::: :: ::tip Use the `keyIncludes` property if you want to use the same input type for multiple keys. For eg. if you want to use the `switch` input type for all keys that includes "active", you can use `keyIncludes` with the string "active" instead of specifying every key individually. :: #### Available input types | Input type | Description | Output value | Options required | | ---------- | ----------------------------------------------- | ------------ | ---------------- | | `text` | A simple text input | `String` | - | | `checkbox` | A checkbox input | `Boolean` | - | | `number` | A number input | `Number` | - | | `textarea` | A textarea input | `String` | - | | `select` | A select input | `String` | Yes | | `radio` | A radio button input | `String` | Yes | | `hidden` | A hidden input | `String` | - | | `date` | A date picker input | `String` | - | | `time` | A time picker input | `String` | - | | `color` | A color picker input to select a hex color | `String` | - | | `image` | An image uploader | `String` | - | | `product` | A product search to select one or more products | `[Object]` | - | | `multi` | A group of checkboxes | `[String]` | Yes | | `switch` | An on/off switcher | `Boolean` | - | ### Input rules If you want to add display rules for your inputs, you can do so by adding an array called `inputRules` to your settings JSON. Here follows an example of how you could use it. ::code-collapse ```json [settings.json] { "inputRules": [ { "key": "cards", "rules": { "itemsPerRow": 2, "staticItemsQuantity": true, "customLabel": "Product display cards", "description": "Add cards to show in grid" } }, { "key": "title", "rules": { "hideLabel": true, "placeholder": "Enter the title of your list" } }, { "key": "product", "rules": { "productQuantityLimit": 1, "description": "Select the product to display" } }, { "key": "textAlign", "rules": { "defaultValue": "center", } }, { "key": "darkMode", "customLabels": { "true": "Active", "false": "Inactive" } } ] } ``` :: The `inputRules` array contains objects with a `key` property and a `rules` property. The `key` property is used to specify a specific key in your JSON. Like with `inputRules`, you can use `keyIncludes` instead of `key` if you want to. The `rules` property is used to specify the rules for the input. You can find all available rules in the table below. #### Available input rules | Rule | Description | Works with | Default value | Type | | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | ------------------------------------------------------- | --------- | | `customLabel` | Specify a custom label for the input | All input types | For example `textAlign` becomes **Text align** | `String` | | `hideLabel` | Hide the label | All input types | `false` | `Boolean` | | `description` | Add a description for the input. For `Array` and `Object` values this will be shown under the label, otherwise it will be shown under the input. | All input types | - | `String` | | `placeholder` | Add a placeholder for the input | Input types `text`, `number`, `textarea` & `select` | - | `String` | | `defaultValue` | Specify a default value for the input. Set this for the editor to be resetted correctly when user clicks **Clear all data** in the editor. | All input types | `String`: `''` :br `Number`: `0` :br `Boolean`: `false` | Any | | `itemsPerRow` | Specify how many items should be displayed per row in the editor. Recommended to not exceed 4 in a row for UX reasons. | `Array` values | 3 | `Number` | | `staticItemsQuantity` | Specify if the quantity of items should be static or not. If set to `true`, the user will not be able to add or remove items to the array through the editor. | `Array` values | `false` | `Boolean` | | `productQuantityLimit` | Specify the maximum quantity of products that can be added | Input type `product` | No limit | `Number` | | `customLabels` | Specify custom labels for the `switch` input type. The `customLabels` property is an object with two properties, `true` and `false`. | Input type `switch` | `true`: `'On'` :br `false`: `'Off'` | `Object` | ::tip Use the `itemsPerRow` and `staticItemsQuantity` rules to make sure that the editor for your array values looks good and is easy to use for admins. :: # Sitemaps ## Description The Geins platform offer sitemaps that are generated daily at 04:30 UTC Sitemaps are available via our [management-api](https://geins.io/developers/management-api/sitemap/get-get-sitemap) in json-format. It is also possible to fetch sitemaps directly via a http link. Sitemaps are automatically split into multiple files when size limit for a sitemap has been reached. All files are listed in an index file. ## Using Geins sitemaps on a website Sitemaps are available at this URL: [https://carsitemapstorprod.blob.core.windows.net/sitemaps/{{GEINS\_ACCOUNT\_NAME}}/prod/](https://carsitemapstorprod.blob.core.windows.net/sitemaps/%7B%7BGEINS_ACCOUNT_NAME%7D%7D/prod/){rel="nofollow"}:br It is recommended that you forward all request to /sitemap on your storefront to this URL. ### Index file and file names **Index available at:**:br[https://carsitemapstorprod.blob.core.windows.net/sitemaps/{{GEINS\_ACCOUNT\_NAME}}/prod/{{SALES\_CHANNEL\_NAME}}.xml](https://carsitemapstorprod.blob.core.windows.net/sitemaps/%7B%7BGEINS_ACCOUNT_NAME%7D%7D/prod/%7B%7BSALES_CHANNEL_NAME%7D%7D.xml){rel="nofollow"} The hostnames in the index file match the ones configured on your sales channels. **Example:** ```xml https://www.store.se/sitemap/store.se-sv-SE.xml https://www.store.com/sitemap/store.com-en-US.xml ``` **Filename format:** {{ SALES_CHANNEL_NAME }}-{{ LOCALE }} ## Sitemap file contents Each sitemap file contains a list of URLs for products, categories, brands and content pages. When multi market has been configured, Rel alternates for different languages and markets are also included. # Activate promo code on cart ## Prerequisites - Merchant API key - Existing cart id - Valid promo code ## Goals - Activate a promo code on a cart - Complete checkout with the promo code discount applied ## Architecture at a glance - Activate promo code on cart → Complete checkout with discount applied ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Activate promo code on cart Using the `setCartPromoCode` mutation in the Merchant API, you can activate a promo code on a cart at any time before checkout. The promo code will be validated and any applicable discounts will be applied to the cart. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation setCartPromoCode( $id: String! $promoCode: String! $channelId: String $languageId: String $marketId: String ) { setCartPromoCode( id: $id promoCode: $promoCode channelId: $channelId languageId: $languageId marketId: $marketId ) { id promoCode appliedCampaigns { name } items { id skuId quantity campaign { appliedCampaigns { name } prices { price { sellingPriceIncVat isDiscounted } } } } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "id": "{CART_ID}", "promoCode": "SUMMER2025", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation setCartPromoCode($id: String!, $promoCode: String!, $channelId: String, $languageId: String, $marketId: String) { setCartPromoCode(id: $id, promoCode: $promoCode, channelId: $channelId, languageId: $languageId, marketId: $marketId) { id promoCode appliedCampaigns { name } items { id skuId quantity campaign { appliedCampaigns { name } prices { price { sellingPriceIncVat isDiscounted } } } } } }","variables":{"id":"{CART_ID}","promoCode":"SUMMER2024","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "setCartPromoCode": { "id": "638cf54d-74d2-4ff7-86df-45e514b19094", "promoCode": "VIBE_WNR", "appliedCampaigns": [ { "name": "Cart Campaign" }, { "name": "VIBE_WNR" } ], "items": [ { "id": "c34a2721-dc52-415f-995a-418d76efa978", "skuId": 1350, "quantity": 1, "campaign": { "appliedCampaigns": [ { "name": "Cart Campaign" }, { "name": "VIBE_WNR" } ], "prices": [ { "price": { "sellingPriceIncVat": 2230.61, "isDiscounted": true } } ] } }, { "id": "b34a2721-dc45-415f-888a-418d76efa123", "skuId": 1351, "quantity": 1, "campaign": { "appliedCampaigns": [ { "name": "Cart Campaign" } ], "prices": [ { "price": { "sellingPriceIncVat": 1234.49, "isDiscounted": true } } ] } } ] } } } ``` ### Complete the checkout After activating the promo code, you can proceed to complete the checkout as usual. The promo code discount will be applied to the cart and included on the order. :::note Depending on campaign settings, the promo code discount may apply to specific items or to the entire cart. The response from the `setCartPromoCode` mutation includes details about which campaigns were applied to the cart as a whole and to individual items, along with the updated prices for each cart item. ::: :: ## Options ### Channel, Language, and Market The mutation also supports optional parameters for multi-market support: ::tip Read more about `channelId`, `languageId`, and `marketId` in the "how to"-article about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access While authentication is not required for this mutation, including a JWT bearer token in the `Authorization` header can provide personalized results based on the authenticated user's context, for example personalized pricing. To include authentication, add the JWT bearer token to your request headers: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: ## Common pitfalls - Ensure the promo code is valid and active in your system. - Promo codes may have conditions such as minimum purchase amount or specific product categories. - Check for expiration dates on promo codes. # Add custom data to cart ## Prerequisites - Merchant API key - Existing cart id ## Goals - Add custom data to a cart - Complete checkout with the custom data attached to cart on the order ## Architecture at a glance - Add custom data to cart → Complete checkout with saved data ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Add custom data to cart Using the `setCartMerchantData` mutation in the Merchant API, you can add custom data to a cart at any time before checkout. The expected format is a stringified JSON object, which allows you to store multiple key-value pairs. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation setCartMerchantData( $id: String! $merchantData: String! $channelId: String $languageId: String $marketId: String ) { setCartMerchantData( id: $id merchantData: $merchantData channelId: $channelId languageId: $languageId marketId: $marketId ) { id merchantData } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "id": "{CART_ID}", "merchantData": "{\"giftMessage\":\"Happy Birthday!\",\"deliveryInstructions\":\"Leave at the front door if no one is home.\"}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation setCartMerchantData($id: String!, $merchantData: String!, $channelId: String, $languageId: String, $marketId: String) { setCartMerchantData(id: $id, merchantData: $merchantData, channelId: $channelId, languageId: $languageId, marketId: $marketId) { id merchantData } }","variables":{"id":"{CART_ID}","merchantData":"{\"giftMessage\":\"Happy Birthday!\",\"deliveryInstructions\":\"Leave at the front door if no one is home.\"}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "setCartMerchantData": { "id": "{CART_ID}", "merchantData": "{\"giftMessage\":\"Happy Birthday!\",\"deliveryInstructions\":\"Leave at the front door if no one is home.\"}" } } } ``` ### Complete the checkout After adding the custom data, you can proceed to complete the checkout as usual. The custom data will be included on the cart that is attached to the order. :: ## Options ### Channel, Language, and Market The mutation also supports optional parameters for multi-market support: ::tip Read more about `channelId`, `languageId`, and `marketId` in the "how to"-article about [using multi-market support](https://geins.io/use-multi-market-support).. :: ### Authenticated access While authentication is not required for this mutation, including a JWT bearer token in the `Authorization` header can provide personalized results based on the authenticated user's context, for example personalized pricing. To include authentication, add the JWT bearer token to your request headers: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: ## Common pitfalls - Ensure the `merchantData` string is properly formatted (e.g., valid JSON). # Add product to cart ## Prerequisites - Merchant API key - Existing cart ID - Valid product SKU ID ::tip Learn how to get a cart ID by following the [Get cart](https://geins.io/get-cart) guide. :: ## Goal - Add products to an existing cart ## Architecture at a glance - Use `addToCart` mutation → Product added to cart → Cart updated with new totals ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Add a product to the cart Use the `addToCart` mutation to add a product to your cart. You'll need the cart ID and a valid SKU ID (as an integer): :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation addToCart( $id: String! $item: CartItemInputType! $channelId: String $languageId: String $marketId: String ) { addToCart( id: $id item: $item channelId: $channelId languageId: $languageId marketId: $marketId ) { id items { id skuId quantity product { name } unitPrice { regularPriceIncVat } totalPrice { regularPriceIncVat } } summary { total { regularPriceIncVat } } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "id": "{CART_ID}", "item": { "skuId": {SKU_ID}, "quantity": 2 }, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation addToCart($id: String!, $item: CartItemInputType!, $channelId: String, $languageId: String, $marketId: String) { addToCart(id: $id, item: $item, channelId: $channelId, languageId: $languageId, marketId: $marketId) { id items { id skuId quantity product { name } unitPrice { regularPriceIncVat } totalPrice { regularPriceIncVat } } summary { total { regularPriceIncVat } } } }","variables":{"id":"{CART_ID}","item":{"skuId":{SKU_ID},"quantity":2},"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "addToCart": { "id": "{CART_ID}", "items": [ { "id": "item-id-1", "skuId": {SKU_ID}, "quantity": 2, "name": "Premium Wireless Headphones", "unitPrice": { "regularPriceIncVat": 99.00 }, "totalPrice": { "regularPriceIncVat": 198.00 } } ], "summary": { "total": { "regularPriceIncVat": 198.00 } } } } } ``` :: ## Adding multiple products To add multiple different products to the cart, call the `addToCart` mutation multiple times. ::note The `addToCart` mutation accepts a single item, not an array. Call it multiple times to add multiple different products. :: ## Quantity behavior When adding a product that already exists in the cart: - The quantity will be **added** to the existing quantity - Example: Cart has 2 units of SKU 12345, adding 3 more results in 5 total units ## Multi-market support The mutation supports optional parameters for multi-market configurations: ::tip Read more about `channelId`, `languageId`, and `marketId` in the [multi-market support guide](https://geins.io/use-multi-market-support). :: ### Authenticated access While authentication is not required for this mutation, including a JWT bearer token in the `Authorization` header can provide personalized results based on the authenticated user's context, for example personalized pricing. To include authentication, add the JWT bearer token to your request headers: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: ## Common pitfalls - Invalid SKU ID - ensure the product exists and is available for purchase - Invalid cart ID - the cart may have expired or been deleted - Out of stock items - check product availability before adding to cart # Build product listing ## Prerequisites - Merchant API key - Known context for `url` or `categoryAlias` (optional) ## Goals - Retrieve products with minimal fields and total count - Fetch facets for filtering - Support simple pagination using `skip` and `take` ## Architecture at a glance - Query `products` → Render list + pagination controls → Apply filters → Re‑query ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Get page info (SEO + subcategories) Use `listPageInfo` to fetch basic SEO and header data for the listing context. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query listPageInfo( $url: String!, $channelId: String, $languageId: String, $marketId: String ) { listPageInfo( url: $url, channelId: $channelId, languageId: $languageId, marketId: $marketId ) { name alias canonicalUrl meta { title description } subCategories { name alias canonicalUrl } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "url": "{LIST_PAGE_URL}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query listPageInfo($url:String!,$channelId:String,$languageId:String,$marketId:String){ listPageInfo(url:$url,channelId:$channelId,languageId:$languageId,marketId:$marketId){ name alias canonicalUrl meta{ title description } subCategories{ name alias canonicalUrl } }}","variables":{"url":"{LIST_PAGE_URL}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: ### Fetch products for the list (with count) Use `products` with `skip`/`take` to build pagination and select minimal fields for PLP cards. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query products( $skip: Int $take: Int $url: String $filter: FilterInputType $channelId: String $languageId: String $marketId: String ) { products( skip: $skip take: $take url: $url filter: $filter channelId: $channelId languageId: $languageId marketId: $marketId ) { products { productId alias name canonicalUrl productImages { fileName } unitPrice { sellingPriceIncVatFormatted } brand { name } } count } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "skip": 0, "take": 12, "url": "{LIST_PAGE_URL}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query products($skip:Int,$take:Int,$url:String,$filter:FilterInputType,$channelId:String,$languageId:String,$marketId:String){ products(skip:$skip,take:$take,url:$url,filter:$filter,channelId:$channelId,languageId:$languageId,marketId:$marketId){ products{ productId alias name canonicalUrl productImages{ fileName } unitPrice{ sellingPriceIncVatFormatted } brand{ name } } count }}","variables":{"skip":0,"take":12,"url":"{LIST_PAGE_URL}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: ### Fetch facets for filters Retrieve facet groups via the same `products` operation by requesting `filters`. This could be done in the same query as above but is usually separated for performance reasons. Fetching of facets can often be run in the background while the initial product list is loading. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query productFilters( $url: String $filter: FilterInputType $channelId: String $languageId: String $marketId: String ) { products( url: $url filter: $filter channelId: $channelId languageId: $languageId marketId: $marketId ) { count filters { facets { filterId group label type values { _id count facetId parentId label order hidden } } } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "url": "{LIST_PAGE_URL}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query productFilters($url:String,$filter:FilterInputType,$channelId:String,$languageId:String,$marketId:String){ products(url:$url,filter:$filter,channelId:$channelId,languageId:$languageId,marketId:$marketId){ count filters{ facets{ filterId group label type values{ _id count facetId parentId label order hidden } } } }}","variables":{"url":"{LIST_PAGE_URL}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json { "data": { "products": { "count": 128, "filters": { "facets": [ { "filterId": "brand", "group": null, "label": "Brand", "type": "Brand", "values": [ { "_id": "acme", "count": 45, "facetId": "b_acme", "parentId": null, "label": "Acme", "order": 1, "hidden": false }, { "_id": "techco", "count": 32, "facetId": "b_techco", "parentId": null, "label": "TechCo", "order": 2, "hidden": false } ] }, { "filterId": "1_2", "group": "Product Attributes", "label": "Color", "type": "Parameter", "values": [ { "_id": "p_1_2_blue", "count": 28, "facetId": "color", "parentId": null, "label": "Blue", "order": 1, "hidden": false }, { "_id": "p_1_2_red", "count": 22, "facetId": "color", "parentId": null, "label": "Red", "order": 2, "hidden": false } ] } ] } } } } ``` :: ## Pagination Use `skip` and `take` parameters for pagination: - `skip`: Number of products to skip (default: 0, max: 6000) - `take`: Number of products to return (default: 20, max: 200) - `count`: Total number of matching products (use for pagination controls) ## Validation - Products array length matches `take` (except when fewer remain) - `count` reflects total items for pagination logic - Basic fields present (`name`, `canonicalUrl`, primary image, price) - Facets returned when `filters` requested ## Options ### Multi‑market support The mutation supports optional parameters for multi-market configurations: ::tip Read more about `channelId`, `languageId`, and `marketId` in the how-to about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access While authentication is not required for these queries, including a JWT bearer token in the `Authorization` header can provide personalized results based on the authenticated user's context, for example personalized pricing and product availability. To include authentication, add the JWT bearer token to your request headers: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: ## Common pitfalls - Using high `skip`/`take` leads to slow pages on large catalogs - Forgetting to request minimal fields can bloat payloads - Facets update based on `filter` and `url` context — keep them in sync # Bulk update sale prices ## Overview Perform a bulk reset of sale prices from a previous promotion and apply new sale prices for the current promotion across one or more markets. ## Prerequisites - Management API access (`X-ApiKey` + `Basic auth credentials`) - Market ID(s) where the promotion runs - Knowledge of Geins standard price list IDs: - Sale price lists have IDs ending in `1` - Campaign price lists (ID ending in `2`) **cannot** be updated; such entries will be ignored and can only be updated by the campaign service - Standard ID formula: `Market ID × 1000000 + Price list type` - Ordinary = `0` - Sale = `1` - Campaign = `2` - Examples: - Market 1, Sale → `1000001` - Market 2, Sale → `2000001` - Access to Merchant Center for verification ## Goal - Remove/clear sale prices that belonged to the previous promotion - Set new sale prices for the current promotion - Do this reliably in bulk with the Management API ## Architecture at a glance - Prepare two payloads (reset payload, new-sale payload) → call Management API bulk update → verify results ## APIs used - Management API: (bulk update price list prices): - `PUT /api/pricelist/price` ## Plan 1. Create a reset payload to clear previous promotion sale values. Use -1 as value to remove Sale price. 2. Create a new-sale payload with the new sale prices. 3. Run a dry-run against a test market or small SKU set. 4. Execute bulk update in batches for production markets. 5. Verify. ## Step-by-step ::steps{level="3"} ### Build reset payload for previous promotion - For each sale price entry to clear, prepare an update that: - Sets the sale price to -1 - Example: :::code-group ```json [Reset Payload] [ { "priceListId": 1000001, "productId": "10001", "price": -1, "currency": "SEK" }, { "priceListId": 1000001, "productId": "10002", "price": -1, "currency": "SEK" } ] ``` ```bash [cURL] curl -L 'https://mgmtapi.geins.io/API/pricelist/price' \ -X PUT \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H "X-ApiKey: {MGMT_API_KEY}" \ -u "{MGMT_USERNAME}:{MGMT_PASSWORD}" \ -d '[ { "priceListId": 1000001, "productId": "10001", "price": -1, "currency": "SEK" }, { "priceListId": 1000001, "productId": "10002", "price": -1, "currency": "SEK" } ]' ``` ::: - Use a dry-run on a small sample to confirm the API accepts the reset format. ### Build new-sale payload for current promotion - Prepare updates with new sale price values and currency: :::code-group ```json [New Sale Payload] [ { "priceListId": 1000001, "productId": "10003", "price": 49.99, "currency": "SEK" }, { "priceListId": 1000001, "productId": "10004", "price": 29.99, "currency": "SEK" } ] ``` ```bash [cURL] curl -L 'https://mgmtapi.geins.io/API/pricelist/price' \ -X PUT \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H "X-ApiKey: {MGMT_API_KEY}" \ -u "{MGMT_USERNAME}:{MGMT_PASSWORD}" \ -d '[ { "priceListId": 1000001, "productId": "10003", "price": 49.99, "currency": "SEK" }, { "priceListId": 1000001, "productId": "10004", "price": 29.99, "currency": "SEK" } ]' ``` ::: ### Execute updates in safe batches - Run the reset payload first in a dry-run or small production batch, verify results. - Next, apply the new-sale payload in batches (e.g., 500–2000 records per request. Do not exceed 5000 records per request.). - Monitor success/failure responses; retry transient failures. ### Verify and publish - Spot-check Products in each market and compare to the backup. - Confirm storefront/checkout pricing reflects changes. - Compare counts: number of records updated vs expected from export. ```json [response.json] { "Message": "Update success.", "Invalid": null, "NotFound": null, "UpdateCount": 2 } ``` :::note If errors occurred, review `Invalid` and `NotFound` arrays in the response for troubleshooting. ::: :: # Change user password ## Prerequisites - Geins account name - Merchant API key - Valid credentials (username and password) ## Goal - Change user password securely - Maintain active session with new Bearer token - Ensure seamless user experience during password change ## Architecture at a glance - Send username → get signature challenge → send current password + new password with signature → receive new Bearer token - Session remains active with refreshed authentication ## APIs used - Auth Service: `https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/password` - Merchant API: `https://merchantapi.geins.io/auth/sign/{MERCHANT_API_KEY}` ::tip You can find your `ACCOUNT_NAME` when you log in to your account. Note that the account name in the auth URL is always followed by `_prod`. :: ::warning **Important**: All calls to the auth service must be handled from the server-side to prevent CORS issues. Do not make direct calls to the auth service from client-side code. :: ## Step-by-step ::steps{level="3"} ### Start password change challenge Send the user's username to get a signature challenge: #### Request example :::code-group ```bash [cURL] curl -X POST "https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/password" \ -H "Content-Type: application/json" \ -d '{ "username": "{USER_EMAIL}" }' ``` ```typescript [auth.ts] // Note: This code should run on the server-side to prevent CORS issues const authUrl = `https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/password`; const challengeResponse = await fetch(authUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ username: '{USER_EMAIL}' }) }); const challengeData = await challengeResponse.json(); ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "sign": "IDENTITY_SIGN_STRING" } ``` ### Get signature from Merchant API Use the signature challenge from step 1 (IDENTITY\_SIGN\_STRING) to get the signed identity: #### Request example :::code-group ```bash [cURL] curl -X GET "https://merchantapi.geins.io/auth/sign/{MERCHANT_API_KEY}?identity={IDENTITY_SIGN_STRING}" \ -H "Cache-Control: no-cache" ``` ```typescript [auth.ts] const params = new URLSearchParams({ identity: 'IDENTITY_SIGN_STRING' }); const signUrl = `https://merchantapi.geins.io/auth/sign/{MERCHANT_API_KEY}?${params}`; const signResponse = await fetch(signUrl, { method: 'GET', cache: 'no-cache' }); const signature = await signResponse.json(); ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "identity": "IDENTITY_SIGN_STRING", "timestamp": "TIMESTAMP_STRING", "signature": "SIGNATURE_STRING" } ``` ### Complete password change Send the signed credentials along with the old and new passwords to complete the password change: #### Request example :::code-group ```bash [cURL] curl -X POST "https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/password" \ -H "Content-Type: application/json" \ -d '{ "username": "{USER_EMAIL}", "password": "{USER_PASSWORD}", "newPassword": "new-password", "signature": { "identity": "IDENTITY_SIGN_STRING", "timestamp": "TIMESTAMP_STRING", "signature": "SIGNATURE_STRING" } }' ``` ```typescript [auth.ts] // Note: This code should run on the server-side to prevent CORS issues const authUrl = `https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/password`; const passwordChangeResponse = await fetch(authUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ username: '{USER_EMAIL}', password: '{USER_PASSWORD}', newPassword: 'new-password', signature: { identity: "IDENTITY_SIGN_STRING", timestamp: "TIMESTAMP_STRING", signature: "SIGNATURE_STRING" } }) }); const passwordChangeData = await passwordChangeResponse.json(); ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "token": "NEW_JWT_BEARER_TOKEN", "maxAge": 900 } ``` ### Update stored tokens Clear the old token and save the new one: :::code-group ```bash [cURL] # Extract new tokens from response headers during password change curl -X POST "https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/password" \ -H "Content-Type: application/json" \ -D headers.txt \ -d '{ "username": "{USER_EMAIL}", "password": "{USER_PASSWORD}", "newPassword": "new-password", "signature": { ... } }' # Extract the new refresh token from headers grep "x-auth-refresh-token" headers.txt ``` ```typescript [auth.ts] const passwordChangeData = await passwordChangeResponse.json(); if (passwordChangeData.token) { const newBearerToken = passwordChangeData.token; // Extract new refresh token from response headers const newRefreshToken = passwordChangeResponse.headers.get('x-auth-refresh-token'); // Update stored tokens with new values updateStoredTokens(newBearerToken, newRefreshToken); } ``` ::: :: ## Security and access - Always use HTTPS for password change requests - Validate current password before attempting change - Old tokens become invalid after successful password change ## Common pitfalls - Not handling the two-step flow properly—both requests to the password endpoint are required - Forgetting to update stored tokens with new values after password change ## Related docs - Login guide: [Log in as user](https://geins.io/log-in-user) - Token refresh guide: [Refresh user token](https://geins.io/refresh-user-token) - Registration guide: [Register user](https://geins.io/register-user) - Full authentication guide: [Authentication flow](https://geins.io/../guides/authentication-flow) # Check out as company user ## Prerequisites - Merchant API key (`X-ApiKey`) - Authenticated user session (JWT bearer token) - User associated with a company account - Existing cart with items (or a quotation cart ID) ::note Company addresses used during checkout are managed separately. See [Manage company addresses](https://geins.io/manage-company-addresses) to add, update, or remove addresses before checking out. :: ## Goals - Check out a regular cart as a company user with company-managed addresses - Load a quotation cart in checkout and understand its restrictions - Place an order for a company cart or finalize a quotation order ## Architecture at a glance - Authenticate company user → `createOrUpdateCheckout` (with company address selection) → `placeOrder` - Authenticate company user → `createOrUpdateCheckout` (with quotation cart) → `finalizeQuotation` ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Create or update checkout as a company user When an authenticated company user calls `createOrUpdateCheckout`, the API automatically detects the company membership and applies company rules: - **Addresses** are restricted to those defined on the company. Custom `billingAddress` and `shippingAddress` fields are not accepted — use `billingAddressId` and `shippingAddressId` instead. - The response includes `billingAddresses` and `shippingAddresses` lists containing the eligible company addresses. - If no address ID is provided, the first matching address is selected by default. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation createOrUpdateCheckout( $cartId: String! $checkout: CheckoutInputType $channelId: String $languageId: String $marketId: String ) { createOrUpdateCheckout( cartId: $cartId checkout: $checkout channelId: $channelId languageId: $languageId marketId: $marketId ) { billingAddress { addressId company addressLine1 zip city country } shippingAddress { addressId company addressLine1 zip city country } billingAddresses { addressId company addressLine1 zip city country } shippingAddresses { addressId company addressLine1 zip city country } shippingOptions { id displayName feeIncVat isSelected } paymentOptions { id displayName feeIncVat isSelected } checkoutStatus } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {JWT_TOKEN}" } ``` ```json [query-variables.json] { "cartId": "{CART_ID}", "checkout": { "shippingAddressId": "{SHIPPING_ADDRESS_ID}", "billingAddressId": "{BILLING_ADDRESS_ID}", "shippingId": 1, "paymentId": 2, "email": "buyer@company.com" }, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"query":"mutation createOrUpdateCheckout($cartId:String!,$checkout:CheckoutInputType,$channelId:String,$languageId:String,$marketId:String){createOrUpdateCheckout(cartId:$cartId,checkout:$checkout,channelId:$channelId,languageId:$languageId,marketId:$marketId){billingAddress{addressId company addressLine1 zip city country}shippingAddress{addressId company addressLine1 zip city country}billingAddresses{addressId company addressLine1 zip city country}shippingAddresses{addressId company addressLine1 zip city country}shippingOptions{id displayName feeIncVat isSelected}paymentOptions{id displayName feeIncVat isSelected}checkoutStatus}}","variables":{"cartId":"{CART_ID}","checkout":{"shippingAddressId":"{SHIPPING_ADDRESS_ID}","billingAddressId":"{BILLING_ADDRESS_ID}","shippingId":1,"paymentId":2,"email":"buyer@company.com"},"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `shippingAddressId` and `billingAddressId` fields are optional. If omitted, the first eligible address from the company is selected automatically. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "createOrUpdateCheckout": { "billingAddress": { "addressId": "101", "company": "Acme Trading AB", "addressLine1": "Industrivägen 10", "zip": "11122", "city": "Stockholm", "country": "SE" }, "shippingAddress": { "addressId": "102", "company": "Acme Trading AB", "addressLine1": "Lagervägen 5", "zip": "11133", "city": "Stockholm", "country": "SE" }, "billingAddresses": [ { "addressId": "101", "company": "Acme Trading AB", "addressLine1": "Industrivägen 10", "zip": "11122", "city": "Stockholm", "country": "SE" } ], "shippingAddresses": [ { "addressId": "102", "company": "Acme Trading AB", "addressLine1": "Lagervägen 5", "zip": "11133", "city": "Stockholm", "country": "SE" } ], "shippingOptions": [ { "id": 1, "displayName": "Standard Shipping", "feeIncVat": 49.00, "isSelected": true } ], "paymentOptions": [ { "id": 2, "displayName": "Invoice", "feeIncVat": 0.00, "isSelected": true } ], "checkoutStatus": "OK" } } } ``` ### Place an order for a company cart After setting up the checkout, place the order using `placeOrder`. The same company rules apply — use `billingAddressId` and `shippingAddressId` instead of free-form addresses. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation placeOrder( $cartId: String! $checkout: CheckoutInputType! $channelId: String $languageId: String $marketId: String ) { placeOrder( cartId: $cartId checkout: $checkout channelId: $channelId languageId: $languageId marketId: $marketId ) { orderId publicId } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {JWT_TOKEN}" } ``` ```json [query-variables.json] { "cartId": "{CART_ID}", "checkout": { "shippingAddressId": "{SHIPPING_ADDRESS_ID}", "billingAddressId": "{BILLING_ADDRESS_ID}", "shippingId": 1, "paymentId": 2, "email": "buyer@company.com" }, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"query":"mutation placeOrder($cartId:String!,$checkout:CheckoutInputType!,$channelId:String,$languageId:String,$marketId:String){placeOrder(cartId:$cartId,checkout:$checkout,channelId:$channelId,languageId:$languageId,marketId:$marketId){orderId publicId}}","variables":{"cartId":"{CART_ID}","checkout":{"shippingAddressId":"{SHIPPING_ADDRESS_ID}","billingAddressId":"{BILLING_ADDRESS_ID}","shippingId":1,"paymentId":2,"email":"buyer@company.com"},"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "placeOrder": { "orderId": "order-id-12345", "publicId": "ORD-2025-001234" } } } ``` ### Check out a quotation cart Quotation carts can also be loaded in `createOrUpdateCheckout`. This lets you preview shipping and payment options before finalizing. The following restrictions apply: - Only shipping and payment methods defined in the quotation are available. - The authenticated user must be the assigned buyer for the quotation. - The cart cannot be modified (items are locked). - Orders from quotation carts are placed via `finalizeQuotation`, **not** `placeOrder`. #### Quotation status requirements A quotation cart can only be used in `getCart` and `createOrUpdateCheckout` if it has an eligible status. The API rejects carts with terminal or inactive statuses: | Status | Allowed in checkout | Notes | | ----------- | ---------------------------------------- | ------------------------------------------------------------------------------------------- | | `PENDING` | Only if `requireConfirmation` is `false` | If `requireConfirmation` is `true`, the buyer must first accept and the seller must confirm | | `ACCEPTED` | Only if `requireConfirmation` is `false` | If `requireConfirmation` is `true`, the cart is blocked until the seller confirms | | `CONFIRMED` | ✅ Yes | Ready for checkout and finalization | | `DRAFT` | ❌ No | Not yet sent to buyer | | `EXPIRED` | ❌ No | Validity period has passed | | `CANCELED` | ❌ No | Canceled by seller | | `REJECTED` | ❌ No | Rejected by buyer | | `FINALIZED` | ❌ No | Already converted to an order | When a quotation has `requireConfirmation: true` and is in `PENDING` status, the API returns an error indicating the quotation must be accepted by the buyer and confirmed by the seller before it can proceed. Similarly, an `ACCEPTED` quotation with `requireConfirmation: true` is blocked until the seller confirms it. Pass the quotation cart ID as the `cartId` argument: :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation createOrUpdateCheckout( $cartId: String! $checkout: CheckoutInputType $channelId: String $languageId: String $marketId: String ) { createOrUpdateCheckout( cartId: $cartId checkout: $checkout channelId: $channelId languageId: $languageId marketId: $marketId ) { shippingOptions { id displayName feeIncVat isSelected } paymentOptions { id displayName feeIncVat isSelected } billingAddress { addressId company addressLine1 city country } shippingAddress { addressId company addressLine1 city country } checkoutStatus } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {JWT_TOKEN}" } ``` ```json [query-variables.json] { "cartId": "{QUOTATION_CART_ID}", "checkout": { "shippingId": 1, "paymentId": 2, "shippingAddressId": "{SHIPPING_ADDRESS_ID}", "billingAddressId": "{BILLING_ADDRESS_ID}" }, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"query":"mutation createOrUpdateCheckout($cartId:String!,$checkout:CheckoutInputType,$channelId:String,$languageId:String,$marketId:String){createOrUpdateCheckout(cartId:$cartId,checkout:$checkout,channelId:$channelId,languageId:$languageId,marketId:$marketId){shippingOptions{id displayName feeIncVat isSelected}paymentOptions{id displayName feeIncVat isSelected}billingAddress{addressId company addressLine1 city country}shippingAddress{addressId company addressLine1 city country}checkoutStatus}}","variables":{"cartId":"{QUOTATION_CART_ID}","checkout":{"shippingId":1,"paymentId":2,"shippingAddressId":"{SHIPPING_ADDRESS_ID}","billingAddressId":"{BILLING_ADDRESS_ID}"},"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note After previewing checkout options, finalize the quotation using the `finalizeQuotation` mutation — see [Finalize a quotation order](https://geins.io/finalize-quotation-order). ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "createOrUpdateCheckout": { "shippingOptions": [ { "id": 1, "displayName": "Freight", "feeIncVat": 0.00, "isSelected": true } ], "paymentOptions": [ { "id": 2, "displayName": "Invoice 30 days", "feeIncVat": 0.00, "isSelected": true } ], "billingAddress": { "addressId": "101", "company": "Acme Trading AB", "addressLine1": "Industrivägen 10", "city": "Stockholm", "country": "SE" }, "shippingAddress": { "addressId": "102", "company": "Acme Trading AB", "addressLine1": "Lagervägen 5", "city": "Stockholm", "country": "SE" }, "checkoutStatus": "OK" } } } ``` :: ## Options ### Multi-market support All mutations support optional parameters for multi-market functionality: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the how-to about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access Authentication is **required** for company checkout. The API uses the JWT bearer token to identify the user's company membership and apply company-specific rules (addresses, pricing). Without a valid token, the checkout will not apply company logic. For quotation carts, authentication is also required — the API verifies that the logged-in user matches the assigned buyer on the quotation. Include the token in the `Authorization` header: ```http Authorization: Bearer {JWT_TOKEN} ``` ::tip See the [authentication flow guide](https://geins.io/../guides/authentication-flow) for details on obtaining and refreshing JWT tokens. :: ## Common pitfalls - **Passing `billingAddress` or `shippingAddress` directly** — Company checkouts reject free-form address input. Use `billingAddressId` and `shippingAddressId` to select from predefined company addresses. - **Calling `placeOrder` on a quotation cart** — Quotation carts must be finalized via `finalizeQuotation`. The `placeOrder` mutation will return an error for quotation carts. - **Quotation in wrong status** — A quotation cart with status `DRAFT`, `EXPIRED`, `CANCELED`, `REJECTED`, or `FINALIZED` cannot be loaded in `getCart` or `createOrUpdateCheckout`. If `requireConfirmation` is enabled, the quotation must reach `CONFIRMED` status before checkout is possible. - **Missing authentication** — Both company checkout and quotation checkout require a valid JWT token. An unauthenticated request will fail. - **Wrong buyer for quotation** — A quotation cart can only be checked out by the user assigned as buyer on that quotation. Attempting to load another user's quotation returns an error. # Check out headless cart ## Overview Learn how to create a cart, add items to it, and then complete the checkout process using Geins Merchant API. ## Prerequisites - Merchant API key - Known SKU to add to the cart - Available shipping ID - Available payment ID ::tip Read the [display shipping/payment options](https://geins.io/display-shipping-payment-options) guide to learn how to retrieve available shipping and payment options for your cart. :: ## Goal - Create a new cart - Add products to the cart - Complete the checkout process and place an order ## Architecture at a glance - Create cart → Add items to cart → Place order → Get order confirmation ## Step-by-step ::steps{level="3"} ### Create a new cart Start by creating a new cart using the `getCart` query. When no cart ID is provided, a new cart will be created automatically. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query getCart( $id: String $channelId: String $languageId: String $marketId: String ) { getCart( id: $id channelId: $channelId languageId: $languageId marketId: $marketId ) { id items { id skuId quantity unitPrice { regularPriceIncVat } totalPrice { regularPriceIncVat } } summary { total { regularPriceIncVat } } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query getCart($id: String, $channelId: String, $languageId: String, $marketId: String) { getCart(id: $id, channelId: $channelId, languageId: $languageId, marketId: $marketId) { id items { id skuId quantity unitPrice { regularPriceIncVat } totalPrice { regularPriceIncVat } } summary { total { regularPriceIncVat } } } }","variables":{"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "getCart": { "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "items": [], "summary": { "total": { ... }, } } } } ``` ### Add items to the cart Now add products to your cart using the `addToCart` mutation. You'll need the cart ID from step 1 and a valid SKU ID (as an integer). #### Request example :::code-group ```graphql [mutation.graphql] mutation addToCart( $id: String! $item: CartItemInputType! $channelId: String $languageId: String $marketId: String ) { addToCart( id: $id item: $item channelId: $channelId languageId: $languageId marketId: $marketId ) { id items { id skuId quantity unitPrice { regularPriceIncVat } totalPrice { regularPriceIncVat } } summary { total { regularPriceIncVat } } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "id": "{CART_ID}", "item": { "skuId": {SKU_ID}, "quantity": 2 }, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation addToCart($id: String!, $item: CartItemInputType!, $channelId: String, $languageId: String, $marketId: String) { addToCart(id: $id, item: $item, channelId: $channelId, languageId: $languageId, marketId: $marketId) { id items { id skuId quantity unitPrice { regularPriceIncVat } totalPrice { regularPriceIncVat } } summary { total { regularPriceIncVat } } } }","variables":{"id":"{CART_ID}","item":{"skuId":{SKU_ID},"quantity":2},"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "addToCart": { "id": "{CART_ID}", "items": [ { "id": "xxx", "skuId": {SKU_ID}, "quantity": 2, "unitPrice": { "regularPriceIncVat": 20.00, }, "totalPrice": { "regularPriceIncVat": 40.00, } } ], "summary": { "total": { ... }, } } } } ``` ### Place the order Complete the checkout process by placing the order using the `placeOrder` mutation. You'll need the cart ID and checkout information including shipping IDs. #### Request example :::code-group ```graphql [mutation.graphql] mutation placeOrder( $cartId: String! $checkout: CheckoutInputType! $channelId: String $languageId: String $marketId: String ) { placeOrder( cartId: $cartId checkout: $checkout channelId: $channelId languageId: $languageId marketId: $marketId ) { orderId publicId } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "cartId": "{CART_ID}", "checkout": { "paymentId": {PAYMENT_ID}, "shippingId": {SHIPPING_ID}, "email": "{USER_EMAIL}", "billingAddress": { "firstName": "John", "lastName": "Doe", "addressLine1": "Street Address 123", "city": "Stockholm", "zip": "12345", "country": "SE" }, }, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation placeOrder($cartId: String!, $checkout: CheckoutInputType!, $channelId: String, $languageId: String, $marketId: String) { placeOrder(cartId: $cartId, checkout: $checkout, channelId: $channelId, languageId: $languageId, marketId: $marketId) { orderId publicId } }","variables":{"cartId":"{CART_ID}","checkout":{"paymentId":{PAYMENT_ID},"shippingId":{SHIPPING_ID},"email":"{USER_EMAIL}","billingAddress":{"firstName":"John","lastName":"Doe","addressLine1":"Street Address 123","city":"Stockholm","zip":"12345","country":"SE"}},"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "placeOrder": { "orderId": "order-id-12345", "publicId": "ORD-2025-001234", } } } ``` :: ## Options ### Multi-market support All mutations and queries support optional parameters for multi-market functionality: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the "how to"-article about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access While authentication is not required for these mutations, including a JWT bearer token in the `Authorization` header can provide personalized results based on the authenticated user's context, for example personalized pricing and pre-filled user information. To include authentication, add the JWT bearer token to your request headers: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: ## Common pitfalls - Ensure the SKU ID exists and is available - Verify that the shipping ID is a valid integer for your merchant setup - Check that the cart has items before attempting to place an order - Note that `addToCart` accepts a single item, not an array - call it multiple times for multiple items # Clone a cart ## Prerequisites - Merchant API key - Existing cart ID to clone ## Goal - Create a new cart by cloning an existing one ## Architecture at a glance - Use `cloneCart` mutation → Get new cart ID → Continue shopping with cloned cart ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Clone an existing cart Use the `cloneCart` mutation to create an exact copy of an existing cart: :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation cloneCart( $id: String! $resetPromotions: Boolean, $channelId: String, $languageId: String, $marketId: String ) { cloneCart( id: $id, resetPromotions: $resetPromotions, channelId: $channelId, languageId: $languageId, marketId: $marketId ) { id } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "id": "{CART_ID}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation cloneCart($id: String!, $resetPromotions: Boolean, $channelId: String, $languageId: String, $marketId: String) { cloneCart(id: $id, resetPromotions: $resetPromotions, channelId: $channelId, languageId: $languageId, marketId: $marketId) { id } }","variables":{"id":"{CART_ID}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "cloneCart": { "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", } } } ``` ### Continue shopping with the cloned cart You can now use the new id with `getCart` to get the newly created cart and continue shopping, add items, and proceed to checkout as usual. :: ## Options ### Reset promotions When cloning a cart, you can choose to reset any applied promotions by setting the `resetPromotions` parameter to `true` in the `cloneCart` mutation. This will remove any applied promo code or price list prices from the cloned cart. ```json [query-variables.json] { "id": "{CART_ID}", "resetPromotions": true, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ### Channel, Language, and Market The mutation also supports optional parameters for multi-market support: ::tip Read more about `channelId`, `languageId`, and `marketId` in the "how to"-article about [using multi-market support](https://geins.io/use-multi-market-support).. :: ### Authenticated access While authentication is not required for this mutation, including a JWT bearer token in the `Authorization` header can provide personalized results based on the authenticated user's context, for example personalized pricing. To include authentication, add the JWT bearer token to your request headers: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: # Show shipping/payment options ## Overview Learn how to fetch available shipping and payment options for a checkout session and update the selection based on customer preferences. This guide covers dynamic option retrieval and handling customer choices. ## Prerequisites - Merchant API key - Existing cart with items ## Goal - Retrieve all available shipping options - Retrieve all available payment options ## Architecture at a glance - Get options → Display to user ## Step-by-step ::steps{level="3"} ### Get available shipping and payment options Create a checkout session to retrieve all available options based on the cart contents and user data (if user is logged in). :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation createOrUpdateCheckout( $cartId: String! $checkout: CheckoutInputType $channelId: String $languageId: String $marketId: String ) { createOrUpdateCheckout( cartId: $cartId checkout: $checkout channelId: $channelId languageId: $languageId marketId: $marketId ) { shippingOptions { id displayName feeIncVat isSelected logo } paymentOptions { id displayName feeIncVat isSelected logo paymentType } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "cartId": "{CART_ID}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation createOrUpdateCheckout($cartId: String!, $checkout: CheckoutInputType, $channelId: String, $languageId: String, $marketId: String) { createOrUpdateCheckout(cartId: $cartId, checkout: $checkout, channelId: $channelId, languageId: $languageId, marketId: $marketId) { shippingOptions { id displayName feeIncVat isSelected logo } paymentOptions { id displayName feeIncVat isSelected logo paymentType } } }","variables":{"cartId":"{CART_ID}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "createOrUpdateCheckout": { "cart": { "id": "{CART_ID}", "summary": { "total": { "regularPriceIncVat": 348.00 } } }, "shippingOptions": [ { "id": 1, "displayName": "Standard", "feeIncVat": 59, "isSelected": true, "logo": null }, { "id": 7, "displayName": "Store pickup", "feeIncVat": 0, "isSelected": false, "logo": "store" } ], "paymentOptions": [ { "id": 23, "displayName": "Klarna Checkout", "feeIncVat": 0, "isSelected": false, "logo": "payment-klarna", "checkoutType": "EXTERNAL" }, { "id": 27, "displayName": "Geins Pay", "feeIncVat": 0, "isSelected": false, "logo": "payment-geins", "checkoutType": "GEINS_PAY" }, { "id": 18, "displayName": "Manual Invoice", "feeIncVat": 0, "isSelected": false, "logo": "payment-invoice", "paymentType": "STANDARD" } ] } } } ``` ### Display options to the customer Use the returned data to display shipping and payment options in your checkout UI. :: ## Options ### Payment types Different payment types require different handling: - **`STANDARD`**: Manual payment method for manual invoicing. Use with `placeOrder` mutation to complete checkout. - **`EXTERNAL`**: Payment providers like Klarna or Svea that use iframes. Returns HTML in `paymentData` after selection for embedding the payment widget. - **`GEINS_PAY`**: Geins Pay method, needs an address provided to return the `paymentData` HTML for embedding the payment widget. ### Multi-market support All mutations support optional parameters for multi-market functionality: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the how-to about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access While authentication is not required for this mutation, including a JWT bearer token in the `Authorization` header can provide personalized results based on the authenticated user's context, for example personalized pricing. To include authentication, add the JWT bearer token to your request headers: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: ## Common pitfalls - Handle cases where options become unavailable (e.g., if shipping address changes) - When changing payment methods, be prepared to handle different payment flows ::warning Some payment and shipping providers require specific front end implementations to work correctly, refer to their documentation for details. :: # Filter products Build faceted product filtering with parameters, categories, and brands. Control filter logic with `includeMode` and facet count calculation with `filterMode`. ## Prerequisites - Merchant API key ## Goals - Fetch available facets for product filtering - Filter products using facet IDs with the `include` field - Understand `includeMode` (INTERSECT vs UNION) for combining filters - Understand `filterMode` (BY\_GROUP vs CURRENT) for facet counts - Work with different facet types and ID formats - Build interactive faceted navigation ## Architecture at a glance - Query `products` → Get available facets → User selects filters → Query `products` with facets applied → Get filtered results ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Get available facets First, fetch products and include the `filters` field to get available facets. This shows you what filters users can apply. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query getAvailableFacets( $categoryAlias: String $skip: Int $take: Int $channelId: String $languageId: String $marketId: String ) { products( categoryAlias: $categoryAlias skip: $skip take: $take channelId: $channelId languageId: $languageId marketId: $marketId ) { products { productId name canonicalUrl } count filters { facets { filterId type group label order values { facetId label count order hidden } } } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "categoryAlias": "headphones", "skip": 0, "take": 12, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ALIAS}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query getAvailableFacets($categoryAlias: String, $skip: Int, $take: Int, $channelId: String, $languageId: String, $marketId: String) { products(categoryAlias: $categoryAlias, skip: $skip, take: $take, channelId: $channelId, languageId: $languageId, marketId: $marketId) { products { productId name canonicalUrl } count filters { facets { filterId type group label order values { facetId label count order hidden } } } } }","variables":{"categoryAlias":"headphones","skip":0,"take":12,"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ALIAS}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "products": { "products": [ { "productId": 1234, "name": "Premium Wireless Headphones", "canonicalUrl": "/p/premium-wireless-headphones" } ], "count": 47, "filters": { "facets": [ { "filterId": "Brand", "type": "Brand", "group": null, "label": "Brand", "order": 0, "values": [ { "facetId": "b_audiopro", "label": "AudioPro", "count": 15, "order": 0, "hidden": false }, { "facetId": "b_soundmax", "label": "SoundMax", "count": 8, "order": 1, "hidden": false } ] }, { "filterId": "Color", "type": "Parameter", "group": "Specifications", "label": "Color", "order": 1, "values": [ { "facetId": "p_1_5_black", "label": "Black", "count": 23, "order": 0, "hidden": false }, { "facetId": "p_1_5_white", "label": "White", "count": 12, "order": 1, "hidden": false }, { "facetId": "p_1_5_silver", "label": "Silver", "count": 7, "order": 2, "hidden": false } ] }, { "filterId": "Connectivity", "type": "Parameter", "group": "Features", "label": "Connectivity", "order": 2, "values": [ { "facetId": "p_2_8_bluetooth", "label": "Bluetooth", "count": 35, "order": 0, "hidden": false }, { "facetId": "p_2_8_wired", "label": "Wired", "count": 18, "order": 1, "hidden": false } ] } ] } } } } ``` :: ### Filter products with multiple facets Apply multiple filters using the `include` field with facet IDs. The default `INTERSECT` mode groups facets and combines them logically. ::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. :: #### Request example ::code-group ```graphql [query.graphql] query filterProducts( $categoryAlias: String $include: [String] $includeMode: IncludeMode $filterMode: FilterMode $skip: Int $take: Int $channelId: String $languageId: String $marketId: String ) { products( categoryAlias: $categoryAlias skip: $skip take: $take filter: { include: $include includeMode: $includeMode filterMode: $filterMode } channelId: $channelId languageId: $languageId marketId: $marketId ) { products { productId name canonicalUrl productImages { fileName } unitPrice { sellingPriceIncVat sellingPriceIncVatFormatted } brand { name alias } } count } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "categoryAlias": "headphones", "include": ["b_audiopro", "b_soundmax", "p_1_5_black", "p_1_5_white", "p_2_8_bluetooth"], "includeMode": "INTERSECT", "filterMode": "BY_GROUP", "skip": 0, "take": 12, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ALIAS}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query filterProducts($categoryAlias: String, $include: [String], $includeMode: IncludeMode, $filterMode: FilterMode, $skip: Int, $take: Int, $channelId: String, $languageId: String, $marketId: String) { products(categoryAlias: $categoryAlias, skip: $skip, take: $take, filter: { include: $include, includeMode: $includeMode, filterMode: $filterMode }, channelId: $channelId, languageId: $languageId, marketId: $marketId) { products { productId name canonicalUrl productImages { fileName } unitPrice { sellingPriceIncVat sellingPriceIncVatFormatted } brand { name alias } } count } }","variables":{"categoryAlias":"headphones","include":["b_audiopro","b_soundmax","p_1_5_black","p_1_5_white","p_2_8_bluetooth"],"includeMode":"INTERSECT","filterMode":"BY_GROUP","skip":0,"take":12,"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ALIAS}"}}' ``` :: ::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. :: #### Response example ::badge **200 OK** :: ```json [response.json] { "data": { "products": { "products": [ { "productId": 1234, "name": "Premium Wireless Headphones - Black", "canonicalUrl": "/p/premium-wireless-headphones", "productImages": [ { "fileName": "headphones-black.jpg" } ], "unitPrice": { "sellingPriceIncVat": 299.00, "sellingPriceIncVatFormatted": "$299.00" }, "brand": { "name": "AudioPro", "alias": "audiopro" } }, { "productId": 1235, "name": "Premium Wireless Headphones - White", "canonicalUrl": "/p/premium-wireless-headphones-white", "productImages": [ { "fileName": "headphones-white.jpg" } ], "unitPrice": { "sellingPriceIncVat": 299.00, "sellingPriceIncVatFormatted": "$299.00" }, "brand": { "name": "SoundMax", "alias": "soundmax" } } ], "count": 12 } } } ``` ::tip With `includeMode: INTERSECT` (default), this returns products from (AudioPro OR SoundMax) AND (black OR white) AND (Bluetooth). See [Understanding include modes](https://geins.io/#understanding-include-modes) below for details. :: ::note **Other filtering options:** - **UNION mode**: Set `includeMode: UNION` to apply OR logic across all facets (products match ANY selected facet). - **Exclude facets**: Use `exclude: ["facetId"]` to filter out products with specific attributes. - **Alternative methods**: `brandIds`, `categoryIds`, `excludeBrandIds`, and `excludeCategoryIds` provide shortcuts, but facets are more flexible. :: \:: ## Understanding include modes The `includeMode` parameter controls how multiple facets are combined logically. ### INTERSECT mode (default) Facets are grouped by type or parameter group, then combined using: - **OR within groups** - Products match any value in the group - **AND between groups** - Products must match at least one value from each group **Example:** ```javascript include: ["b_audiopro", "b_soundmax", "p_1_5_black", "p_1_5_white", "p_2_8_bluetooth", "p_2_8_wired"] // Automatic grouping: // - Brand: b_audiopro, b_soundmax // - Color (param group 1): p_1_5_black, p_1_5_white // - Connectivity (param group 2): p_2_8_bluetooth, p_2_8_wired // Logic applied: (b_audiopro OR b_soundmax) AND (p_1_5_black OR p_1_5_white) AND (p_2_8_bluetooth OR p_2_8_wired) ``` ### UNION mode All facets treated as a flat list with OR logic: **Example:** ```javascript include: ["b_audiopro", "p_1_5_black", "p_2_8_bluetooth"] includeMode: UNION // Logic: b_audiopro OR p_1_5_black OR p_2_8_bluetooth ``` ::tip Use **INTERSECT** for standard faceted navigation (users select from different categories). Use **UNION** for "show me anything matching these" scenarios. :: ## Understanding filter mode The `filterMode` parameter controls how facet counts are calculated in the filter results. This affects the numbers shown next to each filter option in your UI. ### BY\_GROUP mode (recommended) Most common when users interact with filters. Shows counts as if each facet group is selected independently, helping users understand available combinations. **How it works:** - For each facet, shows the count **excluding** filters in its own group - But **including** filters from other groups - Users see realistic counts for what they'll get if they change their selection within a group **Example:** User has selected "AudioPro" brand and "Black" color: ```javascript filter: { include: ["b_audiopro", "p_1_5_black"] includeMode: INTERSECT filterMode: BY_GROUP } // Results show: // Brands: // - AudioPro (15) ← count excludes brand filter, includes color filter // - SoundMax (8) ← count excludes brand filter, includes color filter // Colors: // - Black (15) ← count excludes color filter, includes brand filter // - White (10) ← count excludes color filter, includes brand filter ``` ### CURRENT mode Shows counts for the **current filter results exactly as applied**. All selected filters affect all facet counts. **Example:** Same selection as above: ```javascript filter: { include: ["b_audiopro", "p_1_5_black"] includeMode: INTERSECT filterMode: CURRENT } // Results show: // Brands: // - AudioPro (15) ← count includes all filters // - SoundMax (0) ← filtered out by current selection, not included in results // Colors: // - Black (15) ← count includes all filters // - White (0) ← filtered out by current selection, not included in results ``` ## Understanding facet types Facets can represent different types of filterable attributes. The `type` field in `FilterType` indicates what kind of filter it is: ### Facet types - **`Parameter`** - Product parameters/attributes (e.g., Color, Size, Material, Connectivity) - Grouped by parameter group (specified in `group` field) - Custom sort order supported via `order` field - Most common type for product filtering - **`Brand`** - Product brands - No parameter group - Used for brand filtering - **`Category`** - Product categories - Can have hierarchical structure (use `parentId` in `FilterValueType`) - Used for category-based filtering - **`Sku`** - SKU-level attributes - Represents variant-specific attributes ::tip Use the `type` field to organize filters in your UI. Group all `Parameter` type filters together, and display `Brand` and `Category` filters separately. :: ## Facet ID formats Facet IDs follow specific naming patterns based on the facet type: ### Standard facet formats - **Brand facets**: `b_{brandAlias}` (e.g., `b_audiopro`, `b_soundmax`) - **Category facets**: `c_{categoryAlias}` (e.g., `c_headphones`, `c_electronics`) - **Parameter facets**: `p_{groupId}_{parameterId}_{value}` (e.g., `p_1_5_black`, `p_2_8_bluetooth`) - **SKU facets**: `sku_{value}` (e.g., `sku_large`, `sku_xl`) ### Special facet formats - **Stock status facets**: - In stock: `ss_in_stock` - Out of stock: `ss_out_of_stock` - Order item: `ss_order_item` - **Discount campaign facets**: `dc_{campaignAlias}_{currency}` (e.g., `dc_summer-sale_usd`) - **Price range facets**: `price_{from}_{to}_{currency}` (e.g., `price_100_500_usd`) - **Reduced price facets**: `rp_{type}_{currency}` (e.g., `rp_sale_usd`, `rp_campaign_eur`) ::note While facet IDs typically should be obtained from the `filters` response, there are valid use cases for using known facet IDs directly—such as programmatically excluding out-of-stock items with `exclude: ["ss_out_of_stock"]` or filtering by specific campaigns. However, **use this approach with caution**: facet ID formats and availability can vary based on configuration and market settings. When possible, rely on dynamically fetched facets to ensure compatibility. :: ## Advanced filtering options ### Combining with other filters Facets can be combined with sorting, price filters, and search: ```graphql filter: { include: ["b_audiopro", "p_1_5_black"] includeMode: INTERSECT sort: PRICE price: { min: 50.00, max: 500.00 } searchText: "wireless" } ``` ### Alternative methods For simple filtering, you can use shortcuts (converted to facets internally): - `brandIds: [123]` - Filter by brand IDs - `categoryIds: [456]` - Filter by category IDs - `productIds: [789]` - Filter by specific product IDs - `articleNumbers: ["SKU-001"]` - Filter by article numbers - `excludeBrandIds` / `excludeCategoryIds` - Exclude specific brands/categories ::tip Check current merchant api documentation for the latest available filtering options. :: ## Multi-market support The query supports optional parameters for multi-market configurations: ::tip Read more about `channelId`, `languageId`, and `marketId` in the [multi-market support guide](https://geins.io/use-multi-market-support). :: ## Common pitfalls - **Not showing facet counts** - Display the `count` field to help users understand filter options - **Using hardcoded facet IDs** - Always fetch facets dynamically; they change based on available products - **Ignoring hidden facets** - Check the `hidden` field before displaying facet values - **Misunderstanding INTERSECT mode** - Remember: OR within groups, AND between groups (see [Understanding include modes](https://geins.io/#understanding-include-modes)) - **Not refreshing facets** - Re-fetch `filters` after applying filters to show relevant options only # Finalize a quotation order ## Overview Quotations follow a lifecycle that turns a seller-created proposal into an order. The buyer can accept or reject a quotation, and once accepted and confirmed, either the buyer or the seller can finalize it to place the order. ### Quotation statuses | Status | Description | | ----------- | ----------------------------------------------------------------------------- | | `DRAFT` | Quotation is being prepared by the seller and is not yet visible to the buyer | | `PENDING` | Quotation has been sent to the buyer and is awaiting a response | | `ACCEPTED` | Buyer has accepted the quotation; awaiting seller confirmation if required | | `CONFIRMED` | Seller has confirmed the accepted quotation; ready to be finalized | | `FINALIZED` | Quotation has been finalized and an order has been placed | | `REJECTED` | Buyer has rejected the quotation | | `EXPIRED` | Quotation validity period (`validTo`) has passed without action | | `CANCELED` | Quotation has been canceled by the seller | ::note When `settings.requireConfirmation` is `true`, the quotation must reach `CONFIRMED` status before it can be finalized. The `isBlockedFromCheckout` flag on the cart will be `true` until the seller confirms. When `requireConfirmation` is `false`, the quotation moves directly from `ACCEPTED` to being ready for finalization. :: ## Prerequisites - Merchant API key - JWT token for the authenticated buyer - Known quotation ID (from `listQuotationCarts` or `getQuotationCart`) ## Goal - Accept or reject a quotation - Finalize a confirmed quotation into an order - Understand quotation statuses and the seller confirmation flow ## Architecture at a glance - Buyer accepts quotation → Seller confirms (if required) → Buyer or seller finalizes → Order created - Buyer rejects quotation → Quotation closed ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Check the quotation status Before acting on a quotation, retrieve it to inspect the current status and settings. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query getQuotationCart( $quotationId: Guid! $channelId: String $languageId: String $marketId: String ) { getQuotationCart( quotationId: $quotationId channelId: $channelId languageId: $languageId marketId: $marketId ) { id isBlockedFromCheckout quotation { quotationNumber status validTo settings { requireConfirmation } orderId } } } ``` ```json [headers.json] { "Accept": "application/json", "Authorization": "Bearer {JWT_TOKEN}", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "quotationId": "{QUOTATION_ID}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query getQuotationCart($quotationId: Guid!, $channelId: String, $languageId: String, $marketId: String) { getQuotationCart(quotationId: $quotationId, channelId: $channelId, languageId: $languageId, marketId: $marketId) { id isBlockedFromCheckout quotation { quotationNumber status validTo settings { requireConfirmation } orderId } } }","variables":{"quotationId":"{QUOTATION_ID}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "getQuotationCart": { "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "isBlockedFromCheckout": true, "quotation": { "quotationNumber": "2603-01-0001-00", "status": "PENDING", "validTo": "2026-04-30T23:59:59Z", "settings": { "requireConfirmation": true }, "orderId": null } } } } ``` ### Accept a quotation Call `acceptQuotation` to indicate the buyer agrees with the quotation terms. The status changes from `PENDING` to `ACCEPTED`. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the mutation, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation acceptQuotation( $quotationId: Guid! $channelId: String $languageId: String $marketId: String ) { acceptQuotation( quotationId: $quotationId channelId: $channelId languageId: $languageId marketId: $marketId ) } ``` ```json [headers.json] { "Accept": "application/json", "Authorization": "Bearer {JWT_TOKEN}", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "quotationId": "{QUOTATION_ID}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation acceptQuotation($quotationId: Guid!, $channelId: String, $languageId: String, $marketId: String) { acceptQuotation(quotationId: $quotationId, channelId: $channelId, languageId: $languageId, marketId: $marketId) }","variables":{"quotationId":"{QUOTATION_ID}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "acceptQuotation": true } } ``` ### Reject a quotation If the buyer does not agree with the terms, call `rejectQuotation`. The status changes to `REJECTED` and cannot be acted upon further. #### Request example :::code-group ```graphql [mutation.graphql] mutation rejectQuotation( $quotationId: Guid! $channelId: String $languageId: String $marketId: String ) { rejectQuotation( quotationId: $quotationId channelId: $channelId languageId: $languageId marketId: $marketId ) } ``` ```json [headers.json] { "Accept": "application/json", "Authorization": "Bearer {JWT_TOKEN}", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "quotationId": "{QUOTATION_ID}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation rejectQuotation($quotationId: Guid!, $channelId: String, $languageId: String, $marketId: String) { rejectQuotation(quotationId: $quotationId, channelId: $channelId, languageId: $languageId, marketId: $marketId) }","variables":{"quotationId":"{QUOTATION_ID}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "rejectQuotation": true } } ``` ### Finalize the quotation into an order Once the quotation has been confirmed (status `CONFIRMED`) and `isBlockedFromCheckout` is `false`, call `finalizeQuotation` to place the order. Either the buyer or the seller can perform this step. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the mutation, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation finalizeQuotation( $quotationId: Guid! $channelId: String $languageId: String $marketId: String ) { finalizeQuotation( quotationId: $quotationId channelId: $channelId languageId: $languageId marketId: $marketId ) } ``` ```json [headers.json] { "Accept": "application/json", "Authorization": "Bearer {JWT_TOKEN}", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "quotationId": "{QUOTATION_ID}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation finalizeQuotation($quotationId: Guid!, $channelId: String, $languageId: String, $marketId: String) { finalizeQuotation(quotationId: $quotationId, channelId: $channelId, languageId: $languageId, marketId: $marketId) }","variables":{"quotationId":"{QUOTATION_ID}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "finalizeQuotation": true } } ``` After finalization, retrieve the quotation cart to get the `orderId`: ```graphql query getQuotationCart($quotationId: Guid!) { getQuotationCart(quotationId: $quotationId) { quotation { status orderId } } } ``` :::badge **200 OK** ::: ```json [response.json] { "data": { "getQuotationCart": { "quotation": { "status": "FINALIZED", "orderId": "12345" } } } } ``` :: ## Options ### Multi-market support All mutations support optional parameters for multi-market configurations: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the "how to"-article about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access These mutations require JWT authentication. Include the JWT bearer token in the `Authorization` header: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: ## Common pitfalls - Calling `finalizeQuotation` when `isBlockedFromCheckout` is `true` will fail — the seller must confirm the quotation first when `settings.requireConfirmation` is `true` - Accepting or finalizing an expired quotation (past `validTo`) will fail - Once a quotation is `REJECTED`, `FINALIZED`, or `CANCELED`, no further status transitions are possible - Do not use `placeOrder` on a quotation cart — use `finalizeQuotation` instead ## Related docs - Read quotations: [Get quotation carts](https://geins.io/get-quotation-carts) - Cart basics: [Get cart](https://geins.io/get-cart) - Standard checkout: [Checkout headless cart](https://geins.io/checkout-headless-cart) # Get brands ## Prerequisites - Merchant API key ## Goal - Display a linked list of all brands for navigation or filtering - Create a brands page listing all available brands ## Architecture at a glance - Use `brands` query → Get all brands with details → Display in navigation or listing ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Get all brands Use the `brands` query to retrieve all available brands: :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query brands( $channelId: String $languageId: String $marketId: String ) { brands( channelId: $channelId languageId: $languageId marketId: $marketId ) { name description alias canonicalUrl primaryImage } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query brands($channelId: String, $languageId: String, $marketId: String) { brands(channelId: $channelId, languageId: $languageId, marketId: $marketId) { name description alias canonicalUrl primaryImage { url alt } } }","variables":{"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "brands": [ { "name": "Acme", "description": "Premium quality products since 1950", "alias": "acme", "canonicalUrl": "/b/acme", "primaryImage": "https://cdn.example.com/images/brands/acme-logo.jpg" }, { "name": "TechCorp", "description": "Innovative technology solutions", "alias": "techcorp", "canonicalUrl": "/b/techcorp", "primaryImage": "https://cdn.example.com/images/brands/techcorp-logo.jpg" } ] } } ``` :: ## Multi-market support The query supports optional parameters for multi-market configurations: ::tip Read more about `channelId`, `languageId`, and `marketId` in the [multi-market support guide](https://geins.io/use-multi-market-support). :: ## Common pitfalls - Hardcoding brand URLs - use the `canonicalUrl` field for proper routing # Get cart ## Prerequisites - Merchant API key ## Goal - Retrieve an existing cart by ID - Create a new cart when no ID is provided ## Architecture at a glance - Use `getCart` query with ID → Get existing cart - Use `getCart` query without ID → Create new cart ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Get an existing cart Use the `getCart` query with a cart ID to retrieve an existing cart: :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query getCart( $id: String $channelId: String $languageId: String $marketId: String ) { getCart( id: $id channelId: $channelId languageId: $languageId marketId: $marketId ) { id items { id skuId quantity product { name } unitPrice { regularPriceIncVat } totalPrice { regularPriceIncVat } } summary { total { regularPriceIncVat } } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "id": "{CART_ID}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query getCart($id: String, $channelId: String, $languageId: String, $marketId: String) { getCart(id: $id, channelId: $channelId, languageId: $languageId, marketId: $marketId) { id items { id skuId quantity product { name } unitPrice { regularPriceIncVat } totalPrice { regularPriceIncVat } } summary { total { regularPriceIncVat } } } }","variables":{"id":"{CART_ID}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "getCart": { "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "items": [ { "id": "item-id-1", "skuId": {SKU_ID}, "quantity": 2, "name": "Product Name", "unitPrice": { "regularPriceIncVat": 99.00 }, "totalPrice": { "regularPriceIncVat": 198.00 } } ], "summary": { "total": { "regularPriceIncVat": 198.00 } } } } } ``` ### Create a new cart To create a new cart, use the same `getCart` query but omit the `id` parameter or set it to `null`: #### Request example :::code-group ```json [query-variables.json] { "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "getCart": { "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "items": [], "summary": { "total": { "regularPriceIncVat": 0.00 } } } } } ``` :: ## Options ### Multi-market support The query supports optional parameters for multi-market configurations: ::tip Read more about `channelId`, `languageId`, and `marketId` in the [multi-market support guide](https://geins.io/use-multi-market-support). :: ### Authenticated access While authentication is not required for this query, including a JWT bearer token in the `Authorization` header can provide personalized results based on the authenticated user's context, for example personalized pricing. To include authentication, add the JWT bearer token to your request headers: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: ## Related docs - Add items: [Add product to cart](https://geins.io/add-product-to-cart) - Duplicate cart: [Clone a cart](https://geins.io/clone-a-cart) - Complete purchase: [Checkout headless cart](https://geins.io/checkout-headless-cart) # Get CMS area ## Prerequisites - Merchant API key - An existing CMS family with at least one area ## Goal - Retrieve a page's widget collection by specifying `family` and `areaName` ## Architecture at a glance - Call `widgetArea` with `family` and `areaName` → Receive area containing containers and widgets ## Example Use `family` and `areaName` to fetch a known area. ::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. :: ### Request example ::code-group ```graphql [query.graphql] query widgetArea( $family: String $areaName: String $channelId: String $languageId: String $marketId: String ) { widgetArea( family: $family areaName: $areaName channelId: $channelId languageId: $languageId marketId: $marketId ) { tags containers { layout design widgets { name configuration images { fileName } } } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "family": "{CMS_FAMILY}", "areaName": "{CMS_AREA_NAME}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query widgetArea($family: String, $areaName: String, $displaySetting: String, $channelId: String, $languageId: String, $marketId: String) { widgetArea(family: $family, areaName: $areaName, displaySetting: $displaySetting, channelId: $channelId, languageId: $languageId, marketId: $marketId) { tags containers { layout design widgets { name configuration images { fileName } } } } }","variables":{"family":"{CMS_FAMILY}","areaName":"{CMS_AREA_NAME}","displaySetting":"desktop","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` :: ::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. :: ### Response example ::badge **200 OK** :: ```json [response.json] { "data": { "widgetArea": { "tags": ["startpage"], "containers": [ { "layout": "full", "design": "default", "widgets": [ { "name": "Banner", "configuration": "{...}", "images": [{"fileName": "image.jpg"}] } ] } ] } } } ``` ## Options ::note Read more about filtering options in the "how to"-article about [using CMS area filters](https://geins.io/use-cms-area-filters). :: ### Channel, Language, and Market The query also supports optional parameters for multi-market support: ::tip Read more about `channelId`, `languageId`, and `marketId` in the "how to"-article about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access While authentication is not required for this query, including a JWT bearer token in the `Authorization` header can provide personalized results based on the authenticated user's context, for example personalized or restricted content. To include authentication, add the JWT bearer token to your request headers: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: # Get CMS menu ## Prerequisites - Merchant API key - Menu location ID ## Goal - Fetch the menu tree for a given menu location ## Architecture at a glance - Call `getMenuAtLocation` with `menuLocationId` → Receive a menu with nested items ## Example Use the `getMenuAtLocation` query to fetch a menu and its nested items. ::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. :: ### Request example ::code-group ```graphql [query.graphql] query getMenuAtLocation( $menuLocationId: String! $channelId: String $languageId: String $marketId: String ) { getMenuAtLocation( menuLocationId: $menuLocationId channelId: $channelId languageId: $languageId marketId: $marketId ) { id name title menuItems { id label title canonicalUrl targetBlank type order hidden children { id label canonicalUrl children { id label canonicalUrl } } } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "menuLocationId": "{MENU_LOCATION_ID}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query getMenuAtLocation($menuLocationId: String!, $channelId: String, $languageId: String, $marketId: String) { getMenuAtLocation(menuLocationId: $menuLocationId, channelId: $channelId, languageId: $languageId, marketId: $marketId) { id name title menuItems { id label title canonicalUrl targetBlank type order hidden children { id label canonicalUrl children { id label canonicalUrl } } } } }","variables":{"menuLocationId":"{MENU_LOCATION_ID}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` :: ::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. :: ### Response example ::badge **200 OK** :: ```json [response.json] { "data": { "getMenuAtLocation": { "id": "main-menu", "name": "Main", "title": "Main navigation", "menuItems": [ { "id": "home", "label": "Home", "canonicalUrl": "/", "children": [] }, { "id": "news", "label": "News", "canonicalUrl": "/new-in", "children": [ { "id": "shoes", "label": "Shoes", "canonicalUrl": "/c/shoes" } ... ] } ... ] } } } ``` ## Options ### Channel, Language, and Market The query also supports optional parameters for multi-market support: ::tip Read more about `channelId`, `languageId`, and `marketId` in the "how to"-article about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access While authentication is not required for this query, including a JWT bearer token in the `Authorization` header can provide personalized results based on the authenticated user's context, for example personalized or restricted content. To include authentication, add the JWT bearer token to your request headers: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: # Get CMS Page ## Prerequisites - Merchant API key - Page alias (for example, "about", "contact") ## Goal - Retrieve a page's widget collection by providing its `alias` ## Architecture at a glance - Call `widgetArea` with `alias` → Receive content collection for that page ## Example Use the `alias` argument to fetch the page. ::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. :: ### Request example ::code-group ```graphql [query.graphql] query widgetArea( $alias: String $channelId: String $languageId: String $marketId: String ) { widgetArea( alias: $alias channelId: $channelId languageId: $languageId marketId: $marketId ) { tags containers { layout design widgets { name configuration images { fileName } } } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "alias": "{CMS_PAGE_ALIAS}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query widgetArea($alias: String!, $channelId: String, $languageId: String, $marketId: String) { widgetArea(alias: $alias, channelId: $channelId, languageId: $languageId, marketId: $marketId) { tags containers { layout design widgets { name configuration images { fileName } } } } }","variables":{"alias":"{CMS_PAGE_ALIAS}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` :: ::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. :: ### Response example ::badge **200 OK** :: ```json [response.json] { "data": { "widgetArea": { "tags": ["page"], "containers": [ { "layout": "one-column", "design": "default", "widgets": [ { "name": "HeroBanner", "configuration": "{...}", "images": [{"fileName": "hero.jpg"}] } ] } ] } } } ``` ## Options ### Channel, Language, and Market The query also supports optional parameters for multi-market support: ::tip Read more about `channelId`, `languageId`, and `marketId` in the "how to"-article about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access While authentication is not required for this query, including a JWT bearer token in the `Authorization` header can provide personalized results based on the authenticated user's context, for example personalized or restricted content. To include authentication, add the JWT bearer token to your request headers: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: # Get list of CMS pages ## Overview Learn how to retrieve a list of your CMS pages from your Geins backend. This guide covers fetching pages with tag-based filtering, perfect for displaying campaign pages, landing pages, or any custom content. ## Prerequisites - Merchant API key - CMS pages configured in your Geins backend - (Optional) Tags configured on your CMS pages ## Goal - Fetch all CMS pages - Filter pages by tags (include/exclude) - Display a list of campaign pages ## Architecture at a glance - Query CMS pages → Filter by tags → Display list → Link to individual pages ## Step-by-step ::steps{level="3"} ### Get all CMS pages Retrieve all available CMS pages without any filtering. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query cmsPages( $channelId: String $languageId: String $marketId: String ) { cmsPages( channelId: $channelId languageId: $languageId marketId: $marketId ) { id name alias activeFrom activeTo tags meta { title description keywords } canonicalUrl } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query cmsPages($channelId: String, $languageId: String, $marketId: String) { cmsPages(channelId: $channelId, languageId: $languageId, marketId: $marketId) { id name alias activeFrom activeTo tags meta { title description keywords } canonicalUrl } }","variables":{"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "cmsPages": [ { "id": 1, "name": "Summer Sale 2025", "alias": "summer-sale-2025", "activeFrom": "2025-06-01T00:00:00Z", "activeTo": "2025-08-31T23:59:59Z", "tags": ["campaign", "sale", "summer"], "meta": { "title": "Summer Sale 2025 - Up to 50% Off", "description": "Don't miss our biggest summer sale of the year!", "keywords": "summer, sale, discount, campaign" }, "canonicalUrl": "/campaigns/summer-sale-2025" }, { "id": 2, "name": "Black Friday 2025", "alias": "black-friday-2025", "activeFrom": "2025-11-29T00:00:00Z", "activeTo": "2025-11-29T23:59:59Z", "tags": ["campaign", "sale", "black-friday"], "meta": { "title": "Black Friday 2025 - Massive Savings", "description": "Amazing Black Friday deals on all products!", "keywords": "black friday, sale, deals" }, "canonicalUrl": "/campaigns/black-friday-2025" }, { "id": 3, "name": "About Us", "alias": "about-us", "activeFrom": null, "activeTo": null, "tags": ["info", "company"], "meta": { "title": "About Us - Our Story", "description": "Learn more about our company and mission.", "keywords": "about, company, information" }, "canonicalUrl": "/about-us" } ] } } ``` ### Filter pages by included/excluded tags Retrieve only pages that have specific tags, such as campaign pages. #### Request example :::code-group ```graphql [query.graphql] query cmsPages( $includeTags: [String] $excludeTags: [String] $channelId: String $languageId: String $marketId: String ) { cmsPages( includeTags: $includeTags excludeTags: $excludeTags channelId: $channelId languageId: $languageId marketId: $marketId ) { id name alias tags activeFrom activeTo meta { description } canonicalUrl } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "includeTags": ["campaign"], "excludeTags": ["christmas"], "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query cmsPages($includeTags: [String], $excludeTags: [String], $channelId: String, $languageId: String, $marketId: String) { cmsPages(includeTags: $includeTags, excludeTags: $excludeTags, channelId: $channelId, languageId: $languageId, marketId: $marketId) { id name alias tags activeFrom activeTo meta { description } canonicalUrl } }","variables":{"includeTags":["campaign"],"excludeTags":["christmas"],"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "cmsPages": [ { "id": 1, "name": "summer-sale-2025", "title": "Summer Sale 2025", "alias": "summer-sale-2025", "tags": ["campaign", "sale", "summer"], "activeFrom": "2025-06-01T00:00:00Z", "activeTo": "2025-08-31T23:59:59Z", "meta": { "description": "Don't miss our biggest summer sale of the year!" }, "canonicalUrl": "/campaigns/summer-sale-2025" }, { "id": 2, "name": "black-friday-2025", "title": "Black Friday 2025", "alias": "black-friday-2025", "tags": ["campaign", "sale", "black-friday"], "activeFrom": "2025-11-29T00:00:00Z", "activeTo": "2025-11-29T23:59:59Z", "meta": { "description": "Amazing Black Friday deals on all products!" }, "canonicalUrl": "/campaigns/black-friday-2025" } ] } } ``` :: ## Options ### Multi-market support All queries support optional parameters for multi-market functionality: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the how-to about [using multi-market support](https://geins.io/use-multi-market-support). :: # Get company info Retrieve company information — including addresses and buyers — for the currently authenticated user. This query is read-only. To modify company data, see: - [Manage company settings](https://geins.io/manage-company-settings) — update the company name - [Manage company addresses](https://geins.io/manage-company-addresses) — add, update, and remove addresses - [Manage company buyers](https://geins.io/manage-company-buyers) — add, assign, update, and remove buyers - [Get company orders](https://geins.io/get-company-orders) — retrieve order history for all company buyers ## Prerequisites - Merchant API key (`X-ApiKey`) - Authenticated user session (JWT bearer token) - User associated with a company account ## Goals - Fetch company details (name, VAT number, pricing flags) - Retrieve associated addresses (billing, shipping) - List buyers linked to the company ## Architecture at a glance - Authenticate user → Query `getCompany` → Receive company with addresses and buyers ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Query company information Fetch the authenticated user's company profile with nested addresses and buyers. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query getCompany( $channelId: String $languageId: String $marketId: String ) { getCompany( channelId: $channelId languageId: $languageId marketId: $marketId ) { id name vatNumber exVat limitedProductAccess addresses { addressId company addressLine1 zip city country addressType } buyers { id internalId firstName lastName active } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {JWT_TOKEN}" } ``` ```json [query-variables.json] { "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"query":"query getCompany($channelId:String,$languageId:String,$marketId:String){getCompany(channelId:$channelId,languageId:$languageId,marketId:$marketId){id name vatNumber exVat limitedProductAccess addresses{addressId company addressLine1 zip city country addressType} buyers{id internalId firstName lastName active}}}","variables":{"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be omitted to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "getCompany": { "id": "12345", "name": "Acme Trading AB", "vatNumber": "SE556677889901", "exVat": true, "limitedProductAccess": false, "addresses": [ { "addressId": "101", "company": "Acme Trading AB", "addressLine1": "Industrivägen 10", "zip": "11122", "city": "Stockholm", "country": "SE", "addressType": "billingandshipping" } ], "buyers": [ { "id": "anna.svensson@acme.se", "internalId": 1001, "firstName": "Anna", "lastName": "Svensson", "active": true } ] } } } ``` :: ## Options ### Multi-market support All queries support optional parameters for multi-market functionality: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the how-to about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access Authentication is **required** for this endpoint. The `getCompany` query returns data scoped to the currently authenticated user's company account. Without a valid JWT bearer token the request will fail with an authorization error. Include the token in the `Authorization` header: ```text Authorization: Bearer {JWT_TOKEN} ``` ::tip See the [authentication flow guide](https://geins.io/../guides/authentication-flow) for details on obtaining and refreshing JWT tokens. :: ## Common pitfalls - **Missing JWT token** — This query requires authentication. An API key alone is not sufficient; include the `Authorization: Bearer` header. - **User not linked to a company** — If the authenticated user has no company account, the query returns `null`. - **Expecting all address fields** — Only request the fields you need; some fields (e.g., `addressLine2`, `careOf`) may be empty. # Get company orders ## Prerequisites - Merchant API key (`X-ApiKey`) - Authenticated user session (JWT bearer token) - User associated with a company account ## Goals - Fetch all orders placed by any buyer in the authenticated user's company - Display a company-wide order history overview - Understand how company orders differ from individual user orders ## Architecture at a glance - Authenticate company user → Query `getCompanyOrders` → Receive orders from all company buyers ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Query company orders The `getCompanyOrders` query returns orders placed by **all buyers** linked to the authenticated user's company — not just the current user's own orders. This is the key difference from `getOrders`, which only returns the individual user's orders. If the authenticated user is not a member of a company, the query returns an empty list. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query getCompanyOrders( $channelId: String $languageId: String $marketId: String ) { getCompanyOrders( channelId: $channelId languageId: $languageId marketId: $marketId ) { id publicId createdAt status orderTotal { sellingPriceIncVat sellingPriceIncVatFormatted } currency cart { items { id } } shippingAddress { firstName lastName company addressLine1 city zip country } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {JWT_TOKEN}" } ``` ```json [query-variables.json] { "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"query":"query getCompanyOrders($channelId:String,$languageId:String,$marketId:String){getCompanyOrders(channelId:$channelId,languageId:$languageId,marketId:$marketId){id publicId createdAt status orderTotal{sellingPriceIncVat sellingPriceIncVatFormatted} currency cart{items{id}} shippingAddress{firstName lastName company addressLine1 city zip country}}}","variables":{"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be omitted to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "getCompanyOrders": [ { "id": 12345, "publicId": "ORD-2025-001234", "createdAt": "2025-10-25T14:30:00Z", "status": "Shipped", "orderTotal": { "sellingPriceIncVat": 4500.00, "sellingPriceIncVatFormatted": "4,500.00 SEK" }, "currency": "SEK", "cart": { "items": [ { "id": 1 }, { "id": 2 } ] }, "shippingAddress": { "firstName": "Anna", "lastName": "Svensson", "company": "Acme Trading AB", "addressLine1": "Industrivägen 10", "city": "Stockholm", "zip": "11122", "country": "SE" } }, { "id": 12340, "publicId": "ORD-2025-001229", "createdAt": "2025-09-15T10:15:00Z", "status": "Delivered", "orderTotal": { "sellingPriceIncVat": 1899.00, "sellingPriceIncVatFormatted": "1,899.00 SEK" }, "currency": "SEK", "cart": { "items": [ { "id": 1 } ] }, "shippingAddress": { "firstName": "Erik", "lastName": "Johansson", "company": "Acme Trading AB", "addressLine1": "Lagervägen 5", "city": "Stockholm", "zip": "11133", "country": "SE" } } ] } } ``` ### Combine with individual order details Use `getOrder` with a specific `orderId` from the list to retrieve full details for any company order — including payment, shipping, and refund information. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query getOrder( $orderId: Int! $channelId: String $languageId: String $marketId: String ) { getOrder( orderId: $orderId channelId: $channelId languageId: $languageId marketId: $marketId ) { id publicId createdAt completedAt status orderTotal { sellingPriceIncVat sellingPriceExVat vat } shippingAddress { firstName lastName company addressLine1 city zip country } paymentDetails { displayName } shippingDetails { name parcelNumber trackingLink } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {JWT_TOKEN}" } ``` ```json [query-variables.json] { "orderId": 12345, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"query":"query getOrder($orderId:Int!,$channelId:String,$languageId:String,$marketId:String){getOrder(orderId:$orderId,channelId:$channelId,languageId:$languageId,marketId:$marketId){id publicId createdAt completedAt status orderTotal{sellingPriceIncVat sellingPriceExVat vat} shippingAddress{firstName lastName company addressLine1 city zip country} paymentDetails{displayName} shippingDetails{name parcelNumber trackingLink}}}","variables":{"orderId":12345,"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note Company members can view order details for any order placed by a buyer within the same company, not only their own orders. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "getOrder": { "id": 12345, "publicId": "ORD-2025-001234", "createdAt": "2025-10-25T14:30:00Z", "completedAt": "2025-10-27T09:00:00Z", "status": "Shipped", "orderTotal": { "sellingPriceIncVat": 4500.00, "sellingPriceExVat": 3600.00, "vat": 900.00 }, "shippingAddress": { "firstName": "Anna", "lastName": "Svensson", "company": "Acme Trading AB", "addressLine1": "Industrivägen 10", "city": "Stockholm", "zip": "11122", "country": "SE" }, "paymentDetails": { "displayName": "Invoice" }, "shippingDetails": { "name": "Standard Shipping", "parcelNumber": "TRK987654321SE", "trackingLink": "https://tracking.example.com/TRK987654321SE" } } } } ``` :: ## Options ### Multi-market support All queries support optional parameters for multi-market functionality: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the how-to about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access Authentication is **required** for this endpoint. The `getCompanyOrders` query uses the JWT bearer token to identify the user's company membership and retrieve all orders placed under that company. Without a valid token the request will fail with an authorization error. Include the token in the `Authorization` header: ```http Authorization: Bearer {JWT_TOKEN} ``` ::tip See the [authentication flow guide](https://geins.io/../guides/authentication-flow) for details on obtaining and refreshing JWT tokens. :: ## Common pitfalls - **Confusing `getCompanyOrders` with `getOrders`** — `getOrders` returns only the individual user's orders. `getCompanyOrders` returns orders placed by all buyers in the company. Use [Get user orders](https://geins.io/get-user-orders) for personal order history. - **User not linked to a company** — If the authenticated user has no company account, the query returns an empty list rather than an error. - **Missing JWT token** — This query requires authentication. An API key alone is not sufficient; include the `Authorization: Bearer` header. # Get product ## Prerequisites - Merchant API key - Product ID or product alias ## Goals - Fetch product information for a product detail page (PDP) ## Architecture at a glance - Query `product` with ID or alias → Get complete product details → Display on product page ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Get product by alias Fetch a product using its URL-friendly alias (slug). This is the most common method for product detail pages. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query getProduct( $alias: String! $channelId: String $languageId: String $marketId: String ) { product( alias: $alias channelId: $channelId languageId: $languageId marketId: $marketId ) { productId alias name articleNumber canonicalUrl skus { skuId name stock { totalStock } } texts { text1 text2 text3 } brand { name alias canonicalUrl } productImages { fileName } unitPrice { sellingPriceIncVat sellingPriceExVat sellingPriceIncVatFormatted regularPriceIncVat regularPriceIncVatFormatted isDiscounted } totalStock { totalStock inStock } variantGroup { variants { productId alias label name primaryImage stock { inStock } } } parameterGroups { name parameters { name value } } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "alias": "{PRODUCT_ALIAS}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query getProduct($alias: String!, $channelId: String, $languageId: String, $marketId: String) { product(alias: $alias, channelId: $channelId, languageId: $languageId, marketId: $marketId) { productId alias name articleNumber canonicalUrl skus { skuId name stock { totalStock } } texts { text1 text2 text3 } brand { name alias canonicalUrl } productImages { fileName } unitPrice { sellingPriceIncVat sellingPriceExVat sellingPriceIncVatFormatted regularPriceIncVat regularPriceIncVatFormatted isDiscounted } totalStock { totalStock inStock } variantGroup { variants { productId alias label name primaryImage stock { inStock } } } parameterGroups { name parameters { name value } } } }","variables":{"alias":"{PRODUCT_ALIAS}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "product": { "productId": 1234, "alias": "{PRODUCT_ALIAS}", "name": "Premium Wireless Headphones", "articleNumber": "WH-1000XM5", "canonicalUrl": "/p/premium-wireless-headphones", "skus": [ { "skuId": 5678, "name": "Premium Wireless Headphones - Black", "stock": { "totalStock": 47 } } ], "texts": { "text1": "

These premium wireless headphones deliver exceptional audio quality with industry-leading noise cancellation. Perfect for music lovers and professionals alike.

", "text2": "Experience superior sound quality with active noise cancellation.", "text3": null }, "brand": { "name": "Acme Audio", "alias": "acme-audio", "canonicalUrl": "/b/acme-audio" }, "productImages": [ { "fileName": "headphones-black-front.jpg" }, { "fileName": "headphones-black-side.jpg" } ], "unitPrice": { "sellingPriceIncVat": 299.00, "sellingPriceExVat": 239.20, "sellingPriceIncVatFormatted": "$299.00", "regularPriceIncVat": 349.00, "regularPriceIncVatFormatted": "$349.00", "isDiscounted": true }, "totalStock": { "totalStock": 47, "inStock": 47 }, "variantGroup": { "variants": [ { "productId": 1235, "alias": "premium-wireless-headphones-white", "label": "White", "name": "Premium Wireless Headphones - White", "primaryImage": "headphones-white-front.jpg", "stock": { "inStock": true } } ] }, "parameterGroups": [ { "name": "Specifications", "parameters": [ { "name": "Color", "value": "Black" }, { "name": "Connectivity", "value": "Bluetooth 5.2" }, { "name": "Battery Life", "value": "30 hours" } ] } ] } } } ``` :: ### Get product by ID Alternatively, fetch a product using its numeric product ID. Useful when you have the ID from another query or database. ::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. :: #### Request example ::code-group ```graphql [query.graphql] query getProductById( $productId: Int! $channelId: String $languageId: String $marketId: String ) { product( productId: $productId channelId: $channelId languageId: $languageId marketId: $marketId ) { productId alias name } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "productId": 1234, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query getProductById($productId: Int!, $channelId: String, $languageId: String, $marketId: String) { product(productId: $productId, channelId: $channelId, languageId: $languageId, marketId: $marketId) { productId alias name } }","variables":{"productId":1234,"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` :: ### Multi-market support All queries support optional parameters for multi-market functionality: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the how-to about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access While authentication is not required for this query, including a JWT bearer token in the `Authorization` header can provide personalized results based on the authenticated user's context, for example personalized pricing. To include authentication, add the JWT bearer token to your request headers: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: ## Common pitfalls - Using `productId` when you meant to use `alias` - the query accepts both but `alias` is more common for URLs - Requesting too many fields - only request fields you actually need for better performance - Not handling null responses - product may not exist or be unavailable in the specified market - Forgetting to check `skus.stock.totalStock` before allowing purchases. Observe that stock levels are managed at the SKU level. The `totalStock` field on the product level provides an aggregate stock level but individual SKUs may have different stock statuses. # Get product categories Learn how to fetch product categories from the Merchant API and render them in navigation or filters. ## Prerequisites - Merchant API key - Channel/market/language context (defaults are supported) ## Goals - Retrieve categories (top-level or nested) - Build a simple tree for navigation or filtering ## Architecture at a glance - Query `categories` → Render list/tree ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Query categories Use `parentCategoryId: 0` to ***only*** fetch top-level categories. Omiting the parameter fetches all categories. Set it to a specific category ID to get its children. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query categories( $parentCategoryId: Int $channelId: String $languageId: String $marketId: String ) { categories( parentCategoryId: $parentCategoryId channelId: $channelId languageId: $languageId marketId: $marketId ) { categoryId parentCategoryId name alias canonicalUrl } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] // Fetching only top-level categories { "parentCategoryId": 0, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query categories($parentCategoryId:Int,$channelId:String,$languageId:String,$marketId:String,$includeHidden:Boolean){ categories(parentCategoryId:$parentCategoryId,channelId:$channelId,languageId:$languageId,marketId:$marketId,includeHidden:$includeHidden){ categoryId parentCategoryId name alias canonicalUrl }}","variables":{"parentCategoryId":0,"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "categories": [ { "categoryId": 1, "parentCategoryId": 0, "name": "Men", "alias": "men", "canonicalUrl": "/c/men" } ] } } ``` :: ## Validation - Top-level: `parentCategoryId: 0` returns only root categories - A known parent ID returns its children - Names and `canonicalUrl` match storefront navigation ::note For optimal UX, cache categories in your application state/store to speed up navigation and rendering. :: ## Options ### Multi-market support All queries support optional parameters for multi-market functionality: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the how-to about [using multi-market support](https://geins.io/use-multi-market-support). :: # Get quotation carts ## Overview A quotation cart is a standard `CartType` with an attached `quotation` field of type `CartQuotationType`. Quotations are created by sellers and represent a fixed-price proposal for the buyer. All quotation carts have `isLocked: true`, meaning their items cannot be modified, and they cannot go through the normal `placeOrder` checkout flow. To turn a quotation into an order, use the dedicated [quotation lifecycle mutations](https://geins.io/finalize-quotation-order). ## Prerequisites - Merchant API key - JWT token for the authenticated buyer ## Goal - List all quotation carts for the current user - Retrieve a specific quotation cart by ID - Inspect quotation details, status, and validity ## Architecture at a glance - Authenticate buyer → `listQuotationCarts` → overview of all quotations - Authenticate buyer → `getQuotationCart` → full details for a specific quotation ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### List all quotation carts Use the `listQuotationCarts` query to retrieve all quotations for the authenticated user. This is useful for building a "My Quotations" overview page. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: :::note This query requires JWT authentication. Include the JWT token in the Authorization header. ::: #### Request example :::code-group ```graphql [query.graphql] query listQuotationCarts( $channelId: String $languageId: String $marketId: String ) { listQuotationCarts( channelId: $channelId languageId: $languageId marketId: $marketId ) { id isLocked isBlockedFromCheckout summary { total { regularPriceExVat } } quotation { quotationNumber name status currency validFrom validTo company { name } } } } ``` ```json [headers.json] { "Accept": "application/json", "Authorization": "Bearer {JWT_TOKEN}", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query listQuotationCarts($channelId: String, $languageId: String, $marketId: String) { listQuotationCarts(channelId: $channelId, languageId: $languageId, marketId: $marketId) { id isLocked isBlockedFromCheckout summary { total { regularPriceExVat } } quotation { quotationNumber name status currency validFrom validTo company { name } } } }","variables":{"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "listQuotationCarts": [ { "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "isLocked": true, "isBlockedFromCheckout": true, "summary": { "total": { "regularPriceExVat": 15000.00 } }, "quotation": { "quotationNumber": "2603-01-0001-00", "name": "Office furniture package", "status": "PENDING", "currency": "SEK", "validFrom": "2026-03-01T00:00:00Z", "validTo": "2026-04-30T23:59:59Z", "company": { "name": "Acme Supplies AB" } } }, { "id": "b2c3d4e5-f6a7-8901-bcde-f12345678901", "isLocked": true, "isBlockedFromCheckout": false, "summary": { "total": { "regularPriceExVat": 4500.00 } }, "quotation": { "quotationNumber": "2603-01-0002-00", "name": "IT equipment bundle", "status": "CONFIRMED", "currency": "SEK", "validFrom": "2026-03-15T00:00:00Z", "validTo": "2026-05-15T23:59:59Z", "company": { "name": "Tech Solutions AB" } } } ] } } ``` ### Get a specific quotation cart Use the `getQuotationCart` query to retrieve full details for a specific quotation, including line items, addresses, discount, terms, and settings. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query getQuotationCart( $quotationId: Guid! $channelId: String $languageId: String $marketId: String ) { getQuotationCart( quotationId: $quotationId channelId: $channelId languageId: $languageId marketId: $marketId ) { id isLocked isBlockedFromCheckout items { id skuId quantity product { name } unitPrice { regularPriceExVat } totalPrice { regularPriceExVat } } summary { total { regularPriceExVat } } quotation { quotationNumber name status currency validFrom validTo company { name vatNumber } owner { firstName lastName } customer { firstName lastName approvedAt rejectedAt } billingAddress { firstName lastName addressLine1 city zip country } shippingAddress { firstName lastName addressLine1 city zip country } discount { type value } terms { text } settings { requireConfirmation } orderId } } } ``` ```json [headers.json] { "Accept": "application/json", "Authorization": "Bearer {JWT_TOKEN}", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "quotationId": "{QUOTATION_ID}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query getQuotationCart($quotationId: Guid!, $channelId: String, $languageId: String, $marketId: String) { getQuotationCart(quotationId: $quotationId, channelId: $channelId, languageId: $languageId, marketId: $marketId) { id isLocked isBlockedFromCheckout items { id skuId quantity product { name } unitPrice { regularPriceExVat } totalPrice { regularPriceExVat } } summary { total { regularPriceExVat } } quotation { quotationNumber name status currency validFrom validTo company { name vatNumber } owner { firstName lastName } customer { firstName lastName approvedAt rejectedAt } billingAddress { firstName lastName addressLine1 city zip country } shippingAddress { firstName lastName addressLine1 city zip country } discount { type value } terms { text } settings { requireConfirmation } orderId } } }","variables":{"quotationId":"{QUOTATION_ID}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "getQuotationCart": { "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "isLocked": true, "isBlockedFromCheckout": true, "items": [ { "id": "item-1", "skuId": 12345, "quantity": 10, "product": { "name": "Ergonomic Office Chair" }, "unitPrice": { "regularPriceExVat": 1500.00 }, "totalPrice": { "regularPriceExVat": 15000.00 } } ], "summary": { "total": { "regularPriceExVat": 15000.00 } }, "quotation": { "quotationNumber": "2603-01-0001-00", "name": "Office furniture package", "status": "PENDING", "currency": "SEK", "validFrom": "2026-03-01T00:00:00Z", "validTo": "2026-04-30T23:59:59Z", "company": { "name": "Acme Supplies AB", "vatNumber": "SE1234567890" }, "owner": { "firstName": "Anna", "lastName": "Svensson" }, "customer": { "firstName": "Erik", "lastName": "Johansson", "approvedAt": null, "rejectedAt": null }, "billingAddress": { "firstName": "Erik", "lastName": "Johansson", "addressLine1": "Storgatan 1", "city": "Stockholm", "zip": "11122", "country": "SE" }, "shippingAddress": { "firstName": "Erik", "lastName": "Johansson", "addressLine1": "Storgatan 1", "city": "Stockholm", "zip": "11122", "country": "SE" }, "discount": { "type": "percentage", "value": 10.0 }, "terms": { "text": "Payment within 30 days. Delivery 5-7 business days." }, "settings": { "requireConfirmation": true }, "orderId": null } } } } ``` :: ## Options ### Multi-market support All queries support optional parameters for multi-market configurations: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the "how to"-article about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access These queries require JWT authentication since quotation carts are scoped to the authenticated user. Include the JWT bearer token in the `Authorization` header: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: ## Common pitfalls - Quotation carts are read-only — `isLocked` is always `true`, so mutations like `addToCart` or `updateCartItem` will fail on these carts - Do not use `placeOrder` on a quotation cart — quotation carts can only become orders through the `finalizeQuotation` mutation - A `null` `quotation` field on a returned `CartType` means the cart is a regular cart, not a quotation - Expired quotations (where `validTo` is in the past) cannot be accepted or finalized ## Related docs - Act on quotations: [Finalize a quotation order](https://geins.io/finalize-quotation-order) - Cart basics: [Get cart](https://geins.io/get-cart) - Complete purchase: [Checkout headless cart](https://geins.io/checkout-headless-cart) # Get redirects mapping Retrieve URL and slug (alias) redirects to manage and audit your site's redirection rules. Url redirects are managed in Merchant Center via an import template. Slug (alias) redirects are managed automatically by the system when slugs are changed for entities like products or categories. ## Prerequisites - Management API key and api user with access. - Basic understanding of URLs and slugs in Geins - Familiarity with your platform's URL structure ## Goal - Retrieve all URL redirects - Retrieve all slug (alias) redirects - Use this data to manage and audit your site's redirection rules ## Architecture at a glance - Use the Management API to fetch URL and alias redirects → Process and utilize the data as needed ## Step-by-step ::steps{level="3"} ### Fetch URL redirects using Management API #### Request example ```bash [cURL] curl -L 'https://mgmtapi.geins.io/API/redirect/url/1?currentCheckpoint=2025-01-01&nextCheckpoint=2025-02-01' \ -H 'Accept: application/json' \ -H "X-ApiKey: {MGMT_API_KEY}" \ -u "{MGMT_USERNAME}:{MGMT_PASSWORD}" \ ``` #### Response example :::badge **200 OK** ::: ```json [response.json] { "Resource": [ { "OldUrl": "/old-path", "NewUrl": "/new-path", "MarketId": 1, "Action": "update", } ], "Message": "string", "Details": ["string"] } ``` ### Fetch slug (alias) redirects using Management API #### Request example ```bash [cURL] curl -L 'https://mgmtapi.geins.io/API/redirect/alias/1?currentCheckpoint=2025-01-01&nextCheckpoint=2025-02-01' \ -H 'Accept: application/json' \ -H "X-ApiKey: {MGMT_API_KEY}" \ -u "{MGMT_USERNAME}:{MGMT_PASSWORD}" ``` #### Response example :::badge **200 OK** ::: ```json [response.json] { "Resource": [ { "OldUrl": "old-alias", "NewUrl": "new-alias", "MarketId": 1, "Action": "update", } ], "Message": "string", "Details": ["string"] } ``` :: ## Key points - Use `currentCheckpoint` and `nextCheckpoint` parameters to fetch redirects within a specific time range - The `Action` field indicates whether the redirect was updated or deleted - Both URL and alias redirects return the same response structure ## Process URL redirects - Use the fetched URL redirects to update your platform's routing rules or for auditing purposes - Ensure that old URLs correctly redirect to the new URLs as per the mapping ## Process alias redirects - Use the fetched alias redirects to update your platform's slug management system - Ensure that old slugs correctly are replaced with new slugs in your platform's URL structure ## Regularly update redirects - Schedule regular fetches of redirects to keep your platform's routing and slug management up to date # Get related products ## Prerequisites - Merchant API key - Product alias ## Goals - Retrieve related products for product detail pages - Display product recommendations (accessories, similar products, related items) - Understand relation types and their use cases ## Architecture at a glance - Query `relatedProducts` with product alias → Get related products with relation types ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Get related products Fetch all related products for a specific product using its alias. Related products include accessories, similar items, and other related recommendations. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query getRelatedProducts( $alias: String! $channelId: String $languageId: String $marketId: String ) { relatedProducts( alias: $alias channelId: $channelId languageId: $languageId marketId: $marketId ) { alias name canonicalUrl relationType primaryImage brand { name alias } unitPrice { sellingPriceIncVat sellingPriceIncVatFormatted regularPriceIncVat regularPriceIncVatFormatted isDiscounted } productImages { fileName } primaryCategory { categoryId name alias } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "alias": "{PRODUCT_ALIAS}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query getRelatedProducts($alias: String!, $channelId: String, $languageId: String, $marketId: String) { relatedProducts(alias: $alias, channelId: $channelId, languageId: $languageId, marketId: $marketId) { alias name canonicalUrl relationType primaryImage brand { name alias } unitPrice { sellingPriceIncVat sellingPriceIncVatFormatted regularPriceIncVat regularPriceIncVatFormatted isDiscounted } productImages { fileName } primaryCategory { categoryId name alias } } }","variables":{"alias":"{PRODUCT_ALIAS}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "relatedProducts": [ { "alias": "headphone-carrying-case", "name": "Premium Headphone Carrying Case", "canonicalUrl": "/p/headphone-carrying-case", "relationType": "ACCESSORIES", "primaryImage": "headphone-case.jpg", "brand": { "name": "AudioPro", "alias": "audiopro" }, "unitPrice": { "sellingPriceIncVat": 29.99, "sellingPriceIncVatFormatted": "$29.99", "regularPriceIncVat": 29.99, "regularPriceIncVatFormatted": "$29.99", "isDiscounted": false }, "productImages": [ { "fileName": "headphone-case.jpg" } ], "primaryCategory": { "categoryId": 45, "name": "Accessories", "alias": "accessories" } }, { "alias": "wireless-earbuds-pro", "name": "Wireless Earbuds Pro", "canonicalUrl": "/p/wireless-earbuds-pro", "relationType": "SIMILAR", "primaryImage": "earbuds-pro.jpg", "brand": { "name": "AudioPro", "alias": "audiopro" }, "unitPrice": { "sellingPriceIncVat": 199.99, "sellingPriceIncVatFormatted": "$199.99", "regularPriceIncVat": 249.99, "regularPriceIncVatFormatted": "$249.99", "isDiscounted": true }, "productImages": [ { "fileName": "earbuds-pro.jpg" } ], "primaryCategory": { "categoryId": 12, "name": "Headphones", "alias": "headphones" } }, { "alias": "audio-cable-premium", "name": "Premium Audio Cable 3.5mm", "canonicalUrl": "/p/audio-cable-premium", "relationType": "ACCESSORIES", "primaryImage": "audio-cable.jpg", "brand": { "name": "TechConnect", "alias": "techconnect" }, "unitPrice": { "sellingPriceIncVat": 14.99, "sellingPriceIncVatFormatted": "$14.99", "regularPriceIncVat": 14.99, "regularPriceIncVatFormatted": "$14.99", "isDiscounted": false }, "productImages": [ { "fileName": "audio-cable.jpg" } ], "primaryCategory": { "categoryId": 45, "name": "Accessories", "alias": "accessories" } } ] } } ``` :: ## Understanding relation types The `relationType` field indicates how each product relates to the main product. This helps you organize recommendations into meaningful sections. ::note Administrate available relation types using the Mgmt API. :: ### Example relation types - **`ACCESSORIES`** - Products that complement or enhance the main product (e.g., cases, cables, chargers) - **`SIMILAR`** - Alternative products with similar features or in the same category - **`RELATED`** - General related products that might interest the customer ::tip Group related products by `relationType` in your UI to create distinct recommendation sections like "Accessories", "Similar Products", or "Customers Also Viewed". :: ### Multi-market support All queries support optional parameters for multi-market functionality: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the how-to about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access While authentication is not required for this query, including a JWT bearer token in the `Authorization` header can provide personalized results based on the authenticated user's context, for example personalized pricing. To include authentication, add the JWT bearer token to your request headers: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: ## Common pitfalls - Not grouping products by relation type - displaying all related products together can be confusing - Showing related products when none exist - always check if the array is empty before rendering - Fetching too many fields - only request the fields you need # Get user data ## Prerequisites - Merchant API key - Bearer token (obtained from user authentication) ::tip Learn how to obtain a Bearer token by following the [Log in user](https://geins.io/log-in-user) guide. :: ## Goals - Retrieve user profile data (email, address, customer type) - Discover which channels and markets the user is allowed to use - Use the available channels and markets to make valid API calls on behalf of the user ## Architecture at a glance - Authenticate user → call `getUser` query → read profile and `availableChannels` → use valid channel/market in subsequent API calls ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Get user profile and available channels Use the `getUser` query to retrieve the authenticated user's profile data together with the channels and markets the user is allowed to use. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query getUser( $channelId: String $languageId: String $marketId: String ) { getUser( channelId: $channelId languageId: $languageId marketId: $marketId ) { id email customerType address { firstName lastName company } availableChannels { channelId availableMarkets { id alias country { name code } currency { code } allowedLanguages { id } } } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {JWT_BEARER_TOKEN}" } ``` ```json [query-variables.json] { "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_BEARER_TOKEN}" \ -d '{"query":"query getUser($channelId: String, $languageId: String, $marketId: String) { getUser(channelId: $channelId, languageId: $languageId, marketId: $marketId) { id email customerType address { firstName lastName company } availableChannels { channelId availableMarkets { id alias country { name code } currency { code } allowedLanguages { id } } } } }","variables":{"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "getUser": { "id": 12345, "email": "buyer@example.com", "customerType": "PERSON", "address": { "firstName": "Jane", "lastName": "Doe", "company": "Acme Corp" }, "availableChannels": [ { "channelId": "1|se", "availableMarkets": [ { "id": "SE|SEK", "alias": "se", "country": { "name": "Sweden", "code": "SE" }, "currency": { "code": "SEK" }, "allowedLanguages": [ { "id": "sv-SE" }, { "id": "en-US" } ] } ] }, { "channelId": "2|eu", "availableMarkets": [ { "id": "EU|EUR", "alias": "eu", "country": { "name": "Germany", "code": "DE" }, "currency": { "code": "EUR" }, "allowedLanguages": [ { "id": "en-US" } ] } ] } ] } } } ``` ### Use available channels and markets in subsequent calls The `availableChannels` array lists every channel the user is permitted to access, along with the markets within each channel. Use these values as `channelId` and `marketId` in subsequent API calls to ensure valid requests. This is particularly important for **company buyers**. A company can restrict its buyers to specific channels and markets. If you pass a channel or market that the buyer is not allowed to use, the API may return empty results or invalid data. A typical flow after login: 1. Call `getUser` and read `availableChannels`. 2. If the user has access to more than one channel or market, let them choose (or select a default). 3. Pass the chosen `channelId` and `marketId` (use the market `alias`) to all subsequent queries and mutations (products, cart, checkout, orders). ## Options ### Multi-market support The `getUser` query accepts optional localization arguments: - `channelId` — target a specific sales channel (e.g., `1|se`) - `marketId` — target a specific market using its alias (e.g., `se`) - `languageId` — target a specific language (e.g., `sv-SE`) :::tip Read more about `channelId`, `languageId`, and `marketId` in the [multi-market support guide](https://geins.io/use-multi-market-support). ::: ### Authenticated access The `getUser` query **requires** a valid Bearer token. Include it as `Authorization: Bearer {JWT_BEARER_TOKEN}` in the HTTP headers alongside the `X-ApiKey`. :::tip See the full [Authentication flow](https://geins.io/../guides/authentication-flow) guide for details on obtaining and refreshing tokens. ::: ## Common pitfalls - Missing `Authorization` header — `getUser` requires authentication and will fail without a Bearer token. - Expired Bearer token — tokens expire after 15 minutes; implement refresh logic as needed. - Ignoring `availableChannels` for company buyers — passing a channel or market the buyer is not allowed to use can result in empty or invalid responses from other API calls. :: # Get user orders ## Overview Learn how to retrieve order information for authenticated users. This guide covers fetching a list of all orders and getting detailed information about a specific order. ::note This query returns orders for the **individual user** only. To retrieve orders placed by all buyers in a company, use [Get company orders](https://geins.io/get-company-orders) instead. :: ## Prerequisites - Merchant API key - JWT token for authenticated user ## Goal - Fetch list of all orders for the current user - Display order history with basic information - Get detailed information about a specific order ## Architecture at a glance - Authenticate user → Get orders list → Display overview → Get order details → Show full information ## Step-by-step ::steps{level="3"} ### Get all orders for the current user Retrieve a list of all orders placed by the authenticated user. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: :::note This query requires JWT authentication. Include the JWT token in the Authorization header. ::: #### Request example :::code-group ```graphql [query.graphql] query getOrders( $channelId: String $languageId: String $marketId: String ) { getOrders( channelId: $channelId languageId: $languageId marketId: $marketId ) { id publicId createdAt status orderTotal { sellingPriceIncVat sellingPriceIncVatFormatted } currency cart { items { id } } shippingAddress { firstName lastName addressLine1 city zip country } } } ``` ```json [headers.json] { "Accept": "application/json", "Authorization": "Bearer {JWT_TOKEN}", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query getOrders($channelId: String, $languageId: String, $marketId: String) { getOrders(channelId: $channelId, languageId: $languageId, marketId: $marketId) { id publicId createdAt status orderTotal { sellingPriceIncVat sellingPriceIncVatFormatted } currency cart { items { id } } shippingAddress { firstName lastName addressLine1 city zip country } } }","variables":{"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "getOrders": [ { "id": 12345, "publicId": "ORD-2025-001234", "createdAt": "2025-10-25T14:30:00Z", "status": "Shipped", "orderTotal": { "sellingPriceIncVat": 1299.00, "sellingPriceIncVatFormatted": "1,299.00 SEK" }, "currency": "SEK", "cart": { "items": [ { "id": 1 }, { "id": 2 }, { "id": 3 } ] }, "shippingAddress": { "firstName": "John", "lastName": "Doe", "addressLine1": "Street Address 123", "city": "Stockholm", "zip": "12345", "country": "SE" } }, { "id": 12340, "publicId": "ORD-2025-001229", "createdAt": "2025-09-15T10:15:00Z", "status": "Delivered", "orderTotal": { "sellingPriceIncVat": 599.00, "sellingPriceIncVatFormatted": "599.00 SEK" }, "currency": "SEK", "cart": { "items": [ { "id": 1 } ] }, "shippingAddress": { "firstName": "John", "lastName": "Doe", "addressLine1": "Street Address 123", "city": "Stockholm", "zip": "12345", "country": "SE" } } ] } } ``` ### Get detailed order information Retrieve complete details about a specific order, including all items, pricing, and shipping information. :::note This query requires JWT authentication and the user must own the order being requested. ::: #### Request example :::code-group ```graphql [query.graphql] query getOrder( $orderId: Int! $channelId: String $languageId: String $marketId: String ) { getOrder( orderId: $orderId channelId: $channelId languageId: $languageId marketId: $marketId ) { id publicId createdAt completedAt status message desiredDeliveryDate orderTotal { sellingPriceIncVat sellingPriceExVat vat isDiscounted discountIncVat } shippingAddress { firstName lastName company addressLine1 addressLine2 city zip country phone } paymentDetails { displayName } shippingDetails { name parcelNumber trackingLink } refunds { id createdAt reason } } } ``` ```json [headers.json] { "Accept": "application/json", "Authorization": "Bearer {JWT_TOKEN}", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "orderId": 12345, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query getOrder($orderId: Int!, $channelId: String, $languageId: String, $marketId: String) { getOrder(orderId: $orderId, channelId: $channelId, languageId: $languageId, marketId: $marketId) { id publicId createdAt completedAt status currency message desiredDeliveryDate orderTotal { sellingPriceIncVat sellingPriceExVat vat isDiscounted discountIncVat } shippingAddress { firstName lastName company addressLine1 addressLine2 city zip country phone } paymentDetails { displayName } shippingDetails { displayName parcelNumber trackingLink } refunds { id createdAt reason } } }","variables":{"orderId":12345,"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "getOrder": { "id": 12345, "publicId": "ORD-2025-001234", "createdAt": "2025-10-25T14:30:00Z", "completedAt": "2025-10-27T09:00:00Z", "status": "Shipped", "message": "Please leave package at reception", "desiredDeliveryDate": "2025-10-30", "orderTotal": { "sellingPriceIncVat": 1299.00, "sellingPriceExVat": 1039.20, "vat": 259.80, "isDiscounted": true, "discountIncVat": 100.00 }, "shippingAddress": { "firstName": "John", "lastName": "Doe", "company": "", "addressLine1": "Street Address 123", "addressLine2": "", "city": "Stockholm", "zip": "12345", "country": "SE", "phone": "+46701234567" }, "paymentDetails": { "displayName": "Card Payment" }, "shippingDetails": { "name": "Standard Shipping", "parcelNumber": "TRK123456789SE", "trackingLink": "https://tracking.example.com/TRK123456789SE" }, "refunds": [] } } } ``` :: ## Options ### Multi-market support All queries support optional parameters for multi-market functionality: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the how-to about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access Authentication is **required** for this endpoint. The `getOrders` query returns data scoped to the currently authenticated user. Without a valid JWT bearer token the request will fail with an authorization error. Include the token in the `Authorization` header: ```http Authorization: Bearer {JWT_TOKEN} ``` ::tip See the [authentication flow guide](https://geins.io/../guides/authentication-flow) for details on obtaining and refreshing JWT tokens. :: ## Common pitfalls - **Forgetting the JWT token** — This query requires authentication. An API key alone is not sufficient; include the `Authorization: Bearer` header. - **Expecting company-wide orders** — `getOrders` only returns the individual user's orders. For all orders across a company account, use [Get company orders](https://geins.io/get-company-orders). # Build guest order tracking Build a guest order tracking page that resolves an order by its public ID and shows item, status, and delivery details—no login required. Useful for guest checkout and support deflection. ## Prerequisites - Merchant API key - Public order IDs available from confirmation emails or receipts ## Goal - Allow guests to retrieve order details by public ID - Show item list, totals, and lifecycle statuses safely ## Architecture at a glance - UI form (enter public ID) → GraphQL `getOrderPublic` → render order summary and statuses - Handle not found/expired IDs; avoid leaking PII beyond order context ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Add input UI for public order ID - Create a simple form with a single input for the `publicOrderId` (GUID). Validate format client-side. #### Request example :::code-collapse ::::code-group ```graphql [query.graphql] query getOrderPublic( $publicOrderId: Guid! $channelId: String $languageId: String $marketId: String ) { getOrderPublic( publicOrderId: $publicOrderId channelId: $channelId languageId: $languageId marketId: $marketId ) { orderId publicOrderId status created totals { grandTotal currency } customer { email } deliveryAddress { firstName lastName address1 zip city country } items { productId skuId name quantity price { unit total currency } status } shipments { carrier method trackingNumber trackingUrl status } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "publicOrderId": "{PUBLIC_ORDER_ID}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query getOrderPublic($publicOrderId: Guid!, $channelId: String, $languageId: String, $marketId: String) { getOrderPublic(publicOrderId: $publicOrderId, channelId: $channelId, languageId: $languageId, marketId: $marketId) { orderId publicOrderId status created totals { grandTotal currency } customer { email } deliveryAddress { firstName lastName address1 zip city country } items { productId skuId name quantity price { unit total currency } status } shipments { carrier method trackingNumber trackingUrl status } } }","variables":{"publicOrderId":"{PUBLIC_ORDER_ID}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` :::: ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "getOrderPublic": { "publicOrderId": "...", "status": "...", "items": [ ... ] } } } ``` ### Render statuses and tracking - Map order `status` and item statuses to user-friendly labels. - If `shipments[].trackingUrl` exists, render a track button; else show method/carrier. - Mask sensitive data if needed (e.g., email partial). :: ## Validation - Enter a known `publicOrderId` from a confirmation; verify order summary matches the confirmation. - Try an invalid/unknown GUID and show a clear, non-revealing error. # Handle canonical URLs ## Prerequisites - Basic understanding of URLs and slugs in Geins - Access to Merchant API - Familiarity with your platform's URL structure ## Goal - Ensure users are directed to the canonical URL for products - Implement redirects for outdated or changed URLs - Maintain SEO integrity by using canonical URLs ## Architecture at a glance - Use the Merchant API to fetch entities by slug → Check for canonical URL → Redirect if necessary ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Fetch product by slug using Merchant API When fetching an entity (e.g., product, category) using the Merchant API, the system automatically checks the slug history to find the current slug if an old slug is used. This ensures that you always get the canonical URL for the entity. This is done for all segments in the URL, resulting in a `canonicalUrl` being returned in the response, even if the current slug does not differ from the requested slug. #### Request example :::code-group ```graphql [query.graphql] query product( $alias: String! $channelId: String $languageId: String $marketId: String ) { product( alias: $alias channelId: $channelId languageId: $languageId marketId: $marketId ) { productId articleNumber canonicalUrl name } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", } ``` ```json [query-variables.json] { "alias": "{PRODUCT_ALIAS}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query product($alias: String!, $channelId: String, $languageId: String, $marketId: String) { product(alias: $alias, channelId: $channelId, languageId: $languageId, marketId: $marketId) { productId articleNumber canonicalUrl name } }","variables":{"alias":"{PRODUCT_ALIAS}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "product": { "productId": "12345", "articleNumber": "SKU123", "canonicalUrl": "/market/language/p/category/new-product-slug", "name": "New Product Name" } } } ``` ### Handle canonical URL in your application If the `canonicalUrl` in the response differs from the requested URL, you can choose to redirect the user to the canonical URL. :: # Handle product reviews ## Overview Learn how to submit and fetch product reviews. This guide covers fetching reviews for a product and allowing customers to post their own reviews. ## Prerequisites - Merchant API key - Product alias for the product you want to review or fetch reviews for ## Goal - Submit a new product review - Fetch all reviews for a specific product - Display reviews with pagination ## Architecture at a glance - Submit new review → Query reviews → Display to users with pagination ## Step-by-step ::steps{level="3"} ### Submit a new product review Allow customers to post reviews for products they've purchased. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation postProductReview( $alias: String! $rating: Int $comment: String $author: String! $channelId: String $languageId: String $marketId: String ) { postProductReview( alias: $alias rating: $rating comment: $comment author: $author channelId: $channelId languageId: $languageId marketId: $marketId ) } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "alias": "{PRODUCT_ALIAS}", "rating": 5, "comment": "Amazing product! Exceeded my expectations.", "author": "John Doe", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation postProductReview($alias: String!, $rating: Int, $comment: String, $author: String!, $channelId: String, $languageId: String, $marketId: String) { postProductReview(alias: $alias, rating: $rating, comment: $comment, author: $author, channelId: $channelId, languageId: $languageId, marketId: $marketId) }","variables":{"alias":"{PRODUCT_ALIAS}","rating":5,"comment":"Amazing product! Exceeded my expectations.","author":"John Doe","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "postProductReview": true } } ``` ### Get reviews for a product Retrieve all reviews for a specific product using the product alias. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query reviews( $alias: String $skip: Int $take: Int $channelId: String $languageId: String $marketId: String ) { reviews( alias: $alias skip: $skip take: $take channelId: $channelId languageId: $languageId marketId: $marketId ) { reviews { rating comment reviewDate author } count averageRating } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "alias": "{PRODUCT_ALIAS}", "skip": 0, "take": 10, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query reviews($alias: String, $skip: Int, $take: Int, $channelId: String, $languageId: String, $marketId: String) { reviews(alias: $alias, skip: $skip, take: $take, channelId: $channelId, languageId: $languageId, marketId: $marketId) { reviews { rating comment reviewDate author } count averageRating } }","variables":{"alias":"{PRODUCT_ALIAS}","skip":0,"take":10,"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "reviews": { "reviews": [ { "rating": 5, "comment": "Excellent product! Highly recommended.", "reviewDate": "2025-10-15T12:34:56Z", "author": "John Doe" }, { "rating": 4, "comment": "Very good quality, but a bit expensive.", "reviewDate": "2025-10-14T10:20:30Z", "author": "Jane Smith" } ], "count": 23, "averageRating": 4.5 } } } ``` ### Display reviews with pagination Use the `skip` and `take` parameters to implement pagination for the reviews list. :: ## Options ### Pagination Use `skip` and `take` parameters to paginate through reviews: - `skip`: Number of reviews to skip (default: 0) - `take`: Number of reviews to return per page (default: 10) - `count`: Total number of reviews available Example for page 2 with 10 reviews per page: ```json { "skip": 10, "take": 10 } ``` ### Multi-market support All queries and mutations support optional parameters for multi-market functionality: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the how-to about [using multi-market support](https://geins.io/use-multi-market-support). :: # Log in user ## Prerequisites - Geins account name - Merchant API key - Customer credentials (username/email and password) ## Goal - Authenticate user credentials securely - Obtain Bearer token for Merchant API requests ## Architecture at a glance - Send username → get signature challenge → send signed credentials → receive Bearer token - Use token in `Authorization: Bearer {token}` header for Merchant API calls ## APIs used - Auth Service: `https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/login` - Merchant API: `https://merchantapi.geins.io/auth/sign/{MERCHANT_API_KEY}` ::tip You can find your `ACCOUNT_NAME` when you log in to your account. Note that the account name in the auth URL is always followed by `_prod`. :: ::warning **Important**: All calls to the auth service must be handled from the server-side to prevent CORS issues. Do not make direct calls to the auth service from client-side code. :: ## Step-by-step ::steps{level="3"} ### Start authentication challenge Send the username to get a signature challenge: #### Request example :::code-group ```bash [cURL] curl -X POST "https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/login" \ -H "Content-Type: application/json" \ -d '{ "username": "{USER_EMAIL}" }' ``` ```ts [auth.ts] // Note: This code should run on the server-side to prevent CORS issues const authUrl = `https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/login`; const challengeResponse = await fetch(authUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ username: '{USER_EMAIL}' }) }); const challengeData = await challengeResponse.json(); ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "sign": "IDENTITY_SIGN_STRING" } ``` ### Get signature from Merchant API Use the signature challenge from step 1 (IDENTITY\_SIGN\_STRING) to get the signed identity: #### Request example :::code-group ```bash [cURL] curl -X GET "https://merchantapi.geins.io/auth/sign/{MERCHANT_API_KEY}?identity={IDENTITY_SIGN_STRING}" \ -H "Cache-Control: no-cache" ``` ```ts [auth.ts] const params = new URLSearchParams({ identity: 'IDENTITY_SIGN_STRING' }); const signUrl = `https://merchantapi.geins.io/auth/sign/{MERCHANT_API_KEY}?${params}`; const signResponse = await fetch(signUrl, { method: 'GET', cache: 'no-cache' }); const signature = await signResponse.json(); ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "identity": "IDENTITY_SIGN_STRING", "timestamp": "TIMESTAMP_STRING", "signature": "SIGNATURE_STRING" } ``` ### Complete authentication Send the signed credentials to complete login: #### Request example :::code-group ```bash [cURL] curl -X POST "https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/login" \ -H "Content-Type: application/json" \ -d '{ "username": "{USER_EMAIL}", "password": "{USER_PASSWORD}", "signature": { "identity": "IDENTITY_SIGN_STRING", "timestamp": "TIMESTAMP_STRING", "signature": "SIGNATURE_STRING" } }' ``` ```ts [auth.ts] // Note: This code should run on the server-side to prevent CORS issues const authUrl = `https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/login`; const authResponse = await fetch(authUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ username: '{USER_EMAIL}', password: '{USER_PASSWORD}', signature: { identity: "ID_STRING", timestamp: "TIMESTAMP_STRING", signature: "SIGNATURE_STRING" } }) }); const authData = await authResponse.json(); ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "token": "JWT_BEARER_TOKEN", "maxAge": 900 } ``` ### Use token with Merchant API Include the Bearer token in Merchant API requests: #### Request example :::code-group ```bash [cURL] curl -X POST "https://merchantapi.geins.io/graphql" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_BEARER_TOKEN}" \ -d '{ "query": "query { ... }" }' ``` ```ts [auth.ts] const merchantResponse = await fetch('https://merchantapi.geins.io/graphql', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-ApiKey': '{MERCHANT_API_KEY}', 'Authorization': `Bearer {JWT_BEARER_TOKEN}` }, body: JSON.stringify({ query: `query { ... }` }) }); ``` ::: :: ## Security and access - Always use HTTPS for authentication requests. - The Bearer token expires after 15 minutes, implement refresh logic as needed. - The signature-based flow prevents credential exposure and replay attacks. ## Common pitfalls - Not handling the two-step flow properly—both requests to the auth endpoint are required. ## Related docs - Full authentication guide: [Authentication flow](https://geins.io/../guides/authentication-flow) # Log out user ## Prerequisites - Geins account name - Active user session with refresh token ## Goal - Securely terminate user session - Clear stored authentication data ## Architecture at a glance - Send logout request with refresh token → server invalidates tokens → clear local token storage - All subsequent API requests require new authentication ## APIs used - Auth Service: `https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/logout` ::tip You can find your `ACCOUNT_NAME` when you log in to your account. Note that the account name in the auth URL is always followed by `_prod`. :: ::warning **Important**: All calls to the auth service must be handled from the server-side to prevent CORS issues. Do not make direct calls to the auth service from client-side code. :: ## Step-by-step ::steps{level="3"} ### Send logout request Send a POST request to invalidate the current session: #### Request example :::code-group ```bash [cURL] curl -X GET "https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/logout" \ -H "Content-Type: application/json" \ -H "x-auth-refresh-token: {REFRESH_TOKEN}" \ -H "Cache-Control: no-cache" ``` ```typescript [auth.ts] // Note: This code should run on the server-side to prevent CORS issues const authUrl = `https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/logout`; const logoutResponse = await fetch(authUrl, { method: 'GET', cache: 'no-cache', credentials: 'include', headers: { 'Content-Type': 'application/json', 'x-auth-refresh-token': {REFRESH_TOKEN} } }); ``` ::: #### Response example :::badge **200 OK** ::: The server responds with a `200 OK` status indicating successful logout. ### Clear local authentication data Remove all stored tokens and session data from the client application. :: ## Security and access - Always use HTTPS for logout requests - Clear all forms of token storage (memory, cookies, localStorage, sessionStorage) ## Common pitfalls - Not clearing all token storage locations after logout ## Related docs - Login guide: [Log in as user](https://geins.io/log-in-user) - Token refresh guide: [Refresh user token](https://geins.io/refresh-user-token) - Registration guide: [Register user](https://geins.io/register-user) - Password change guide: [Change user password](https://geins.io/change-user-password) - Full authentication guide: [Authentication flow](https://geins.io/../guides/authentication-flow) # Manage company addresses ## Prerequisites - Merchant API key (`X-ApiKey`) - Authenticated user session (JWT bearer token) - User associated with a company account ## Goals - Add new billing and shipping addresses to a company - Update existing company address details - Remove addresses that are no longer needed ## Architecture at a glance - Authenticate company user → `createCompanyAddress` / `updateCompanyAddress` / `deleteCompanyAddress` → Verify via `getCompany` ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Create a company address Use `createCompanyAddress` to add a new address. Each address must have an `addressType` that determines how it can be used during checkout: `billing`, `shipping`, or `billingandshipping`. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation createCompanyAddress( $address: CreateCompanyAddressInputType! $channelId: String $languageId: String $marketId: String ) { createCompanyAddress( address: $address channelId: $channelId languageId: $languageId marketId: $marketId ) } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {JWT_TOKEN}" } ``` ```json [query-variables.json] { "address": { "firstName": "Anna", "lastName": "Svensson", "company": "Acme Trading AB", "addressLine1": "Lagervägen 5", "zip": "11133", "city": "Stockholm", "country": "SE", "addressType": "shipping" }, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"query":"mutation createCompanyAddress($address:CreateCompanyAddressInputType!,$channelId:String,$languageId:String,$marketId:String){createCompanyAddress(address:$address,channelId:$channelId,languageId:$languageId,marketId:$marketId)}","variables":{"address":{"firstName":"Anna","lastName":"Svensson","company":"Acme Trading AB","addressLine1":"Lagervägen 5","zip":"11133","city":"Stockholm","country":"SE","addressType":"shipping"},"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note Required fields: `firstName`, `lastName`, `addressLine1`, `zip`, `city`, `country`, and `addressType`. Optional fields include `email`, `phone`, `company`, `careOf`, `addressLine2`, `addressLine3`, and `region`. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "createCompanyAddress": true } } ``` ### Update an existing address Use `updateCompanyAddress` to modify an existing address. Only the fields you provide are updated — omitted fields remain unchanged. You need the `addressId` from the `getCompany` query. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation updateCompanyAddress( $addressId: String! $address: UpdateCompanyAddressInputType! $channelId: String $languageId: String $marketId: String ) { updateCompanyAddress( addressId: $addressId address: $address channelId: $channelId languageId: $languageId marketId: $marketId ) } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {JWT_TOKEN}" } ``` ```json [query-variables.json] { "addressId": "102", "address": { "addressLine1": "Nya Lagervägen 12", "zip": "11144", "addressType": "billingandshipping" }, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"query":"mutation updateCompanyAddress($addressId:String!,$address:UpdateCompanyAddressInputType!,$channelId:String,$languageId:String,$marketId:String){updateCompanyAddress(addressId:$addressId,address:$address,channelId:$channelId,languageId:$languageId,marketId:$marketId)}","variables":{"addressId":"102","address":{"addressLine1":"Nya Lagervägen 12","zip":"11144","addressType":"billingandshipping"},"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note All fields in `UpdateCompanyAddressInputType` are optional. Only provide the fields you want to change. The `country` field expects a 2-character ISO 3166-1 alpha-2 code (e.g., `SE`). ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "updateCompanyAddress": true } } ``` ### Delete an address Use `deleteCompanyAddress` to remove an address from the company. You need the `addressId` from the `getCompany` query. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation deleteCompanyAddress( $addressId: String! $channelId: String $languageId: String $marketId: String ) { deleteCompanyAddress( addressId: $addressId channelId: $channelId languageId: $languageId marketId: $marketId ) } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {JWT_TOKEN}" } ``` ```json [query-variables.json] { "addressId": "102", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"query":"mutation deleteCompanyAddress($addressId:String!,$channelId:String,$languageId:String,$marketId:String){deleteCompanyAddress(addressId:$addressId,channelId:$channelId,languageId:$languageId,marketId:$marketId)}","variables":{"addressId":"102","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "deleteCompanyAddress": true } } ``` :: ## Options ### Multi-market support All mutations support optional parameters for multi-market functionality: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the how-to about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access Authentication is **required** for all company address mutations. The API uses the JWT bearer token to identify the user's company membership and scope operations to that company. Without a valid token the request will fail with an authorization error. Include the token in the `Authorization` header: ```http Authorization: Bearer {JWT_TOKEN} ``` ::tip See the [authentication flow guide](https://geins.io/../guides/authentication-flow) for details on obtaining and refreshing JWT tokens. :: ## Common pitfalls - **Invalid `addressType` value** — Must be exactly `billing`, `shipping`, or `billingandshipping`. Other values will cause an error. - **Invalid `country` format** — Use 2-character ISO 3166-1 alpha-2 codes (e.g., `SE`, `NO`, `DE`), not full country names. - **Addresses affect checkout flow** — Company addresses are presented as selectable options during [company checkout](https://geins.io/checkout-as-company-user). Changes here are immediately reflected in the checkout address lists. # Manage company buyers ## Prerequisites - Merchant API key (`X-ApiKey`) - Authenticated user session (JWT bearer token) - User associated with a company account ## Goals - Add new buyers to a company (create or assign existing users) - Update buyer details such as name, phone, and active status - Remove buyers from the company ## Architecture at a glance - Authenticate company user → `createCompanyBuyer` / `assignCompanyBuyer` / `updateCompanyBuyer` / `deleteCompanyBuyer` → Verify via `getCompany` ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Create a new buyer Use `createCompanyBuyer` to add a completely new buyer to the company. The buyer's `id` is their email address, which also serves as their login identifier. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation createCompanyBuyer( $buyer: CreateCompanyBuyerInputType! $channelId: String $languageId: String $marketId: String ) { createCompanyBuyer( buyer: $buyer channelId: $channelId languageId: $languageId marketId: $marketId ) } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {JWT_TOKEN}" } ``` ```json [query-variables.json] { "buyer": { "id": "erik.johansson@acme.se", "firstName": "Erik", "lastName": "Johansson", "phone": "+46701234567" }, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"query":"mutation createCompanyBuyer($buyer:CreateCompanyBuyerInputType!,$channelId:String,$languageId:String,$marketId:String){createCompanyBuyer(buyer:$buyer,channelId:$channelId,languageId:$languageId,marketId:$marketId)}","variables":{"buyer":{"id":"erik.johansson@acme.se","firstName":"Erik","lastName":"Johansson","phone":"+46701234567"},"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `id` field (email) is required. Fields `firstName`, `lastName`, `phone`, and `active` are optional. If `active` is omitted it defaults to `true`. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "createCompanyBuyer": true } } ``` ### Assign an existing user as buyer Use `assignCompanyBuyer` to link an already-registered user to the company as a buyer. This is useful when the user already has an account but needs to be added to a company. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation assignCompanyBuyer( $id: String! $channelId: String $languageId: String $marketId: String ) { assignCompanyBuyer( id: $id channelId: $channelId languageId: $languageId marketId: $marketId ) } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {JWT_TOKEN}" } ``` ```json [query-variables.json] { "id": "existing.user@acme.se", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"query":"mutation assignCompanyBuyer($id:String!,$channelId:String,$languageId:String,$marketId:String){assignCompanyBuyer(id:$id,channelId:$channelId,languageId:$languageId,marketId:$marketId)}","variables":{"id":"existing.user@acme.se","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `id` parameter is the email address of the existing user to assign. Use `createCompanyBuyer` instead if the user does not already have an account. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "assignCompanyBuyer": true } } ``` ### Update a buyer Use `updateCompanyBuyer` to modify buyer details. Only provided fields are updated. Changing the `id` field reassigns the buyer to a new email/identifier. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation updateCompanyBuyer( $id: String! $buyer: UpdateCompanyBuyerInputType! $channelId: String $languageId: String $marketId: String ) { updateCompanyBuyer( id: $id buyer: $buyer channelId: $channelId languageId: $languageId marketId: $marketId ) } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {JWT_TOKEN}" } ``` ```json [query-variables.json] { "id": "erik.johansson@acme.se", "buyer": { "phone": "+46709876543", "active": false }, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"query":"mutation updateCompanyBuyer($id:String!,$buyer:UpdateCompanyBuyerInputType!,$channelId:String,$languageId:String,$marketId:String){updateCompanyBuyer(id:$id,buyer:$buyer,channelId:$channelId,languageId:$languageId,marketId:$marketId)}","variables":{"id":"erik.johansson@acme.se","buyer":{"phone":"+46709876543","active":false},"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note All fields in `UpdateCompanyBuyerInputType` are optional. Setting `active` to `false` deactivates the buyer without removing them. To change the buyer's email, pass a new value in the `id` field inside the `buyer` input — this reassigns the buyer to the new email. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "updateCompanyBuyer": true } } ``` ### Remove a buyer Use `deleteCompanyBuyer` to remove a buyer from the company. The `id` parameter is the buyer's email address. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation deleteCompanyBuyer( $id: String! $channelId: String $languageId: String $marketId: String ) { deleteCompanyBuyer( id: $id channelId: $channelId languageId: $languageId marketId: $marketId ) } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {JWT_TOKEN}" } ``` ```json [query-variables.json] { "id": "erik.johansson@acme.se", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"query":"mutation deleteCompanyBuyer($id:String!,$channelId:String,$languageId:String,$marketId:String){deleteCompanyBuyer(id:$id,channelId:$channelId,languageId:$languageId,marketId:$marketId)}","variables":{"id":"erik.johansson@acme.se","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "deleteCompanyBuyer": true } } ``` :: ## Options ### Multi-market support All mutations support optional parameters for multi-market functionality: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the how-to about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access Authentication is **required** for all company buyer mutations. The API uses the JWT bearer token to identify the user's company membership and scope operations to that company. Without a valid token the request will fail with an authorization error. Include the token in the `Authorization` header: ```http Authorization: Bearer {JWT_TOKEN} ``` ::tip See the [authentication flow guide](https://geins.io/../guides/authentication-flow) for details on obtaining and refreshing JWT tokens. :: ## Common pitfalls - **A buyer cannot remove themselves** — The `deleteCompanyBuyer` mutation prevents users from deleting their own account. Another company member must perform the removal. - **`createCompanyBuyer` vs `assignCompanyBuyer`** — Use `createCompanyBuyer` when the person does not yet have an account. Use `assignCompanyBuyer` when you want to link an already-registered user to the company. - **Changing buyer email via `updateCompanyBuyer`** — Passing a new `id` in the `buyer` input reassigns the buyer to that email. This changes their login identifier. - **Deactivating vs removing** — Setting `active: false` via `updateCompanyBuyer` disables the buyer without deleting them, preserving their order history association. Use `deleteCompanyBuyer` only for permanent removal. # Manage company settings ## Prerequisites - Merchant API key (`X-ApiKey`) - Authenticated user session (JWT bearer token) - User associated with a company account ## Goals - Update the company name for the authenticated user's company - Understand which company properties are editable via the API ## Architecture at a glance - Authenticate company user → Mutation `updateCompany` → Company updated → Confirm via `getCompany` ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Retrieve current company information Before updating, query the current company details to confirm the values you want to change. See [Get company info](https://geins.io/get-company) for full details on the `getCompany` query. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query getCompany( $channelId: String $languageId: String $marketId: String ) { getCompany( channelId: $channelId languageId: $languageId marketId: $marketId ) { id name vatNumber exVat } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {JWT_TOKEN}" } ``` ```json [query-variables.json] { "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"query":"query getCompany($channelId:String,$languageId:String,$marketId:String){getCompany(channelId:$channelId,languageId:$languageId,marketId:$marketId){id name vatNumber exVat}}","variables":{"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "getCompany": { "id": "12345", "name": "Acme Trading AB", "vatNumber": "SE556677889901", "exVat": true } } } ``` ### Update the company name Use the `updateCompany` mutation to change the company name. The mutation accepts an `UpdateCompanyInputType` object. Currently, `name` is the only editable field. The mutation returns `true` on success. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation updateCompany( $company: UpdateCompanyInputType! $channelId: String $languageId: String $marketId: String ) { updateCompany( company: $company channelId: $channelId languageId: $languageId marketId: $marketId ) } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {JWT_TOKEN}" } ``` ```json [query-variables.json] { "company": { "name": "Acme Trading International AB" }, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"query":"mutation updateCompany($company:UpdateCompanyInputType!,$channelId:String,$languageId:String,$marketId:String){updateCompany(company:$company,channelId:$channelId,languageId:$languageId,marketId:$marketId)}","variables":{"company":{"name":"Acme Trading International AB"},"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note Only provided fields are updated. Omitted fields remain unchanged. Currently `name` is the only editable property; other fields such as `vatNumber` and `exVat` are read-only from this endpoint. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "updateCompany": true } } ``` :: ## Options ### Multi-market support All mutations and queries support optional parameters for multi-market functionality: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the how-to about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access Authentication is **required** for this endpoint. The `updateCompany` mutation uses the JWT bearer token to identify the user's company membership and scope the update to that company. Without a valid token the request will fail with an authorization error. Include the token in the `Authorization` header: ```http Authorization: Bearer {JWT_TOKEN} ``` ::tip See the [authentication flow guide](https://geins.io/../guides/authentication-flow) for details on obtaining and refreshing JWT tokens. :: ## Common pitfalls - **Expecting to update `vatNumber` or `exVat`** — These properties are read-only from the Merchant API. Only `name` can be changed via `updateCompany`. Other company settings must be managed through the back-office. - **User not linked to a company** — If the authenticated user has no company account, the mutation will fail. - **Missing JWT token** — This mutation requires authentication. An API key alone is not sufficient; include the `Authorization: Bearer` header. # Preview scheduled CMS content ## Prerequisites - Merchant API key - CMS content with future publish dates or specific filters ## Goal - Preview scheduled CMS content before it goes live - Test content filtering based on attributes ## Architecture at a glance - Get preview token → Use token in Merchant API requests → Access scheduled/filtered CMS content ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Obtain a preview token Log in to your Geins Merchant Center ([https://{ACCOUNT\_NAME}.admin.geins.io](https://%7BACCOUNT_NAME%7D.admin.geins.io){rel="nofollow"}) and navigate to the CMS section. Locate the content you want to preview and choose an option under the "View" dropdown menu. You will be routed to a url with the preview token in the query parameters; `?loginToken={YOUR_PREVIEW_ACCESS_TOKEN}`. Use the token for the next step. :::note A way of getting a preview token via Management API is under development. For now, use the Merchant Center method described above. ::: ### Use the preview token in Merchant API requests Now that you got your token, you can use it in your Merchant API requests to preview scheduled CMS content. Use the widget area filters/parameters to preview specific content (for example, set channelId to preview content for a specific channel). In the example below, we're previewing startpage content for desktop users who viewing prices excluding VAT. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-collapse ::::code-group ```graphql [query.graphql] query widgetArea( $family: String = null $areaName: String = null $displaySetting: String = null $preview: Boolean = null $customerType: CustomerType $channelId: String $languageId: String $marketId: String ) { widgetArea( family: $family areaName: $areaName displaySetting: $displaySetting preview: $preview customerType: $customerType channelId: $channelId languageId: $languageId marketId: $marketId ) { tags containers { layout design widgets { name configuration images { fileName } } } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {YOUR_PREVIEW_ACCESS_TOKEN}" } ``` ```json [query-variables.json] { "family": "startpage", "areaName": "startpage-area", "displaySetting": "desktop", "preview": true, "customerType": "COMPANY", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {YOUR_PREVIEW_ACCESS_TOKEN}" \ -d '{"query":"query widgetArea($family: String, $areaName: String, $displaySetting: String, $preview: Boolean, $customerType: CustomerType, $channelId: String, $languageId: String, $marketId: String) { widgetArea(family: $family, areaName: $areaName, displaySetting: $displaySetting, preview: $preview, customerType: $customerType, channelId: $channelId, languageId: $languageId, marketId: $marketId) { tags containers { layout design widgets { name configuration images { fileName } } } } }","variables":{"family":"startpage","areaName":"startpage-area","displaySetting":"desktop","preview":true,"customerType":"COMPANY","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` :::: ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "widgetArea": { "tags": [...], "containers": [ { "layout": "...", "design": "...", "widgets": [ { "name": "...", "configuration": "...", "images": [{ "fileName": "..." }] }, ] } ] } } } ``` :: ## Common pitfalls - Ensure the preview token is valid and not expired. - Use correct widget area parameters to filter content as needed. - Verify that the CMS content is properly scheduled and published in the CMS. # Refresh user token ## Prerequisites - Valid customer credentials (username/email and password) - Merchant API key ## Goal - Refresh expired Bearer tokens seamlessly - Maintain user session without requiring re-login - Get new Bearer token for continued API access ## Architecture at a glance - Save refresh token on log in → Use stored refresh token to get new Bearer token → save new refresh token → continue API requests ## APIs used - Auth Service: `https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/login` (GET request for refresh) ::tip Refresh tokens are provided in the `x-auth-refresh-token` header during login and must be stored securely for future refresh requests. :: ::warning **Important**: All calls to the auth service must be handled from the server-side to prevent CORS issues. Do not make direct calls to the auth service from client-side code. :: ## When to refresh - **Before expiration**: Bearer tokens expire after 15 minutes - **On 401 errors**: When API calls return unauthorized - **Proactively**: Check token expiration before making requests ## Step-by-step ::steps{level="3"} ### Save refresh token during login :::tip Learn more about how to login a customer [here](https://geins.io/log-in-user). ::: When logging in, extract and store the refresh token from response headers: :::code-group ```bash [cURL] # Extract refresh token from response headers when logging in curl -X POST "https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/login" \ -H "Content-Type: application/json" \ -D headers.txt \ -d '{ "username": "{USER_EMAIL}", "password": "{USER_PASSWORD}", "signature": { ... } }' # Extract the refresh token from headers grep "x-auth-refresh-token" headers.txt ``` ```ts [auth.ts] const loginData = await loginResponse.json(); if (loginData.token) { const bearerToken = loginData.token; // Extract refresh token from response headers const refreshToken = loginResponse.headers.get('x-auth-refresh-token'); } ``` ::: ### Check if token needs refresh Use the token maxAge or expiration time to determine if a refresh is needed before making API calls. If the token is expired or about to expire, proceed to refresh. ### Refresh the token Use the stored refresh token to get a new Bearer token: #### Request example :::code-group ```bash [cURL] curl -X GET "https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/login" \ -H "Content-Type: application/json" \ -H "x-auth-refresh-token: {REFRESH_TOKEN}" \ -H "Cache-Control: no-cache" ``` ```ts [auth.ts] // Note: This code should run on the server-side to prevent CORS issues const authUrl = `https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/login`; // In this example, we assume the refresh token is stored securely on the server const storedRefreshToken = getStoredRefreshToken(); // Your secure storage method if (!storedRefreshToken) { throw new Error('No refresh token available - user needs to log in'); } const refreshResponse = await fetch(authUrl, { method: 'GET', cache: 'no-cache', credentials: 'include', headers: { 'Content-Type': 'application/json', 'x-auth-refresh-token': storedRefreshToken } }); const refreshData = await refreshResponse.json(); if (refreshData.token) { const newBearerToken = refreshData.token; // Save new refresh token if provided const newRefreshToken = refreshResponse.headers.get('x-auth-refresh-token'); if (newRefreshToken) { saveRefreshToken(newRefreshToken); // Your secure storage method } } ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "token": "NEW_JWT_TOKEN", "maxAge": 900 } ``` :: ## Security and access - Store refresh tokens securely (cookies, sessionStorage, localStorage). - Always use HTTPS for refresh requests. - Clear refresh tokens on logout or when they become invalid. - Handle refresh failures gracefully by redirecting to login. ## Common pitfalls - Not saving the refresh token from the `x-auth-refresh-token` header during login. - Forgetting to update stored refresh token when a new one is provided during refresh. - Not handling refresh failures - users get stuck with expired tokens. - Refreshing too frequently - check expiration before refreshing unnecessarily. ## Related docs - Login guide: [Log in as user](https://geins.io/log-in-user) - Full authentication guide: [Authentication flow](https://geins.io/../guides/authentication-flow) # Register user ## Prerequisites - Geins account name - Merchant API key ## Goal - Register new user in auth service - Register user in Merchant API - Obtain Bearer token for authenticated API access ## Architecture at a glance - Send username → get signature challenge → send signed credentials with password → receive Bearer token → Register user in Merchant API - Use token in `Authorization: Bearer {token}` header for Merchant API calls ## APIs used - Auth Service: `https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/register` - Merchant API: `https://merchantapi.geins.io/auth/sign/{MERCHANT_API_KEY}` ::tip You can find your `ACCOUNT_NAME` when you log in to your account. Note that the account name in the auth URL is always followed by `_prod`. :: ::warning **Important**: All calls to the auth service must be handled from the server-side to prevent CORS issues. Do not make direct calls to the auth service from client-side code. :: ## Step-by-step ::steps{level="3"} ### Start registration challenge Send the desired username/email to get a signature challenge: #### Request example :::code-group ```bash [cURL] curl -X POST "https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/register" \ -H "Content-Type: application/json" \ -d '{ "username": "{USER_EMAIL}" }' ``` ```typescript [auth.ts] // Note: This code should run on the server-side to prevent CORS issues const authUrl = `https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/register`; const challengeResponse = await fetch(authUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ username: '{USER_EMAIL}' }) }); const challengeData = await challengeResponse.json(); ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "sign": "IDENTITY_SIGN_STRING" } ``` ### Get signature from Merchant API Use the signature challenge from step 1 (IDENTITY\_SIGN\_STRING) to get the signed identity: #### Request example :::code-group ```bash [cURL] curl -X GET "https://merchantapi.geins.io/auth/sign/{MERCHANT_API_KEY}?identity={IDENTITY_SIGN_STRING}" \ -H "Cache-Control: no-cache" ``` ```typescript [auth.ts] const params = new URLSearchParams({ identity: 'IDENTITY_SIGN_STRING' }); const signUrl = `https://merchantapi.geins.io/auth/sign/{MERCHANT_API_KEY}?${params}`; const signResponse = await fetch(signUrl, { method: 'GET', cache: 'no-cache' }); const signature = await signResponse.json(); ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "identity": "IDENTITY_SIGN_STRING", "timestamp": "TIMESTAMP_STRING", "signature": "SIGNATURE_STRING" } ``` ### Complete registration Send the signed credentials along with user information to complete registration: #### Request example :::code-group ```bash [cURL] curl -X POST "https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/register" \ -H "Content-Type: application/json" \ -d '{ "username": "{USER_EMAIL}", "password": "{USER_PASSWORD}", "signature": { "identity": "IDENTITY_SIGN_STRING", "timestamp": "TIMESTAMP_STRING", "signature": "SIGNATURE_STRING" } }' ``` ```typescript [auth.ts] // Note: This code should run on the server-side to prevent CORS issues const authUrl = `https://auth-service.geins.io/api/{ACCOUNT_NAME}_prod/register`; const registrationResponse = await fetch(authUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ username: '{USER_EMAIL}', password: '{USER_PASSWORD}', signature: { identity: "IDENTITY_SIGN_STRING", timestamp: "TIMESTAMP_STRING", signature: "SIGNATURE_STRING" } }) }); const registrationData = await registrationResponse.json(); ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "token": "JWT_BEARER_TOKEN", "maxAge": 900 } ``` ### Register user in Merchant API To be able to use the token with the Merchant API to place orders and manage user data, you must first register the user in the Merchant API. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation updateUser( $user: UserInputType! $channelId: String $languageId: String $marketId: String ) { updateUser( user: $user channelId: $channelId languageId: $languageId marketId: $marketId ) { email } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {JWT_BEARER_TOKEN}" } ``` ```json [query-variables.json] // To register a user without any additional data, leave the user object empty { "user": {}, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_BEARER_TOKEN}" \ -d '{"query":"mutation updateUser($user: UserInputType!, $channelId: String, $languageId: String, $marketId: String) { updateUser(user: $user, channelId: $channelId, languageId: $languageId, marketId: $marketId) { email } }","variables":{"user":{},"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "updateUser": { "email": "{USER_EMAIL}" } } } ``` ### Use the token for authenticated Merchant API calls The user is now registered and you can use the obtained Bearer token to make authenticated requests to the Merchant API by always including it in the `Authorization` header: ```json [headers.json] { ... "Authorization": "Bearer {JWT_BEARER_TOKEN}" ... } ``` :: ## Update user data ::card --- icon: i-lucide-user-cog title: "How to: Update a user →" to: https://geins.io/../how-to/update-user-data.md type: link --- Learn more what options you can provide in the user object when updating user data in the Merchant API. :: ## Registration validation - **Username requirements**: Must be a valid email address - **Duplicate accounts**: Registration will fail if username already exists ## Security and access - Always use HTTPS for registration requests - The Bearer token expires after 15 minutes, implement refresh logic as needed ## Common pitfalls - Not handling the two-step flow properly—both requests to the register endpoint are required - Missing refresh token extraction from response headers ## Related docs - Login guide: [Log in as user](https://geins.io/log-in-user) - Token refresh guide: [Refresh user token](https://geins.io/refresh-user-token) - Full authentication guide: [Authentication flow](https://geins.io/../guides/authentication-flow) # Reset user password ## Prerequisites - Merchant API key - Geins transactional emails configured - Account url set up in Geins system ## Goal - Allow users to reset their forgotten password through a secure email flow ## Architecture at a glance - User requests reset → Email sent with reset link → User sets new password → Password updated ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Request password reset Use the `requestPasswordReset` mutation to initiate the password reset process. This will send an email to the user with a password reset link: :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation requestPasswordReset( $email: String! $channelId: String $languageId: String $marketId: String ) { requestPasswordReset( email: $email channelId: $channelId languageId: $languageId marketId: $marketId ) } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "email": "{USER_EMAIL}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation requestPasswordReset($email: String!, $channelId: String, $languageId: String, $marketId: String) { requestPasswordReset(email: $email, channelId: $channelId, languageId: $languageId, marketId: $marketId) }","variables":{"email":"{USER_EMAIL}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "requestPasswordReset": true } } ``` :::tip The mutation returns `true` regardless of whether the email exists in the system. This is a security measure to prevent email enumeration attacks. ::: ### Email with reset link After the request is made, the user will receive an email containing a password reset link. The link should direct users to your password reset page with the reset key as a URL parameter: ```text https://yoursite.com/reset-password?key={RESET_KEY} ``` ### Commit password reset Use the `commitReset` mutation to complete the password reset with the reset key and new password provided by the user. #### Request example :::code-group ```graphql [mutation.graphql] mutation commitReset( $resetKey: String! $password: String! $channelId: String $languageId: String $marketId: String ) { commitReset( resetKey: $resetKey password: $password channelId: $channelId languageId: $languageId marketId: $marketId ) } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "resetKey": "{RESET_KEY}", "password": "NewSecurePassword123!", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation commitReset($resetKey: String!, $password: String!, $channelId: String, $languageId: String, $marketId: String) { commitReset(resetKey: $resetKey, password: $password, channelId: $channelId, languageId: $languageId, marketId: $marketId) }","variables":{"resetKey":"{RESET_KEY}","password":"NewSecurePassword123!","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "commitReset": true } } ``` :: ## Multi-market support Both mutations support optional parameters for multi-market configurations: ::tip Read more about `channelId`, `languageId`, and `marketId` in the [multi-market support guide](https://geins.io/use-multi-market-support). :: ## Common pitfalls - Invalid or expired reset key - keys expire after a set period - Using the same reset key twice - each key can only be used once ## Security considerations - Always use HTTPS for password reset pages - Clear any active sessions when password is reset # Search products ## Prerequisites - Merchant API key ## Goals - Search products using text search - Sort search results by relevance ## Architecture at a glance - Enter search text → Query `products` with filter → Get sorted results ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Search products with relevance sorting Use the `products` query with `filter.searchText` to search for products by name, description, article number, or other searchable fields. Add `sort: RELEVANCE` to return the most relevant results first. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query searchProducts( $searchText: String! $skip: Int $take: Int $channelId: String $languageId: String $marketId: String ) { products( skip: $skip take: $take filter: { searchText: $searchText sort: RELEVANCE } channelId: $channelId languageId: $languageId marketId: $marketId ) { products { productId alias name canonicalUrl articleNumber productImages { fileName } unitPrice { sellingPriceIncVat sellingPriceIncVatFormatted } brand { name alias } } count } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "searchText": "wireless headphones", "skip": 0, "take": 12, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query searchProducts($searchText: String!, $skip: Int, $take: Int, $channelId: String, $languageId: String, $marketId: String) { products(skip: $skip, take: $take, filter: { searchText: $searchText, sort: RELEVANCE }, channelId: $channelId, languageId: $languageId, marketId: $marketId) { products { productId alias name canonicalUrl articleNumber productImages { fileName } unitPrice { sellingPriceIncVat sellingPriceIncVatFormatted } brand { name alias } } count } }","variables":{"searchText":"wireless headphones","skip":0,"take":12,"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "products": { "products": [ { "productId": 1234, "alias": "{PRODUCT_ALIAS}", "name": "Premium Wireless Headphones", "canonicalUrl": "/p/premium-wireless-headphones", "articleNumber": "WH-1000XM5", "productImages": [ { "fileName": "headphones-black.jpg" } ], "unitPrice": { "sellingPriceIncVat": 299.00, "sellingPriceIncVatFormatted": "$299.00" }, "brand": { "name": "Acme Audio", "alias": "acme-audio" } } ], "count": 47 } } } ``` :: ## Pagination Use `skip` and `take` parameters for pagination: - `skip`: Number of products to skip (default: 0, max: 6000) - `take`: Number of products to return (default: 20, max: 200) - `count`: Total number of matching products (use for pagination controls) ::note To calculate page numbers: `currentPage = (skip / take) + 1` and `totalPages = Math.ceil(count / take)` :: ### Multi-market support All queries support optional parameters for multi-market functionality: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the how-to about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access While authentication is not required for this query, including a JWT bearer token in the `Authorization` header can provide personalized results based on the authenticated user's context, for example personalized pricing. To include authentication, add the JWT bearer token to your request headers: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: ## Common pitfalls - Empty search results - ensure `searchText` is not too specific or check if products exist - Slow queries - limit the number of fields requested and use appropriate `take` values - Case sensitivity - search is case-insensitive, no need to normalize input # Sort products ## Prerequisites - Merchant API key ## Goals - Sort product listings by different criteria - Understand available sort types and their use cases ## Architecture at a glance - Query `products` with sort parameter → Get products in desired order ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Sort products Sort products using the `sort` parameter in the filter object. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [query.graphql] query sortProducts( $categoryAlias: String $sort: SortType $skip: Int $take: Int $channelId: String $languageId: String $marketId: String ) { products( categoryAlias: $categoryAlias skip: $skip take: $take filter: { sort: $sort } channelId: $channelId languageId: $languageId marketId: $marketId ) { products { productId name canonicalUrl productImages { fileName } unitPrice { sellingPriceIncVat sellingPriceIncVatFormatted } } count } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "categoryAlias": "electronics", "sort": "PRICE", "skip": 0, "take": 12, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query sortProducts($categoryAlias: String, $sort: SortType, $skip: Int, $take: Int, $channelId: String, $languageId: String, $marketId: String) { products(categoryAlias: $categoryAlias, skip: $skip, take: $take, filter: { sort: $sort }, channelId: $channelId, languageId: $languageId, marketId: $marketId) { products { productId name canonicalUrl productImages { fileName } unitPrice { sellingPriceIncVat sellingPriceIncVatFormatted } } count } }","variables":{"categoryAlias":"electronics","sort":"PRICE","skip":0,"take":12,"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "products": { "products": [ { "productId": 101, "name": "Budget Headphones", "canonicalUrl": "/p/budget-headphones", "productImages": [ { "fileName": "budget-headphones.jpg" } ], "unitPrice": { "sellingPriceIncVat": 29.99, "sellingPriceIncVatFormatted": "$29.99" } }, { "productId": 102, "name": "Mid-Range Headphones", "canonicalUrl": "/p/mid-range-headphones", "productImages": [ { "fileName": "mid-range.jpg" } ], "unitPrice": { "sellingPriceIncVat": 99.99, "sellingPriceIncVatFormatted": "$99.99" } } ], "count": 24 } } } ``` :: ## Available sort types The `SortType` enum provides the following sorting options: ### Common sort types - **`PRICE`** - Sort by price (lowest to highest) - **`PRICE_DESC`** - Sort by price (highest to lowest) - **`MOST_SOLD`** - Sort by popularity (best sellers first) - **`LATEST`** - Sort by newest products first - **`ALPHABETICAL`** - Sort alphabetically by name (A-Z) - **`ALPHABETICAL_DESC`** - Sort alphabetically by name (Z-A) - **`RELEVANCE`** - Sort by search relevance (use with text search) ### Stock-based sorting - **`AVAILABLE_STOCK`** - Sort by available stock (lowest to highest) - **`AVAILABLE_STOCK_DESC`** - Sort by available stock (highest to lowest) - **`TOTAL_STOCK`** - Sort by total stock (lowest to highest) - **`TOTAL_STOCK_DESC`** - Sort by total stock (highest to lowest) ### Other sort types - **`BRAND`** - Sort by brand name - **`VOTES`** - Sort by customer ratings/votes - **`FACET_ORDER`** - Sort by facet order - **`NONE`** - No sorting applied ### Custom sort types - **`CUSTOM_1`** to **`CUSTOM_5`** - Custom sort. These are simple sort values that can be set on products via the Mgmt API backend for specific use cases. ::tip For category pages, use `MOST_SOLD` or `PRICE` as default. For search results, use `RELEVANCE`. For "New Arrivals" sections, use `LATEST`. :: ### Multi-market support All queries support optional parameters for multi-market functionality: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the how-to about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access While authentication is not required for this query, including a JWT bearer token in the `Authorization` header can provide personalized results based on the authenticated user's context, for example personalized pricing. To include authentication, add the JWT bearer token to your request headers: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: ## Common pitfalls - Not providing a default sort option - users expect some order, even if it's just `MOST_SOLD` - Using `RELEVANCE` without text search - this sort type only works with search queries - Forgetting to update sort when switching between search and browse modes - Not communicating the current sort order to users in the UI # Subscribe to newsletter ## Prerequisites - Merchant API key - Valid email address to subscribe ## Goal - Subscribe an email address to your newsletter with optional tags and targeting ## Architecture at a glance - Use `subscribeToNewsletter` mutation → Provide email and optional parameters → Confirm subscription ## Example To subscribe an email to your newsletter, use the `subscribeToNewsletter` mutation in the Merchant API. At minimum, you need to provide an email address. ::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. :: ### Request example ::code-group ```graphql [mutation.graphql] mutation subscribeToNewsletter( $email: String! $tags: [String] $channelId: String $languageId: String $marketId: String ) { subscribeToNewsletter( email: $email tags: $tags channelId: $channelId languageId: $languageId marketId: $marketId ) } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "email": "{USER_EMAIL}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation subscribeToNewsletter($email: String!, $tags: [String], $channelId: String, $languageId: String, $marketId: String) { subscribeToNewsletter(email: $email, tags: $tags, channelId: $channelId, languageId: $languageId, marketId: $marketId) }","variables":{"email":"{USER_EMAIL}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` :: ::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. :: ### Response example ::badge **200 OK** :: ```json [response.json] { "data": { "subscribeToNewsletter": true } } ``` ## Options ### Tags You can supply an optional list of tags when subscribing an email address. This will get sent to your newsletter provider and can be used for segmentation. #### Query Variables example with tags ```json [query-variables.json] { "email": "{USER_EMAIL}", "tags": ["promotion", "new-products"], "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ### Channel, Language, and Market The mutation also supports optional parameters for multi-market support: ::tip Read more about `channelId`, `languageId`, and `marketId` in the "how to"-article about [using multi-market support](https://geins.io/use-multi-market-support).. :: # Track product availability ## Prerequisites - Merchant API key - SKU ID of the product to monitor - Valid email address for notifications ## Goal - Subscribe to availability notifications for a specific product SKU ## Architecture at a glance - Use `monitorProductAvailability` mutation → Provide email and SKU ID → Get notified when product is back in stock ## Example To monitor product availability, use the `monitorProductAvailability` mutation in the Merchant API. You need to provide an email address and the SKU ID of the product you want to track. ::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. :: ### Request example ::code-group ```graphql [mutation.graphql] mutation monitorProductAvailability( $email: String! $skuId: Int! $channelId: String $languageId: String $marketId: String ) { monitorProductAvailability( email: $email skuId: $skuId channelId: $channelId languageId: $languageId marketId: $marketId ) } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "email": "{USER_EMAIL}", "skuId": {SKU_ID}, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation monitorProductAvailability($email: String!, $skuId: Int!, $channelId: String, $languageId: String, $marketId: String) { monitorProductAvailability(email: $email, skuId: $skuId, channelId: $channelId, languageId: $languageId, marketId: $marketId) }","variables":{"email":"{USER_EMAIL}","skuId":{SKU_ID},"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` :: ::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. :: ### Response example ::badge **200 OK** :: ```json [response.json] { "data": { "monitorProductAvailability": true } } ``` ## Options ### Channel, Language, and Market The mutation also supports optional parameters for multi-market support: ::tip Read more about `channelId`, `languageId`, and `marketId` in the "how to"-article about [using multi-market support](https://geins.io/use-multi-market-support). :: # Update user data ## Prerequisites - Merchant API key - Bearer token (obtained from user authentication) ::tip Learn how to obtain a Bearer token by following the [Log in user](https://geins.io/log-in-user) guide. :: ## Goal - Update user profile information ## Architecture at a glance - Use `updateUser` mutation → Update profile data - Include Bearer token in `Authorization: Bearer {token}` header for all requests ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Step-by-step ::steps{level="3"} ### Update basic user information Use the `updateUser` mutation to modify user profile data: :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation updateUser( $user: UserInputType! $channelId: String $languageId: String $marketId: String ) { updateUser( user: $user channelId: $channelId languageId: $languageId marketId: $marketId ) { id email gender customerType newsletter personalId } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {JWT_BEARER_TOKEN}" } ``` ```json [query-variables.json] { "user": { "gender": "WOMAN", "newsletter": true, "personalId": "19901231-1234", "customerType": "PERSON", }, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_BEARER_TOKEN}" \ -d '{"query":"mutation updateUser($user: UserInputType!, $channelId: String, $languageId: String, $marketId: String) { updateUser(user: $user, channelId: $channelId, languageId: $languageId, marketId: $marketId) { id email gender customerType newsletter personalId } }","variables":{"user":{"gender":"WOMAN","newsletter":true,"personalId":"19901231-1234","customerType":"PERSON"},"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "updateUser": { "id": 12345, "email": "user@example.com", "gender": "WOMAN", "customerType": "PERSON", "newsletter": true, "personalId": "19901231-1234" } } } ``` ### Update user address Update address information for the user #### Request example :::code-collapse ::::code-group ```graphql [mutation.graphql] mutation updateUser( $user: UserInputType! $channelId: String $languageId: String $marketId: String ) { updateUser( user: $user channelId: $channelId languageId: $languageId marketId: $marketId ) { address { firstName lastName addressLine1 addressLine2 city state country zip company mobile phone careOf entryCode } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}", "Authorization": "Bearer {JWT_BEARER_TOKEN}" } ``` ```json [query-variables.json] { "user": { "address": { "firstName": "Jane", "lastName": "Doe", "addressLine1": "456 New Street", "addressLine2": "Apartment 2B", "city": "Gothenburg", "state": "Västra Götaland", "country": "Sweden", "zip": "41234", "company": "Tech Solutions AB", "mobile": "+46 70 987 654 32", "phone": "+46 31 123 456 78", "careOf": "John Smith", "entryCode": "1234" } }, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -H "Authorization: Bearer {JWT_BEARER_TOKEN}" \ -d '{"query":"mutation updateUser($user: UserInputType!, $channelId: String, $languageId: String, $marketId: String) { updateUser(user: $user, channelId: $channelId, languageId: $languageId, marketId: $marketId) { address { firstName lastName addressLine1 addressLine2 city state country zip company mobile phone careOf entryCode } } }","variables":{"user":{"address":{"firstName":"Jane","lastName":"Doe","addressLine1":"456 New Street","addressLine2":"Apartment 2B","city":"Gothenburg","state":"Västra Götaland","country":"Sweden","zip":"41234","company":"Tech Solutions AB","mobile":"+46 70 987 654 32","phone":"+46 31 123 456 78","careOf":"John Smith","entryCode":"1234"}},"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` :::: ::: ### Update customer type Change user from person to organization: #### Request example :::code-group ```json [query-variables.json] { "user": { "customerType": "ORGANIZATION", "address": { "company": "Acme Corporation AB", "firstName": "Jane", "lastName": "Doe" } } } ``` ::: :: ## User input options The `updateUser` mutation accepts the following user data: ### Basic information - `gender`: Set to `UNSET`, `UNSPECIFIED`, `WOMAN`, or `MAN` - `newsletter`: Boolean for newsletter subscription - `personalId`: Personal identification number or social security number - `customerType`: Set to `PERSON` or `ORGANIZATION` (defaults to `PERSON`) - `metaData`: JSON string for storing custom user preferences or data ### Address information All address fields are optional: - `firstName`, `lastName`: User's name - `addressLine1`, `addressLine2`, `addressLine3`: Street address lines - `city`, `state`, `country`: Location information - `zip`: Postal code - `company`: Company name (especially useful for `ORGANIZATION` customer type) - `mobile`, `phone`: Contact numbers - `careOf`: Care of address information - `entryCode`: Building or gate entry code ## Multi-market support The mutation supports optional parameters for multi-market configurations: ::tip Read more about `channelId`, `languageId`, and `marketId` in the [multi-market support guide](https://geins.io/use-multi-market-support). :: ## Common pitfalls - Missing to add `Authorization` header with Bearer token - Invalid `customerType` enum values - use `PERSON` or `ORGANIZATION` only - Invalid `gender` enum values - use `UNSET`, `UNSPECIFIED`, `WOMAN`, or `MAN` ## Related docs - Authentication guide: [Log in user](https://geins.io/log-in-user) - Token refresh guide: [Refresh user token](https://geins.io/refresh-user-token) - Registration guide: [Register user](https://geins.io/register-user) # Use CMS area filters ## Overview Learn how to fetch a CMS area with specific content using the `url` argument in the `widgetArea` query. ## Prerequisites - Merchant API key - An existing CMS family with at least one area and applied filters - Canonical URL for the page (for example, "/p/shoes/shoe-blue" or "/c/shoes") ## Goal - Resolve and return the appropriate widget collection for an area on a specific URL, leveraging automatic filter resolution ## Architecture at a glance - Call `widgetArea` with `url` → The API infers filters from the URL → Receive specific CMS content ## Example Pass an existing canonical URL as the `url` argument to automatically resolve the correct area content. ::note The `{CANONICAL_URL}` must point to a product list page, a product page, a category page, a brand page or a campaign page. :: ::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. :: ### Request example ::code-group ```graphql [query.graphql] query widgetArea( $family: String $areaName: String $url: String $displaySetting: String $customerType: CustomerType $channelId: String $languageId: String $marketId: String ) { widgetArea( family: $family areaName: $areaName url: $url displaySetting: $displaySetting customerType: $customerType channelId: $channelId languageId: $languageId marketId: $marketId ) { tags containers { layout design widgets { name configuration images { fileName } } } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "url": "{CANONICAL_URL}", "family": "{CMS_FAMILY}", "areaName": "{CMS_AREA_NAME}", "displaySetting": "desktop", "customerType": "PERSON", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query widgetArea($family: String!, $areaName: String!, $url: String!, $displaySetting: String, $channelId: String, $languageId: String, $marketId: String) { widgetArea(family: $family, areaName: $areaName, url: $url, displaySetting: $displaySetting, customerType: $customerType, channelId: $channelId, languageId: $languageId, marketId: $marketId) { tags containers { layout design widgets { name configuration images { fileName } } } } }","variables":{"family":"{CMS_FAMILY}","areaName":"{CMS_AREA_NAME}","url":"{CANONICAL_URL}","displaySetting":"desktop","customerType":"PERSON","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` :: ::note The `channelId`, `languageId`, and `marketId` arguments are optional and can be left out to use default values. :: ### Response example ::badge **200 OK** :: ```json [response.json] { "data": { "widgetArea": { "tags": ["page"], "containers": [ { "layout": "full", "design": "default", "widgets": [ { "name": "ContentBlock", "configuration": "{...}", "images": [{"fileName": "image.jpg"}] } ] } ] } } } ``` ### Use case: Show a widget on a specific category page If you want a Banner to appear only on the "Shoes" category page: - In your Geins CMS, add a filter to the area that targets the "Shoes" category. - Call `widgetArea` with `url` set to the canonical URL of that page (for example, "/c/shoes"). - The API returns the Banner only for that URL; other pages won’t include it. ## Options ### Display setting Provide `displaySetting` (for example, `desktop` or `mobile`) to return device-specific containers and widgets. ### Customer type You can provide a `customerType` argument (`PERSON` or `ORGANIZATION`) to fetch widgets and content tailored to specific customer segments. This allows for personalized experiences based on whether the user is a business or an individual consumer. ### Channel, Language, and Market The query also supports optional parameters for multi-market support: ::tip Read more about `channelId`, `languageId`, and `marketId` in the "how to"-article about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access While authentication is not required for this query, including a JWT bearer token in the `Authorization` header can provide personalized results based on the authenticated user's context, for example personalized or restricted content. To include authentication, add the JWT bearer token to your request headers: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: # Use external payment frame ## Overview Learn how to implement a checkout flow using an external payment provider frame. This guide covers creating a checkout session, selecting shipping, displaying the payment frame, and completing the order. ## Prerequisites - Merchant API key - Existing cart with items - Payment provider configured with frame/iframe support ## Goal - Create a checkout session and retrieve payment frame HTML - Display the payment frame in your frontend - Complete the cart after payment ## Architecture at a glance - Create checkout → Select shipping → Get payment frame → Display frame → Complete cart ## Step-by-step ::steps{level="3"} ### Create checkout and get shipping options Start by creating a checkout session. This will return available shipping and payment options. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation createOrUpdateCheckout( $cartId: String! $checkout: CheckoutInputType $channelId: String $languageId: String $marketId: String ) { createOrUpdateCheckout( cartId: $cartId checkout: $checkout channelId: $channelId languageId: $languageId marketId: $marketId ) { cart { id summary { total { regularPriceIncVat } } } shippingOptions { id displayName feeIncVat isSelected } paymentOptions { id displayName paymentType isSelected paymentData } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "cartId": "{CART_ID}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation createOrUpdateCheckout($cartId: String!, $checkout: CheckoutInputType, $channelId: String, $languageId: String, $marketId: String) { createOrUpdateCheckout(cartId: $cartId, checkout: $checkout, channelId: $channelId, languageId: $languageId, marketId: $marketId) { cart { id summary { total { regularPriceIncVat } } } shippingOptions { id name description fee isSelected } paymentOptions { id name paymentType isSelected paymentData } } }","variables":{"cartId":"{CART_ID}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "createOrUpdateCheckout": { "cart": { "id": "{CART_ID}", "summary": { "total": { "regularPriceIncVat": 299 } } }, "shippingOptions": [ { "id": 1, "displayName": "Standard", "feeIncVat": 59, "isSelected": true }, { "id": 7, "displayName": "Store pickup", "feeIncVat": 0, "isSelected": false } ], "paymentOptions": [ { "id": 23, "displayName": "Klarna Checkout", "paymentType": "KLARNA", "isSelected": false, "paymentData": null }, { "id": 27, "displayName": "Geins Pay", "paymentType": "GEINS_PAY", "isSelected": false, "paymentData": null }, ] } } } ``` :::note The default shipping option will be pre-selected, but you must manually select the payment option to get the payment frame HTML. ::: ### Select shipping and payment options to get payment frame Update the checkout with the selected shipping method and payment option to get the payment frame HTML. #### Request example :::code-group ```graphql [mutation.graphql] mutation createOrUpdateCheckout( $cartId: String! $checkout: CheckoutInputType $channelId: String $languageId: String $marketId: String ) { createOrUpdateCheckout( cartId: $cartId checkout: $checkout channelId: $channelId languageId: $languageId marketId: $marketId ) { cart { id summary { total { regularPriceIncVat } } } paymentOptions { id name displayName paymentType isSelected paymentData } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "cartId": "{CART_ID}", "checkout": { "shippingId": {SHIPPING_ID}, "paymentId": {PAYMENT_ID} }, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation createOrUpdateCheckout($cartId: String!, $checkout: CheckoutInputType, $channelId: String, $languageId: String, $marketId: String) { createOrUpdateCheckout(cartId: $cartId, checkout: $checkout, channelId: $channelId, languageId: $languageId, marketId: $marketId) { cart { id summary { total { regularPriceIncVat } } } paymentOptions { id name paymentType isSelected frame } } }","variables":{"cartId":"{CART_ID}","checkout":{"shippingId":{SHIPPING_ID},"paymentId":{PAYMENT_ID},"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "createOrUpdateCheckout": { "cart": { "id": "{CART_ID}", "summary": { "total": { "regularPriceIncVat": 348 } } }, "paymentOptions": [ { "id": {PAYMENT_ID}, "displayName": "Klarna Checkout", "paymentType": "KLARNA", "isSelected": true, "paymentData": "
" } ] } } } ``` ### Display the payment frame Inject the frame HTML into your checkout page. The payment provider's frame will handle customer payment processing. As long as you haven't completed the purchase in the frame, you can still update the checkout by calling `createOrUpdateCheckout` again. :::warning If you update the cart by adding/removing items or adding a promo code, you must call `createOrUpdateCheckout` again to refresh the payment frame with the updated total. ::: :::note When the customer completes payment, they will be redirected to your confirmation page via the callback URL configured in your payment provider settings. ::: ### Get and display confirmation frame To get the confirmation frame (if your payment provider supports it), you will need your external order ID. Most likely you will have set up your callback URL to include the external order ID and other valuable information as query parameters. For example: ```text https://yourshop.com/checkout/confirmation?externalOrderId={EXTERNAL_ORDER_ID}&cartId={CART_ID}&paymentType={PAYMENT_TYPE} ``` Get the confirmation frame by calling the `checkout` query with the external order ID and payment type. Then, display the confirmation frame HTML on your confirmation page. #### Request example :::code-group ```graphql [query.graphql] query checkout( $id: String! $cartId: String $paymentType: PaymentType! $channelId: String $languageId: String $marketId: String ) { checkout( id: $id cartId: $cartId paymentType: $paymentType channelId: $channelId languageId: $languageId marketId: $marketId ) { htmlSnippet order { orderId } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "id": "{EXTERNAL_ORDER_ID}", "cartId": "{CART_ID}", "paymentType": "{PAYMENT_TYPE}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"query checkout($id: String!, $cartId: String, $paymentType: PaymentType!, $channelId: String, $languageId: String, $marketId: String) { checkout(id: $id, cartId: $cartId, paymentType: $paymentType, channelId: $channelId, languageId: $languageId, marketId: $marketId) { htmlSnippet order { orderId publicId } } }","variables":{"id":"{EXTERNAL_ORDER_ID}","cartId":"{CART_ID}","paymentType":"{PAYMENT_TYPE}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "checkout": { "htmlSnippet": "
", "order": { "orderId": "12345" } } } } ``` :::note The `htmlSnippet` field contains the confirmation frame HTML. Display this on your confirmation page. The `paymentType` should match the payment method used (e.g. `GEINS_PAY`, `KLARNA`, etc.). ::: ### Complete the cart After displaying the confirmation frame, mark the cart as completed to make it read-only. :::code-group ```graphql [mutation.graphql] mutation completeCart( $id: String! $channelId: String $languageId: String $marketId: String ) { completeCart( id: $id channelId: $channelId languageId: $languageId marketId: $marketId ) { id completed } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "id": "{CART_ID}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation completeCart($id: String!, $channelId: String, $languageId: String, $marketId: String) { completeCart(id: $id, channelId: $channelId, languageId: $languageId, marketId: $marketId) { id completed } }","variables":{"id":"{CART_ID}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: :: ## Options ### Session persistence The checkout session is automatically maintained server-side. You can call `createOrUpdateCheckout` multiple times with the same `cartId` to update customer information, change shipping, or switch payment methods. The payment frame will be refreshed automatically. ### Multi-market support All mutations support optional parameters for multi-market functionality: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the how-to about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access While authentication is not required for this mutation, including a JWT bearer token in the `Authorization` header can provide personalized results based on the authenticated user's context, for example personalized pricing. To include authentication, add the JWT bearer token to your request headers: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: ## Common pitfalls - Ensure the payment provider is properly configured in your Geins backend - Always use HTTPS when displaying payment frames for security - The payment frame must be inserted into the DOM exactly as returned by the API - Don't forget to call `completeCart` on the confirmation page to finalize the order ::warning Some payment providers require specific front end implementations to work correctly, refer to their documentation for details. :: # Use external shipping frame ## Overview Learn how to implement a checkout flow using an external shipping provider frame such as nShift. This allows customers to select pickup points, delivery times, and other shipping options directly within an embedded widget. ## Prerequisites - Merchant API key - Existing cart with items - External shipping provider configured (e.g., nShift) - Customer's zip/postal code ## Goal - Create a checkout session with basic customer information - Initialize the external shipping frame with zip code - Display the shipping widget and capture customer selections - Update checkout with selected shipping options ## Architecture at a glance - Create checkout → Initialize shipping frame with zip → Display widget → Capture selections → Update checkout ## Step-by-step ::steps{level="3"} ### Create checkout session Start by creating a checkout session. :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the query, headers and variables below. ::: #### Request example :::code-group ```graphql [mutation.graphql] mutation createOrUpdateCheckout( $cartId: String! $checkout: CheckoutInputType $channelId: String $languageId: String $marketId: String ) { createOrUpdateCheckout( cartId: $cartId checkout: $checkout channelId: $channelId languageId: $languageId marketId: $marketId ) { cart { id summary { total { regularPriceIncVat } } } shippingData } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "cartId": "{CART_ID}", "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation createOrUpdateCheckout($cartId: String!, $checkout: CheckoutInputType, $channelId: String, $languageId: String, $marketId: String) { createOrUpdateCheckout(cartId: $cartId, checkout: $checkout, channelId: $channelId, languageId: $languageId, marketId: $marketId) { cart { id summary { total { regularPriceIncVat } } } shippingData }","variables":{"cartId":"{CART_ID}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "createOrUpdateCheckout": { "cart": { "id": "{CART_ID}", "summary": { "total": { "regularPriceIncVat": 299.00 } } }, "shippingData": null } } } ``` ### Supply zip code to initialize shipping frame Update the checkout with the customer's zip/postal code to initialize the external shipping frame. #### Request example :::code-group ```graphql [mutation.graphql] mutation createOrUpdateCheckout( $cartId: String! $checkout: CheckoutInputType $channelId: String $languageId: String $marketId: String ) { createOrUpdateCheckout( cartId: $cartId checkout: $checkout channelId: $channelId languageId: $languageId marketId: $marketId ) { shippingData } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "cartId": "{CART_ID}", "checkout": { "billingAddress": { "zip": "{ZIP_CODE}", } }, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ```bash [cURL] curl -X POST https://merchantapi.geins.io/graphql \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-ApiKey: {MERCHANT_API_KEY}" \ -d '{"query":"mutation createOrUpdateCheckout($cartId: String!, $checkout: CheckoutInputType, $channelId: String, $languageId: String, $marketId: String) { createOrUpdateCheckout(cartId: $cartId, checkout: $checkout, channelId: $channelId, languageId: $languageId, marketId: $marketId) { shippingData }","variables":{"cartId":"{CART_ID}","checkout":{"billingAddress":{"zip":"{ZIP_CODE}"}},"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}' ``` ::: #### Response example :::badge **200 OK** ::: ```json [response.json] { "data": { "createOrUpdateCheckout": { "shippingData": "
" } } } ``` ### Display the external shipping widget Embed the external shipping provider's widget in your checkout page. The exact implementation depends on your shipping provider. :::note The external shipping widget is provided by your shipping provider. Refer to their documentation for specific initialization parameters and callback handling. ::: ### Update checkout with selected shipping data After the customer selects a delivery option in the widget, update the checkout with the selection details, this is different depending on your shipping provider. #### Request variables example ```json [query-variables.json] { "cartId": "{CART_ID}", "checkout": { "billingAddress": { "zip": "{ZIP_CODE}", }, "externalShippingId": "12345", "pickupPoint": "12345_67899", "message": "Delivery details: Pickup Point" }, "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` :: ## Options ### Multi-market support All mutations support optional parameters for multi-market functionality: - `channelId`: Target specific sales channels - `languageId`: Set content language - `marketId`: Target specific markets ::tip Read more about `channelId`, `languageId`, and `marketId` in the how-to about [using multi-market support](https://geins.io/use-multi-market-support). :: ### Authenticated access While authentication is not required for this mutation, including a JWT bearer token in the `Authorization` header can provide personalized results based on the authenticated user's context, for example personalized pricing. To include authentication, add the JWT bearer token to your request headers: ```http "Authorization": "Bearer {JWT_TOKEN}" ``` ::tip Read more about obtaining and using JWT tokens in the guide about the [authentication flow](https://geins.io/../guides/authentication-flow). :: ## Common pitfalls - Ensure the zip/postal code format matches what the shipping provider expects - The external shipping widget must be properly configured in your Geins backend ::warning Some external shipping providers require specific front end implementations to work correctly, refer to their documentation for details. :: # Use multi-market support ## Overview Learn how to know use `channelId`, `marketId`, and `languageId` arguments to target specific sales channels, markets, and languages in Geins Merchant API. ::tip These arguments are available in all GraphQL queries and mutations to help you control the context of your requests. :: ## Prerequisites - Merchant API key ## Goal - Find your available channels, markets, and languages - Use the parameters in your API requests to target specific contexts ## Architecture at a glance - Discover available channels → Choose target channel/market/language → Use parameters in queries/mutations ## APIs used - Merchant API: `https://merchantapi.geins.io/graphql` ## Understanding the hierarchy The multi-market system follows this structure: ```text Channel (e.g., "1|se") ├── Market 1 (e.g., "se") + Currency (SEK) │ ├── Language 1 (e.g., "sv-SE") │ └── Language 2 (e.g., "en-US") ├── Market 2 (e.g., "eu") + Currency (EUR) │ └── Language 1 (e.g., "en-US") └── Market 3 (e.g., "fi") + Currency (EUR) ├── Language 1 (e.g., "fi-FI") └── Language 2 (e.g., "sv-SE") ``` - **Channel**: Sales channel (different storefronts/brands/way of selling) - **Market**: Geographic/business market with specific currency - **Language**: Content language for that market ## The properties ::field-group :::field{name="channelId" type="string"} The `channelId` parameter specifies which sales channel to use for the request. The id is built as `{channelInternalId}|{channelAlias}` (e.g., `1|se`). You can find it by quering your `channels`, see example below. ::: :::field{name="marketId" type="string"} The `marketId` parameter specifies which market to use for the request. Use the market `id` (e.g., `SE|SEK`, `EU|EUR`, `FI|EUR`) or `alias` (e.g., `se`, `eu`, `fi`) for this field. You can find it by querying your **channels** and their **markets**, see example below. :br A note on marketId values: - The `alias` is often more user-friendly and stable to use in URLs. Often it is just the country code in lowercase (e.g., `se` for Sweden) when the market only uses one currency. - The `id` includes both country and currency (e.g., `SE|SEK` for Sweden with SEK currency) and is useful when a market has multiple currencies. ::: :::field{name="languageId" type="string"} The `languageId` parameter specifies which language to use for the request. The id is the language code (e.g., `sv-SE`). You can find it by querying your **channels** and their **languages**, see example below. ::: :: ## Step-by-step ::steps{level="3"} ### Discover available channels First, get all available channels to understand your setup: :::tip Try it out in the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} using the headers and query below. ::: #### Request example :::code-collapse ::::code-group ```graphql [query.graphql] query getChannels { channels { id name type url defaultLanguageId defaultMarketId languages { id name code } markets { id defaultLanguageId virtual onlyDisplayInCheckout groupKey alias allowedLanguages { id name code } country { name code } currency { name symbol code rate } } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` :::: ::: #### Response example :::badge **200 OK** ::: :::code-collapse ```json [response.json] { "data": { "channels": [ { "id": "1|se", "name": "store.se", "type": "webshop", "url": "https://store.example.com", "defaultLanguageId": "sv-SE", "defaultMarketId": "SE|SEK", "languages": [ { "id": "sv-SE", "name": "Svenska", "code": "sv" }, { "id": "en-US", "name": "English", "code": "en" } ], "markets": [ { "id": "SE|SEK", "defaultLanguageId": "sv-SE", "virtual": false, "onlyDisplayInCheckout": false, "groupKey": "SCANDINAVIA", "alias": "se", "allowedLanguages": [ { "id": "sv-SE", "name": "Svenska", "code": "sv" }, { "id": "en-US", "name": "English", "code": "en" } ], "country": { "name": "Sweden", "code": "SE" }, "currency": { "name": "Svenska Kronor", "code": "SEK", "symbol": "kr", "rate": 1 } }, { "id": "FI|EUR", "defaultLanguageId": "en-US", "virtual": false, "onlyDisplayInCheckout": false, "groupKey": "SCANDINAVIA", "alias": "fi", "allowedLanguages": [ ... ], "country": { ... }, "currency": { ... } }, { "id": "EU|EUR", "defaultLanguageId": "en-US", "virtual": true, "onlyDisplayInCheckout": false, "groupKey": "EU", "alias": "eu", "allowedLanguages": [ ... ], "country": { ... }, "currency": { ... } } ] } ] } } ``` ::: ### Use parameters in queries and mutations Once you know the available channels, markets, and languages, include the appropriate parameters in your API calls: :::warning Note that it is the `alias` of the market that should be used as the `marketId` parameter value in queries and mutations. ::: #### Example: Get products for specific market :::code-collapse ::::code-group ```graphql [query.graphql] query products( $channelId: String $marketId: String $languageId: String ) { products( channelId: $channelId marketId: $marketId languageId: $languageId ) { count products { productId name } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` :::: ::: #### Example: Create cart for specific market :::code-group ```graphql [mutation.graphql] mutation getCart( $channelId: String $marketId: String $languageId: String ) { getCart( channelId: $channelId marketId: $marketId languageId: $languageId ) { id } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```json [query-variables.json] { "channelId": "{CHANNEL_ID}", "languageId": "{LANGUAGE_ID}", "marketId": "{MARKET_ID}" } ``` ::: :: ## Default behavior When parameters are omitted or invalid values are provided: - **Missing `channelId`**: Uses the default sales channel - **Missing `marketId`**: Uses the channel's default market - **Missing `languageId`**: Uses the market's default language, or if not set, the channel's default language - **Invalid values**: Falls back to defaults (no errors thrown) ## What data changes between markets and languages ### Market differences - **Pricing**: Different currencies (SEK, EUR, USD) - **Product availability**: Products may be restricted to specific channels/markets - **Campaigns**: Promotions can run on specific channels only - **Tax calculations**: Market-specific tax rules ### Language differences - **Product names and descriptions**: Localized content - **Category names**: Translated navigation - **Error messages**: Localized user feedback - **Content pages**: Market-specific information # Merchant API ::presentation-text With this API, you can build your next commerce application that retrieve product information, process orders, manage customer data, handle shopping cart operations, process payments, and create state of the art shopping experiences. :: ## Getting started Once you have created a Geins account, you can start using the Merchant API by obtaining your **Merchant API key**. You can obtain your API key by logging in to your Geins account in the top right corner or in your Geins Merchant Center. ## Authentication ### API key A `X-ApiKey` header needs to be included in every request. This header should contain the value of your **Merchant API key**. ### GraphQL playground Head over to the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} to start exploring the API. The playground is a great way to test out queries and mutations without having to write any code. ### Request example ::code-collapse :::code-group ```graphql [query.graphql] query categories { categories { categoryId parentCategoryId order alias canonicalUrl alternativeCanonicalUrls name description isHidden googleTaxonomy { id parentId name path } } } ``` ```json [headers.json] { "Accept": "application/json", "X-ApiKey": "{MERCHANT_API_KEY}" } ``` ```shell [cURL] curl -X POST 'https://merchantapi.geins.io/graphql' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'X-ApiKey: {MERCHANT_API_KEY}' \ -d '{"query":"query categories { categories { categoryId name description } }"}' ``` ```ts [fetch.js] const response = await fetch('https://merchantapi.geins.io/graphql', { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', 'X-ApiKey': '{MERCHANT_API_KEY}', }, body: JSON.stringify({ query: `query categories { categories { categoryId name description } }` }) }); const data = await response.json(); console.log(data); ``` ::: :: ### The GraphQL schema The documentation has been automatically generated from the GraphQL schema, available for download from the [GraphQL Playground](https://merchantapi.geins.io/ui/playground){rel="nofollow"} Use the docs in the sidebar to find out more about available operations and types: - **Allowed operations**: - `queries` - `mutations` - **Schema-defined types**: - `scalars` - `objects` - `enums` - `interfaces` - `unions` - `input objects` # Getting started ::tip With this API, you can build custom applications and integrate with third-party systems, feeds, dashboards and other bussiness logic apps. :: ## Getting started Once you have created a Geins account, you can start using the Management API by creating an `API User`. You can create as many API users as you need. Each `API user` is connected to a specific account so you can keep track of operations and manage keys. You can find all your API credentials in `Geins Merchant Center`. ## Authentication ### Basic Auth A Basic auth `Authorization` header needs to be included in every request. The value should be `Basic ` where `` is the Base64 encoding of your `API username` and `API password` joined by a single colon `:`. See [Wikipedia](https://en.wikipedia.org/wiki/Basic_access_authentication){rel="nofollow"} for more information on Basic auth. ### API Key A `X-ApiKey` header needs to be included in every request. This header should contain the value of your `API key`. ### Generate credentials Base64 encoded ::api-credentials :: ### Request example ::code-collapse{sync="request"} :::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Brand/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Brand/{id}', headers: { Accept: 'application/json', 'Content-Type': 'application/json', Authorization: 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}', }, }; axios .request(config) .then((response) => response.data) .catch((error) => console.error(error)); ``` ```ts [fetch.js] const response = await fetch('https://mgmtapi.geins.io/API/Brand/{id}', { method: 'GET', headers: { Accept: 'application/json', 'Content-Type': 'application/json', Authorization: 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}', }, }); const data = await response.json(); console.log(data); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Brand/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Brand/{id}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Brand/{id}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` ::: :: # Get user balance types ::api-endpoint --- api: mgmtapi endpointUrl: /API/BalanceType/List operationId: Get user balance types --- #sidebar :::api-endpoint-path{method="GET" path="/API/BalanceType/List"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/BalanceType/List' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/BalanceType/List', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/BalanceType/List', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/BalanceType/List" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/BalanceType/List" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/BalanceType/List", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ { "Name": "string" } ], "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get brand ::api-endpoint --- api: mgmtapi endpointUrl: /API/Brand/{id} operationId: Get brand --- #sidebar :::api-endpoint-path{method="GET" path="/API/Brand/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Brand/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Brand/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Brand/{id}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Brand/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Brand/{id}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Brand/{id}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "BrandId": 0, "Name": "string", "ExternalId": "string", "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create brand ::api-endpoint --- api: mgmtapi endpointUrl: /API/Brand operationId: Create brand --- #sidebar :::api-endpoint-path{method="POST" path="/API/Brand"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Brand' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Name": "string", "ExternalId": "string", "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Brand', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Name": "string", "ExternalId": "string", "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Brand', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Name": "string", "ExternalId": "string", "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Brand" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Name": "string", "ExternalId": "string", "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ] } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Brand" payload := []byte(`{ "Name": "string", "ExternalId": "string", "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ] }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Name = "string", ExternalId = "string", Descriptions = new[] { new { LanguageCode = "string", Content = "string" } } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Brand", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "BrandId": 0, "Name": "string", "ExternalId": "string", "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update brand ::api-endpoint --- api: mgmtapi endpointUrl: /API/Brand/{id} operationId: Update brand --- #sidebar :::api-endpoint-path{method="PUT" path="/API/Brand/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Brand/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Name": "string", "ExternalId": "string", "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Brand/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Name": "string", "ExternalId": "string", "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Brand/{id}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Name": "string", "ExternalId": "string", "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Brand/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Name": "string", "ExternalId": "string", "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ] } response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Brand/{id}" payload := []byte(`{ "Name": "string", "ExternalId": "string", "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ] }`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Name = "string", ExternalId = "string", Descriptions = new[] { new { LanguageCode = "string", Content = "string" } } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Brand/{id}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "BrandId": 0, "Name": "string", "ExternalId": "string", "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Delete brand ::api-endpoint --- api: mgmtapi endpointUrl: /API/Brand/{id} operationId: Delete brand --- #sidebar :::api-endpoint-path{method="DELETE" path="/API/Brand/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/Brand/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/Brand/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Brand/{id}', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Brand/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Brand/{id}" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/Brand/{id}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Query brands ::api-endpoint --- api: mgmtapi endpointUrl: /API/Brand/Query operationId: Query brands --- #sidebar :::api-endpoint-path{method="POST" path="/API/Brand/Query"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Brand/Query' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "CreatedAfter": "string", "BrandIds": [ 0 ], "ExternalIds": [ "string" ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Brand/Query', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "CreatedAfter": "string", "BrandIds": [ 0 ], "ExternalIds": [ "string" ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Brand/Query', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "CreatedAfter": "string", "BrandIds": [ 0 ], "ExternalIds": [ "string" ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Brand/Query" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "CreatedAfter": "string", "BrandIds": [ 0 ], "ExternalIds": [ "string" ] } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Brand/Query" payload := []byte(`{ "CreatedAfter": "string", "BrandIds": [ 0 ], "ExternalIds": [ "string" ] }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { CreatedAfter = "string", BrandIds = new[] { 0 }, ExternalIds = new[] { "string" } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Brand/Query", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] [ { "BrandId": 0, "Name": "string", "ExternalId": "string", "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] ``` :::: ::: :: # Get campaign ::api-endpoint --- api: mgmtapi endpointUrl: /API/Campaign/{id} operationId: Get campaign --- #sidebar :::api-endpoint-path{method="GET" path="/API/Campaign/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Campaign/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Campaign/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Campaign/{id}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Campaign/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Campaign/{id}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Campaign/{id}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "CampaignNumber": 0, "Status": "string", "RoundingMethod": "string", "ContractVersion": "string", "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignBaseType": 0, "Title": [ { "Language": "string", "Value": "string" } ], "Description": "string", "MarketId": "string", "CampaignTypeId": 0, "BuyQuantity": 0, "Amounts": {}, "PayForQuantity": 0, "Priority": 0, "StopCombining": true, "ValidFrom": "string", "ValidTo": "string", "PromoCode": "string", "HideTitle": true, "CantCombineWithCartCampaign": true, "PercentageValue": 0, "ExcludeProductsOnSale": true, "SaleTypesToEnforce": 0, "MinimumPurchaseAmounts": {}, "MinimumQuantity": 0, "CheckMinAmountAfterDiscounts": true, "Scoped": true, "OncePerCustomer": true, "UseSalePrice": true, "FreeShipping": true, "UsageLimit": 0, "Prices": {}, "LandingPage": { "Title": [ { "Language": "string", "Value": "string" } ], "Url": [ { "Values": [ "string" ], "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ], "Meta": { "Title": [ { "Language": "string", "Value": "string" } ], "Keywords": [ { "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ] } }, "SelectedUsers": [ "string" ], "SelectedGroups": [ "string" ], "Enabled": true, "ProductSelection": { "Include": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] }, "Exclude": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] } }, "Group": "string", "PriceOutput": 0 }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create campaign ::api-endpoint --- api: mgmtapi endpointUrl: /API/Campaign operationId: Create campaign --- #sidebar :::api-endpoint-path{method="POST" path="/API/Campaign"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Campaign' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignBaseType": 0, "Title": [ { "Language": "string", "Value": "string" } ], "Description": "string", "MarketId": "string", "CampaignTypeId": 0, "BuyQuantity": 0, "Amounts": {}, "PayForQuantity": 0, "Priority": 0, "StopCombining": true, "ValidFrom": "string", "ValidTo": "string", "PromoCode": "string", "HideTitle": true, "CantCombineWithCartCampaign": true, "PercentageValue": 0, "ExcludeProductsOnSale": true, "SaleTypesToEnforce": 0, "MinimumPurchaseAmounts": {}, "MinimumQuantity": 0, "CheckMinAmountAfterDiscounts": true, "Scoped": true, "OncePerCustomer": true, "UseSalePrice": true, "FreeShipping": true, "UsageLimit": 0, "Prices": {}, "LandingPage": { "Title": [ { "Language": "string", "Value": "string" } ], "Url": [ { "Values": [ "string" ], "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ], "Meta": { "Title": [ { "Language": "string", "Value": "string" } ], "Keywords": [ { "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ] } }, "SelectedUsers": [ "string" ], "SelectedGroups": [ "string" ], "Enabled": true, "ProductSelection": { "Include": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] }, "Exclude": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] } }, "Group": "string", "PriceOutput": 0 }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Campaign', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignBaseType": 0, "Title": [ { "Language": "string", "Value": "string" } ], "Description": "string", "MarketId": "string", "CampaignTypeId": 0, "BuyQuantity": 0, "Amounts": {}, "PayForQuantity": 0, "Priority": 0, "StopCombining": true, "ValidFrom": "string", "ValidTo": "string", "PromoCode": "string", "HideTitle": true, "CantCombineWithCartCampaign": true, "PercentageValue": 0, "ExcludeProductsOnSale": true, "SaleTypesToEnforce": 0, "MinimumPurchaseAmounts": {}, "MinimumQuantity": 0, "CheckMinAmountAfterDiscounts": true, "Scoped": true, "OncePerCustomer": true, "UseSalePrice": true, "FreeShipping": true, "UsageLimit": 0, "Prices": {}, "LandingPage": { "Title": [ { "Language": "string", "Value": "string" } ], "Url": [ { "Values": [ "string" ], "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ], "Meta": { "Title": [ { "Language": "string", "Value": "string" } ], "Keywords": [ { "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ] } }, "SelectedUsers": [ "string" ], "SelectedGroups": [ "string" ], "Enabled": true, "ProductSelection": { "Include": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] }, "Exclude": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] } }, "Group": "string", "PriceOutput": 0 } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Campaign', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignBaseType": 0, "Title": [ { "Language": "string", "Value": "string" } ], "Description": "string", "MarketId": "string", "CampaignTypeId": 0, "BuyQuantity": 0, "Amounts": {}, "PayForQuantity": 0, "Priority": 0, "StopCombining": true, "ValidFrom": "string", "ValidTo": "string", "PromoCode": "string", "HideTitle": true, "CantCombineWithCartCampaign": true, "PercentageValue": 0, "ExcludeProductsOnSale": true, "SaleTypesToEnforce": 0, "MinimumPurchaseAmounts": {}, "MinimumQuantity": 0, "CheckMinAmountAfterDiscounts": true, "Scoped": true, "OncePerCustomer": true, "UseSalePrice": true, "FreeShipping": true, "UsageLimit": 0, "Prices": {}, "LandingPage": { "Title": [ { "Language": "string", "Value": "string" } ], "Url": [ { "Values": [ "string" ], "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ], "Meta": { "Title": [ { "Language": "string", "Value": "string" } ], "Keywords": [ { "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ] } }, "SelectedUsers": [ "string" ], "SelectedGroups": [ "string" ], "Enabled": true, "ProductSelection": { "Include": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] }, "Exclude": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] } }, "Group": "string", "PriceOutput": 0 }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Campaign" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignBaseType": 0, "Title": [ { "Language": "string", "Value": "string" } ], "Description": "string", "MarketId": "string", "CampaignTypeId": 0, "BuyQuantity": 0, "Amounts": {}, "PayForQuantity": 0, "Priority": 0, "StopCombining": true, "ValidFrom": "string", "ValidTo": "string", "PromoCode": "string", "HideTitle": true, "CantCombineWithCartCampaign": true, "PercentageValue": 0, "ExcludeProductsOnSale": true, "SaleTypesToEnforce": 0, "MinimumPurchaseAmounts": {}, "MinimumQuantity": 0, "CheckMinAmountAfterDiscounts": true, "Scoped": true, "OncePerCustomer": true, "UseSalePrice": true, "FreeShipping": true, "UsageLimit": 0, "Prices": {}, "LandingPage": { "Title": [ { "Language": "string", "Value": "string" } ], "Url": [ { "Values": [ "string" ], "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ], "Meta": { "Title": [ { "Language": "string", "Value": "string" } ], "Keywords": [ { "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ] } }, "SelectedUsers": [ "string" ], "SelectedGroups": [ "string" ], "Enabled": true, "ProductSelection": { "Include": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] }, "Exclude": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] } }, "Group": "string", "PriceOutput": 0 } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Campaign" payload := []byte(`{ "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignBaseType": 0, "Title": [ { "Language": "string", "Value": "string" } ], "Description": "string", "MarketId": "string", "CampaignTypeId": 0, "BuyQuantity": 0, "Amounts": {}, "PayForQuantity": 0, "Priority": 0, "StopCombining": true, "ValidFrom": "string", "ValidTo": "string", "PromoCode": "string", "HideTitle": true, "CantCombineWithCartCampaign": true, "PercentageValue": 0, "ExcludeProductsOnSale": true, "SaleTypesToEnforce": 0, "MinimumPurchaseAmounts": {}, "MinimumQuantity": 0, "CheckMinAmountAfterDiscounts": true, "Scoped": true, "OncePerCustomer": true, "UseSalePrice": true, "FreeShipping": true, "UsageLimit": 0, "Prices": {}, "LandingPage": { "Title": [ { "Language": "string", "Value": "string" } ], "Url": [ { "Values": [ "string" ], "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ], "Meta": { "Title": [ { "Language": "string", "Value": "string" } ], "Keywords": [ { "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ] } }, "SelectedUsers": [ "string" ], "SelectedGroups": [ "string" ], "Enabled": true, "ProductSelection": { "Include": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] }, "Exclude": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] } }, "Group": "string", "PriceOutput": 0 }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { CampaignId = "00000000-0000-0000-0000-000000000000", CampaignBaseType = 0, Title = new[] { new { Language = "string", Value = "string" } }, Description = "string", MarketId = "string", CampaignTypeId = 0, BuyQuantity = 0, Amounts = new { }, PayForQuantity = 0, Priority = 0, StopCombining = true, ValidFrom = "string", ValidTo = "string", PromoCode = "string", HideTitle = true, CantCombineWithCartCampaign = true, PercentageValue = 0, ExcludeProductsOnSale = true, SaleTypesToEnforce = 0, MinimumPurchaseAmounts = new { }, MinimumQuantity = 0, CheckMinAmountAfterDiscounts = true, Scoped = true, OncePerCustomer = true, UseSalePrice = true, FreeShipping = true, UsageLimit = 0, Prices = new { }, LandingPage = new { Title = new[] { new { Language = "string", Value = "string" } }, Url = new[] { new { Values = new[] { "string" }, Language = "string", Value = "string" } }, Description = new[] { new { Language = "string", Value = "string" } }, Meta = new { Title = new[] { new { Language = "string", Value = "string" } }, Keywords = new[] { new { Language = "string", Value = "string" } }, Description = new[] { new { Language = "string", Value = "string" } } } }, SelectedUsers = new[] { "string" }, SelectedGroups = new[] { "string" }, Enabled = true, ProductSelection = new { Include = new { Condition = 0, Categories = new[] { new { Id = 0, Name = "string" } }, Brands = new[] { new { Id = 0, Name = "string" } }, Products = new[] { 0 }, Price = new[] { new { Condition = 0, Prices = new { } } } }, Exclude = new { Condition = 0, Categories = new[] { new { Id = 0, Name = "string" } }, Brands = new[] { new { Id = 0, Name = "string" } }, Products = new[] { 0 }, Price = new[] { new { Condition = 0, Prices = new { } } } } }, Group = "string", PriceOutput = 0 }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Campaign", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "CampaignNumber": 0, "Status": "string", "RoundingMethod": "string", "ContractVersion": "string", "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignBaseType": 0, "Title": [ { "Language": "string", "Value": "string" } ], "Description": "string", "MarketId": "string", "CampaignTypeId": 0, "BuyQuantity": 0, "Amounts": {}, "PayForQuantity": 0, "Priority": 0, "StopCombining": true, "ValidFrom": "string", "ValidTo": "string", "PromoCode": "string", "HideTitle": true, "CantCombineWithCartCampaign": true, "PercentageValue": 0, "ExcludeProductsOnSale": true, "SaleTypesToEnforce": 0, "MinimumPurchaseAmounts": {}, "MinimumQuantity": 0, "CheckMinAmountAfterDiscounts": true, "Scoped": true, "OncePerCustomer": true, "UseSalePrice": true, "FreeShipping": true, "UsageLimit": 0, "Prices": {}, "LandingPage": { "Title": [ { "Language": "string", "Value": "string" } ], "Url": [ { "Values": [ "string" ], "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ], "Meta": { "Title": [ { "Language": "string", "Value": "string" } ], "Keywords": [ { "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ] } }, "SelectedUsers": [ "string" ], "SelectedGroups": [ "string" ], "Enabled": true, "ProductSelection": { "Include": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] }, "Exclude": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] } }, "Group": "string", "PriceOutput": 0 }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update campaign ::api-endpoint --- api: mgmtapi endpointUrl: /API/Campaign/{id} operationId: Update campaign --- #sidebar :::api-endpoint-path{method="PUT" path="/API/Campaign/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Campaign/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignBaseType": 0, "Title": [ { "Language": "string", "Value": "string" } ], "Description": "string", "MarketId": "string", "CampaignTypeId": 0, "BuyQuantity": 0, "Amounts": {}, "PayForQuantity": 0, "Priority": 0, "StopCombining": true, "ValidFrom": "string", "ValidTo": "string", "PromoCode": "string", "HideTitle": true, "CantCombineWithCartCampaign": true, "PercentageValue": 0, "ExcludeProductsOnSale": true, "SaleTypesToEnforce": 0, "MinimumPurchaseAmounts": {}, "MinimumQuantity": 0, "CheckMinAmountAfterDiscounts": true, "Scoped": true, "OncePerCustomer": true, "UseSalePrice": true, "FreeShipping": true, "UsageLimit": 0, "Prices": {}, "LandingPage": { "Title": [ { "Language": "string", "Value": "string" } ], "Url": [ { "Values": [ "string" ], "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ], "Meta": { "Title": [ { "Language": "string", "Value": "string" } ], "Keywords": [ { "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ] } }, "SelectedUsers": [ "string" ], "SelectedGroups": [ "string" ], "Enabled": true, "ProductSelection": { "Include": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] }, "Exclude": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] } }, "Group": "string", "PriceOutput": 0 }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Campaign/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignBaseType": 0, "Title": [ { "Language": "string", "Value": "string" } ], "Description": "string", "MarketId": "string", "CampaignTypeId": 0, "BuyQuantity": 0, "Amounts": {}, "PayForQuantity": 0, "Priority": 0, "StopCombining": true, "ValidFrom": "string", "ValidTo": "string", "PromoCode": "string", "HideTitle": true, "CantCombineWithCartCampaign": true, "PercentageValue": 0, "ExcludeProductsOnSale": true, "SaleTypesToEnforce": 0, "MinimumPurchaseAmounts": {}, "MinimumQuantity": 0, "CheckMinAmountAfterDiscounts": true, "Scoped": true, "OncePerCustomer": true, "UseSalePrice": true, "FreeShipping": true, "UsageLimit": 0, "Prices": {}, "LandingPage": { "Title": [ { "Language": "string", "Value": "string" } ], "Url": [ { "Values": [ "string" ], "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ], "Meta": { "Title": [ { "Language": "string", "Value": "string" } ], "Keywords": [ { "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ] } }, "SelectedUsers": [ "string" ], "SelectedGroups": [ "string" ], "Enabled": true, "ProductSelection": { "Include": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] }, "Exclude": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] } }, "Group": "string", "PriceOutput": 0 } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Campaign/{id}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignBaseType": 0, "Title": [ { "Language": "string", "Value": "string" } ], "Description": "string", "MarketId": "string", "CampaignTypeId": 0, "BuyQuantity": 0, "Amounts": {}, "PayForQuantity": 0, "Priority": 0, "StopCombining": true, "ValidFrom": "string", "ValidTo": "string", "PromoCode": "string", "HideTitle": true, "CantCombineWithCartCampaign": true, "PercentageValue": 0, "ExcludeProductsOnSale": true, "SaleTypesToEnforce": 0, "MinimumPurchaseAmounts": {}, "MinimumQuantity": 0, "CheckMinAmountAfterDiscounts": true, "Scoped": true, "OncePerCustomer": true, "UseSalePrice": true, "FreeShipping": true, "UsageLimit": 0, "Prices": {}, "LandingPage": { "Title": [ { "Language": "string", "Value": "string" } ], "Url": [ { "Values": [ "string" ], "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ], "Meta": { "Title": [ { "Language": "string", "Value": "string" } ], "Keywords": [ { "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ] } }, "SelectedUsers": [ "string" ], "SelectedGroups": [ "string" ], "Enabled": true, "ProductSelection": { "Include": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] }, "Exclude": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] } }, "Group": "string", "PriceOutput": 0 }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Campaign/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignBaseType": 0, "Title": [ { "Language": "string", "Value": "string" } ], "Description": "string", "MarketId": "string", "CampaignTypeId": 0, "BuyQuantity": 0, "Amounts": {}, "PayForQuantity": 0, "Priority": 0, "StopCombining": true, "ValidFrom": "string", "ValidTo": "string", "PromoCode": "string", "HideTitle": true, "CantCombineWithCartCampaign": true, "PercentageValue": 0, "ExcludeProductsOnSale": true, "SaleTypesToEnforce": 0, "MinimumPurchaseAmounts": {}, "MinimumQuantity": 0, "CheckMinAmountAfterDiscounts": true, "Scoped": true, "OncePerCustomer": true, "UseSalePrice": true, "FreeShipping": true, "UsageLimit": 0, "Prices": {}, "LandingPage": { "Title": [ { "Language": "string", "Value": "string" } ], "Url": [ { "Values": [ "string" ], "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ], "Meta": { "Title": [ { "Language": "string", "Value": "string" } ], "Keywords": [ { "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ] } }, "SelectedUsers": [ "string" ], "SelectedGroups": [ "string" ], "Enabled": true, "ProductSelection": { "Include": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] }, "Exclude": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] } }, "Group": "string", "PriceOutput": 0 } response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Campaign/{id}" payload := []byte(`{ "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignBaseType": 0, "Title": [ { "Language": "string", "Value": "string" } ], "Description": "string", "MarketId": "string", "CampaignTypeId": 0, "BuyQuantity": 0, "Amounts": {}, "PayForQuantity": 0, "Priority": 0, "StopCombining": true, "ValidFrom": "string", "ValidTo": "string", "PromoCode": "string", "HideTitle": true, "CantCombineWithCartCampaign": true, "PercentageValue": 0, "ExcludeProductsOnSale": true, "SaleTypesToEnforce": 0, "MinimumPurchaseAmounts": {}, "MinimumQuantity": 0, "CheckMinAmountAfterDiscounts": true, "Scoped": true, "OncePerCustomer": true, "UseSalePrice": true, "FreeShipping": true, "UsageLimit": 0, "Prices": {}, "LandingPage": { "Title": [ { "Language": "string", "Value": "string" } ], "Url": [ { "Values": [ "string" ], "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ], "Meta": { "Title": [ { "Language": "string", "Value": "string" } ], "Keywords": [ { "Language": "string", "Value": "string" } ], "Description": [ { "Language": "string", "Value": "string" } ] } }, "SelectedUsers": [ "string" ], "SelectedGroups": [ "string" ], "Enabled": true, "ProductSelection": { "Include": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] }, "Exclude": { "Condition": 0, "Categories": [ { "Id": 0, "Name": "string" } ], "Brands": [ { "Id": 0, "Name": "string" } ], "Products": [ 0 ], "Price": [ { "Condition": 0, "Prices": {} } ] } }, "Group": "string", "PriceOutput": 0 }`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { CampaignId = "00000000-0000-0000-0000-000000000000", CampaignBaseType = 0, Title = new[] { new { Language = "string", Value = "string" } }, Description = "string", MarketId = "string", CampaignTypeId = 0, BuyQuantity = 0, Amounts = new { }, PayForQuantity = 0, Priority = 0, StopCombining = true, ValidFrom = "string", ValidTo = "string", PromoCode = "string", HideTitle = true, CantCombineWithCartCampaign = true, PercentageValue = 0, ExcludeProductsOnSale = true, SaleTypesToEnforce = 0, MinimumPurchaseAmounts = new { }, MinimumQuantity = 0, CheckMinAmountAfterDiscounts = true, Scoped = true, OncePerCustomer = true, UseSalePrice = true, FreeShipping = true, UsageLimit = 0, Prices = new { }, LandingPage = new { Title = new[] { new { Language = "string", Value = "string" } }, Url = new[] { new { Values = new[] { "string" }, Language = "string", Value = "string" } }, Description = new[] { new { Language = "string", Value = "string" } }, Meta = new { Title = new[] { new { Language = "string", Value = "string" } }, Keywords = new[] { new { Language = "string", Value = "string" } }, Description = new[] { new { Language = "string", Value = "string" } } } }, SelectedUsers = new[] { "string" }, SelectedGroups = new[] { "string" }, Enabled = true, ProductSelection = new { Include = new { Condition = 0, Categories = new[] { new { Id = 0, Name = "string" } }, Brands = new[] { new { Id = 0, Name = "string" } }, Products = new[] { 0 }, Price = new[] { new { Condition = 0, Prices = new { } } } }, Exclude = new { Condition = 0, Categories = new[] { new { Id = 0, Name = "string" } }, Brands = new[] { new { Id = 0, Name = "string" } }, Products = new[] { 0 }, Price = new[] { new { Condition = 0, Prices = new { } } } } }, Group = "string", PriceOutput = 0 }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Campaign/{id}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Delete campaign ::api-endpoint --- api: mgmtapi endpointUrl: /API/Campaign/{id} operationId: Delete campaign --- #sidebar :::api-endpoint-path{method="DELETE" path="/API/Campaign/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/Campaign/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/Campaign/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Campaign/{id}', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Campaign/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Campaign/{id}" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/Campaign/{id}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # List campaigns ::api-endpoint --- api: mgmtapi endpointUrl: /API/Campaign/List operationId: List campaigns --- #sidebar :::api-endpoint-path{method="GET" path="/API/Campaign/List"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Campaign/List' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Campaign/List', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Campaign/List', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Campaign/List" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Campaign/List" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Campaign/List", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ { "CampaignId": "00000000-0000-0000-0000-000000000000", "Type": "string", "CampaignBaseType": "string", "Market": "string", "StartDate": "string", "CreateDate": "string", "Status": "string", "Title": "string", "PromoCode": "string", "Description": "string", "Priority": 0 } ], "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get campaign types ::api-endpoint --- api: mgmtapi endpointUrl: /API/Campaign/Types operationId: Get campaign types --- #sidebar :::api-endpoint-path{method="GET" path="/API/Campaign/Types"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Campaign/Types' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Campaign/Types', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Campaign/Types', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Campaign/Types" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Campaign/Types" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Campaign/Types", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ { "Id": 0, "Name": "string" } ], "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get category ::api-endpoint --- api: mgmtapi endpointUrl: /API/Category/{id} operationId: Get category --- #sidebar :::api-endpoint-path{method="GET" path="/API/Category/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Category/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Category/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Category/{id}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Category/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Category/{id}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Category/{id}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "CategoryId": 0, "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "GoogleCategoryPath": "string", "Hidden": true, "Active": true }, "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create category ::api-endpoint --- api: mgmtapi endpointUrl: /API/Category operationId: Create category --- #sidebar :::api-endpoint-path{method="POST" path="/API/Category"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Category' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "Hidden": true, "Active": true }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Category', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "Hidden": true, "Active": true } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Category', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "Hidden": true, "Active": true }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Category" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "Hidden": true, "Active": true } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Category" payload := []byte(`{ "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "Hidden": true, "Active": true }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { ParentCategoryId = 0, Names = new[] { new { LanguageCode = "string", Content = "string" } }, Descriptions = new[] { new { LanguageCode = "string", Content = "string" } }, SecondaryDescriptions = new[] { new { LanguageCode = "string", Content = "string" } }, Meta = new { Descriptions = new[] { new { LanguageCode = "string", Content = "string" } }, Keywords = new[] { new { LanguageCode = "string", Content = "string" } }, Titles = new[] { new { LanguageCode = "string", Content = "string" } } }, Hidden = true, Active = true }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Category", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "CategoryId": 0, "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "GoogleCategoryPath": "string", "Hidden": true, "Active": true }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update category ::api-endpoint --- api: mgmtapi endpointUrl: /API/Category/{id} operationId: Update category --- #sidebar :::api-endpoint-path{method="PUT" path="/API/Category/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Category/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "Hidden": true, "Active": true }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Category/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "Hidden": true, "Active": true } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Category/{id}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "Hidden": true, "Active": true }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Category/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "Hidden": true, "Active": true } response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Category/{id}" payload := []byte(`{ "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "Hidden": true, "Active": true }`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { ParentCategoryId = 0, Names = new[] { new { LanguageCode = "string", Content = "string" } }, Descriptions = new[] { new { LanguageCode = "string", Content = "string" } }, SecondaryDescriptions = new[] { new { LanguageCode = "string", Content = "string" } }, Meta = new { Descriptions = new[] { new { LanguageCode = "string", Content = "string" } }, Keywords = new[] { new { LanguageCode = "string", Content = "string" } }, Titles = new[] { new { LanguageCode = "string", Content = "string" } } }, Hidden = true, Active = true }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Category/{id}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "CategoryId": 0, "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "GoogleCategoryPath": "string", "Hidden": true, "Active": true }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Query categories ::api-endpoint --- api: mgmtapi endpointUrl: /API/Category/Query operationId: Query categories --- #sidebar :::api-endpoint-path{method="POST" path="/API/Category/Query"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Category/Query' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "CreatedAfter": "string", "CategoryIds": [ 0 ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Category/Query', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "CreatedAfter": "string", "CategoryIds": [ 0 ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Category/Query', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "CreatedAfter": "string", "CategoryIds": [ 0 ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Category/Query" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "CreatedAfter": "string", "CategoryIds": [ 0 ] } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Category/Query" payload := []byte(`{ "CreatedAfter": "string", "CategoryIds": [ 0 ] }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { CreatedAfter = "string", CategoryIds = new[] { 0 } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Category/Query", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] [ { "CategoryId": 0, "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "GoogleCategoryPath": "string", "Hidden": true, "Active": true } ] ``` :::: ::: :: # Get customer group ::api-endpoint --- api: mgmtapi endpointUrl: /API/CustomerGroup/{id} operationId: Get customer group --- #sidebar :::api-endpoint-path{method="GET" path="/API/CustomerGroup/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/CustomerGroup/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/CustomerGroup/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/CustomerGroup/{id}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/CustomerGroup/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/CustomerGroup/{id}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/CustomerGroup/{id}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "CustomerGroupId": 0, "Name": "string", "DiscountPercentage": 0 }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create customer group ::api-endpoint --- api: mgmtapi endpointUrl: /API/CustomerGroup operationId: Create customer group --- #sidebar :::api-endpoint-path{method="POST" path="/API/CustomerGroup"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/CustomerGroup' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Name": "string", "DiscountPercentage": 0 }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/CustomerGroup', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Name": "string", "DiscountPercentage": 0 } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/CustomerGroup', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Name": "string", "DiscountPercentage": 0 }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/CustomerGroup" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Name": "string", "DiscountPercentage": 0 } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/CustomerGroup" payload := []byte(`{ "Name": "string", "DiscountPercentage": 0 }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Name = "string", DiscountPercentage = 0 }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/CustomerGroup", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": 0, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update customer group ::api-endpoint --- api: mgmtapi endpointUrl: /API/CustomerGroup/{id} operationId: Update customer group --- #sidebar :::api-endpoint-path{method="PUT" path="/API/CustomerGroup/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/CustomerGroup/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Name": "string", "DiscountPercentage": 0 }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/CustomerGroup/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Name": "string", "DiscountPercentage": 0 } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/CustomerGroup/{id}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Name": "string", "DiscountPercentage": 0 }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/CustomerGroup/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Name": "string", "DiscountPercentage": 0 } response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/CustomerGroup/{id}" payload := []byte(`{ "Name": "string", "DiscountPercentage": 0 }`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Name = "string", DiscountPercentage = 0 }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/CustomerGroup/{id}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Delete customer group ::api-endpoint --- api: mgmtapi endpointUrl: /API/CustomerGroup/{id} operationId: Delete customer group --- #sidebar :::api-endpoint-path{method="DELETE" path="/API/CustomerGroup/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/CustomerGroup/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/CustomerGroup/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/CustomerGroup/{id}', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/CustomerGroup/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/CustomerGroup/{id}" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/CustomerGroup/{id}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # List customer groups ::api-endpoint --- api: mgmtapi endpointUrl: /API/CustomerGroup/List operationId: List customer groups --- #sidebar :::api-endpoint-path{method="GET" path="/API/CustomerGroup/List"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/CustomerGroup/List' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/CustomerGroup/List', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/CustomerGroup/List', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/CustomerGroup/List" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/CustomerGroup/List" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/CustomerGroup/List", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ { "CustomerGroupId": 0, "Name": "string", "DiscountPercentage": 0 } ], "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get market ::api-endpoint --- api: mgmtapi endpointUrl: /API/Market/{marketId} operationId: Get market --- #sidebar :::api-endpoint-path{method="GET" path="/API/Market/{marketId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Market/{marketId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Market/{marketId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Market/{marketId}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Market/{marketId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Market/{marketId}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Market/{marketId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # List markets ::api-endpoint --- api: mgmtapi endpointUrl: /API/Market/List operationId: List markets --- #sidebar :::api-endpoint-path{method="GET" path="/API/Market/List"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Market/List' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Market/List', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Market/List', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Market/List" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Market/List" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Market/List", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ] ``` :::: ::: :: # Get order (id) ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/{id}/{include} operationId: Get order (id) --- #sidebar :::api-endpoint-path{method="GET" path="/API/Order/{id}/{include}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Order/{id}/{include}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Order/{id}/{include}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/{id}/{include}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/{id}/{include}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/{id}/{include}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Order/{id}/{include}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Id": 0, "ChannelId": "string", "ExternalId": "string", "PersonalId": "string", "CustomerId": 0, "CustomerEmail": "string", "CustomerTypeId": 0, "CustomerGroupId": 0, "CustomerGroupName": "string", "CustomerLoggedIn": true, "CreatedAt": "string", "UpdatedAt": "string", "CompletedAt": "string", "Status": "string", "Currency": "string", "CurrencyRate": 0, "MarketId": 0, "MarketName": "string", "Language": "string", "OrderTotal": 0, "ExpectedSum": 0, "VATTotal": 0, "OrderValueIncVat": 0, "OrderValueExVat": 0, "ItemValueIncVat": 0, "ItemValueExVat": 0, "Discount": 0, "DiscountExVat": 0, "FromBalance": 0, "ShippingFee": 0, "ShippingFeeExVat": 0, "PaymentFee": 0, "PaymentFeeExVat": 0, "Message": "string", "OrderMessages": [ "string" ], "PaymentDetails": [ { "Id": 0, "PaymentId": 0, "Name": "string", "DisplayName": "string", "TransactionId": "string", "SecondaryTransactionId": "string", "ReservationNumber": "string", "ReservationDate": "string", "PaymentDate": "string", "Total": 0, "Payed": true, "PaymentFee": 0, "ShippingFee": 0, "PaymentOption": "string" } ], "ShippingDetails": [ { "Id": 0, "ShippingId": 0, "Name": "string", "ParcelNumber": "string", "ShippingDate": "string", "TrackingUrl": "string", "ExternalDeliveryOptionId": "string", "ExternalServiceId": "string", "ExternalCarrierId": "string", "ExternalDeliveryId": "string", "PickupPoint": "string", "ExternalDeliveryData": "string" } ], "ShippingAddress": { "Company": "string", "CareOf": "string", "State": "string", "Country": "string", "FirstName": "string", "LastName": "string", "Email": "string", "AddressLine1": "string", "AddressLine2": "string", "AddressLine3": "string", "Zip": "string", "City": "string", "Phone": "string", "Mobile": "string", "EntryCode": "string" }, "BillingAddress": { "Company": "string", "CareOf": "string", "State": "string", "Country": "string", "FirstName": "string", "LastName": "string", "Email": "string", "AddressLine1": "string", "AddressLine2": "string", "AddressLine3": "string", "Zip": "string", "City": "string", "Phone": "string", "Mobile": "string", "EntryCode": "string" }, "Rows": [ { "Id": 0, "IdList": "string", "ProductId": 0, "Name": "string", "ProductName": "string", "ItemId": 0, "ItemName": "string", "ArticleNumber": "string", "Total": 0, "ExpectedTotalPriceIncVat": 0, "DiscountRate": 0, "Discount": 0, "ExpectedTotalDiscountIncVat": 0, "VATTotal": 0, "VATRate": 0, "Quantity": 0, "PurchasePrice": 0, "PaymentDetailId": 0, "ShippingDetailId": 0, "Market": "string", "UnitPrice": 0, "ProductContainerBuildId": 0, "Message": "string", "CartRowId": 0, "ExternalId": "string", "ProductContainerSelectionId": 0, "ProductContainerName": "string", "ExternalProductId": "string", "ExternalProductItemId": "string", "ParcelGroupId": 0, "BrandName": "string", "Gtin": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Color": "string", "Variant": "string", "CampaignIds": [ "string" ], "CampaignGroupData": "string", "CampaignGroupId": 0, "CampaignNames": [ "string" ], "CategoryId": 0, "RelatedProductsBuildId": "string", "PackingLocationId": 0, "ProductPriceCampaignId": 0, "ProductPriceListId": 0, "ProductPackageId": 0, "ProductPackageName": "string", "ProductPackageGroupId": "00000000-0000-0000-0000-000000000000", "Status": "string", "ExternalPriceSource": "string" } ], "Refunds": [ { "Id": 0, "OrderRowId": 0, "PaymentDetailId": 0, "ReturnId": 0, "ArticleNumber": "string", "CreatedAt": "string", "Total": 0, "ReasonCode": 0, "Reason": "string", "ToBalance": true, "Vat": 0, "ItemId": 0, "RefundType": "string" } ], "Ip": "string", "UserAgent": "string", "ServiceLocation": "string", "CampaignCode": "string", "CampaignCodeId": 0, "Percent": 0, "DesiredDeliveryDate": "string", "Gender": true, "CartId": 0, "SessionId": "string", "ExternalOrderStatus": 0, "CampaignIds": [ "string" ], "CampaignNames": [ "string" ], "MetaData": {}, "PublicId": "00000000-0000-0000-0000-000000000000", "GoodsLabel": "string", "CustomerOrderNumber": "string" } ``` ```ts [404] {} ``` :::: ::: :: # Create refund ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/{orderId}/Refund operationId: Create refund --- #sidebar :::api-endpoint-path{method="POST" path="/API/Order/{orderId}/Refund"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Order/{orderId}/Refund' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "OrderRowId": 0, "Reference": "string", "Description": "string", "Author": "string", "RefundAmount": 0, "ToBalance": true, "Settled": true, "RefundType": 0, "SkipRefundEvents": true, "RefundsRequireApproval": true }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Order/{orderId}/Refund', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "OrderRowId": 0, "Reference": "string", "Description": "string", "Author": "string", "RefundAmount": 0, "ToBalance": true, "Settled": true, "RefundType": 0, "SkipRefundEvents": true, "RefundsRequireApproval": true } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/{orderId}/Refund', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "OrderRowId": 0, "Reference": "string", "Description": "string", "Author": "string", "RefundAmount": 0, "ToBalance": true, "Settled": true, "RefundType": 0, "SkipRefundEvents": true, "RefundsRequireApproval": true }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/{orderId}/Refund" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "OrderRowId": 0, "Reference": "string", "Description": "string", "Author": "string", "RefundAmount": 0, "ToBalance": true, "Settled": true, "RefundType": 0, "SkipRefundEvents": true, "RefundsRequireApproval": true } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/{orderId}/Refund" payload := []byte(`{ "OrderRowId": 0, "Reference": "string", "Description": "string", "Author": "string", "RefundAmount": 0, "ToBalance": true, "Settled": true, "RefundType": 0, "SkipRefundEvents": true, "RefundsRequireApproval": true }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { OrderRowId = 0, Reference = "string", Description = "string", Author = "string", RefundAmount = 0, ToBalance = true, Settled = true, RefundType = 0, SkipRefundEvents = true, RefundsRequireApproval = true }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Order/{orderId}/Refund", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": "00000000-0000-0000-0000-000000000000", "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Resource": "00000000-0000-0000-0000-000000000000", "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Resource": "00000000-0000-0000-0000-000000000000", "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Delete refund row ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/{orderId}/Refund/{refundId}/RefundRow/{refundRowId} operationId: Delete refund row --- #sidebar :::api-endpoint-path --- method: DELETE path: /API/Order/{orderId}/Refund/{refundId}/RefundRow/{refundRowId} --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/RefundRow/{refundRowId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/RefundRow/{refundRowId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/RefundRow/{refundRowId}', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/RefundRow/{refundRowId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/RefundRow/{refundRowId}" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/RefundRow/{refundRowId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Set refund row as settled ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/{orderId}/Refund/{refundId}/RefundRow/{refundRowId}/SetAsSettled operationId: Set refund row as settled --- #sidebar :::api-endpoint-path --- method: POST path: /API/Order/{orderId}/Refund/{refundId}/RefundRow/{refundRowId}/SetAsSettled --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/RefundRow/{refundRowId}/SetAsSettled' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "SettledByAdminUserId": 0, "SettledOn": "string" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/RefundRow/{refundRowId}/SetAsSettled', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "SettledByAdminUserId": 0, "SettledOn": "string" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/RefundRow/{refundRowId}/SetAsSettled', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "SettledByAdminUserId": 0, "SettledOn": "string" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/RefundRow/{refundRowId}/SetAsSettled" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "SettledByAdminUserId": 0, "SettledOn": "string" } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/RefundRow/{refundRowId}/SetAsSettled" payload := []byte(`{ "SettledByAdminUserId": 0, "SettledOn": "string" }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { SettledByAdminUserId = 0, SettledOn = "string" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/RefundRow/{refundRowId}/SetAsSettled", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Set refund approval ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/{orderId}/Refund/{refundId}/SetApproval operationId: Set refund approval --- #sidebar :::api-endpoint-path --- method: POST path: /API/Order/{orderId}/Refund/{refundId}/SetApproval --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/SetApproval' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Approved": true, "ApprovalDecidedBy": "string", "ApprovalDecidedOn": "string" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/SetApproval', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Approved": true, "ApprovalDecidedBy": "string", "ApprovalDecidedOn": "string" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/SetApproval', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Approved": true, "ApprovalDecidedBy": "string", "ApprovalDecidedOn": "string" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/SetApproval" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Approved": true, "ApprovalDecidedBy": "string", "ApprovalDecidedOn": "string" } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/SetApproval" payload := []byte(`{ "Approved": true, "ApprovalDecidedBy": "string", "ApprovalDecidedOn": "string" }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Approved = true, ApprovalDecidedBy = "string", ApprovalDecidedOn = "string" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/SetApproval", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Set refund as processed ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/{orderId}/Refund/{refundId}/SetAsProcessed operationId: Set refund as processed --- #sidebar :::api-endpoint-path --- method: POST path: /API/Order/{orderId}/Refund/{refundId}/SetAsProcessed --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/SetAsProcessed' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "ExternalId": "string", "Reference": "string", "ProcessedOn": "string" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/SetAsProcessed', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "ExternalId": "string", "Reference": "string", "ProcessedOn": "string" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/SetAsProcessed', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "ExternalId": "string", "Reference": "string", "ProcessedOn": "string" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/SetAsProcessed" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "ExternalId": "string", "Reference": "string", "ProcessedOn": "string" } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/SetAsProcessed" payload := []byte(`{ "ExternalId": "string", "Reference": "string", "ProcessedOn": "string" }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { ExternalId = "string", Reference = "string", ProcessedOn = "string" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/SetAsProcessed", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Set refund as settled ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/{orderId}/Refund/{refundId}/SetAsSettled operationId: Set refund as settled --- #sidebar :::api-endpoint-path --- method: POST path: /API/Order/{orderId}/Refund/{refundId}/SetAsSettled --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/SetAsSettled' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "SettledByAdminUserId": 0, "SettledOn": "string" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/SetAsSettled', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "SettledByAdminUserId": 0, "SettledOn": "string" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/SetAsSettled', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "SettledByAdminUserId": 0, "SettledOn": "string" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/SetAsSettled" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "SettledByAdminUserId": 0, "SettledOn": "string" } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/SetAsSettled" payload := []byte(`{ "SettledByAdminUserId": 0, "SettledOn": "string" }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { SettledByAdminUserId = 0, SettledOn = "string" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}/SetAsSettled", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # List refunds ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/{orderId}/Refund/List operationId: List refunds --- #sidebar :::api-endpoint-path{method="GET" path="/API/Order/{orderId}/Refund/List"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Order/{orderId}/Refund/List' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Order/{orderId}/Refund/List', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/{orderId}/Refund/List', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/{orderId}/Refund/List" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/{orderId}/Refund/List" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Order/{orderId}/Refund/List", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ { "RefundId": "00000000-0000-0000-0000-000000000000", "RefundInstanceId": 0, "OrderId": 0, "Reference": "string", "Description": "string", "Author": "string", "ExternalOrderId": "string", "OrderTransactionId": "string", "SecondaryOrderTransactionId": "string", "ExternalId": "string", "PaymentName": "string", "Locale": "string", "SiteName": "string", "Customer": "string", "OrderSum": 0, "OrderVat": 0, "OrderValue": 0, "OrderDiscount": 0, "ShippingFee": 0, "PaymentFee": 0, "Currency": "string", "CreatedOn": "string", "SentOn": "string", "ProcessedOn": "string", "Sent": true, "Processed": true, "RequiresApproval": true, "Approved": true, "ApprovalDecidedBy": "string", "ApprovalDecidedOn": "string", "VatRate": 0, "SkipRefundEvents": true, "RefundedItemTotal": 0, "RefundedShippingFee": 0, "OrderStatus": "string", "RefundedPaymentFee": 0, "RefundedDiscount": 0, "Shipped": true, "RefundedBalance": 0, "RefundedTotal": 0, "RefundRows": [ { "OrderId": 0, "RefundRowId": 0, "OrderRowId": 0, "CaptureId": "00000000-0000-0000-0000-000000000000", "RefundAmount": 0, "RefundAmountExVat": 0, "ToBalance": true, "Settled": true, "SettledOn": "string", "CreatedOn": "string", "Investigation": true, "RefundType": 0 } ], "Rows": [ { "OrderRowId": 0, "ItemId": 0, "ProductId": 0, "Price": 0, "PriceExVat": 0, "Name": "string", "ProductName": "string", "Variant": "string", "Brand": "string", "PrimaryImage": "string", "ArticleNumber": "string", "Shelf": "string", "CampaignNames": "string", "Discount": 0, "SuggestedRefundAmount": 0, "AverageDiscount": 0, "PriceBeforeDiscount": 0 } ] } ], "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get return ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/{orderId}/Return/{returnId} operationId: Get return --- #sidebar :::api-endpoint-path{method="GET" path="/API/Order/{orderId}/Return/{returnId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Order/{orderId}/Return/{returnId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Order/{orderId}/Return/{returnId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/{orderId}/Return/{returnId}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/{orderId}/Return/{returnId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/{orderId}/Return/{returnId}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Order/{orderId}/Return/{returnId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "ReturnId": 0, "OrderId": 0, "CreatedOn": "string", "ReturnRows": [ { "ReturnId": 0, "ReturnRowId": 0, "OrderRowId": 0, "ReturnCode": 0, "ReturnAction": 0 } ], "OrderRows": [ { "OrderRowId": 0, "ItemId": 0, "ProductId": 0, "Price": 0, "PriceExVat": 0, "Name": "string", "ProductName": "string", "Variant": "string", "Brand": "string", "PrimaryImage": "string", "ArticleNumber": "string", "Shelf": "string", "CampaignNames": "string", "Discount": 0, "SuggestedRefundAmount": 0, "AverageDiscount": 0, "PriceBeforeDiscount": 0 } ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create return ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/{orderId}/Return operationId: Create return --- #sidebar :::api-endpoint-path{method="POST" path="/API/Order/{orderId}/Return"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Order/{orderId}/Return' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "ShippingFeeRefund": 0, "PaymentFeeRefund": 0, "ReturnFee": 0, "AdminUserId": 0, "Author": "string", "Reference": "string", "Description": "string", "SkipReturnEvents": true, "SkipProductEvents": true, "SkipRefundEvents": true, "RefundsRequireApproval": true, "ReturnRows": [ { "OrderRowId": 0, "ReturnCode": 0, "ReturnAction": 0, "RefundAmount": 0, "Restock": true } ], "Settled": true }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Order/{orderId}/Return', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "ShippingFeeRefund": 0, "PaymentFeeRefund": 0, "ReturnFee": 0, "AdminUserId": 0, "Author": "string", "Reference": "string", "Description": "string", "SkipReturnEvents": true, "SkipProductEvents": true, "SkipRefundEvents": true, "RefundsRequireApproval": true, "ReturnRows": [ { "OrderRowId": 0, "ReturnCode": 0, "ReturnAction": 0, "RefundAmount": 0, "Restock": true } ], "Settled": true } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/{orderId}/Return', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "ShippingFeeRefund": 0, "PaymentFeeRefund": 0, "ReturnFee": 0, "AdminUserId": 0, "Author": "string", "Reference": "string", "Description": "string", "SkipReturnEvents": true, "SkipProductEvents": true, "SkipRefundEvents": true, "RefundsRequireApproval": true, "ReturnRows": [ { "OrderRowId": 0, "ReturnCode": 0, "ReturnAction": 0, "RefundAmount": 0, "Restock": true } ], "Settled": true }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/{orderId}/Return" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "ShippingFeeRefund": 0, "PaymentFeeRefund": 0, "ReturnFee": 0, "AdminUserId": 0, "Author": "string", "Reference": "string", "Description": "string", "SkipReturnEvents": true, "SkipProductEvents": true, "SkipRefundEvents": true, "RefundsRequireApproval": true, "ReturnRows": [ { "OrderRowId": 0, "ReturnCode": 0, "ReturnAction": 0, "RefundAmount": 0, "Restock": true } ], "Settled": true } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/{orderId}/Return" payload := []byte(`{ "ShippingFeeRefund": 0, "PaymentFeeRefund": 0, "ReturnFee": 0, "AdminUserId": 0, "Author": "string", "Reference": "string", "Description": "string", "SkipReturnEvents": true, "SkipProductEvents": true, "SkipRefundEvents": true, "RefundsRequireApproval": true, "ReturnRows": [ { "OrderRowId": 0, "ReturnCode": 0, "ReturnAction": 0, "RefundAmount": 0, "Restock": true } ], "Settled": true }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { ShippingFeeRefund = 0, PaymentFeeRefund = 0, ReturnFee = 0, AdminUserId = 0, Author = "string", Reference = "string", Description = "string", SkipReturnEvents = true, SkipProductEvents = true, SkipRefundEvents = true, RefundsRequireApproval = true, ReturnRows = new[] { new { OrderRowId = 0, ReturnCode = 0, ReturnAction = 0, RefundAmount = 0, Restock = true } }, Settled = true }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Order/{orderId}/Return", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": 0, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Resource": 0, "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Resource": 0, "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # List returns ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/{orderId}/Return/List operationId: List returns --- #sidebar :::api-endpoint-path{method="GET" path="/API/Order/{orderId}/Return/List"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Order/{orderId}/Return/List' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Order/{orderId}/Return/List', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/{orderId}/Return/List', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/{orderId}/Return/List" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/{orderId}/Return/List" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Order/{orderId}/Return/List", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ { "ReturnId": 0, "OrderId": 0, "CreatedOn": "string", "ReturnRows": [ { "ReturnId": 0, "ReturnRowId": 0, "OrderRowId": 0, "ReturnCode": 0, "ReturnAction": 0 } ], "OrderRows": [ { "OrderRowId": 0, "ItemId": 0, "ProductId": 0, "Price": 0, "PriceExVat": 0, "Name": "string", "ProductName": "string", "Variant": "string", "Brand": "string", "PrimaryImage": "string", "ArticleNumber": "string", "Shelf": "string", "CampaignNames": "string", "Discount": 0, "SuggestedRefundAmount": 0, "AverageDiscount": 0, "PriceBeforeDiscount": 0 } ] } ], "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create order ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order operationId: Create order --- #sidebar :::api-endpoint-path{method="POST" path="/API/Order"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Order' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Id": 0, "ChannelId": "string", "ExternalId": "string", "PersonalId": "string", "CustomerId": 0, "CustomerEmail": "string", "CustomerTypeId": 0, "CustomerGroupId": 0, "CustomerGroupName": "string", "CustomerLoggedIn": true, "CreatedAt": "string", "UpdatedAt": "string", "CompletedAt": "string", "Status": "string", "Currency": "string", "CurrencyRate": 0, "MarketId": 0, "MarketName": "string", "Language": "string", "OrderTotal": 0, "ExpectedSum": 0, "VATTotal": 0, "OrderValueIncVat": 0, "OrderValueExVat": 0, "ItemValueIncVat": 0, "ItemValueExVat": 0, "Discount": 0, "DiscountExVat": 0, "FromBalance": 0, "ShippingFee": 0, "ShippingFeeExVat": 0, "PaymentFee": 0, "PaymentFeeExVat": 0, "Message": "string", "OrderMessages": [ "string" ], "PaymentDetails": [ { "Id": 0, "PaymentId": 0, "Name": "string", "DisplayName": "string", "TransactionId": "string", "SecondaryTransactionId": "string", "ReservationNumber": "string", "ReservationDate": "string", "PaymentDate": "string", "Total": 0, "Payed": true, "PaymentFee": 0, "ShippingFee": 0, "PaymentOption": "string" } ], "ShippingDetails": [ { "Id": 0, "ShippingId": 0, "Name": "string", "ParcelNumber": "string", "ShippingDate": "string", "TrackingUrl": "string", "ExternalDeliveryOptionId": "string", "ExternalServiceId": "string", "ExternalCarrierId": "string", "ExternalDeliveryId": "string", "PickupPoint": "string", "ExternalDeliveryData": "string" } ], "ShippingAddress": { "Company": "string", "CareOf": "string", "State": "string", "Country": "string", "FirstName": "string", "LastName": "string", "Email": "string", "AddressLine1": "string", "AddressLine2": "string", "AddressLine3": "string", "Zip": "string", "City": "string", "Phone": "string", "Mobile": "string", "EntryCode": "string" }, "BillingAddress": { "Company": "string", "CareOf": "string", "State": "string", "Country": "string", "FirstName": "string", "LastName": "string", "Email": "string", "AddressLine1": "string", "AddressLine2": "string", "AddressLine3": "string", "Zip": "string", "City": "string", "Phone": "string", "Mobile": "string", "EntryCode": "string" }, "Rows": [ { "Id": 0, "IdList": "string", "ProductId": 0, "Name": "string", "ProductName": "string", "ItemId": 0, "ItemName": "string", "ArticleNumber": "string", "Total": 0, "ExpectedTotalPriceIncVat": 0, "DiscountRate": 0, "Discount": 0, "ExpectedTotalDiscountIncVat": 0, "VATTotal": 0, "VATRate": 0, "Quantity": 0, "PurchasePrice": 0, "PaymentDetailId": 0, "ShippingDetailId": 0, "Market": "string", "UnitPrice": 0, "ProductContainerBuildId": 0, "Message": "string", "CartRowId": 0, "ExternalId": "string", "ProductContainerSelectionId": 0, "ProductContainerName": "string", "ExternalProductId": "string", "ExternalProductItemId": "string", "ParcelGroupId": 0, "BrandName": "string", "Gtin": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Color": "string", "Variant": "string", "CampaignIds": [ "string" ], "CampaignGroupData": "string", "CampaignGroupId": 0, "CampaignNames": [ "string" ], "CategoryId": 0, "RelatedProductsBuildId": "string", "PackingLocationId": 0, "ProductPriceCampaignId": 0, "ProductPriceListId": 0, "ProductPackageId": 0, "ProductPackageName": "string", "ProductPackageGroupId": "00000000-0000-0000-0000-000000000000", "Status": "string", "ExternalPriceSource": "string" } ], "Refunds": [ { "Id": 0, "OrderRowId": 0, "PaymentDetailId": 0, "ReturnId": 0, "ArticleNumber": "string", "CreatedAt": "string", "Total": 0, "ReasonCode": 0, "Reason": "string", "ToBalance": true, "Vat": 0, "ItemId": 0, "RefundType": "string" } ], "Ip": "string", "UserAgent": "string", "ServiceLocation": "string", "CampaignCode": "string", "CampaignCodeId": 0, "Percent": 0, "DesiredDeliveryDate": "string", "Gender": true, "CartId": 0, "SessionId": "string", "ExternalOrderStatus": 0, "CampaignIds": [ "string" ], "CampaignNames": [ "string" ], "MetaData": {}, "PublicId": "00000000-0000-0000-0000-000000000000", "GoodsLabel": "string", "CustomerOrderNumber": "string" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Order', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Id": 0, "ChannelId": "string", "ExternalId": "string", "PersonalId": "string", "CustomerId": 0, "CustomerEmail": "string", "CustomerTypeId": 0, "CustomerGroupId": 0, "CustomerGroupName": "string", "CustomerLoggedIn": true, "CreatedAt": "string", "UpdatedAt": "string", "CompletedAt": "string", "Status": "string", "Currency": "string", "CurrencyRate": 0, "MarketId": 0, "MarketName": "string", "Language": "string", "OrderTotal": 0, "ExpectedSum": 0, "VATTotal": 0, "OrderValueIncVat": 0, "OrderValueExVat": 0, "ItemValueIncVat": 0, "ItemValueExVat": 0, "Discount": 0, "DiscountExVat": 0, "FromBalance": 0, "ShippingFee": 0, "ShippingFeeExVat": 0, "PaymentFee": 0, "PaymentFeeExVat": 0, "Message": "string", "OrderMessages": [ "string" ], "PaymentDetails": [ { "Id": 0, "PaymentId": 0, "Name": "string", "DisplayName": "string", "TransactionId": "string", "SecondaryTransactionId": "string", "ReservationNumber": "string", "ReservationDate": "string", "PaymentDate": "string", "Total": 0, "Payed": true, "PaymentFee": 0, "ShippingFee": 0, "PaymentOption": "string" } ], "ShippingDetails": [ { "Id": 0, "ShippingId": 0, "Name": "string", "ParcelNumber": "string", "ShippingDate": "string", "TrackingUrl": "string", "ExternalDeliveryOptionId": "string", "ExternalServiceId": "string", "ExternalCarrierId": "string", "ExternalDeliveryId": "string", "PickupPoint": "string", "ExternalDeliveryData": "string" } ], "ShippingAddress": { "Company": "string", "CareOf": "string", "State": "string", "Country": "string", "FirstName": "string", "LastName": "string", "Email": "string", "AddressLine1": "string", "AddressLine2": "string", "AddressLine3": "string", "Zip": "string", "City": "string", "Phone": "string", "Mobile": "string", "EntryCode": "string" }, "BillingAddress": { "Company": "string", "CareOf": "string", "State": "string", "Country": "string", "FirstName": "string", "LastName": "string", "Email": "string", "AddressLine1": "string", "AddressLine2": "string", "AddressLine3": "string", "Zip": "string", "City": "string", "Phone": "string", "Mobile": "string", "EntryCode": "string" }, "Rows": [ { "Id": 0, "IdList": "string", "ProductId": 0, "Name": "string", "ProductName": "string", "ItemId": 0, "ItemName": "string", "ArticleNumber": "string", "Total": 0, "ExpectedTotalPriceIncVat": 0, "DiscountRate": 0, "Discount": 0, "ExpectedTotalDiscountIncVat": 0, "VATTotal": 0, "VATRate": 0, "Quantity": 0, "PurchasePrice": 0, "PaymentDetailId": 0, "ShippingDetailId": 0, "Market": "string", "UnitPrice": 0, "ProductContainerBuildId": 0, "Message": "string", "CartRowId": 0, "ExternalId": "string", "ProductContainerSelectionId": 0, "ProductContainerName": "string", "ExternalProductId": "string", "ExternalProductItemId": "string", "ParcelGroupId": 0, "BrandName": "string", "Gtin": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Color": "string", "Variant": "string", "CampaignIds": [ "string" ], "CampaignGroupData": "string", "CampaignGroupId": 0, "CampaignNames": [ "string" ], "CategoryId": 0, "RelatedProductsBuildId": "string", "PackingLocationId": 0, "ProductPriceCampaignId": 0, "ProductPriceListId": 0, "ProductPackageId": 0, "ProductPackageName": "string", "ProductPackageGroupId": "00000000-0000-0000-0000-000000000000", "Status": "string", "ExternalPriceSource": "string" } ], "Refunds": [ { "Id": 0, "OrderRowId": 0, "PaymentDetailId": 0, "ReturnId": 0, "ArticleNumber": "string", "CreatedAt": "string", "Total": 0, "ReasonCode": 0, "Reason": "string", "ToBalance": true, "Vat": 0, "ItemId": 0, "RefundType": "string" } ], "Ip": "string", "UserAgent": "string", "ServiceLocation": "string", "CampaignCode": "string", "CampaignCodeId": 0, "Percent": 0, "DesiredDeliveryDate": "string", "Gender": true, "CartId": 0, "SessionId": "string", "ExternalOrderStatus": 0, "CampaignIds": [ "string" ], "CampaignNames": [ "string" ], "MetaData": {}, "PublicId": "00000000-0000-0000-0000-000000000000", "GoodsLabel": "string", "CustomerOrderNumber": "string" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Id": 0, "ChannelId": "string", "ExternalId": "string", "PersonalId": "string", "CustomerId": 0, "CustomerEmail": "string", "CustomerTypeId": 0, "CustomerGroupId": 0, "CustomerGroupName": "string", "CustomerLoggedIn": true, "CreatedAt": "string", "UpdatedAt": "string", "CompletedAt": "string", "Status": "string", "Currency": "string", "CurrencyRate": 0, "MarketId": 0, "MarketName": "string", "Language": "string", "OrderTotal": 0, "ExpectedSum": 0, "VATTotal": 0, "OrderValueIncVat": 0, "OrderValueExVat": 0, "ItemValueIncVat": 0, "ItemValueExVat": 0, "Discount": 0, "DiscountExVat": 0, "FromBalance": 0, "ShippingFee": 0, "ShippingFeeExVat": 0, "PaymentFee": 0, "PaymentFeeExVat": 0, "Message": "string", "OrderMessages": [ "string" ], "PaymentDetails": [ { "Id": 0, "PaymentId": 0, "Name": "string", "DisplayName": "string", "TransactionId": "string", "SecondaryTransactionId": "string", "ReservationNumber": "string", "ReservationDate": "string", "PaymentDate": "string", "Total": 0, "Payed": true, "PaymentFee": 0, "ShippingFee": 0, "PaymentOption": "string" } ], "ShippingDetails": [ { "Id": 0, "ShippingId": 0, "Name": "string", "ParcelNumber": "string", "ShippingDate": "string", "TrackingUrl": "string", "ExternalDeliveryOptionId": "string", "ExternalServiceId": "string", "ExternalCarrierId": "string", "ExternalDeliveryId": "string", "PickupPoint": "string", "ExternalDeliveryData": "string" } ], "ShippingAddress": { "Company": "string", "CareOf": "string", "State": "string", "Country": "string", "FirstName": "string", "LastName": "string", "Email": "string", "AddressLine1": "string", "AddressLine2": "string", "AddressLine3": "string", "Zip": "string", "City": "string", "Phone": "string", "Mobile": "string", "EntryCode": "string" }, "BillingAddress": { "Company": "string", "CareOf": "string", "State": "string", "Country": "string", "FirstName": "string", "LastName": "string", "Email": "string", "AddressLine1": "string", "AddressLine2": "string", "AddressLine3": "string", "Zip": "string", "City": "string", "Phone": "string", "Mobile": "string", "EntryCode": "string" }, "Rows": [ { "Id": 0, "IdList": "string", "ProductId": 0, "Name": "string", "ProductName": "string", "ItemId": 0, "ItemName": "string", "ArticleNumber": "string", "Total": 0, "ExpectedTotalPriceIncVat": 0, "DiscountRate": 0, "Discount": 0, "ExpectedTotalDiscountIncVat": 0, "VATTotal": 0, "VATRate": 0, "Quantity": 0, "PurchasePrice": 0, "PaymentDetailId": 0, "ShippingDetailId": 0, "Market": "string", "UnitPrice": 0, "ProductContainerBuildId": 0, "Message": "string", "CartRowId": 0, "ExternalId": "string", "ProductContainerSelectionId": 0, "ProductContainerName": "string", "ExternalProductId": "string", "ExternalProductItemId": "string", "ParcelGroupId": 0, "BrandName": "string", "Gtin": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Color": "string", "Variant": "string", "CampaignIds": [ "string" ], "CampaignGroupData": "string", "CampaignGroupId": 0, "CampaignNames": [ "string" ], "CategoryId": 0, "RelatedProductsBuildId": "string", "PackingLocationId": 0, "ProductPriceCampaignId": 0, "ProductPriceListId": 0, "ProductPackageId": 0, "ProductPackageName": "string", "ProductPackageGroupId": "00000000-0000-0000-0000-000000000000", "Status": "string", "ExternalPriceSource": "string" } ], "Refunds": [ { "Id": 0, "OrderRowId": 0, "PaymentDetailId": 0, "ReturnId": 0, "ArticleNumber": "string", "CreatedAt": "string", "Total": 0, "ReasonCode": 0, "Reason": "string", "ToBalance": true, "Vat": 0, "ItemId": 0, "RefundType": "string" } ], "Ip": "string", "UserAgent": "string", "ServiceLocation": "string", "CampaignCode": "string", "CampaignCodeId": 0, "Percent": 0, "DesiredDeliveryDate": "string", "Gender": true, "CartId": 0, "SessionId": "string", "ExternalOrderStatus": 0, "CampaignIds": [ "string" ], "CampaignNames": [ "string" ], "MetaData": {}, "PublicId": "00000000-0000-0000-0000-000000000000", "GoodsLabel": "string", "CustomerOrderNumber": "string" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Id": 0, "ChannelId": "string", "ExternalId": "string", "PersonalId": "string", "CustomerId": 0, "CustomerEmail": "string", "CustomerTypeId": 0, "CustomerGroupId": 0, "CustomerGroupName": "string", "CustomerLoggedIn": true, "CreatedAt": "string", "UpdatedAt": "string", "CompletedAt": "string", "Status": "string", "Currency": "string", "CurrencyRate": 0, "MarketId": 0, "MarketName": "string", "Language": "string", "OrderTotal": 0, "ExpectedSum": 0, "VATTotal": 0, "OrderValueIncVat": 0, "OrderValueExVat": 0, "ItemValueIncVat": 0, "ItemValueExVat": 0, "Discount": 0, "DiscountExVat": 0, "FromBalance": 0, "ShippingFee": 0, "ShippingFeeExVat": 0, "PaymentFee": 0, "PaymentFeeExVat": 0, "Message": "string", "OrderMessages": [ "string" ], "PaymentDetails": [ { "Id": 0, "PaymentId": 0, "Name": "string", "DisplayName": "string", "TransactionId": "string", "SecondaryTransactionId": "string", "ReservationNumber": "string", "ReservationDate": "string", "PaymentDate": "string", "Total": 0, "Payed": true, "PaymentFee": 0, "ShippingFee": 0, "PaymentOption": "string" } ], "ShippingDetails": [ { "Id": 0, "ShippingId": 0, "Name": "string", "ParcelNumber": "string", "ShippingDate": "string", "TrackingUrl": "string", "ExternalDeliveryOptionId": "string", "ExternalServiceId": "string", "ExternalCarrierId": "string", "ExternalDeliveryId": "string", "PickupPoint": "string", "ExternalDeliveryData": "string" } ], "ShippingAddress": { "Company": "string", "CareOf": "string", "State": "string", "Country": "string", "FirstName": "string", "LastName": "string", "Email": "string", "AddressLine1": "string", "AddressLine2": "string", "AddressLine3": "string", "Zip": "string", "City": "string", "Phone": "string", "Mobile": "string", "EntryCode": "string" }, "BillingAddress": { "Company": "string", "CareOf": "string", "State": "string", "Country": "string", "FirstName": "string", "LastName": "string", "Email": "string", "AddressLine1": "string", "AddressLine2": "string", "AddressLine3": "string", "Zip": "string", "City": "string", "Phone": "string", "Mobile": "string", "EntryCode": "string" }, "Rows": [ { "Id": 0, "IdList": "string", "ProductId": 0, "Name": "string", "ProductName": "string", "ItemId": 0, "ItemName": "string", "ArticleNumber": "string", "Total": 0, "ExpectedTotalPriceIncVat": 0, "DiscountRate": 0, "Discount": 0, "ExpectedTotalDiscountIncVat": 0, "VATTotal": 0, "VATRate": 0, "Quantity": 0, "PurchasePrice": 0, "PaymentDetailId": 0, "ShippingDetailId": 0, "Market": "string", "UnitPrice": 0, "ProductContainerBuildId": 0, "Message": "string", "CartRowId": 0, "ExternalId": "string", "ProductContainerSelectionId": 0, "ProductContainerName": "string", "ExternalProductId": "string", "ExternalProductItemId": "string", "ParcelGroupId": 0, "BrandName": "string", "Gtin": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Color": "string", "Variant": "string", "CampaignIds": [ "string" ], "CampaignGroupData": "string", "CampaignGroupId": 0, "CampaignNames": [ "string" ], "CategoryId": 0, "RelatedProductsBuildId": "string", "PackingLocationId": 0, "ProductPriceCampaignId": 0, "ProductPriceListId": 0, "ProductPackageId": 0, "ProductPackageName": "string", "ProductPackageGroupId": "00000000-0000-0000-0000-000000000000", "Status": "string", "ExternalPriceSource": "string" } ], "Refunds": [ { "Id": 0, "OrderRowId": 0, "PaymentDetailId": 0, "ReturnId": 0, "ArticleNumber": "string", "CreatedAt": "string", "Total": 0, "ReasonCode": 0, "Reason": "string", "ToBalance": true, "Vat": 0, "ItemId": 0, "RefundType": "string" } ], "Ip": "string", "UserAgent": "string", "ServiceLocation": "string", "CampaignCode": "string", "CampaignCodeId": 0, "Percent": 0, "DesiredDeliveryDate": "string", "Gender": true, "CartId": 0, "SessionId": "string", "ExternalOrderStatus": 0, "CampaignIds": [ "string" ], "CampaignNames": [ "string" ], "MetaData": {}, "PublicId": "00000000-0000-0000-0000-000000000000", "GoodsLabel": "string", "CustomerOrderNumber": "string" } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order" payload := []byte(`{ "Id": 0, "ChannelId": "string", "ExternalId": "string", "PersonalId": "string", "CustomerId": 0, "CustomerEmail": "string", "CustomerTypeId": 0, "CustomerGroupId": 0, "CustomerGroupName": "string", "CustomerLoggedIn": true, "CreatedAt": "string", "UpdatedAt": "string", "CompletedAt": "string", "Status": "string", "Currency": "string", "CurrencyRate": 0, "MarketId": 0, "MarketName": "string", "Language": "string", "OrderTotal": 0, "ExpectedSum": 0, "VATTotal": 0, "OrderValueIncVat": 0, "OrderValueExVat": 0, "ItemValueIncVat": 0, "ItemValueExVat": 0, "Discount": 0, "DiscountExVat": 0, "FromBalance": 0, "ShippingFee": 0, "ShippingFeeExVat": 0, "PaymentFee": 0, "PaymentFeeExVat": 0, "Message": "string", "OrderMessages": [ "string" ], "PaymentDetails": [ { "Id": 0, "PaymentId": 0, "Name": "string", "DisplayName": "string", "TransactionId": "string", "SecondaryTransactionId": "string", "ReservationNumber": "string", "ReservationDate": "string", "PaymentDate": "string", "Total": 0, "Payed": true, "PaymentFee": 0, "ShippingFee": 0, "PaymentOption": "string" } ], "ShippingDetails": [ { "Id": 0, "ShippingId": 0, "Name": "string", "ParcelNumber": "string", "ShippingDate": "string", "TrackingUrl": "string", "ExternalDeliveryOptionId": "string", "ExternalServiceId": "string", "ExternalCarrierId": "string", "ExternalDeliveryId": "string", "PickupPoint": "string", "ExternalDeliveryData": "string" } ], "ShippingAddress": { "Company": "string", "CareOf": "string", "State": "string", "Country": "string", "FirstName": "string", "LastName": "string", "Email": "string", "AddressLine1": "string", "AddressLine2": "string", "AddressLine3": "string", "Zip": "string", "City": "string", "Phone": "string", "Mobile": "string", "EntryCode": "string" }, "BillingAddress": { "Company": "string", "CareOf": "string", "State": "string", "Country": "string", "FirstName": "string", "LastName": "string", "Email": "string", "AddressLine1": "string", "AddressLine2": "string", "AddressLine3": "string", "Zip": "string", "City": "string", "Phone": "string", "Mobile": "string", "EntryCode": "string" }, "Rows": [ { "Id": 0, "IdList": "string", "ProductId": 0, "Name": "string", "ProductName": "string", "ItemId": 0, "ItemName": "string", "ArticleNumber": "string", "Total": 0, "ExpectedTotalPriceIncVat": 0, "DiscountRate": 0, "Discount": 0, "ExpectedTotalDiscountIncVat": 0, "VATTotal": 0, "VATRate": 0, "Quantity": 0, "PurchasePrice": 0, "PaymentDetailId": 0, "ShippingDetailId": 0, "Market": "string", "UnitPrice": 0, "ProductContainerBuildId": 0, "Message": "string", "CartRowId": 0, "ExternalId": "string", "ProductContainerSelectionId": 0, "ProductContainerName": "string", "ExternalProductId": "string", "ExternalProductItemId": "string", "ParcelGroupId": 0, "BrandName": "string", "Gtin": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Color": "string", "Variant": "string", "CampaignIds": [ "string" ], "CampaignGroupData": "string", "CampaignGroupId": 0, "CampaignNames": [ "string" ], "CategoryId": 0, "RelatedProductsBuildId": "string", "PackingLocationId": 0, "ProductPriceCampaignId": 0, "ProductPriceListId": 0, "ProductPackageId": 0, "ProductPackageName": "string", "ProductPackageGroupId": "00000000-0000-0000-0000-000000000000", "Status": "string", "ExternalPriceSource": "string" } ], "Refunds": [ { "Id": 0, "OrderRowId": 0, "PaymentDetailId": 0, "ReturnId": 0, "ArticleNumber": "string", "CreatedAt": "string", "Total": 0, "ReasonCode": 0, "Reason": "string", "ToBalance": true, "Vat": 0, "ItemId": 0, "RefundType": "string" } ], "Ip": "string", "UserAgent": "string", "ServiceLocation": "string", "CampaignCode": "string", "CampaignCodeId": 0, "Percent": 0, "DesiredDeliveryDate": "string", "Gender": true, "CartId": 0, "SessionId": "string", "ExternalOrderStatus": 0, "CampaignIds": [ "string" ], "CampaignNames": [ "string" ], "MetaData": {}, "PublicId": "00000000-0000-0000-0000-000000000000", "GoodsLabel": "string", "CustomerOrderNumber": "string" }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Id = 0, ChannelId = "string", ExternalId = "string", PersonalId = "string", CustomerId = 0, CustomerEmail = "string", CustomerTypeId = 0, CustomerGroupId = 0, CustomerGroupName = "string", CustomerLoggedIn = true, CreatedAt = "string", UpdatedAt = "string", CompletedAt = "string", Status = "string", Currency = "string", CurrencyRate = 0, MarketId = 0, MarketName = "string", Language = "string", OrderTotal = 0, ExpectedSum = 0, VATTotal = 0, OrderValueIncVat = 0, OrderValueExVat = 0, ItemValueIncVat = 0, ItemValueExVat = 0, Discount = 0, DiscountExVat = 0, FromBalance = 0, ShippingFee = 0, ShippingFeeExVat = 0, PaymentFee = 0, PaymentFeeExVat = 0, Message = "string", OrderMessages = new[] { "string" }, PaymentDetails = new[] { new { Id = 0, PaymentId = 0, Name = "string", DisplayName = "string", TransactionId = "string", SecondaryTransactionId = "string", ReservationNumber = "string", ReservationDate = "string", PaymentDate = "string", Total = 0, Payed = true, PaymentFee = 0, ShippingFee = 0, PaymentOption = "string" } }, ShippingDetails = new[] { new { Id = 0, ShippingId = 0, Name = "string", ParcelNumber = "string", ShippingDate = "string", TrackingUrl = "string", ExternalDeliveryOptionId = "string", ExternalServiceId = "string", ExternalCarrierId = "string", ExternalDeliveryId = "string", PickupPoint = "string", ExternalDeliveryData = "string" } }, ShippingAddress = new { Company = "string", CareOf = "string", State = "string", Country = "string", FirstName = "string", LastName = "string", Email = "string", AddressLine1 = "string", AddressLine2 = "string", AddressLine3 = "string", Zip = "string", City = "string", Phone = "string", Mobile = "string", EntryCode = "string" }, BillingAddress = new { Company = "string", CareOf = "string", State = "string", Country = "string", FirstName = "string", LastName = "string", Email = "string", AddressLine1 = "string", AddressLine2 = "string", AddressLine3 = "string", Zip = "string", City = "string", Phone = "string", Mobile = "string", EntryCode = "string" }, Rows = new[] { new { Id = 0, IdList = "string", ProductId = 0, Name = "string", ProductName = "string", ItemId = 0, ItemName = "string", ArticleNumber = "string", Total = 0, ExpectedTotalPriceIncVat = 0, DiscountRate = 0, Discount = 0, ExpectedTotalDiscountIncVat = 0, VATTotal = 0, VATRate = 0, Quantity = 0, PurchasePrice = 0, PaymentDetailId = 0, ShippingDetailId = 0, Market = "string", UnitPrice = 0, ProductContainerBuildId = 0, Message = "string", CartRowId = 0, ExternalId = "string", ProductContainerSelectionId = 0, ProductContainerName = "string", ExternalProductId = "string", ExternalProductItemId = "string", ParcelGroupId = 0, BrandName = "string", Gtin = "string", Weight = 0, Length = 0, Width = 0, Height = 0, Color = "string", Variant = "string", CampaignIds = new[] { "string" }, CampaignGroupData = "string", CampaignGroupId = 0, CampaignNames = new[] { "string" }, CategoryId = 0, RelatedProductsBuildId = "string", PackingLocationId = 0, ProductPriceCampaignId = 0, ProductPriceListId = 0, ProductPackageId = 0, ProductPackageName = "string", ProductPackageGroupId = "00000000-0000-0000-0000-000000000000", Status = "string", ExternalPriceSource = "string" } }, Refunds = new[] { new { Id = 0, OrderRowId = 0, PaymentDetailId = 0, ReturnId = 0, ArticleNumber = "string", CreatedAt = "string", Total = 0, ReasonCode = 0, Reason = "string", ToBalance = true, Vat = 0, ItemId = 0, RefundType = "string" } }, Ip = "string", UserAgent = "string", ServiceLocation = "string", CampaignCode = "string", CampaignCodeId = 0, Percent = 0, DesiredDeliveryDate = "string", Gender = true, CartId = 0, SessionId = "string", ExternalOrderStatus = 0, CampaignIds = new[] { "string" }, CampaignNames = new[] { "string" }, MetaData = new { }, PublicId = "00000000-0000-0000-0000-000000000000", GoodsLabel = "string", CustomerOrderNumber = "string" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Order", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": 0, "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get capture ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/Capture/{captureId} operationId: Get capture --- #sidebar :::api-endpoint-path{method="GET" path="/API/Order/Capture/{captureId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Order/Capture/{captureId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Order/Capture/{captureId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/Capture/{captureId}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/Capture/{captureId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/Capture/{captureId}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Order/Capture/{captureId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "CaptureId": "00000000-0000-0000-0000-000000000000", "OrderPaymentId": "00000000-0000-0000-0000-000000000000", "OrderId": 0, "ExternalOrderId": "string", "ExternalId": "string", "Reference": "string", "Description": "string", "ProcessedOn": "string", "CapturedItemTotal": 0, "CapturedShippingFee": 0, "CapturedPaymentFee": 0, "CapturedDiscount": 0, "CapturedBalance": 0, "VatRate": 0, "TrackingNumber": "string", "ShippingName": "string", "TrackingUri": "string", "ShippingMethod": "string", "PaymentName": "string", "Locale": "string", "Rows": [ { "OrderRowId": 0, "ItemId": 0, "ProductId": 0, "Price": 0, "PriceExVat": 0, "Name": "string", "ProductName": "string", "Variant": "string", "Brand": "string" } ], "OrderTransactionId": "string", "SecondaryOrderTransactionId": "string" }, "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Set capture as processed ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/Capture/SetAsProcessed operationId: Set capture as processed --- #sidebar :::api-endpoint-path{method="POST" path="/API/Order/Capture/SetAsProcessed"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Order/Capture/SetAsProcessed' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "CaptureId": "00000000-0000-0000-0000-000000000000", "ExternalId": "string", "Reference": "string", "ProcessedOn": "string" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Order/Capture/SetAsProcessed', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "CaptureId": "00000000-0000-0000-0000-000000000000", "ExternalId": "string", "Reference": "string", "ProcessedOn": "string" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/Capture/SetAsProcessed', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "CaptureId": "00000000-0000-0000-0000-000000000000", "ExternalId": "string", "Reference": "string", "ProcessedOn": "string" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/Capture/SetAsProcessed" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "CaptureId": "00000000-0000-0000-0000-000000000000", "ExternalId": "string", "Reference": "string", "ProcessedOn": "string" } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/Capture/SetAsProcessed" payload := []byte(`{ "CaptureId": "00000000-0000-0000-0000-000000000000", "ExternalId": "string", "Reference": "string", "ProcessedOn": "string" }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { CaptureId = "00000000-0000-0000-0000-000000000000", ExternalId = "string", Reference = "string", ProcessedOn = "string" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Order/Capture/SetAsProcessed", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Count orders ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/Count/{email} operationId: Count orders --- #sidebar :::api-endpoint-path{method="GET" path="/API/Order/Count/{email}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Order/Count/{email}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Order/Count/{email}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/Count/{email}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/Count/{email}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/Count/{email}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Order/Count/{email}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] 0 ``` :::: ::: :: # Create order id ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/Id operationId: Create order id --- #sidebar :::api-endpoint-path{method="POST" path="/API/Order/Id"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Order/Id' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Order/Id', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/Id', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/Id" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.POST(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/Id" payload := []byte{} req, _ := http.NewRequest("POST", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Order/Id", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": 0, "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Set payment as paid ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/PaymentDetail/{paymentDetailId}/SetAsPaid operationId: Set payment as paid --- #sidebar :::api-endpoint-path --- method: POST path: /API/Order/PaymentDetail/{paymentDetailId}/SetAsPaid --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Order/PaymentDetail/{paymentDetailId}/SetAsPaid' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Order/PaymentDetail/{paymentDetailId}/SetAsPaid', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/PaymentDetail/{paymentDetailId}/SetAsPaid', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/PaymentDetail/{paymentDetailId}/SetAsPaid" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.POST(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/PaymentDetail/{paymentDetailId}/SetAsPaid" payload := []byte{} req, _ := http.NewRequest("POST", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Order/PaymentDetail/{paymentDetailId}/SetAsPaid", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create public order id ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/PublicId/{publicId} operationId: Create public order id --- #sidebar :::api-endpoint-path{method="POST" path="/API/Order/PublicId/{publicId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Order/PublicId/{publicId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Order/PublicId/{publicId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/PublicId/{publicId}', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/PublicId/{publicId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.POST(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/PublicId/{publicId}" payload := []byte{} req, _ := http.NewRequest("POST", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Order/PublicId/{publicId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "OrderId": 0, "PublicId": "00000000-0000-0000-0000-000000000000" }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Resource": {}, "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Query orders ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/Query operationId: Query orders --- #sidebar :::api-endpoint-path{method="POST" path="/API/Order/Query"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Order/Query' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Updated": "string", "UpdatedAfter": "string", "UpdatedBefore": "string", "CreatedBefore": "string", "CreatedAfter": "string", "CompletedBefore": "string", "CompletedAfter": "string", "StatusList": "string", "MarketId": 0, "PaymentName": "string", "ParcelGroupId": 0, "CustomerId": 0, "CustomerGroupId": 0, "Email": "string", "Include": "string", "ExternalOrderStatus": 0, "CombineProductContainerRows": true, "PackingLocationId": 0, "GroupOrderRows": true, "IncludeRowIds": true, "BatchId": "00000000-0000-0000-0000-000000000000" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Order/Query', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Updated": "string", "UpdatedAfter": "string", "UpdatedBefore": "string", "CreatedBefore": "string", "CreatedAfter": "string", "CompletedBefore": "string", "CompletedAfter": "string", "StatusList": "string", "MarketId": 0, "PaymentName": "string", "ParcelGroupId": 0, "CustomerId": 0, "CustomerGroupId": 0, "Email": "string", "Include": "string", "ExternalOrderStatus": 0, "CombineProductContainerRows": true, "PackingLocationId": 0, "GroupOrderRows": true, "IncludeRowIds": true, "BatchId": "00000000-0000-0000-0000-000000000000" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/Query', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Updated": "string", "UpdatedAfter": "string", "UpdatedBefore": "string", "CreatedBefore": "string", "CreatedAfter": "string", "CompletedBefore": "string", "CompletedAfter": "string", "StatusList": "string", "MarketId": 0, "PaymentName": "string", "ParcelGroupId": 0, "CustomerId": 0, "CustomerGroupId": 0, "Email": "string", "Include": "string", "ExternalOrderStatus": 0, "CombineProductContainerRows": true, "PackingLocationId": 0, "GroupOrderRows": true, "IncludeRowIds": true, "BatchId": "00000000-0000-0000-0000-000000000000" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/Query" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Updated": "string", "UpdatedAfter": "string", "UpdatedBefore": "string", "CreatedBefore": "string", "CreatedAfter": "string", "CompletedBefore": "string", "CompletedAfter": "string", "StatusList": "string", "MarketId": 0, "PaymentName": "string", "ParcelGroupId": 0, "CustomerId": 0, "CustomerGroupId": 0, "Email": "string", "Include": "string", "ExternalOrderStatus": 0, "CombineProductContainerRows": true, "PackingLocationId": 0, "GroupOrderRows": true, "IncludeRowIds": true, "BatchId": "00000000-0000-0000-0000-000000000000" } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/Query" payload := []byte(`{ "Updated": "string", "UpdatedAfter": "string", "UpdatedBefore": "string", "CreatedBefore": "string", "CreatedAfter": "string", "CompletedBefore": "string", "CompletedAfter": "string", "StatusList": "string", "MarketId": 0, "PaymentName": "string", "ParcelGroupId": 0, "CustomerId": 0, "CustomerGroupId": 0, "Email": "string", "Include": "string", "ExternalOrderStatus": 0, "CombineProductContainerRows": true, "PackingLocationId": 0, "GroupOrderRows": true, "IncludeRowIds": true, "BatchId": "00000000-0000-0000-0000-000000000000" }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Updated = "string", UpdatedAfter = "string", UpdatedBefore = "string", CreatedBefore = "string", CreatedAfter = "string", CompletedBefore = "string", CompletedAfter = "string", StatusList = "string", MarketId = 0, PaymentName = "string", ParcelGroupId = 0, CustomerId = 0, CustomerGroupId = 0, Email = "string", Include = "string", ExternalOrderStatus = 0, CombineProductContainerRows = true, PackingLocationId = 0, GroupOrderRows = true, IncludeRowIds = true, BatchId = "00000000-0000-0000-0000-000000000000" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Order/Query", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] [ { "Id": 0, "ChannelId": "string", "ExternalId": "string", "PersonalId": "string", "CustomerId": 0, "CustomerEmail": "string", "CustomerTypeId": 0, "CustomerGroupId": 0, "CustomerGroupName": "string", "CustomerLoggedIn": true, "CreatedAt": "string", "UpdatedAt": "string", "CompletedAt": "string", "Status": "string", "Currency": "string", "CurrencyRate": 0, "MarketId": 0, "MarketName": "string", "Language": "string", "OrderTotal": 0, "ExpectedSum": 0, "VATTotal": 0, "OrderValueIncVat": 0, "OrderValueExVat": 0, "ItemValueIncVat": 0, "ItemValueExVat": 0, "Discount": 0, "DiscountExVat": 0, "FromBalance": 0, "ShippingFee": 0, "ShippingFeeExVat": 0, "PaymentFee": 0, "PaymentFeeExVat": 0, "Message": "string", "OrderMessages": [ "string" ], "PaymentDetails": [ { "Id": 0, "PaymentId": 0, "Name": "string", "DisplayName": "string", "TransactionId": "string", "SecondaryTransactionId": "string", "ReservationNumber": "string", "ReservationDate": "string", "PaymentDate": "string", "Total": 0, "Payed": true, "PaymentFee": 0, "ShippingFee": 0, "PaymentOption": "string" } ], "ShippingDetails": [ { "Id": 0, "ShippingId": 0, "Name": "string", "ParcelNumber": "string", "ShippingDate": "string", "TrackingUrl": "string", "ExternalDeliveryOptionId": "string", "ExternalServiceId": "string", "ExternalCarrierId": "string", "ExternalDeliveryId": "string", "PickupPoint": "string", "ExternalDeliveryData": "string" } ], "ShippingAddress": { "Company": "string", "CareOf": "string", "State": "string", "Country": "string", "FirstName": "string", "LastName": "string", "Email": "string", "AddressLine1": "string", "AddressLine2": "string", "AddressLine3": "string", "Zip": "string", "City": "string", "Phone": "string", "Mobile": "string", "EntryCode": "string" }, "BillingAddress": { "Company": "string", "CareOf": "string", "State": "string", "Country": "string", "FirstName": "string", "LastName": "string", "Email": "string", "AddressLine1": "string", "AddressLine2": "string", "AddressLine3": "string", "Zip": "string", "City": "string", "Phone": "string", "Mobile": "string", "EntryCode": "string" }, "Rows": [ { "Id": 0, "IdList": "string", "ProductId": 0, "Name": "string", "ProductName": "string", "ItemId": 0, "ItemName": "string", "ArticleNumber": "string", "Total": 0, "ExpectedTotalPriceIncVat": 0, "DiscountRate": 0, "Discount": 0, "ExpectedTotalDiscountIncVat": 0, "VATTotal": 0, "VATRate": 0, "Quantity": 0, "PurchasePrice": 0, "PaymentDetailId": 0, "ShippingDetailId": 0, "Market": "string", "UnitPrice": 0, "ProductContainerBuildId": 0, "Message": "string", "CartRowId": 0, "ExternalId": "string", "ProductContainerSelectionId": 0, "ProductContainerName": "string", "ExternalProductId": "string", "ExternalProductItemId": "string", "ParcelGroupId": 0, "BrandName": "string", "Gtin": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Color": "string", "Variant": "string", "CampaignIds": [ "string" ], "CampaignGroupData": "string", "CampaignGroupId": 0, "CampaignNames": [ "string" ], "CategoryId": 0, "RelatedProductsBuildId": "string", "PackingLocationId": 0, "ProductPriceCampaignId": 0, "ProductPriceListId": 0, "ProductPackageId": 0, "ProductPackageName": "string", "ProductPackageGroupId": "00000000-0000-0000-0000-000000000000", "Status": "string", "ExternalPriceSource": "string" } ], "Refunds": [ { "Id": 0, "OrderRowId": 0, "PaymentDetailId": 0, "ReturnId": 0, "ArticleNumber": "string", "CreatedAt": "string", "Total": 0, "ReasonCode": 0, "Reason": "string", "ToBalance": true, "Vat": 0, "ItemId": 0, "RefundType": "string" } ], "Ip": "string", "UserAgent": "string", "ServiceLocation": "string", "CampaignCode": "string", "CampaignCodeId": 0, "Percent": 0, "DesiredDeliveryDate": "string", "Gender": true, "CartId": 0, "SessionId": "string", "ExternalOrderStatus": 0, "CampaignIds": [ "string" ], "CampaignNames": [ "string" ], "MetaData": {}, "PublicId": "00000000-0000-0000-0000-000000000000", "GoodsLabel": "string", "CustomerOrderNumber": "string" } ] ``` :::: ::: :: # Query orders (paged) ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/Query/{page} operationId: Query orders (paged) --- #sidebar :::api-endpoint-path{method="POST" path="/API/Order/Query/{page}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Order/Query/{page}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Updated": "string", "UpdatedAfter": "string", "UpdatedBefore": "string", "CreatedBefore": "string", "CreatedAfter": "string", "CompletedBefore": "string", "CompletedAfter": "string", "StatusList": "string", "MarketId": 0, "PaymentName": "string", "ParcelGroupId": 0, "CustomerId": 0, "CustomerGroupId": 0, "Email": "string", "Include": "string", "ExternalOrderStatus": 0, "CombineProductContainerRows": true, "PackingLocationId": 0, "GroupOrderRows": true, "IncludeRowIds": true, "BatchId": "00000000-0000-0000-0000-000000000000" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Order/Query/{page}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Updated": "string", "UpdatedAfter": "string", "UpdatedBefore": "string", "CreatedBefore": "string", "CreatedAfter": "string", "CompletedBefore": "string", "CompletedAfter": "string", "StatusList": "string", "MarketId": 0, "PaymentName": "string", "ParcelGroupId": 0, "CustomerId": 0, "CustomerGroupId": 0, "Email": "string", "Include": "string", "ExternalOrderStatus": 0, "CombineProductContainerRows": true, "PackingLocationId": 0, "GroupOrderRows": true, "IncludeRowIds": true, "BatchId": "00000000-0000-0000-0000-000000000000" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/Query/{page}', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Updated": "string", "UpdatedAfter": "string", "UpdatedBefore": "string", "CreatedBefore": "string", "CreatedAfter": "string", "CompletedBefore": "string", "CompletedAfter": "string", "StatusList": "string", "MarketId": 0, "PaymentName": "string", "ParcelGroupId": 0, "CustomerId": 0, "CustomerGroupId": 0, "Email": "string", "Include": "string", "ExternalOrderStatus": 0, "CombineProductContainerRows": true, "PackingLocationId": 0, "GroupOrderRows": true, "IncludeRowIds": true, "BatchId": "00000000-0000-0000-0000-000000000000" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/Query/{page}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Updated": "string", "UpdatedAfter": "string", "UpdatedBefore": "string", "CreatedBefore": "string", "CreatedAfter": "string", "CompletedBefore": "string", "CompletedAfter": "string", "StatusList": "string", "MarketId": 0, "PaymentName": "string", "ParcelGroupId": 0, "CustomerId": 0, "CustomerGroupId": 0, "Email": "string", "Include": "string", "ExternalOrderStatus": 0, "CombineProductContainerRows": true, "PackingLocationId": 0, "GroupOrderRows": true, "IncludeRowIds": true, "BatchId": "00000000-0000-0000-0000-000000000000" } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/Query/{page}" payload := []byte(`{ "Updated": "string", "UpdatedAfter": "string", "UpdatedBefore": "string", "CreatedBefore": "string", "CreatedAfter": "string", "CompletedBefore": "string", "CompletedAfter": "string", "StatusList": "string", "MarketId": 0, "PaymentName": "string", "ParcelGroupId": 0, "CustomerId": 0, "CustomerGroupId": 0, "Email": "string", "Include": "string", "ExternalOrderStatus": 0, "CombineProductContainerRows": true, "PackingLocationId": 0, "GroupOrderRows": true, "IncludeRowIds": true, "BatchId": "00000000-0000-0000-0000-000000000000" }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Updated = "string", UpdatedAfter = "string", UpdatedBefore = "string", CreatedBefore = "string", CreatedAfter = "string", CompletedBefore = "string", CompletedAfter = "string", StatusList = "string", MarketId = 0, PaymentName = "string", ParcelGroupId = 0, CustomerId = 0, CustomerGroupId = 0, Email = "string", Include = "string", ExternalOrderStatus = 0, CombineProductContainerRows = true, PackingLocationId = 0, GroupOrderRows = true, IncludeRowIds = true, BatchId = "00000000-0000-0000-0000-000000000000" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Order/Query/{page}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "PageResult": { "BatchId": "00000000-0000-0000-0000-000000000000", "Page": 0, "RowCount": 0, "PageCount": 0, "PageSize": 0, "HasMoreRows": true }, "Resource": [ { "Id": 0, "ChannelId": "string", "ExternalId": "string", "PersonalId": "string", "CustomerId": 0, "CustomerEmail": "string", "CustomerTypeId": 0, "CustomerGroupId": 0, "CustomerGroupName": "string", "CustomerLoggedIn": true, "CreatedAt": "string", "UpdatedAt": "string", "CompletedAt": "string", "Status": "string", "Currency": "string", "CurrencyRate": 0, "MarketId": 0, "MarketName": "string", "Language": "string", "OrderTotal": 0, "ExpectedSum": 0, "VATTotal": 0, "OrderValueIncVat": 0, "OrderValueExVat": 0, "ItemValueIncVat": 0, "ItemValueExVat": 0, "Discount": 0, "DiscountExVat": 0, "FromBalance": 0, "ShippingFee": 0, "ShippingFeeExVat": 0, "PaymentFee": 0, "PaymentFeeExVat": 0, "Message": "string", "OrderMessages": [ "string" ], "PaymentDetails": [ { "Id": 0, "PaymentId": 0, "Name": "string", "DisplayName": "string", "TransactionId": "string", "SecondaryTransactionId": "string", "ReservationNumber": "string", "ReservationDate": "string", "PaymentDate": "string", "Total": 0, "Payed": true, "PaymentFee": 0, "ShippingFee": 0, "PaymentOption": "string" } ], "ShippingDetails": [ { "Id": 0, "ShippingId": 0, "Name": "string", "ParcelNumber": "string", "ShippingDate": "string", "TrackingUrl": "string", "ExternalDeliveryOptionId": "string", "ExternalServiceId": "string", "ExternalCarrierId": "string", "ExternalDeliveryId": "string", "PickupPoint": "string", "ExternalDeliveryData": "string" } ], "ShippingAddress": { "Company": "string", "CareOf": "string", "State": "string", "Country": "string", "FirstName": "string", "LastName": "string", "Email": "string", "AddressLine1": "string", "AddressLine2": "string", "AddressLine3": "string", "Zip": "string", "City": "string", "Phone": "string", "Mobile": "string", "EntryCode": "string" }, "BillingAddress": { "Company": "string", "CareOf": "string", "State": "string", "Country": "string", "FirstName": "string", "LastName": "string", "Email": "string", "AddressLine1": "string", "AddressLine2": "string", "AddressLine3": "string", "Zip": "string", "City": "string", "Phone": "string", "Mobile": "string", "EntryCode": "string" }, "Rows": [ { "Id": 0, "IdList": "string", "ProductId": 0, "Name": "string", "ProductName": "string", "ItemId": 0, "ItemName": "string", "ArticleNumber": "string", "Total": 0, "ExpectedTotalPriceIncVat": 0, "DiscountRate": 0, "Discount": 0, "ExpectedTotalDiscountIncVat": 0, "VATTotal": 0, "VATRate": 0, "Quantity": 0, "PurchasePrice": 0, "PaymentDetailId": 0, "ShippingDetailId": 0, "Market": "string", "UnitPrice": 0, "ProductContainerBuildId": 0, "Message": "string", "CartRowId": 0, "ExternalId": "string", "ProductContainerSelectionId": 0, "ProductContainerName": "string", "ExternalProductId": "string", "ExternalProductItemId": "string", "ParcelGroupId": 0, "BrandName": "string", "Gtin": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Color": "string", "Variant": "string", "CampaignIds": [ "string" ], "CampaignGroupData": "string", "CampaignGroupId": 0, "CampaignNames": [ "string" ], "CategoryId": 0, "RelatedProductsBuildId": "string", "PackingLocationId": 0, "ProductPriceCampaignId": 0, "ProductPriceListId": 0, "ProductPackageId": 0, "ProductPackageName": "string", "ProductPackageGroupId": "00000000-0000-0000-0000-000000000000", "Status": "string", "ExternalPriceSource": "string" } ], "Refunds": [ { "Id": 0, "OrderRowId": 0, "PaymentDetailId": 0, "ReturnId": 0, "ArticleNumber": "string", "CreatedAt": "string", "Total": 0, "ReasonCode": 0, "Reason": "string", "ToBalance": true, "Vat": 0, "ItemId": 0, "RefundType": "string" } ], "Ip": "string", "UserAgent": "string", "ServiceLocation": "string", "CampaignCode": "string", "CampaignCodeId": 0, "Percent": 0, "DesiredDeliveryDate": "string", "Gender": true, "CartId": 0, "SessionId": "string", "ExternalOrderStatus": 0, "CampaignIds": [ "string" ], "CampaignNames": [ "string" ], "MetaData": {}, "PublicId": "00000000-0000-0000-0000-000000000000", "GoodsLabel": "string", "CustomerOrderNumber": "string" } ], "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Resource": {}, "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Resource": {}, "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get order statuses ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/Statuses operationId: Get order statuses --- #sidebar :::api-endpoint-path{method="GET" path="/API/Order/Statuses"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Order/Statuses' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Order/Statuses', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/Statuses', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/Statuses" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/Statuses" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Order/Statuses", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] [ { "Name": "string", "DisplayName": "string" } ] ``` :::: ::: :: # Validate order ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/ValidateCreation operationId: Validate order --- #sidebar :::api-endpoint-path{method="POST" path="/API/Order/ValidateCreation"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Order/ValidateCreation' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "OrderId": 0, "UserId": 0, "Email": "string", "Phone": "string", "Currency": "string", "SumIncVat": 0, "BalanceIncVat": 0, "Items": [ { "ItemId": 0, "Quantity": 0 } ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Order/ValidateCreation', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "OrderId": 0, "UserId": 0, "Email": "string", "Phone": "string", "Currency": "string", "SumIncVat": 0, "BalanceIncVat": 0, "Items": [ { "ItemId": 0, "Quantity": 0 } ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/ValidateCreation', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "OrderId": 0, "UserId": 0, "Email": "string", "Phone": "string", "Currency": "string", "SumIncVat": 0, "BalanceIncVat": 0, "Items": [ { "ItemId": 0, "Quantity": 0 } ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/ValidateCreation" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "OrderId": 0, "UserId": 0, "Email": "string", "Phone": "string", "Currency": "string", "SumIncVat": 0, "BalanceIncVat": 0, "Items": [ { "ItemId": 0, "Quantity": 0 } ] } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/ValidateCreation" payload := []byte(`{ "OrderId": 0, "UserId": 0, "Email": "string", "Phone": "string", "Currency": "string", "SumIncVat": 0, "BalanceIncVat": 0, "Items": [ { "ItemId": 0, "Quantity": 0 } ] }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { OrderId = 0, UserId = 0, Email = "string", Phone = "string", Currency = "string", SumIncVat = 0, BalanceIncVat = 0, Items = new[] { new { ItemId = 0, Quantity = 0 } } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Order/ValidateCreation", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "Success": true, "Message": "string" }, "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Partial update of order ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/{id} operationId: Partial update of order --- #sidebar :::api-endpoint-path{method="PATCH" path="/API/Order/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PATCH 'https://mgmtapi.geins.io/API/Order/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "ExternalId": "string", "ParcelNumber": "string", "ExternalOrderStatus": 0, "ReturnParcelNumber": "string" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PATCH', url: 'https://mgmtapi.geins.io/API/Order/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "ExternalId": "string", "ParcelNumber": "string", "ExternalOrderStatus": 0, "ReturnParcelNumber": "string" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/{id}', { method: 'PATCH', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "ExternalId": "string", "ParcelNumber": "string", "ExternalOrderStatus": 0, "ReturnParcelNumber": "string" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "ExternalId": "string", "ParcelNumber": "string", "ExternalOrderStatus": 0, "ReturnParcelNumber": "string" } response = requests.PATCH(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/{id}" payload := []byte(`{ "ExternalId": "string", "ParcelNumber": "string", "ExternalOrderStatus": 0, "ReturnParcelNumber": "string" }`) req, _ := http.NewRequest("PATCH", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { ExternalId = "string", ParcelNumber = "string", ExternalOrderStatus = 0, ReturnParcelNumber = "string" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PATCHAsync("https://mgmtapi.geins.io/API/Order/{id}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] {} ``` ```ts [404] {} ``` :::: ::: :: # Delete order ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/{id} operationId: Delete order --- #sidebar :::api-endpoint-path{method="DELETE" path="/API/Order/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/Order/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/Order/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/{id}', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/{id}" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/Order/{id}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] {} ``` ```ts [400] {} ``` ```ts [404] {} ``` :::: ::: :: # Add order comment ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/{id}/Comment operationId: Add order comment --- #sidebar :::api-endpoint-path{method="POST" path="/API/Order/{id}/Comment"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Order/{id}/Comment' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "OrderId": 0, "Comment": "string", "System": true }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Order/{id}/Comment', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "OrderId": 0, "Comment": "string", "System": true } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/{id}/Comment', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "OrderId": 0, "Comment": "string", "System": true }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/{id}/Comment" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "OrderId": 0, "Comment": "string", "System": true } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/{id}/Comment" payload := []byte(`{ "OrderId": 0, "Comment": "string", "System": true }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { OrderId = 0, Comment = "string", System = true }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Order/{id}/Comment", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update order status ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/{id}/Status/{status}/{transactionId}/{secondaryTransactionId} operationId: Update order status --- #sidebar :::api-endpoint-path --- method: POST path: /API/Order/{id}/Status/{status}/{transactionId}/{secondaryTransactionId} --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Order/{id}/Status/{status}/{transactionId}/{secondaryTransactionId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Order/{id}/Status/{status}/{transactionId}/{secondaryTransactionId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/{id}/Status/{status}/{transactionId}/{secondaryTransactionId}', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/{id}/Status/{status}/{transactionId}/{secondaryTransactionId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.POST(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/{id}/Status/{status}/{transactionId}/{secondaryTransactionId}" payload := []byte{} req, _ := http.NewRequest("POST", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Order/{id}/Status/{status}/{transactionId}/{secondaryTransactionId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update transaction data ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/{id}/TransactionData operationId: Update transaction data --- #sidebar :::api-endpoint-path{method="POST" path="/API/Order/{id}/TransactionData"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Order/{id}/TransactionData' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "OrderId": 0, "TransactionId": "string" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Order/{id}/TransactionData', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "OrderId": 0, "TransactionId": "string" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/{id}/TransactionData', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "OrderId": 0, "TransactionId": "string" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/{id}/TransactionData" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "OrderId": 0, "TransactionId": "string" } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/{id}/TransactionData" payload := []byte(`{ "OrderId": 0, "TransactionId": "string" }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { OrderId = 0, TransactionId = "string" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Order/{id}/TransactionData", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Cancel order row ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/{orderId}/OrderRow/{orderRowId} operationId: Cancel order row --- #sidebar :::api-endpoint-path --- method: DELETE path: /API/Order/{orderId}/OrderRow/{orderRowId} --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/Order/{orderId}/OrderRow/{orderRowId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/Order/{orderId}/OrderRow/{orderRowId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/{orderId}/OrderRow/{orderRowId}', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/{orderId}/OrderRow/{orderRowId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/{orderId}/OrderRow/{orderRowId}" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/Order/{orderId}/OrderRow/{orderRowId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get refund ::api-endpoint --- api: mgmtapi endpointUrl: /API/Order/{orderId}/Refund/{refundId} operationId: Get refund --- #sidebar :::api-endpoint-path{method="GET" path="/API/Order/{orderId}/Refund/{refundId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Order/{orderId}/Refund/{refundId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "RefundId": "00000000-0000-0000-0000-000000000000", "RefundInstanceId": 0, "OrderId": 0, "Reference": "string", "Description": "string", "Author": "string", "ExternalOrderId": "string", "OrderTransactionId": "string", "SecondaryOrderTransactionId": "string", "ExternalId": "string", "PaymentName": "string", "Locale": "string", "SiteName": "string", "Customer": "string", "OrderSum": 0, "OrderVat": 0, "OrderValue": 0, "OrderDiscount": 0, "ShippingFee": 0, "PaymentFee": 0, "Currency": "string", "CreatedOn": "string", "SentOn": "string", "ProcessedOn": "string", "Sent": true, "Processed": true, "RequiresApproval": true, "Approved": true, "ApprovalDecidedBy": "string", "ApprovalDecidedOn": "string", "VatRate": 0, "SkipRefundEvents": true, "RefundedItemTotal": 0, "RefundedShippingFee": 0, "OrderStatus": "string", "RefundedPaymentFee": 0, "RefundedDiscount": 0, "Shipped": true, "RefundedBalance": 0, "RefundedTotal": 0, "RefundRows": [ { "OrderId": 0, "RefundRowId": 0, "OrderRowId": 0, "CaptureId": "00000000-0000-0000-0000-000000000000", "RefundAmount": 0, "RefundAmountExVat": 0, "ToBalance": true, "Settled": true, "SettledOn": "string", "CreatedOn": "string", "Investigation": true, "RefundType": 0 } ], "Rows": [ { "OrderRowId": 0, "ItemId": 0, "ProductId": 0, "Price": 0, "PriceExVat": 0, "Name": "string", "ProductName": "string", "Variant": "string", "Brand": "string", "PrimaryImage": "string", "ArticleNumber": "string", "Shelf": "string", "CampaignNames": "string", "Discount": 0, "SuggestedRefundAmount": 0, "AverageDiscount": 0, "PriceBeforeDiscount": 0 } ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get order (public id) ::api-endpoint --- api: mgmtapi endpointUrl: /API/OrderByPublicId/{publicId}/{include} operationId: Get order (public id) --- #sidebar :::api-endpoint-path --- method: GET path: /API/OrderByPublicId/{publicId}/{include} --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/OrderByPublicId/{publicId}/{include}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/OrderByPublicId/{publicId}/{include}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/OrderByPublicId/{publicId}/{include}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/OrderByPublicId/{publicId}/{include}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/OrderByPublicId/{publicId}/{include}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/OrderByPublicId/{publicId}/{include}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Id": 0, "ChannelId": "string", "ExternalId": "string", "PersonalId": "string", "CustomerId": 0, "CustomerEmail": "string", "CustomerTypeId": 0, "CustomerGroupId": 0, "CustomerGroupName": "string", "CustomerLoggedIn": true, "CreatedAt": "string", "UpdatedAt": "string", "CompletedAt": "string", "Status": "string", "Currency": "string", "CurrencyRate": 0, "MarketId": 0, "MarketName": "string", "Language": "string", "OrderTotal": 0, "ExpectedSum": 0, "VATTotal": 0, "OrderValueIncVat": 0, "OrderValueExVat": 0, "ItemValueIncVat": 0, "ItemValueExVat": 0, "Discount": 0, "DiscountExVat": 0, "FromBalance": 0, "ShippingFee": 0, "ShippingFeeExVat": 0, "PaymentFee": 0, "PaymentFeeExVat": 0, "Message": "string", "OrderMessages": [ "string" ], "PaymentDetails": [ { "Id": 0, "PaymentId": 0, "Name": "string", "DisplayName": "string", "TransactionId": "string", "SecondaryTransactionId": "string", "ReservationNumber": "string", "ReservationDate": "string", "PaymentDate": "string", "Total": 0, "Payed": true, "PaymentFee": 0, "ShippingFee": 0, "PaymentOption": "string" } ], "ShippingDetails": [ { "Id": 0, "ShippingId": 0, "Name": "string", "ParcelNumber": "string", "ShippingDate": "string", "TrackingUrl": "string", "ExternalDeliveryOptionId": "string", "ExternalServiceId": "string", "ExternalCarrierId": "string", "ExternalDeliveryId": "string", "PickupPoint": "string", "ExternalDeliveryData": "string" } ], "ShippingAddress": { "Company": "string", "CareOf": "string", "State": "string", "Country": "string", "FirstName": "string", "LastName": "string", "Email": "string", "AddressLine1": "string", "AddressLine2": "string", "AddressLine3": "string", "Zip": "string", "City": "string", "Phone": "string", "Mobile": "string", "EntryCode": "string" }, "BillingAddress": { "Company": "string", "CareOf": "string", "State": "string", "Country": "string", "FirstName": "string", "LastName": "string", "Email": "string", "AddressLine1": "string", "AddressLine2": "string", "AddressLine3": "string", "Zip": "string", "City": "string", "Phone": "string", "Mobile": "string", "EntryCode": "string" }, "Rows": [ { "Id": 0, "IdList": "string", "ProductId": 0, "Name": "string", "ProductName": "string", "ItemId": 0, "ItemName": "string", "ArticleNumber": "string", "Total": 0, "ExpectedTotalPriceIncVat": 0, "DiscountRate": 0, "Discount": 0, "ExpectedTotalDiscountIncVat": 0, "VATTotal": 0, "VATRate": 0, "Quantity": 0, "PurchasePrice": 0, "PaymentDetailId": 0, "ShippingDetailId": 0, "Market": "string", "UnitPrice": 0, "ProductContainerBuildId": 0, "Message": "string", "CartRowId": 0, "ExternalId": "string", "ProductContainerSelectionId": 0, "ProductContainerName": "string", "ExternalProductId": "string", "ExternalProductItemId": "string", "ParcelGroupId": 0, "BrandName": "string", "Gtin": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Color": "string", "Variant": "string", "CampaignIds": [ "string" ], "CampaignGroupData": "string", "CampaignGroupId": 0, "CampaignNames": [ "string" ], "CategoryId": 0, "RelatedProductsBuildId": "string", "PackingLocationId": 0, "ProductPriceCampaignId": 0, "ProductPriceListId": 0, "ProductPackageId": 0, "ProductPackageName": "string", "ProductPackageGroupId": "00000000-0000-0000-0000-000000000000", "Status": "string", "ExternalPriceSource": "string" } ], "Refunds": [ { "Id": 0, "OrderRowId": 0, "PaymentDetailId": 0, "ReturnId": 0, "ArticleNumber": "string", "CreatedAt": "string", "Total": 0, "ReasonCode": 0, "Reason": "string", "ToBalance": true, "Vat": 0, "ItemId": 0, "RefundType": "string" } ], "Ip": "string", "UserAgent": "string", "ServiceLocation": "string", "CampaignCode": "string", "CampaignCodeId": 0, "Percent": 0, "DesiredDeliveryDate": "string", "Gender": true, "CartId": 0, "SessionId": "string", "ExternalOrderStatus": 0, "CampaignIds": [ "string" ], "CampaignNames": [ "string" ], "MetaData": {}, "PublicId": "00000000-0000-0000-0000-000000000000", "GoodsLabel": "string", "CustomerOrderNumber": "string" } ``` ```ts [404] {} ``` :::: ::: :: # Get page area ::api-endpoint --- api: mgmtapi endpointUrl: /API/PageArea/{name} operationId: Get page area --- #sidebar :::api-endpoint-path{method="GET" path="/API/PageArea/{name}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/PageArea/{name}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/PageArea/{name}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/PageArea/{name}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/PageArea/{name}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/PageArea/{name}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/PageArea/{name}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "Index": 0, "Name": "string", "FamilyId": 0, "Settings": "string", "Containers": [ { "Id": 0, "Name": "string", "ClassNames": [ "string" ], "Active": true, "Layout": "string", "ResponsiveMode": "string", "Visibility": "string", "Design": "string", "Widgets": [ { "Id": "00000000-0000-0000-0000-000000000000", "Name": "string", "Type": "string", "Active": true, "ClassNames": [ "string" ], "Size": "string", "Configuration": "string" } ] } ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create/update page area ::api-endpoint --- api: mgmtapi endpointUrl: /API/PageArea operationId: Create/update page area --- #sidebar :::api-endpoint-path{method="POST" path="/API/PageArea"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/PageArea' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Index": 0, "Name": "string", "FamilyId": 0, "Settings": { "LazyLoadConfiguration": { "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 }, "LazyLoadCollectionConfigurations": [ { "CollectionName": "string", "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 } ], "WidgetRestrictions": {}, "ContainerRestrictions": { "AllowedLayouts": [ 0 ], "BannedWidgets": [ "00000000-0000-0000-0000-000000000000" ] } } }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/PageArea', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Index": 0, "Name": "string", "FamilyId": 0, "Settings": { "LazyLoadConfiguration": { "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 }, "LazyLoadCollectionConfigurations": [ { "CollectionName": "string", "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 } ], "WidgetRestrictions": {}, "ContainerRestrictions": { "AllowedLayouts": [ 0 ], "BannedWidgets": [ "00000000-0000-0000-0000-000000000000" ] } } } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/PageArea', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Index": 0, "Name": "string", "FamilyId": 0, "Settings": { "LazyLoadConfiguration": { "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 }, "LazyLoadCollectionConfigurations": [ { "CollectionName": "string", "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 } ], "WidgetRestrictions": {}, "ContainerRestrictions": { "AllowedLayouts": [ 0 ], "BannedWidgets": [ "00000000-0000-0000-0000-000000000000" ] } } }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/PageArea" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Index": 0, "Name": "string", "FamilyId": 0, "Settings": { "LazyLoadConfiguration": { "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 }, "LazyLoadCollectionConfigurations": [ { "CollectionName": "string", "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 } ], "WidgetRestrictions": {}, "ContainerRestrictions": { "AllowedLayouts": [ 0 ], "BannedWidgets": [ "00000000-0000-0000-0000-000000000000" ] } } } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/PageArea" payload := []byte(`{ "Index": 0, "Name": "string", "FamilyId": 0, "Settings": { "LazyLoadConfiguration": { "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 }, "LazyLoadCollectionConfigurations": [ { "CollectionName": "string", "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 } ], "WidgetRestrictions": {}, "ContainerRestrictions": { "AllowedLayouts": [ 0 ], "BannedWidgets": [ "00000000-0000-0000-0000-000000000000" ] } } }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Index = 0, Name = "string", FamilyId = 0, Settings = new { LazyLoadConfiguration = new { EnableLazyloadMobile = true, EagerLoadStepsMobile = 0, EnableLazyloadDesktop = true, EagerLoadStepsDesktop = 0 }, LazyLoadCollectionConfigurations = new[] { new { CollectionName = "string", EnableLazyloadMobile = true, EagerLoadStepsMobile = 0, EnableLazyloadDesktop = true, EagerLoadStepsDesktop = 0 } }, WidgetRestrictions = new { }, ContainerRestrictions = new { AllowedLayouts = new[] { 0 }, BannedWidgets = new[] { "00000000-0000-0000-0000-000000000000" } } } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/PageArea", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "Index": 0, "Name": "string", "FamilyId": 0, "Settings": "string", "Containers": [ { "Id": 0, "Name": "string", "ClassNames": [ "string" ], "Active": true, "Layout": "string", "ResponsiveMode": "string", "Visibility": "string", "Design": "string", "Widgets": [ { "Id": "00000000-0000-0000-0000-000000000000", "Name": "string", "Type": "string", "Active": true, "ClassNames": [ "string" ], "Size": "string", "Configuration": "string" } ] } ] }, "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Delete page area ::api-endpoint --- api: mgmtapi endpointUrl: /API/PageArea/{name} operationId: Delete page area --- #sidebar :::api-endpoint-path{method="DELETE" path="/API/PageArea/{name}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/PageArea/{name}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/PageArea/{name}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/PageArea/{name}', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/PageArea/{name}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/PageArea/{name}" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/PageArea/{name}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get page area family ::api-endpoint --- api: mgmtapi endpointUrl: /API/PageAreaFamily/{familyId} operationId: Get page area family --- #sidebar :::api-endpoint-path{method="GET" path="/API/PageAreaFamily/{familyId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/PageAreaFamily/{familyId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/PageAreaFamily/{familyId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/PageAreaFamily/{familyId}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/PageAreaFamily/{familyId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/PageAreaFamily/{familyId}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/PageAreaFamily/{familyId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "Id": 0, "Name": "string", "FilterableProperties": "string", "Areas": [ { "Index": 0, "Name": "string", "FamilyId": 0, "Settings": "string", "Containers": [ { "Id": 0, "Name": "string", "ClassNames": [ "string" ], "Active": true, "Layout": "string", "ResponsiveMode": "string", "Visibility": "string", "Design": "string", "Widgets": [ { "Id": "00000000-0000-0000-0000-000000000000", "Name": "string", "Type": "string", "Active": true, "ClassNames": [ "string" ], "Size": "string", "Configuration": "string" } ] } ] } ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create/update page area family ::api-endpoint --- api: mgmtapi endpointUrl: /API/PageAreaFamily operationId: Create/update page area family --- #sidebar :::api-endpoint-path{method="POST" path="/API/PageAreaFamily"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/PageAreaFamily' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Id": 0, "Name": "string", "FilterableProperties": [ "string" ], "Areas": [ { "Index": 0, "Name": "string", "FamilyId": 0, "Settings": { "LazyLoadConfiguration": { "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 }, "LazyLoadCollectionConfigurations": [ { "CollectionName": "string", "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 } ], "WidgetRestrictions": {}, "ContainerRestrictions": { "AllowedLayouts": [ 0 ], "BannedWidgets": [ "00000000-0000-0000-0000-000000000000" ] } } } ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/PageAreaFamily', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Id": 0, "Name": "string", "FilterableProperties": [ "string" ], "Areas": [ { "Index": 0, "Name": "string", "FamilyId": 0, "Settings": { "LazyLoadConfiguration": { "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 }, "LazyLoadCollectionConfigurations": [ { "CollectionName": "string", "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 } ], "WidgetRestrictions": {}, "ContainerRestrictions": { "AllowedLayouts": [ 0 ], "BannedWidgets": [ "00000000-0000-0000-0000-000000000000" ] } } } ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/PageAreaFamily', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Id": 0, "Name": "string", "FilterableProperties": [ "string" ], "Areas": [ { "Index": 0, "Name": "string", "FamilyId": 0, "Settings": { "LazyLoadConfiguration": { "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 }, "LazyLoadCollectionConfigurations": [ { "CollectionName": "string", "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 } ], "WidgetRestrictions": {}, "ContainerRestrictions": { "AllowedLayouts": [ 0 ], "BannedWidgets": [ "00000000-0000-0000-0000-000000000000" ] } } } ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/PageAreaFamily" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Id": 0, "Name": "string", "FilterableProperties": [ "string" ], "Areas": [ { "Index": 0, "Name": "string", "FamilyId": 0, "Settings": { "LazyLoadConfiguration": { "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 }, "LazyLoadCollectionConfigurations": [ { "CollectionName": "string", "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 } ], "WidgetRestrictions": {}, "ContainerRestrictions": { "AllowedLayouts": [ 0 ], "BannedWidgets": [ "00000000-0000-0000-0000-000000000000" ] } } } ] } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/PageAreaFamily" payload := []byte(`{ "Id": 0, "Name": "string", "FilterableProperties": [ "string" ], "Areas": [ { "Index": 0, "Name": "string", "FamilyId": 0, "Settings": { "LazyLoadConfiguration": { "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 }, "LazyLoadCollectionConfigurations": [ { "CollectionName": "string", "EnableLazyloadMobile": true, "EagerLoadStepsMobile": 0, "EnableLazyloadDesktop": true, "EagerLoadStepsDesktop": 0 } ], "WidgetRestrictions": {}, "ContainerRestrictions": { "AllowedLayouts": [ 0 ], "BannedWidgets": [ "00000000-0000-0000-0000-000000000000" ] } } } ] }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Id = 0, Name = "string", FilterableProperties = new[] { "string" }, Areas = new[] { new { Index = 0, Name = "string", FamilyId = 0, Settings = new { LazyLoadConfiguration = new { EnableLazyloadMobile = true, EagerLoadStepsMobile = 0, EnableLazyloadDesktop = true, EagerLoadStepsDesktop = 0 }, LazyLoadCollectionConfigurations = new[] { new { CollectionName = "string", EnableLazyloadMobile = true, EagerLoadStepsMobile = 0, EnableLazyloadDesktop = true, EagerLoadStepsDesktop = 0 } }, WidgetRestrictions = new { }, ContainerRestrictions = new { AllowedLayouts = new[] { 0 }, BannedWidgets = new[] { "00000000-0000-0000-0000-000000000000" } } } } } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/PageAreaFamily", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "Id": 0, "Name": "string", "FilterableProperties": "string", "Areas": [ { "Index": 0, "Name": "string", "FamilyId": 0, "Settings": "string", "Containers": [ { "Id": 0, "Name": "string", "ClassNames": [ "string" ], "Active": true, "Layout": "string", "ResponsiveMode": "string", "Visibility": "string", "Design": "string", "Widgets": [ { "Id": "00000000-0000-0000-0000-000000000000", "Name": "string", "Type": "string", "Active": true, "ClassNames": [ "string" ], "Size": "string", "Configuration": "string" } ] } ] } ] }, "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Delete page area family ::api-endpoint --- api: mgmtapi endpointUrl: /API/PageAreaFamily/{familyId} operationId: Delete page area family --- #sidebar :::api-endpoint-path{method="DELETE" path="/API/PageAreaFamily/{familyId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/PageAreaFamily/{familyId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/PageAreaFamily/{familyId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/PageAreaFamily/{familyId}', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/PageAreaFamily/{familyId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/PageAreaFamily/{familyId}" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/PageAreaFamily/{familyId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # List page area families ::api-endpoint --- api: mgmtapi endpointUrl: /API/PageAreaFamily/List operationId: List page area families --- #sidebar :::api-endpoint-path{method="GET" path="/API/PageAreaFamily/List"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/PageAreaFamily/List' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/PageAreaFamily/List', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/PageAreaFamily/List', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/PageAreaFamily/List" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/PageAreaFamily/List" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/PageAreaFamily/List", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ { "Id": 0, "Name": "string", "FilterableProperties": "string", "Areas": [ { "Index": 0, "Name": "string", "FamilyId": 0, "Settings": "string", "Containers": [ { "Id": 0, "Name": "string", "ClassNames": [ "string" ], "Active": true, "Layout": "string", "ResponsiveMode": "string", "Visibility": "string", "Design": "string", "Widgets": [ { "Id": "00000000-0000-0000-0000-000000000000", "Name": "string", "Type": "string", "Active": true, "ClassNames": [ "string" ], "Size": "string", "Configuration": "string" } ] } ] } ] } ], "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Query payment options ::api-endpoint --- api: mgmtapi endpointUrl: /API/Payment/Query operationId: Query payment options --- #sidebar :::api-endpoint-path{method="POST" path="/API/Payment/Query"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Payment/Query' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "SiteId": 0, "Email": "string", "CustomerTypeId": 0, "CountryId": 0, "Sum": 0 }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Payment/Query', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "SiteId": 0, "Email": "string", "CustomerTypeId": 0, "CountryId": 0, "Sum": 0 } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Payment/Query', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "SiteId": 0, "Email": "string", "CustomerTypeId": 0, "CountryId": 0, "Sum": 0 }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Payment/Query" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "SiteId": 0, "Email": "string", "CustomerTypeId": 0, "CountryId": 0, "Sum": 0 } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Payment/Query" payload := []byte(`{ "SiteId": 0, "Email": "string", "CustomerTypeId": 0, "CountryId": 0, "Sum": 0 }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { SiteId = 0, Email = "string", CustomerTypeId = 0, CountryId = 0, Sum = 0 }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Payment/Query", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] [ { "PaymentId": 0, "PaymentGroupId": 0, "Name": "string", "DisplayName": "string", "Fee": 0, "Icon": "string", "Sort": 0, "Period": 0, "TermsLink": "string", "InfoLink": "string", "PersonalIdRequired": true, "RegisteredAddressRequired": true, "HouseNumberRequired": true, "HouseExtensionShown": true, "GenderRequired": true, "BirthdateRequired": true } ] ``` :::: ::: :: # Get price list by id ::api-endpoint --- api: mgmtapi endpointUrl: /API/PriceList/{id} operationId: Get price list by id --- #sidebar :::api-endpoint-path{method="GET" path="/API/PriceList/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/PriceList/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/PriceList/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/PriceList/{id}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/PriceList/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/PriceList/{id}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/PriceList/{id}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "Id": 0, "Name": "string", "MarketId": 0, "MarketPrefix": "string", "Currency": "string", "Forced": true, "CreatedAt": "string", "Identifier": "string", "Active": true }, "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create price list ::api-endpoint --- api: mgmtapi endpointUrl: /API/PriceList operationId: Create price list --- #sidebar :::api-endpoint-path{method="POST" path="/API/PriceList"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/PriceList' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Name": "string", "MarketId": 0, "Forced": true, "AssignedCustomerGroups": [ 0 ], "Identifier": "string", "Active": true }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/PriceList', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Name": "string", "MarketId": 0, "Forced": true, "AssignedCustomerGroups": [ 0 ], "Identifier": "string", "Active": true } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/PriceList', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Name": "string", "MarketId": 0, "Forced": true, "AssignedCustomerGroups": [ 0 ], "Identifier": "string", "Active": true }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/PriceList" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Name": "string", "MarketId": 0, "Forced": true, "AssignedCustomerGroups": [ 0 ], "Identifier": "string", "Active": true } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/PriceList" payload := []byte(`{ "Name": "string", "MarketId": 0, "Forced": true, "AssignedCustomerGroups": [ 0 ], "Identifier": "string", "Active": true }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Name = "string", MarketId = 0, Forced = true, AssignedCustomerGroups = new[] { 0 }, Identifier = "string", Active = true }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/PriceList", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "Id": 0, "Name": "string", "MarketId": 0, "MarketPrefix": "string", "Currency": "string", "Forced": true, "CreatedAt": "string", "Identifier": "string", "Active": true }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update price list ::api-endpoint --- api: mgmtapi endpointUrl: /API/PriceList/{id} operationId: Update price list --- #sidebar :::api-endpoint-path{method="PUT" path="/API/PriceList/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/PriceList/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Name": "string", "MarketId": 0, "Forced": true, "AssignedCustomerGroups": [ 0 ], "Identifier": "string", "Active": true }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/PriceList/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Name": "string", "MarketId": 0, "Forced": true, "AssignedCustomerGroups": [ 0 ], "Identifier": "string", "Active": true } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/PriceList/{id}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Name": "string", "MarketId": 0, "Forced": true, "AssignedCustomerGroups": [ 0 ], "Identifier": "string", "Active": true }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/PriceList/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Name": "string", "MarketId": 0, "Forced": true, "AssignedCustomerGroups": [ 0 ], "Identifier": "string", "Active": true } response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/PriceList/{id}" payload := []byte(`{ "Name": "string", "MarketId": 0, "Forced": true, "AssignedCustomerGroups": [ 0 ], "Identifier": "string", "Active": true }`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Name = "string", MarketId = 0, Forced = true, AssignedCustomerGroups = new[] { 0 }, Identifier = "string", Active = true }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/PriceList/{id}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Delete price list ::api-endpoint --- api: mgmtapi endpointUrl: /API/PriceList/{id} operationId: Delete price list --- #sidebar :::api-endpoint-path{method="DELETE" path="/API/PriceList/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/PriceList/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/PriceList/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/PriceList/{id}', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/PriceList/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/PriceList/{id}" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/PriceList/{id}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # List price lists ::api-endpoint --- api: mgmtapi endpointUrl: /API/PriceList/List operationId: List price lists --- #sidebar :::api-endpoint-path{method="GET" path="/API/PriceList/List"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/PriceList/List' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/PriceList/List', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/PriceList/List', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/PriceList/List" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/PriceList/List" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/PriceList/List", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] [ { "Id": 0, "Name": "string", "MarketId": 0, "MarketPrefix": "string", "Currency": "string", "Forced": true, "CreatedAt": "string", "Identifier": "string", "Active": true } ] ``` :::: ::: :: # Update price list prices ::api-endpoint --- api: mgmtapi endpointUrl: /API/PriceList/Price operationId: Update price list prices --- #sidebar :::api-endpoint-path{method="PUT" path="/API/PriceList/Price"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/PriceList/Price' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '[ { "PriceListId": 0, "Price": 0, "ProductId": "string", "Currency": "string", "StaggeredCount": 0 } ]' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/PriceList/Price', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: [ { "PriceListId": 0, "Price": 0, "ProductId": "string", "Currency": "string", "StaggeredCount": 0 } ] }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/PriceList/Price', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify([ { "PriceListId": 0, "Price": 0, "ProductId": "string", "Currency": "string", "StaggeredCount": 0 } ]) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/PriceList/Price" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = [ { "PriceListId": 0, "Price": 0, "ProductId": "string", "Currency": "string", "StaggeredCount": 0 } ] response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/PriceList/Price" payload := []byte(`[ { "PriceListId": 0, "Price": 0, "ProductId": "string", "Currency": "string", "StaggeredCount": 0 } ]`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new[] { new { PriceListId = 0, Price = 0, ProductId = "string", Currency = "string", StaggeredCount = 0 } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/PriceList/Price", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Invalid": [ { "PriceListId": 0, "Price": 0, "ProductId": "string", "Currency": "string", "StaggeredCount": 0 } ], "NotFound": [ { "PriceListId": 0, "Price": 0, "ProductId": "string", "Currency": "string", "StaggeredCount": 0 } ], "UpdateCount": 0 } ``` ```ts [400] { "Message": "string", "Invalid": [ { "PriceListId": 0, "Price": 0, "ProductId": "string", "Currency": "string", "StaggeredCount": 0 } ], "NotFound": [ { "PriceListId": 0, "Price": 0, "ProductId": "string", "Currency": "string", "StaggeredCount": 0 } ], "UpdateCount": 0 } ``` :::: ::: :: # Get product ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/{productId} operationId: Get product --- #sidebar :::api-endpoint-path{method="GET" path="/API/Product/{productId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Product/{productId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Product/{productId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/{productId}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/{productId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/{productId}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Product/{productId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "ProductId": 0, "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "DateCreated": "string", "DateUpdated": "string", "DateFirstAvailable": "string", "MaxDiscountPercentage": 0, "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "Items": [ { "ItemId": 0, "ArticleNumber": "string", "ProductId": 0, "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "DateCreated": "string", "DateUpdated": "string", "DateIncoming": "string", "Active": true, "ExternalId": "string", "Stock": { "ItemId": 0, "Stock": 0, "StockOversellable": 0, "StockStatic": 0, "StockSellable": 0 }, "ShippingFees": [ { "Market": 0, "Country": "string", "Service": "string", "ServiceId": 0, "Fee": 0 } ] } ], "Prices": [ { "ProductId": 0, "PriceListId": 0, "PriceListName": "string", "PriceIncVat": 0, "PriceExVat": 0, "VatRate": 0, "Country": "string", "Currency": "string", "StaggeredCount": 0, "ValidFrom": "string", "ValidTo": "string" } ], "Categories": [ { "CategoryId": 0, "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "GoogleCategoryPath": "string", "Hidden": true, "Active": true } ], "Images": [ { "ProductId": 0, "Url": "string", "Order": 0, "Tags": [ "string" ] } ], "BrandId": 0, "BrandName": "string", "SupplierId": 0, "SupplierName": "string", "ParameterValues": [ { "ParameterValueId": 0, "ProductId": 0, "ParameterId": 0, "ParameterName": "string", "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Value": "string", "Description": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "InternalIdentifier": "string", "Order": "string" } ], "Variants": [ { "ProductId": 0, "GroupId": 0, "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "Vat": 0, "PrimaryImage": "string", "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "VatId": 0, "ExternalId": "string", "ActivationDate": "string", "Feeds": [ { "FeedId": 0, "AllowSale": true } ], "Urls": [ { "Url": "string", "Market": 0, "Countries": [ "string" ], "Language": "string" } ], "MainCategoryId": 0, "RelatedProducts": [ { "ProductId": 0, "RelatedProductId": 0, "RelationTypeId": 0 } ], "DiscountCampaigns": [ { "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignName": "string", "Title": "string", "HideTitle": true, "RuleType": "string", "Category": "string", "Enabled": true, "ValidFrom": "string", "ValidTo": "string", "Markets": "string", "Action": "string", "ActionValue": "string", "Quantity": 0, "Titles": [ { "LanguageCode": "string", "Content": "string" } ], "Urls": [ { "LanguageCode": "string", "Content": "string" } ] } ], "LowestPrice": [ { "LowestPrice": 0, "ComparisonPrice": 0, "MarketId": 0, "Currency": "string" } ], "SortOrder": { "Default": 0, "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 }, "Weight": 0, "Length": 0, "Width": 0, "Height": 0 }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Add existing image to products (batch) ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/ImageRelation/{imageName} operationId: Add existing image to products (batch) --- #sidebar :::api-endpoint-path{method="PUT" path="/API/Product/ImageRelation/{imageName}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Product/ImageRelation/{imageName}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '[ { "Id": "string" } ]' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Product/ImageRelation/{imageName}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: [ { "Id": "string" } ] }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/ImageRelation/{imageName}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify([ { "Id": "string" } ]) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/ImageRelation/{imageName}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = [ { "Id": "string" } ] response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/ImageRelation/{imageName}" payload := []byte(`[ { "Id": "string" } ]`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new[] { new { Id = "string" } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Product/ImageRelation/{imageName}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Invalid": [ { "Id": "string" } ], "NotFound": [ { "Id": "string" } ], "UpdateCount": 0 } ``` ```ts [400] { "Message": "string", "Invalid": [ { "Id": "string" } ], "NotFound": [ { "Id": "string" } ], "UpdateCount": 0 } ``` :::: ::: :: # Get product item ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/Item/{itemId} operationId: Get product item --- #sidebar :::api-endpoint-path{method="GET" path="/API/Product/Item/{itemId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Product/Item/{itemId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Product/Item/{itemId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/Item/{itemId}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/Item/{itemId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/Item/{itemId}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Product/Item/{itemId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Item": { "ItemId": 0, "ArticleNumber": "string", "ProductId": 0, "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "DateCreated": "string", "DateUpdated": "string", "DateIncoming": "string", "Active": true, "ExternalId": "string", "Stock": { "ItemId": 0, "Stock": 0, "StockOversellable": 0, "StockStatic": 0, "StockSellable": 0 }, "ShippingFees": [ { "Market": 0, "Country": "string", "Service": "string", "ServiceId": 0, "Fee": 0 } ] } } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create product item ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/{productId}/Item operationId: Create product item --- #sidebar :::api-endpoint-path{method="POST" path="/API/Product/{productId}/Item"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Product/{productId}/Item' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Product/{productId}/Item', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/{productId}/Item', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/{productId}/Item" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/{productId}/Item" payload := []byte(`{ "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { ItemId = 0, ArticleNumber = "string", Name = "string", Shelf = "string", Weight = 0, Length = 0, Width = 0, Height = 0, Gtin = "string", Active = true, ExternalId = "string", DateIncoming = "string" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Product/{productId}/Item", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "ItemId": 0, "ArticleNumber": "string", "ProductId": 0, "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "DateCreated": "string", "DateUpdated": "string", "DateIncoming": "string", "Active": true, "ExternalId": "string", "Stock": { "ItemId": 0, "Stock": 0, "StockOversellable": 0, "StockStatic": 0, "StockSellable": 0 }, "ShippingFees": [ { "Market": 0, "Country": "string", "Service": "string", "ServiceId": 0, "Fee": 0 } ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update product item ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/Item/{itemId} operationId: Update product item --- #sidebar :::api-endpoint-path{method="PUT" path="/API/Product/Item/{itemId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Product/Item/{itemId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Product/Item/{itemId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/Item/{itemId}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/Item/{itemId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/Item/{itemId}" payload := []byte(`{ "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" }`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { ItemId = 0, ArticleNumber = "string", Name = "string", Shelf = "string", Weight = 0, Length = 0, Width = 0, Height = 0, Gtin = "string", Active = true, ExternalId = "string", DateIncoming = "string" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Product/Item/{itemId}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "ItemId": 0, "ArticleNumber": "string", "ProductId": 0, "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "DateCreated": "string", "DateUpdated": "string", "DateIncoming": "string", "Active": true, "ExternalId": "string", "Stock": { "ItemId": 0, "Stock": 0, "StockOversellable": 0, "StockStatic": 0, "StockSellable": 0 }, "ShippingFees": [ { "Market": 0, "Country": "string", "Service": "string", "ServiceId": 0, "Fee": 0 } ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get product parameter value ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/{productId}/Parameter/{parameterId} operationId: Get product parameter value --- #sidebar :::api-endpoint-path --- method: GET path: /API/Product/{productId}/Parameter/{parameterId} --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Product/{productId}/Parameter/{parameterId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Product/{productId}/Parameter/{parameterId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/{productId}/Parameter/{parameterId}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/{productId}/Parameter/{parameterId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/{productId}/Parameter/{parameterId}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Product/{productId}/Parameter/{parameterId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "ParameterValueId": 0, "ProductId": 0, "ParameterId": 0, "ParameterName": "string", "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Value": "string", "Description": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "InternalIdentifier": "string", "Order": "string" }, "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create or update product parameter value ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/{productId}/Parameter/{parameterId} operationId: Create or update product parameter value --- #sidebar :::api-endpoint-path --- method: POST path: /API/Product/{productId}/Parameter/{parameterId} --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Product/{productId}/Parameter/{parameterId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Product/{productId}/Parameter/{parameterId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/{productId}/Parameter/{parameterId}', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/{productId}/Parameter/{parameterId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/{productId}/Parameter/{parameterId}" payload := []byte(`{ "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Value = "string", LocalizedDescriptions = new[] { new { LanguageCode = "string", Content = "string" } } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Product/{productId}/Parameter/{parameterId}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "ParameterValueId": 0, "ProductId": 0, "ParameterId": 0, "ParameterName": "string", "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Value": "string", "Description": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "InternalIdentifier": "string", "Order": "string" }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Remove product parameter value from product ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/{productId}/Parameter/{parameterId} operationId: Remove product parameter value from product --- #sidebar :::api-endpoint-path --- method: DELETE path: /API/Product/{productId}/Parameter/{parameterId} --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/Product/{productId}/Parameter/{parameterId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/Product/{productId}/Parameter/{parameterId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/{productId}/Parameter/{parameterId}', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/{productId}/Parameter/{parameterId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/{productId}/Parameter/{parameterId}" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/Product/{productId}/Parameter/{parameterId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Add related products to product ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/{productId}/Related operationId: Add related products to product --- #sidebar :::api-endpoint-path{method="PUT" path="/API/Product/{productId}/Related"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Product/{productId}/Related' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '[ { "RelatedProductId": "string", "RelationTypeId": 0 } ]' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Product/{productId}/Related', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: [ { "RelatedProductId": "string", "RelationTypeId": 0 } ] }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/{productId}/Related', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify([ { "RelatedProductId": "string", "RelationTypeId": 0 } ]) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/{productId}/Related" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = [ { "RelatedProductId": "string", "RelationTypeId": 0 } ] response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/{productId}/Related" payload := []byte(`[ { "RelatedProductId": "string", "RelationTypeId": 0 } ]`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new[] { new { RelatedProductId = "string", RelationTypeId = 0 } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Product/{productId}/Related", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Invalid": [ { "RelatedProductId": "string", "RelationTypeId": 0 } ], "NotFound": [ { "RelatedProductId": "string", "RelationTypeId": 0 } ], "UpdateCount": 0 } ``` ```ts [400] { "Message": "string", "Invalid": [ { "RelatedProductId": "string", "RelationTypeId": 0 } ], "NotFound": [ { "RelatedProductId": "string", "RelationTypeId": 0 } ], "UpdateCount": 0 } ``` :::: ::: :: # Link related products ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/{productId}/Related/{relationTypeId} operationId: Link related products --- #sidebar :::api-endpoint-path --- method: PUT path: /API/Product/{productId}/Related/{relationTypeId} --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Product/{productId}/Related/{relationTypeId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '[ { "RelatedProductId": "string", "RelationTypeId": 0 } ]' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Product/{productId}/Related/{relationTypeId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: [ { "RelatedProductId": "string", "RelationTypeId": 0 } ] }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/{productId}/Related/{relationTypeId}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify([ { "RelatedProductId": "string", "RelationTypeId": 0 } ]) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/{productId}/Related/{relationTypeId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = [ { "RelatedProductId": "string", "RelationTypeId": 0 } ] response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/{productId}/Related/{relationTypeId}" payload := []byte(`[ { "RelatedProductId": "string", "RelationTypeId": 0 } ]`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new[] { new { RelatedProductId = "string", RelationTypeId = 0 } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Product/{productId}/Related/{relationTypeId}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Invalid": [ { "RelatedProductId": "string", "RelationTypeId": 0 } ], "NotFound": [ { "RelatedProductId": "string", "RelationTypeId": 0 } ], "UpdateCount": 0 } ``` ```ts [400] { "Message": "string", "Invalid": [ { "RelatedProductId": "string", "RelationTypeId": 0 } ], "NotFound": [ { "RelatedProductId": "string", "RelationTypeId": 0 } ], "UpdateCount": 0 } ``` :::: ::: :: # Unlink related products (via relation) ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/{productId}/UnlinkRelated/{relationTypeId} operationId: Unlink related products (via relation) --- #sidebar :::api-endpoint-path --- method: PUT path: /API/Product/{productId}/UnlinkRelated/{relationTypeId} --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Product/{productId}/UnlinkRelated/{relationTypeId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '[ { "RelatedProductId": "string", "RelationTypeId": 0 } ]' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Product/{productId}/UnlinkRelated/{relationTypeId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: [ { "RelatedProductId": "string", "RelationTypeId": 0 } ] }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/{productId}/UnlinkRelated/{relationTypeId}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify([ { "RelatedProductId": "string", "RelationTypeId": 0 } ]) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/{productId}/UnlinkRelated/{relationTypeId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = [ { "RelatedProductId": "string", "RelationTypeId": 0 } ] response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/{productId}/UnlinkRelated/{relationTypeId}" payload := []byte(`[ { "RelatedProductId": "string", "RelationTypeId": 0 } ]`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new[] { new { RelatedProductId = "string", RelationTypeId = 0 } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Product/{productId}/UnlinkRelated/{relationTypeId}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Invalid": [ { "RelatedProductId": "string", "RelationTypeId": 0 } ], "NotFound": [ { "RelatedProductId": "string", "RelationTypeId": 0 } ], "UpdateCount": 0 } ``` ```ts [400] { "Message": "string", "Invalid": [ { "RelatedProductId": "string", "RelationTypeId": 0 } ], "NotFound": [ { "RelatedProductId": "string", "RelationTypeId": 0 } ], "UpdateCount": 0 } ``` :::: ::: :: # Create product ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product operationId: Create product --- #sidebar :::api-endpoint-path{method="POST" path="/API/Product"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Product' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Product', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product" payload := []byte(`{ "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { ArticleNumber = "string", Names = new[] { new { LanguageCode = "string", Content = "string" } }, Active = true, PurchasePrice = 0, PurchasePriceCurrency = "string", ShortTexts = new[] { new { LanguageCode = "string", Content = "string" } }, LongTexts = new[] { new { LanguageCode = "string", Content = "string" } }, TechTexts = new[] { new { LanguageCode = "string", Content = "string" } }, BrandId = 0, MaxDiscountPercentage = 0, SupplierId = 0, Items = new[] { new { ItemId = 0, ArticleNumber = "string", Name = "string", Shelf = "string", Weight = 0, Length = 0, Width = 0, Height = 0, Gtin = "string", Active = true, ExternalId = "string", DateIncoming = "string" } }, CategoryIds = new[] { 0 }, ParameterValues = new[] { new { ProductId = 0, ParameterId = 0, Value = "string", LocalizedDescriptions = new[] { new { LanguageCode = "string", Content = "string" } } } }, Variants = new[] { new { Label = "string", Value = "string" } }, Markets = new[] { new { Id = 0, ChannelId = "string", Name = "string", DisplayName = "string", Url = "string", Currency = "string", VatRate = 0, MarketPrefix = "string", CountryId = 0, CurrencyId = 0, CurrencyRate = 0, LanguageId = 0, Language = "string", Languages = new[] { new { LanguageId = 0, Name = "string", Code = "string" } }, Countries = new[] { new { CountryId = 0, Name = "string", Code = "string", VatRate = 0, CurrencyId = 0 } }, Currencies = new[] { new { Name = "string", Code = "string", CurrencyId = 0, CurrencyRate = 0 } } } }, FreightClassId = 0, IntrastatCode = "string", CountryOfOrigin = "string", VariantGroupId = 0, Vat = 0, VatType = "string", ExternalId = "string", ActivationDate = "string", Weight = 0, Length = 0, Width = 0, Height = 0, SortOrder = new { Custom1 = 0, Custom2 = 0, Custom3 = 0, Custom4 = 0, Custom5 = 0 } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Product", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "ProductId": 0, "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "DateCreated": "string", "DateUpdated": "string", "DateFirstAvailable": "string", "MaxDiscountPercentage": 0, "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "Items": [ { "ItemId": 0, "ArticleNumber": "string", "ProductId": 0, "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "DateCreated": "string", "DateUpdated": "string", "DateIncoming": "string", "Active": true, "ExternalId": "string", "Stock": { "ItemId": 0, "Stock": 0, "StockOversellable": 0, "StockStatic": 0, "StockSellable": 0 }, "ShippingFees": [ { "Market": 0, "Country": "string", "Service": "string", "ServiceId": 0, "Fee": 0 } ] } ], "Prices": [ { "ProductId": 0, "PriceListId": 0, "PriceListName": "string", "PriceIncVat": 0, "PriceExVat": 0, "VatRate": 0, "Country": "string", "Currency": "string", "StaggeredCount": 0, "ValidFrom": "string", "ValidTo": "string" } ], "Categories": [ { "CategoryId": 0, "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "GoogleCategoryPath": "string", "Hidden": true, "Active": true } ], "Images": [ { "ProductId": 0, "Url": "string", "Order": 0, "Tags": [ "string" ] } ], "BrandId": 0, "BrandName": "string", "SupplierId": 0, "SupplierName": "string", "ParameterValues": [ { "ParameterValueId": 0, "ProductId": 0, "ParameterId": 0, "ParameterName": "string", "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Value": "string", "Description": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "InternalIdentifier": "string", "Order": "string" } ], "Variants": [ { "ProductId": 0, "GroupId": 0, "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "Vat": 0, "PrimaryImage": "string", "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "VatId": 0, "ExternalId": "string", "ActivationDate": "string", "Feeds": [ { "FeedId": 0, "AllowSale": true } ], "Urls": [ { "Url": "string", "Market": 0, "Countries": [ "string" ], "Language": "string" } ], "MainCategoryId": 0, "RelatedProducts": [ { "ProductId": 0, "RelatedProductId": 0, "RelationTypeId": 0 } ], "DiscountCampaigns": [ { "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignName": "string", "Title": "string", "HideTitle": true, "RuleType": "string", "Category": "string", "Enabled": true, "ValidFrom": "string", "ValidTo": "string", "Markets": "string", "Action": "string", "ActionValue": "string", "Quantity": 0, "Titles": [ { "LanguageCode": "string", "Content": "string" } ], "Urls": [ { "LanguageCode": "string", "Content": "string" } ] } ], "LowestPrice": [ { "LowestPrice": 0, "ComparisonPrice": 0, "MarketId": 0, "Currency": "string" } ], "SortOrder": { "Default": 0, "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 }, "Weight": 0, "Length": 0, "Width": 0, "Height": 0 }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # List feeds ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/Feeds operationId: List feeds --- #sidebar :::api-endpoint-path{method="GET" path="/API/Product/Feeds"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Product/Feeds' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Product/Feeds', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/Feeds', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/Feeds" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/Feeds" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Product/Feeds", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ { "FeedId": 0, "Name": "string", "Url": "string", "Layout": "string", "Market": 0, "Language": "string", "DefaultCurrency": "string", "DefaultCountry": "string" } ], "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # List product items ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/Items operationId: List product items --- #sidebar :::api-endpoint-path{method="GET" path="/API/Product/Items"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Product/Items' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Product/Items', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/Items', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/Items" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/Items" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Product/Items", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] [ { "ItemId": 0, "ArticleNumber": "string", "ProductId": 0, "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "DateCreated": "string", "DateUpdated": "string", "DateIncoming": "string", "Active": true, "ExternalId": "string", "Stock": { "ItemId": 0, "Stock": 0, "StockOversellable": 0, "StockStatic": 0, "StockSellable": 0 }, "ShippingFees": [ { "Market": 0, "Country": "string", "Service": "string", "ServiceId": 0, "Fee": 0 } ] } ] ``` :::: ::: :: # List product items (paged) ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/Items/{page} operationId: List product items (paged) --- #sidebar :::api-endpoint-path{method="GET" path="/API/Product/Items/{page}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Product/Items/{page}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Product/Items/{page}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/Items/{page}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/Items/{page}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/Items/{page}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Product/Items/{page}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ { "ItemId": 0, "ArticleNumber": "string", "ProductId": 0, "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "DateCreated": "string", "DateUpdated": "string", "DateIncoming": "string", "Active": true, "ExternalId": "string", "Stock": { "ItemId": 0, "Stock": 0, "StockOversellable": 0, "StockStatic": 0, "StockSellable": 0 }, "ShippingFees": [ { "Market": 0, "Country": "string", "Service": "string", "ServiceId": 0, "Fee": 0 } ] } ], "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update product items (batch) ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/Items operationId: Update product items (batch) --- #sidebar :::api-endpoint-path{method="PUT" path="/API/Product/Items"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Product/Items' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '[ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ]' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Product/Items', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ] }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/Items', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify([ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ]) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/Items" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ] response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/Items" payload := []byte(`[ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ]`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new[] { new { ItemId = 0, ArticleNumber = "string", Name = "string", Shelf = "string", Weight = 0, Length = 0, Width = 0, Height = 0, Gtin = "string", Active = true, ExternalId = "string", DateIncoming = "string" } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Product/Items", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "UpdateCount": 0 }, "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Add availability monitor ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/MonitorAvailability operationId: Add availability monitor --- #sidebar :::api-endpoint-path{method="POST" path="/API/Product/MonitorAvailability"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Product/MonitorAvailability' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "SiteId": 0, "LanguageCode": "string", "Email": "string", "SkuId": 0 }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Product/MonitorAvailability', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "SiteId": 0, "LanguageCode": "string", "Email": "string", "SkuId": 0 } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/MonitorAvailability', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "SiteId": 0, "LanguageCode": "string", "Email": "string", "SkuId": 0 }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/MonitorAvailability" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "SiteId": 0, "LanguageCode": "string", "Email": "string", "SkuId": 0 } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/MonitorAvailability" payload := []byte(`{ "SiteId": 0, "LanguageCode": "string", "Email": "string", "SkuId": 0 }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { SiteId = 0, LanguageCode = "string", Email = "string", SkuId = 0 }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Product/MonitorAvailability", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Replace product parameter values (batch) ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/Parameter/Values operationId: Replace product parameter values (batch) --- #sidebar :::api-endpoint-path{method="POST" path="/API/Product/Parameter/Values"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Product/Parameter/Values' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Product/Parameter/Values', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/Parameter/Values', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/Parameter/Values" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/Parameter/Values" payload := []byte(`{ "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { productParameterValues = new[] { new { ProductId = 0, ParameterId = 0, Value = "string", LocalizedDescriptions = new[] { new { LanguageCode = "string", Content = "string" } } } } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Product/Parameter/Values", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update product parameter values (batch) ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/Parameter/Values operationId: Update product parameter values (batch) --- #sidebar :::api-endpoint-path{method="PUT" path="/API/Product/Parameter/Values"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Product/Parameter/Values' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Product/Parameter/Values', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/Parameter/Values', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/Parameter/Values" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] } response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/Parameter/Values" payload := []byte(`{ "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] }`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { productParameterValues = new[] { new { ProductId = 0, ParameterId = 0, Value = "string", LocalizedDescriptions = new[] { new { LanguageCode = "string", Content = "string" } } } } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Product/Parameter/Values", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Remove product parameter assignments (batch) ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/Parameter/Values/Remove operationId: Remove product parameter assignments (batch) --- #sidebar :::api-endpoint-path{method="PATCH" path="/API/Product/Parameter/Values/Remove"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PATCH 'https://mgmtapi.geins.io/API/Product/Parameter/Values/Remove' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "ProductParameterAssignments": [ { "ProductId": 0, "ParameterId": 0 } ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PATCH', url: 'https://mgmtapi.geins.io/API/Product/Parameter/Values/Remove', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "ProductParameterAssignments": [ { "ProductId": 0, "ParameterId": 0 } ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/Parameter/Values/Remove', { method: 'PATCH', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "ProductParameterAssignments": [ { "ProductId": 0, "ParameterId": 0 } ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/Parameter/Values/Remove" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "ProductParameterAssignments": [ { "ProductId": 0, "ParameterId": 0 } ] } response = requests.PATCH(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/Parameter/Values/Remove" payload := []byte(`{ "ProductParameterAssignments": [ { "ProductId": 0, "ParameterId": 0 } ] }`) req, _ := http.NewRequest("PATCH", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { ProductParameterAssignments = new[] { new { ProductId = 0, ParameterId = 0 } } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PATCHAsync("https://mgmtapi.geins.io/API/Product/Parameter/Values/Remove", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update product purchase prices (batch) ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/PurchasePrice operationId: Update product purchase prices (batch) --- #sidebar :::api-endpoint-path{method="PUT" path="/API/Product/PurchasePrice"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Product/PurchasePrice' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '[ { "Id": "string", "PurchasePrice": 0, "PurchasePriceCurrency": "string" } ]' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Product/PurchasePrice', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: [ { "Id": "string", "PurchasePrice": 0, "PurchasePriceCurrency": "string" } ] }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/PurchasePrice', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify([ { "Id": "string", "PurchasePrice": 0, "PurchasePriceCurrency": "string" } ]) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/PurchasePrice" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = [ { "Id": "string", "PurchasePrice": 0, "PurchasePriceCurrency": "string" } ] response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/PurchasePrice" payload := []byte(`[ { "Id": "string", "PurchasePrice": 0, "PurchasePriceCurrency": "string" } ]`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new[] { new { Id = "string", PurchasePrice = 0, PurchasePriceCurrency = "string" } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Product/PurchasePrice", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Invalid": [ { "Id": "string", "PurchasePrice": 0, "PurchasePriceCurrency": "string" } ], "NotFound": [ { "Id": "string", "PurchasePrice": 0, "PurchasePriceCurrency": "string" } ], "UpdateCount": 0 } ``` ```ts [400] { "Message": "string", "Invalid": [ { "Id": "string", "PurchasePrice": 0, "PurchasePriceCurrency": "string" } ], "NotFound": [ { "Id": "string", "PurchasePrice": 0, "PurchasePriceCurrency": "string" } ], "UpdateCount": 0 } ``` :::: ::: :: # Query products ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/Query operationId: Query products --- #sidebar :::api-endpoint-path{method="POST" path="/API/Product/Query"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Product/Query' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "UpdatedAfter": "string", "CreatedAfter": "string", "CreatedBefore": "string", "ProductIds": [ 0 ], "CategoryIds": [ 0 ], "BrandIds": [ 0 ], "SupplierIds": [ 0 ], "ArticleNumbers": [ "string" ], "OnlySellable": true, "OnlyInStock": true, "FeedId": 0, "BatchId": "00000000-0000-0000-0000-000000000000" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Product/Query', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "UpdatedAfter": "string", "CreatedAfter": "string", "CreatedBefore": "string", "ProductIds": [ 0 ], "CategoryIds": [ 0 ], "BrandIds": [ 0 ], "SupplierIds": [ 0 ], "ArticleNumbers": [ "string" ], "OnlySellable": true, "OnlyInStock": true, "FeedId": 0, "BatchId": "00000000-0000-0000-0000-000000000000" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/Query', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "UpdatedAfter": "string", "CreatedAfter": "string", "CreatedBefore": "string", "ProductIds": [ 0 ], "CategoryIds": [ 0 ], "BrandIds": [ 0 ], "SupplierIds": [ 0 ], "ArticleNumbers": [ "string" ], "OnlySellable": true, "OnlyInStock": true, "FeedId": 0, "BatchId": "00000000-0000-0000-0000-000000000000" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/Query" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "UpdatedAfter": "string", "CreatedAfter": "string", "CreatedBefore": "string", "ProductIds": [ 0 ], "CategoryIds": [ 0 ], "BrandIds": [ 0 ], "SupplierIds": [ 0 ], "ArticleNumbers": [ "string" ], "OnlySellable": true, "OnlyInStock": true, "FeedId": 0, "BatchId": "00000000-0000-0000-0000-000000000000" } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/Query" payload := []byte(`{ "UpdatedAfter": "string", "CreatedAfter": "string", "CreatedBefore": "string", "ProductIds": [ 0 ], "CategoryIds": [ 0 ], "BrandIds": [ 0 ], "SupplierIds": [ 0 ], "ArticleNumbers": [ "string" ], "OnlySellable": true, "OnlyInStock": true, "FeedId": 0, "BatchId": "00000000-0000-0000-0000-000000000000" }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { UpdatedAfter = "string", CreatedAfter = "string", CreatedBefore = "string", ProductIds = new[] { 0 }, CategoryIds = new[] { 0 }, BrandIds = new[] { 0 }, SupplierIds = new[] { 0 }, ArticleNumbers = new[] { "string" }, OnlySellable = true, OnlyInStock = true, FeedId = 0, BatchId = "00000000-0000-0000-0000-000000000000" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Product/Query", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "PageResult": { "BatchId": "00000000-0000-0000-0000-000000000000", "Page": 0, "RowCount": 0, "PageCount": 0, "PageSize": 0, "HasMoreRows": true }, "Resource": [ { "ProductId": 0, "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "DateCreated": "string", "DateUpdated": "string", "DateFirstAvailable": "string", "MaxDiscountPercentage": 0, "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "Items": [ { "ItemId": 0, "ArticleNumber": "string", "ProductId": 0, "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "DateCreated": "string", "DateUpdated": "string", "DateIncoming": "string", "Active": true, "ExternalId": "string", "Stock": { "ItemId": 0, "Stock": 0, "StockOversellable": 0, "StockStatic": 0, "StockSellable": 0 }, "ShippingFees": [ { "Market": 0, "Country": "string", "Service": "string", "ServiceId": 0, "Fee": 0 } ] } ], "Prices": [ { "ProductId": 0, "PriceListId": 0, "PriceListName": "string", "PriceIncVat": 0, "PriceExVat": 0, "VatRate": 0, "Country": "string", "Currency": "string", "StaggeredCount": 0, "ValidFrom": "string", "ValidTo": "string" } ], "Categories": [ { "CategoryId": 0, "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "GoogleCategoryPath": "string", "Hidden": true, "Active": true } ], "Images": [ { "ProductId": 0, "Url": "string", "Order": 0, "Tags": [ "string" ] } ], "BrandId": 0, "BrandName": "string", "SupplierId": 0, "SupplierName": "string", "ParameterValues": [ { "ParameterValueId": 0, "ProductId": 0, "ParameterId": 0, "ParameterName": "string", "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Value": "string", "Description": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "InternalIdentifier": "string", "Order": "string" } ], "Variants": [ { "ProductId": 0, "GroupId": 0, "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "Vat": 0, "PrimaryImage": "string", "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "VatId": 0, "ExternalId": "string", "ActivationDate": "string", "Feeds": [ { "FeedId": 0, "AllowSale": true } ], "Urls": [ { "Url": "string", "Market": 0, "Countries": [ "string" ], "Language": "string" } ], "MainCategoryId": 0, "RelatedProducts": [ { "ProductId": 0, "RelatedProductId": 0, "RelationTypeId": 0 } ], "DiscountCampaigns": [ { "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignName": "string", "Title": "string", "HideTitle": true, "RuleType": "string", "Category": "string", "Enabled": true, "ValidFrom": "string", "ValidTo": "string", "Markets": "string", "Action": "string", "ActionValue": "string", "Quantity": 0, "Titles": [ { "LanguageCode": "string", "Content": "string" } ], "Urls": [ { "LanguageCode": "string", "Content": "string" } ] } ], "LowestPrice": [ { "LowestPrice": 0, "ComparisonPrice": 0, "MarketId": 0, "Currency": "string" } ], "SortOrder": { "Default": 0, "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 }, "Weight": 0, "Length": 0, "Width": 0, "Height": 0 } ], "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update product ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/{productId} operationId: Update product --- #sidebar :::api-endpoint-path{method="PUT" path="/API/Product/{productId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Product/{productId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Product/{productId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/{productId}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/{productId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } } response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/{productId}" payload := []byte(`{ "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } }`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { ArticleNumber = "string", Names = new[] { new { LanguageCode = "string", Content = "string" } }, Active = true, PurchasePrice = 0, PurchasePriceCurrency = "string", ShortTexts = new[] { new { LanguageCode = "string", Content = "string" } }, LongTexts = new[] { new { LanguageCode = "string", Content = "string" } }, TechTexts = new[] { new { LanguageCode = "string", Content = "string" } }, BrandId = 0, MaxDiscountPercentage = 0, SupplierId = 0, Items = new[] { new { ItemId = 0, ArticleNumber = "string", Name = "string", Shelf = "string", Weight = 0, Length = 0, Width = 0, Height = 0, Gtin = "string", Active = true, ExternalId = "string", DateIncoming = "string" } }, CategoryIds = new[] { 0 }, ParameterValues = new[] { new { ProductId = 0, ParameterId = 0, Value = "string", LocalizedDescriptions = new[] { new { LanguageCode = "string", Content = "string" } } } }, Variants = new[] { new { Label = "string", Value = "string" } }, Markets = new[] { new { Id = 0, ChannelId = "string", Name = "string", DisplayName = "string", Url = "string", Currency = "string", VatRate = 0, MarketPrefix = "string", CountryId = 0, CurrencyId = 0, CurrencyRate = 0, LanguageId = 0, Language = "string", Languages = new[] { new { LanguageId = 0, Name = "string", Code = "string" } }, Countries = new[] { new { CountryId = 0, Name = "string", Code = "string", VatRate = 0, CurrencyId = 0 } }, Currencies = new[] { new { Name = "string", Code = "string", CurrencyId = 0, CurrencyRate = 0 } } } }, FreightClassId = 0, IntrastatCode = "string", CountryOfOrigin = "string", VariantGroupId = 0, Vat = 0, VatType = "string", ExternalId = "string", ActivationDate = "string", Weight = 0, Length = 0, Width = 0, Height = 0, SortOrder = new { Custom1 = 0, Custom2 = 0, Custom3 = 0, Custom4 = 0, Custom5 = 0 } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Product/{productId}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "ProductId": 0, "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "DateCreated": "string", "DateUpdated": "string", "DateFirstAvailable": "string", "MaxDiscountPercentage": 0, "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "Items": [ { "ItemId": 0, "ArticleNumber": "string", "ProductId": 0, "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "DateCreated": "string", "DateUpdated": "string", "DateIncoming": "string", "Active": true, "ExternalId": "string", "Stock": { "ItemId": 0, "Stock": 0, "StockOversellable": 0, "StockStatic": 0, "StockSellable": 0 }, "ShippingFees": [ { "Market": 0, "Country": "string", "Service": "string", "ServiceId": 0, "Fee": 0 } ] } ], "Prices": [ { "ProductId": 0, "PriceListId": 0, "PriceListName": "string", "PriceIncVat": 0, "PriceExVat": 0, "VatRate": 0, "Country": "string", "Currency": "string", "StaggeredCount": 0, "ValidFrom": "string", "ValidTo": "string" } ], "Categories": [ { "CategoryId": 0, "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "GoogleCategoryPath": "string", "Hidden": true, "Active": true } ], "Images": [ { "ProductId": 0, "Url": "string", "Order": 0, "Tags": [ "string" ] } ], "BrandId": 0, "BrandName": "string", "SupplierId": 0, "SupplierName": "string", "ParameterValues": [ { "ParameterValueId": 0, "ProductId": 0, "ParameterId": 0, "ParameterName": "string", "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Value": "string", "Description": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "InternalIdentifier": "string", "Order": "string" } ], "Variants": [ { "ProductId": 0, "GroupId": 0, "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "Vat": 0, "PrimaryImage": "string", "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "VatId": 0, "ExternalId": "string", "ActivationDate": "string", "Feeds": [ { "FeedId": 0, "AllowSale": true } ], "Urls": [ { "Url": "string", "Market": 0, "Countries": [ "string" ], "Language": "string" } ], "MainCategoryId": 0, "RelatedProducts": [ { "ProductId": 0, "RelatedProductId": 0, "RelationTypeId": 0 } ], "DiscountCampaigns": [ { "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignName": "string", "Title": "string", "HideTitle": true, "RuleType": "string", "Category": "string", "Enabled": true, "ValidFrom": "string", "ValidTo": "string", "Markets": "string", "Action": "string", "ActionValue": "string", "Quantity": 0, "Titles": [ { "LanguageCode": "string", "Content": "string" } ], "Urls": [ { "LanguageCode": "string", "Content": "string" } ] } ], "LowestPrice": [ { "LowestPrice": 0, "ComparisonPrice": 0, "MarketId": 0, "Currency": "string" } ], "SortOrder": { "Default": 0, "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 }, "Weight": 0, "Length": 0, "Width": 0, "Height": 0 }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Query products (paged) ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/Query/{page} operationId: Query products (paged) --- #sidebar :::api-endpoint-path{method="POST" path="/API/Product/Query/{page}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Product/Query/{page}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "UpdatedAfter": "string", "CreatedAfter": "string", "CreatedBefore": "string", "ProductIds": [ 0 ], "CategoryIds": [ 0 ], "BrandIds": [ 0 ], "SupplierIds": [ 0 ], "ArticleNumbers": [ "string" ], "OnlySellable": true, "OnlyInStock": true, "FeedId": 0, "BatchId": "00000000-0000-0000-0000-000000000000" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Product/Query/{page}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "UpdatedAfter": "string", "CreatedAfter": "string", "CreatedBefore": "string", "ProductIds": [ 0 ], "CategoryIds": [ 0 ], "BrandIds": [ 0 ], "SupplierIds": [ 0 ], "ArticleNumbers": [ "string" ], "OnlySellable": true, "OnlyInStock": true, "FeedId": 0, "BatchId": "00000000-0000-0000-0000-000000000000" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/Query/{page}', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "UpdatedAfter": "string", "CreatedAfter": "string", "CreatedBefore": "string", "ProductIds": [ 0 ], "CategoryIds": [ 0 ], "BrandIds": [ 0 ], "SupplierIds": [ 0 ], "ArticleNumbers": [ "string" ], "OnlySellable": true, "OnlyInStock": true, "FeedId": 0, "BatchId": "00000000-0000-0000-0000-000000000000" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/Query/{page}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "UpdatedAfter": "string", "CreatedAfter": "string", "CreatedBefore": "string", "ProductIds": [ 0 ], "CategoryIds": [ 0 ], "BrandIds": [ 0 ], "SupplierIds": [ 0 ], "ArticleNumbers": [ "string" ], "OnlySellable": true, "OnlyInStock": true, "FeedId": 0, "BatchId": "00000000-0000-0000-0000-000000000000" } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/Query/{page}" payload := []byte(`{ "UpdatedAfter": "string", "CreatedAfter": "string", "CreatedBefore": "string", "ProductIds": [ 0 ], "CategoryIds": [ 0 ], "BrandIds": [ 0 ], "SupplierIds": [ 0 ], "ArticleNumbers": [ "string" ], "OnlySellable": true, "OnlyInStock": true, "FeedId": 0, "BatchId": "00000000-0000-0000-0000-000000000000" }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { UpdatedAfter = "string", CreatedAfter = "string", CreatedBefore = "string", ProductIds = new[] { 0 }, CategoryIds = new[] { 0 }, BrandIds = new[] { 0 }, SupplierIds = new[] { 0 }, ArticleNumbers = new[] { "string" }, OnlySellable = true, OnlyInStock = true, FeedId = 0, BatchId = "00000000-0000-0000-0000-000000000000" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Product/Query/{page}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "PageResult": { "BatchId": "00000000-0000-0000-0000-000000000000", "Page": 0, "RowCount": 0, "PageCount": 0, "PageSize": 0, "HasMoreRows": true }, "Resource": [ { "ProductId": 0, "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "DateCreated": "string", "DateUpdated": "string", "DateFirstAvailable": "string", "MaxDiscountPercentage": 0, "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "Items": [ { "ItemId": 0, "ArticleNumber": "string", "ProductId": 0, "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "DateCreated": "string", "DateUpdated": "string", "DateIncoming": "string", "Active": true, "ExternalId": "string", "Stock": { "ItemId": 0, "Stock": 0, "StockOversellable": 0, "StockStatic": 0, "StockSellable": 0 }, "ShippingFees": [ { "Market": 0, "Country": "string", "Service": "string", "ServiceId": 0, "Fee": 0 } ] } ], "Prices": [ { "ProductId": 0, "PriceListId": 0, "PriceListName": "string", "PriceIncVat": 0, "PriceExVat": 0, "VatRate": 0, "Country": "string", "Currency": "string", "StaggeredCount": 0, "ValidFrom": "string", "ValidTo": "string" } ], "Categories": [ { "CategoryId": 0, "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "GoogleCategoryPath": "string", "Hidden": true, "Active": true } ], "Images": [ { "ProductId": 0, "Url": "string", "Order": 0, "Tags": [ "string" ] } ], "BrandId": 0, "BrandName": "string", "SupplierId": 0, "SupplierName": "string", "ParameterValues": [ { "ParameterValueId": 0, "ProductId": 0, "ParameterId": 0, "ParameterName": "string", "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Value": "string", "Description": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "InternalIdentifier": "string", "Order": "string" } ], "Variants": [ { "ProductId": 0, "GroupId": 0, "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "Vat": 0, "PrimaryImage": "string", "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "VatId": 0, "ExternalId": "string", "ActivationDate": "string", "Feeds": [ { "FeedId": 0, "AllowSale": true } ], "Urls": [ { "Url": "string", "Market": 0, "Countries": [ "string" ], "Language": "string" } ], "MainCategoryId": 0, "RelatedProducts": [ { "ProductId": 0, "RelatedProductId": 0, "RelationTypeId": 0 } ], "DiscountCampaigns": [ { "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignName": "string", "Title": "string", "HideTitle": true, "RuleType": "string", "Category": "string", "Enabled": true, "ValidFrom": "string", "ValidTo": "string", "Markets": "string", "Action": "string", "ActionValue": "string", "Quantity": 0, "Titles": [ { "LanguageCode": "string", "Content": "string" } ], "Urls": [ { "LanguageCode": "string", "Content": "string" } ] } ], "LowestPrice": [ { "LowestPrice": 0, "ComparisonPrice": 0, "MarketId": 0, "Currency": "string" } ], "SortOrder": { "Default": 0, "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 }, "Weight": 0, "Length": 0, "Width": 0, "Height": 0 } ], "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # List product relation types ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/RelationTypes operationId: List product relation types --- #sidebar :::api-endpoint-path{method="GET" path="/API/Product/RelationTypes"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Product/RelationTypes' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Product/RelationTypes', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/RelationTypes', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/RelationTypes" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/RelationTypes" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Product/RelationTypes", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ { "Id": 0, "Name": "string", "Order": 0 } ], "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get a relation type ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/RelationTypes/{id} operationId: Get a relation type --- #sidebar :::api-endpoint-path{method="GET" path="/API/Product/RelationTypes/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Product/RelationTypes/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Product/RelationTypes/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/RelationTypes/{id}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/RelationTypes/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/RelationTypes/{id}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Product/RelationTypes/{id}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "Id": 0, "Name": "string", "Order": 0 }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create a relation type ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/RelationTypes operationId: Create a relation type --- #sidebar :::api-endpoint-path{method="POST" path="/API/Product/RelationTypes"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Product/RelationTypes' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Name": "string", "Order": 0 }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Product/RelationTypes', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Name": "string", "Order": 0 } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/RelationTypes', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Name": "string", "Order": 0 }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/RelationTypes" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Name": "string", "Order": 0 } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/RelationTypes" payload := []byte(`{ "Name": "string", "Order": 0 }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Name = "string", Order = 0 }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Product/RelationTypes", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": 0, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update a relation type ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/RelationTypes/{id} operationId: Update a relation type --- #sidebar :::api-endpoint-path{method="PUT" path="/API/Product/RelationTypes/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Product/RelationTypes/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Name": "string", "Order": 0 }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Product/RelationTypes/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Name": "string", "Order": 0 } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/RelationTypes/{id}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Name": "string", "Order": 0 }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/RelationTypes/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Name": "string", "Order": 0 } response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/RelationTypes/{id}" payload := []byte(`{ "Name": "string", "Order": 0 }`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Name = "string", Order = 0 }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Product/RelationTypes/{id}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Delete a relation type ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/RelationTypes/{id} operationId: Delete a relation type --- #sidebar :::api-endpoint-path{method="DELETE" path="/API/Product/RelationTypes/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/Product/RelationTypes/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/Product/RelationTypes/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/RelationTypes/{id}', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/RelationTypes/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/RelationTypes/{id}" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/Product/RelationTypes/{id}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update product sort orders (batch) ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/SortOrder operationId: Update product sort orders (batch) --- #sidebar :::api-endpoint-path{method="PUT" path="/API/Product/SortOrder"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Product/SortOrder' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '[ { "Id": "string", "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } ]' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Product/SortOrder', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: [ { "Id": "string", "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } ] }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/SortOrder', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify([ { "Id": "string", "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } ]) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/SortOrder" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = [ { "Id": "string", "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } ] response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/SortOrder" payload := []byte(`[ { "Id": "string", "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } ]`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new[] { new { Id = "string", Custom1 = 0, Custom2 = 0, Custom3 = 0, Custom4 = 0, Custom5 = 0 } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Product/SortOrder", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Invalid": [ { "Id": "string", "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } ], "NotFound": [ { "Id": "string", "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } ], "UpdateCount": 0 } ``` ```ts [400] { "Message": "string", "Invalid": [ { "Id": "string", "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } ], "NotFound": [ { "Id": "string", "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } ], "UpdateCount": 0 } ``` :::: ::: :: # Update stock (batch) ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/Stock operationId: Update stock (batch) --- #sidebar :::api-endpoint-path{method="PUT" path="/API/Product/Stock"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Product/Stock' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '[ { "Id": "string", "Stock": 0, "StockSellable": 0, "StockType": 0 } ]' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Product/Stock', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: [ { "Id": "string", "Stock": 0, "StockSellable": 0, "StockType": 0 } ] }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/Stock', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify([ { "Id": "string", "Stock": 0, "StockSellable": 0, "StockType": 0 } ]) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/Stock" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = [ { "Id": "string", "Stock": 0, "StockSellable": 0, "StockType": 0 } ] response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/Stock" payload := []byte(`[ { "Id": "string", "Stock": 0, "StockSellable": 0, "StockType": 0 } ]`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new[] { new { Id = "string", Stock = 0, StockSellable = 0, StockType = 0 } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Product/Stock", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Invalid": [ { "Id": "string", "Stock": 0, "StockSellable": 0, "StockType": 0 } ], "NotFound": [ { "Id": "string", "Stock": 0, "StockSellable": 0, "StockType": 0 } ], "UpdateCount": 0 } ``` ```ts [400] { "Message": "string", "Invalid": [ { "Id": "string", "Stock": 0, "StockSellable": 0, "StockType": 0 } ], "NotFound": [ { "Id": "string", "Stock": 0, "StockSellable": 0, "StockType": 0 } ], "UpdateCount": 0 } ``` :::: ::: :: # Query stock ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/Stock/Query operationId: Query stock --- #sidebar :::api-endpoint-path{method="POST" path="/API/Product/Stock/Query"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Product/Stock/Query' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '[ 0 ]' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Product/Stock/Query', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: [ 0 ] }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/Stock/Query', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify([ 0 ]) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/Stock/Query" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = [ 0 ] response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/Stock/Query" payload := []byte(`[ 0 ]`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new[] { 0 }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Product/Stock/Query", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ { "ItemId": 0, "Stock": 0, "StockOversellable": 0, "StockStatic": 0, "StockSellable": 0 } ], "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Delete product ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/{productId} operationId: Delete product --- #sidebar :::api-endpoint-path{method="DELETE" path="/API/Product/{productId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/Product/{productId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/Product/{productId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/{productId}', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/{productId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/{productId}" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/Product/{productId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Add category to product ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/{productId}/Category operationId: Add category to product --- #sidebar :::api-endpoint-path{method="PUT" path="/API/Product/{productId}/Category"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Product/{productId}/Category' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "CategoryId": 0 }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Product/{productId}/Category', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "CategoryId": 0 } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/{productId}/Category', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "CategoryId": 0 }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/{productId}/Category" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "CategoryId": 0 } response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/{productId}/Category" payload := []byte(`{ "CategoryId": 0 }`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { CategoryId = 0 }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Product/{productId}/Category", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Add product image ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/{productId}/Image/{imageName} operationId: Add product image --- #sidebar :::api-endpoint-path --- method: POST path: /API/Product/{productId}/Image/{imageName} --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Product/{productId}/Image/{imageName}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Product/{productId}/Image/{imageName}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/{productId}/Image/{imageName}', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/{productId}/Image/{imageName}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.POST(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/{productId}/Image/{imageName}" payload := []byte{} req, _ := http.NewRequest("POST", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Product/{productId}/Image/{imageName}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "FileName": "string" }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` ```ts [500] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Add/update product image ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/{productId}/Image/{imageName} operationId: Add/update product image --- #sidebar :::api-endpoint-path --- method: PUT path: /API/Product/{productId}/Image/{imageName} --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Product/{productId}/Image/{imageName}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Product/{productId}/Image/{imageName}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/{productId}/Image/{imageName}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/{productId}/Image/{imageName}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.PUT(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/{productId}/Image/{imageName}" payload := []byte{} req, _ := http.NewRequest("PUT", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Product/{productId}/Image/{imageName}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "FileName": "string" }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` ```ts [500] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Delete product image ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/{productId}/Image/{imageName} operationId: Delete product image --- #sidebar :::api-endpoint-path --- method: DELETE path: /API/Product/{productId}/Image/{imageName} --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/Product/{productId}/Image/{imageName}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/Product/{productId}/Image/{imageName}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/{productId}/Image/{imageName}', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/{productId}/Image/{imageName}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/{productId}/Image/{imageName}" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/Product/{productId}/Image/{imageName}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Add existing image to product ::api-endpoint --- api: mgmtapi endpointUrl: /API/Product/{productId}/ImageRelation/{imageName} operationId: Add existing image to product --- #sidebar :::api-endpoint-path --- method: PUT path: /API/Product/{productId}/ImageRelation/{imageName} --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Product/{productId}/ImageRelation/{imageName}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Product/{productId}/ImageRelation/{imageName}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Product/{productId}/ImageRelation/{imageName}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Product/{productId}/ImageRelation/{imageName}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.PUT(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Product/{productId}/ImageRelation/{imageName}" payload := []byte{} req, _ := http.NewRequest("PUT", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Product/{productId}/ImageRelation/{imageName}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "FileName": "string" }, "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get product parameter ::api-endpoint --- api: mgmtapi endpointUrl: /API/ProductParameter/{id} operationId: Get product parameter --- #sidebar :::api-endpoint-path{method="GET" path="/API/ProductParameter/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/ProductParameter/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/ProductParameter/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/ProductParameter/{id}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/ProductParameter/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/ProductParameter/{id}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/ProductParameter/{id}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "ParameterId": 0, "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ], "PredefinedValues": [ { "ParameterId": 0, "PredefinedValueId": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] } ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get product parameter value (obsolete) ::api-endpoint --- api: mgmtapi endpointUrl: /API/ProductParameter/Value/{id} operationId: Get product parameter value (obsolete) --- #sidebar :::api-endpoint-path{method="GET" path="/API/ProductParameter/Value/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/ProductParameter/Value/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/ProductParameter/Value/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/ProductParameter/Value/{id}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/ProductParameter/Value/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/ProductParameter/Value/{id}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/ProductParameter/Value/{id}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "ParameterValueId": 0, "ProductId": 0, "ParameterId": 0, "ParameterName": "string", "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Value": "string", "Description": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "InternalIdentifier": "string", "Order": "string" }, "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create or update product parameter value (obsolete) ::api-endpoint --- api: mgmtapi endpointUrl: /API/ProductParameter/Value operationId: Create or update product parameter value (obsolete) --- #sidebar :::api-endpoint-path{method="POST" path="/API/ProductParameter/Value"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/ProductParameter/Value' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/ProductParameter/Value', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/ProductParameter/Value', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/ProductParameter/Value" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/ProductParameter/Value" payload := []byte(`{ "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { ProductId = 0, ParameterId = 0, Value = "string", LocalizedDescriptions = new[] { new { LanguageCode = "string", Content = "string" } } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/ProductParameter/Value", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "ParameterValueId": 0, "ProductId": 0, "ParameterId": 0, "ParameterName": "string", "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Value": "string", "Description": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "InternalIdentifier": "string", "Order": "string" }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Replace product parameter values (batch) (obsolete) ::api-endpoint --- api: mgmtapi endpointUrl: /API/ProductParameter/Values operationId: Replace product parameter values (batch) (obsolete) --- #sidebar :::api-endpoint-path{method="POST" path="/API/ProductParameter/Values"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/ProductParameter/Values' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/ProductParameter/Values', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/ProductParameter/Values', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/ProductParameter/Values" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/ProductParameter/Values" payload := []byte(`{ "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { productParameterValues = new[] { new { ProductId = 0, ParameterId = 0, Value = "string", LocalizedDescriptions = new[] { new { LanguageCode = "string", Content = "string" } } } } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/ProductParameter/Values", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update product parameter values (batch) (obsolete) ::api-endpoint --- api: mgmtapi endpointUrl: /API/ProductParameter/Values operationId: Update product parameter values (batch) (obsolete) --- #sidebar :::api-endpoint-path{method="PUT" path="/API/ProductParameter/Values"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/ProductParameter/Values' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/ProductParameter/Values', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/ProductParameter/Values', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/ProductParameter/Values" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] } response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/ProductParameter/Values" payload := []byte(`{ "productParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ] }`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { productParameterValues = new[] { new { ProductId = 0, ParameterId = 0, Value = "string", LocalizedDescriptions = new[] { new { LanguageCode = "string", Content = "string" } } } } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/ProductParameter/Values", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create product parameter ::api-endpoint --- api: mgmtapi endpointUrl: /API/ProductParameter operationId: Create product parameter --- #sidebar :::api-endpoint-path{method="POST" path="/API/ProductParameter"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/ProductParameter' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "ParameterId": 0, "GroupId": 0, "ParameterType": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/ProductParameter', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "ParameterId": 0, "GroupId": 0, "ParameterType": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/ProductParameter', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "ParameterId": 0, "GroupId": 0, "ParameterType": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/ProductParameter" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "ParameterId": 0, "GroupId": 0, "ParameterType": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/ProductParameter" payload := []byte(`{ "ParameterId": 0, "GroupId": 0, "ParameterType": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { ParameterId = 0, GroupId = 0, ParameterType = 0, Name = "string", LocalizedNames = new[] { new { LanguageCode = "string", Content = "string" } } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/ProductParameter", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "ParameterId": 0, "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ], "PredefinedValues": [ { "ParameterId": 0, "PredefinedValueId": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] } ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update product parameter ::api-endpoint --- api: mgmtapi endpointUrl: /API/ProductParameter/{id} operationId: Update product parameter --- #sidebar :::api-endpoint-path{method="PUT" path="/API/ProductParameter/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/ProductParameter/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "ParameterId": 0, "GroupId": 0, "ParameterType": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/ProductParameter/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "ParameterId": 0, "GroupId": 0, "ParameterType": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/ProductParameter/{id}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "ParameterId": 0, "GroupId": 0, "ParameterType": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/ProductParameter/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "ParameterId": 0, "GroupId": 0, "ParameterType": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] } response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/ProductParameter/{id}" payload := []byte(`{ "ParameterId": 0, "GroupId": 0, "ParameterType": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] }`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { ParameterId = 0, GroupId = 0, ParameterType = 0, Name = "string", LocalizedNames = new[] { new { LanguageCode = "string", Content = "string" } } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/ProductParameter/{id}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "ParameterId": 0, "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ], "PredefinedValues": [ { "ParameterId": 0, "PredefinedValueId": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] } ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get product parameter group ::api-endpoint --- api: mgmtapi endpointUrl: /API/ProductParameter/Group/{id} operationId: Get product parameter group --- #sidebar :::api-endpoint-path{method="GET" path="/API/ProductParameter/Group/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/ProductParameter/Group/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/ProductParameter/Group/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/ProductParameter/Group/{id}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/ProductParameter/Group/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/ProductParameter/Group/{id}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/ProductParameter/Group/{id}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "GroupId": 0, "Name": "string", "Order": 0, "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ], "ParameterIds": [ 0 ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create product parameter group ::api-endpoint --- api: mgmtapi endpointUrl: /API/ProductParameter/Group operationId: Create product parameter group --- #sidebar :::api-endpoint-path{method="POST" path="/API/ProductParameter/Group"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/ProductParameter/Group' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Name": "string", "Order": 0, "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ], "ParameterIds": [ 0 ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/ProductParameter/Group', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Name": "string", "Order": 0, "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ], "ParameterIds": [ 0 ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/ProductParameter/Group', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Name": "string", "Order": 0, "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ], "ParameterIds": [ 0 ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/ProductParameter/Group" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Name": "string", "Order": 0, "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ], "ParameterIds": [ 0 ] } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/ProductParameter/Group" payload := []byte(`{ "Name": "string", "Order": 0, "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ], "ParameterIds": [ 0 ] }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Name = "string", Order = 0, LocalizedNames = new[] { new { LanguageCode = "string", Content = "string" } }, ParameterIds = new[] { 0 } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/ProductParameter/Group", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "GroupId": 0, "Name": "string", "Order": 0, "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ], "ParameterIds": [ 0 ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update product parameter group ::api-endpoint --- api: mgmtapi endpointUrl: /API/ProductParameter/Group/{id} operationId: Update product parameter group --- #sidebar :::api-endpoint-path{method="PUT" path="/API/ProductParameter/Group/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/ProductParameter/Group/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Name": "string", "Order": 0, "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ], "ParameterIds": [ 0 ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/ProductParameter/Group/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Name": "string", "Order": 0, "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ], "ParameterIds": [ 0 ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/ProductParameter/Group/{id}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Name": "string", "Order": 0, "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ], "ParameterIds": [ 0 ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/ProductParameter/Group/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Name": "string", "Order": 0, "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ], "ParameterIds": [ 0 ] } response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/ProductParameter/Group/{id}" payload := []byte(`{ "Name": "string", "Order": 0, "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ], "ParameterIds": [ 0 ] }`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Name = "string", Order = 0, LocalizedNames = new[] { new { LanguageCode = "string", Content = "string" } }, ParameterIds = new[] { 0 } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/ProductParameter/Group/{id}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "GroupId": 0, "Name": "string", "Order": 0, "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ], "ParameterIds": [ 0 ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get product parameter predefined value ::api-endpoint --- api: mgmtapi endpointUrl: /API/ProductParameter/PredefinedValue/{id} operationId: Get product parameter predefined value --- #sidebar :::api-endpoint-path --- method: GET path: /API/ProductParameter/PredefinedValue/{id} --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/ProductParameter/PredefinedValue/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/ProductParameter/PredefinedValue/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/ProductParameter/PredefinedValue/{id}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/ProductParameter/PredefinedValue/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/ProductParameter/PredefinedValue/{id}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/ProductParameter/PredefinedValue/{id}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "ParameterId": 0, "PredefinedValueId": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create product parameter predefined value ::api-endpoint --- api: mgmtapi endpointUrl: /API/ProductParameter/PredefinedValue operationId: Create product parameter predefined value --- #sidebar :::api-endpoint-path{method="POST" path="/API/ProductParameter/PredefinedValue"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/ProductParameter/PredefinedValue' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "ParameterId": 0, "PredefinedValueId": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/ProductParameter/PredefinedValue', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "ParameterId": 0, "PredefinedValueId": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/ProductParameter/PredefinedValue', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "ParameterId": 0, "PredefinedValueId": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/ProductParameter/PredefinedValue" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "ParameterId": 0, "PredefinedValueId": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/ProductParameter/PredefinedValue" payload := []byte(`{ "ParameterId": 0, "PredefinedValueId": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { ParameterId = 0, PredefinedValueId = 0, Name = "string", LocalizedNames = new[] { new { LanguageCode = "string", Content = "string" } } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/ProductParameter/PredefinedValue", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "ParameterId": 0, "PredefinedValueId": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update product parameter predefined value names ::api-endpoint --- api: mgmtapi endpointUrl: /API/ProductParameter/PredefinedValue/{predefinedValueId} operationId: Update product parameter predefined value names --- #sidebar :::api-endpoint-path --- method: PUT path: /API/ProductParameter/PredefinedValue/{predefinedValueId} --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/ProductParameter/PredefinedValue/{predefinedValueId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '[ { "LanguageCode": "string", "Content": "string" } ]' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/ProductParameter/PredefinedValue/{predefinedValueId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: [ { "LanguageCode": "string", "Content": "string" } ] }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/ProductParameter/PredefinedValue/{predefinedValueId}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify([ { "LanguageCode": "string", "Content": "string" } ]) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/ProductParameter/PredefinedValue/{predefinedValueId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = [ { "LanguageCode": "string", "Content": "string" } ] response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/ProductParameter/PredefinedValue/{predefinedValueId}" payload := []byte(`[ { "LanguageCode": "string", "Content": "string" } ]`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new[] { new { LanguageCode = "string", Content = "string" } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/ProductParameter/PredefinedValue/{predefinedValueId}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "ParameterId": 0, "PredefinedValueId": 0, "Name": "string", "LocalizedNames": [ { "LanguageCode": "string", "Content": "string" } ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get alias redirects ::api-endpoint --- api: mgmtapi endpointUrl: /API/redirect/alias/{page} operationId: Get alias redirects --- #sidebar :::api-endpoint-path{method="GET" path="/API/redirect/alias/{page}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/redirect/alias/{page}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/redirect/alias/{page}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/redirect/alias/{page}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/redirect/alias/{page}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/redirect/alias/{page}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/redirect/alias/{page}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ { "OldUrl": "string", "NewUrl": "string", "MarketId": 0, "Action": "string" } ], "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get url redirects ::api-endpoint --- api: mgmtapi endpointUrl: /API/redirect/url/{page} operationId: Get url redirects --- #sidebar :::api-endpoint-path{method="GET" path="/API/redirect/url/{page}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/redirect/url/{page}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/redirect/url/{page}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/redirect/url/{page}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/redirect/url/{page}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/redirect/url/{page}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/redirect/url/{page}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ { "OldUrl": "string", "NewUrl": "string", "MarketId": 0, "Action": "string" } ], "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Query refunds ::api-endpoint --- api: mgmtapi endpointUrl: /API/Refund/Query operationId: Query refunds --- #sidebar :::api-endpoint-path{method="POST" path="/API/Refund/Query"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Refund/Query' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "CreatedAfter": "string", "CreatedBefore": "string", "ApprovedAfter": "string", "ApprovedBefore": "string", "UpdatedAfter": "string", "UpdatedBefore": "string", "IncludeStatuses": [ 0 ], "ExcludeStatuses": [ 0 ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Refund/Query', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "CreatedAfter": "string", "CreatedBefore": "string", "ApprovedAfter": "string", "ApprovedBefore": "string", "UpdatedAfter": "string", "UpdatedBefore": "string", "IncludeStatuses": [ 0 ], "ExcludeStatuses": [ 0 ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Refund/Query', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "CreatedAfter": "string", "CreatedBefore": "string", "ApprovedAfter": "string", "ApprovedBefore": "string", "UpdatedAfter": "string", "UpdatedBefore": "string", "IncludeStatuses": [ 0 ], "ExcludeStatuses": [ 0 ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Refund/Query" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "CreatedAfter": "string", "CreatedBefore": "string", "ApprovedAfter": "string", "ApprovedBefore": "string", "UpdatedAfter": "string", "UpdatedBefore": "string", "IncludeStatuses": [ 0 ], "ExcludeStatuses": [ 0 ] } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Refund/Query" payload := []byte(`{ "CreatedAfter": "string", "CreatedBefore": "string", "ApprovedAfter": "string", "ApprovedBefore": "string", "UpdatedAfter": "string", "UpdatedBefore": "string", "IncludeStatuses": [ 0 ], "ExcludeStatuses": [ 0 ] }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { CreatedAfter = "string", CreatedBefore = "string", ApprovedAfter = "string", ApprovedBefore = "string", UpdatedAfter = "string", UpdatedBefore = "string", IncludeStatuses = new[] { 0 }, ExcludeStatuses = new[] { 0 } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Refund/Query", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ { "RefundId": "00000000-0000-0000-0000-000000000000", "RefundInstanceId": 0, "OrderId": 0, "Reference": "string", "Description": "string", "Author": "string", "ExternalOrderId": "string", "OrderTransactionId": "string", "SecondaryOrderTransactionId": "string", "ExternalId": "string", "PaymentName": "string", "Locale": "string", "SiteName": "string", "Customer": "string", "OrderSum": 0, "OrderVat": 0, "OrderValue": 0, "OrderDiscount": 0, "ShippingFee": 0, "PaymentFee": 0, "Currency": "string", "CreatedOn": "string", "SentOn": "string", "ProcessedOn": "string", "Sent": true, "Processed": true, "RequiresApproval": true, "Approved": true, "ApprovalDecidedBy": "string", "ApprovalDecidedOn": "string", "VatRate": 0, "SkipRefundEvents": true, "RefundedItemTotal": 0, "RefundedShippingFee": 0, "OrderStatus": "string", "RefundedPaymentFee": 0, "RefundedDiscount": 0, "Shipped": true, "RefundedBalance": 0, "RefundedTotal": 0, "RefundRows": [ { "OrderId": 0, "RefundRowId": 0, "OrderRowId": 0, "CaptureId": "00000000-0000-0000-0000-000000000000", "RefundAmount": 0, "RefundAmountExVat": 0, "ToBalance": true, "Settled": true, "SettledOn": "string", "CreatedOn": "string", "Investigation": true, "RefundType": 0 } ], "Rows": [ { "OrderRowId": 0, "ItemId": 0, "ProductId": 0, "Price": 0, "PriceExVat": 0, "Name": "string", "ProductName": "string", "Variant": "string", "Brand": "string", "PrimaryImage": "string", "ArticleNumber": "string", "Shelf": "string", "CampaignNames": "string", "Discount": 0, "SuggestedRefundAmount": 0, "AverageDiscount": 0, "PriceBeforeDiscount": 0 } ] } ], "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # List return codes ::api-endpoint --- api: mgmtapi endpointUrl: /API/ReturnCode/List operationId: List return codes --- #sidebar :::api-endpoint-path{method="GET" path="/API/ReturnCode/List"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/ReturnCode/List' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/ReturnCode/List', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/ReturnCode/List', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/ReturnCode/List" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/ReturnCode/List" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/ReturnCode/List", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ { "Code": 0, "Name": "string", "AddToStock": true, "DefaultReturnAction": 0 } ], "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create parcel group ::api-endpoint --- api: mgmtapi endpointUrl: /API/Shipping/ParcelGroup operationId: Create parcel group --- #sidebar :::api-endpoint-path{method="POST" path="/API/Shipping/ParcelGroup"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Shipping/ParcelGroup' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "OrderIds": [ 0 ], "OrderRowIds": [ 0 ], "MarkAsDelivered": true, "SendDeliveryEmail": true, "SignalCapturesCreated": true, "Force": true }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Shipping/ParcelGroup', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "OrderIds": [ 0 ], "OrderRowIds": [ 0 ], "MarkAsDelivered": true, "SendDeliveryEmail": true, "SignalCapturesCreated": true, "Force": true } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Shipping/ParcelGroup', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "OrderIds": [ 0 ], "OrderRowIds": [ 0 ], "MarkAsDelivered": true, "SendDeliveryEmail": true, "SignalCapturesCreated": true, "Force": true }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Shipping/ParcelGroup" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "OrderIds": [ 0 ], "OrderRowIds": [ 0 ], "MarkAsDelivered": true, "SendDeliveryEmail": true, "SignalCapturesCreated": true, "Force": true } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Shipping/ParcelGroup" payload := []byte(`{ "OrderIds": [ 0 ], "OrderRowIds": [ 0 ], "MarkAsDelivered": true, "SendDeliveryEmail": true, "SignalCapturesCreated": true, "Force": true }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { OrderIds = new[] { 0 }, OrderRowIds = new[] { 0 }, MarkAsDelivered = true, SendDeliveryEmail = true, SignalCapturesCreated = true, Force = true }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Shipping/ParcelGroup", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": 0, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Capture parcel group ::api-endpoint --- api: mgmtapi endpointUrl: /API/Shipping/ParcelGroup/{parcelGroupId}/Capture operationId: Capture parcel group --- #sidebar :::api-endpoint-path --- method: PUT path: /API/Shipping/ParcelGroup/{parcelGroupId}/Capture --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Shipping/ParcelGroup/{parcelGroupId}/Capture' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Shipping/ParcelGroup/{parcelGroupId}/Capture', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Shipping/ParcelGroup/{parcelGroupId}/Capture', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Shipping/ParcelGroup/{parcelGroupId}/Capture" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.PUT(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Shipping/ParcelGroup/{parcelGroupId}/Capture" payload := []byte{} req, _ := http.NewRequest("PUT", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Shipping/ParcelGroup/{parcelGroupId}/Capture", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Deliver parcel group ::api-endpoint --- api: mgmtapi endpointUrl: /API/Shipping/ParcelGroup/{parcelGroupId}/Deliver operationId: Deliver parcel group --- #sidebar :::api-endpoint-path --- method: PUT path: /API/Shipping/ParcelGroup/{parcelGroupId}/Deliver --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Shipping/ParcelGroup/{parcelGroupId}/Deliver' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Shipping/ParcelGroup/{parcelGroupId}/Deliver', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Shipping/ParcelGroup/{parcelGroupId}/Deliver', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Shipping/ParcelGroup/{parcelGroupId}/Deliver" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.PUT(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Shipping/ParcelGroup/{parcelGroupId}/Deliver" payload := []byte{} req, _ := http.NewRequest("PUT", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Shipping/ParcelGroup/{parcelGroupId}/Deliver", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Query parcel groups ::api-endpoint --- api: mgmtapi endpointUrl: /API/Shipping/ParcelGroup/Query operationId: Query parcel groups --- #sidebar :::api-endpoint-path{method="POST" path="/API/Shipping/ParcelGroup/Query"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Shipping/ParcelGroup/Query' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "ParcelGroupIds": [ 0 ], "OrderIds": [ 0 ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Shipping/ParcelGroup/Query', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "ParcelGroupIds": [ 0 ], "OrderIds": [ 0 ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Shipping/ParcelGroup/Query', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "ParcelGroupIds": [ 0 ], "OrderIds": [ 0 ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Shipping/ParcelGroup/Query" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "ParcelGroupIds": [ 0 ], "OrderIds": [ 0 ] } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Shipping/ParcelGroup/Query" payload := []byte(`{ "ParcelGroupIds": [ 0 ], "OrderIds": [ 0 ] }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { ParcelGroupIds = new[] { 0 }, OrderIds = new[] { 0 } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Shipping/ParcelGroup/Query", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ { "ParcelGroupId": 0, "CreatedDate": "string", "DeliveredDate": "string", "Parcels": [ { "ParcelGroupId": 0, "ParcelId": 0, "OrderId": 0, "OrderRowIds": [ 0 ], "CreatedDate": "string" } ] } ], "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Query shipping options ::api-endpoint --- api: mgmtapi endpointUrl: /API/Shipping/Query operationId: Query shipping options --- #sidebar :::api-endpoint-path{method="POST" path="/API/Shipping/Query"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Shipping/Query' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "SiteId": 0, "CountryId": 0, "ShippingId": 0, "DeliveryOptionId": "00000000-0000-0000-0000-000000000000", "Order": { "OrderId": "string", "ExternalOrderId": "string", "CartId": "string", "SessionId": "string", "SiteId": 0, "Currency": "string", "Status": "string", "IpAddress": "string", "Message": "string", "InternalMessage": "string", "Locale": "string", "Rows": [ { "Sku": "string", "ProductId": 0, "ExternalId": "string", "DiscountRate": 0, "CartRowId": 0, "ProductContainerBuildId": 0, "Message": "string", "ArticleNumber": "string", "Gtin": "string", "Brand": "string", "Categories": [ "string" ], "Name": "string", "Variant": "string", "Quantity": 0, "PriceIncVat": 0, "PriceExVat": 0, "ExpectedTotalPriceIncVat": 0, "DiscountIncVat": 0, "DiscountExVat": 0, "ExpectedTotalDiscountIncVat": 0, "ProductUrl": "string", "ImageUrl": "string", "Weight": 0, "Height": 0, "Width": 0, "Length": 0, "CampaignIds": [ "string" ], "CampaignGroupData": "string", "CampaignNames": [ "string" ], "ProductPriceCampaignId": 0, "ProductPriceListId": 0, "ProductPackageId": 0, "ProductPackageName": "string", "ProductPackageGroupId": "00000000-0000-0000-0000-000000000000" } ], "CheckoutUrls": { "Redirect": "string", "Checkout": "string", "Terms": "string" }, "CampaignId": 0, "CampaignCode": "string", "CampaignName": "string", "CampaignIds": [ "string" ], "CampaignNames": [ "string" ], "CustomerId": 0, "CustomerTypeId": 0, "Gender": 0, "DateOfBirth": "string", "PersonalId": "string", "UserAgent": "string", "MetaData": {}, "MemberId": 0, "PaymentId": 0, "TransactionId": "string", "SecondaryTransactionId": "string", "Country": "string", "Company": "string", "OrganizationNumber": "string", "FirstName": "string", "LastName": "string", "Email": "string", "Address1": "string", "Address2": "string", "Zip": "string", "City": "string", "Region": "string", "Phone": "string", "MobilePhone": "string", "CareOf": "string", "ShippingId": 0, "ShippingCountry": "string", "ShippingCompany": "string", "ShippingOrganizationNumber": "string", "ShippingFirstName": "string", "ShippingLastName": "string", "ShippingEmail": "string", "ShippingAddress1": "string", "ShippingAddress2": "string", "ShippingZip": "string", "ShippingCity": "string", "ShippingRegion": "string", "ShippingPhone": "string", "ShippingMobilePhone": "string", "ShippingCareOf": "string", "PickupPoint": "string", "DesiredDeliveryDate": "string", "FreightClass": { "Id": 0, "Type": 0, "Name": "string", "TypeAsEnum": 0 }, "FreeShippingLimit": 0, "FreeShippingFromLimit": true, "FreeShippingFromCampaign": true, "Sum": 0, "ExpectedSum": 0, "OrderValueIncVat": 0, "OrderValueExVat": 0, "ItemValueIncVat": 0, "ItemValueExVat": 0, "DiscountIncVat": 0, "DiscountExVat": 0, "PercentDiscount": 0, "Balance": 0, "ShippingFeeIncVat": 0, "ShippingFeeExVat": 0, "PaymentFeeIncVat": 0, "PaymentFeeExVat": 0 }, "MinimumFreeShippingLimit": 0 }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Shipping/Query', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "SiteId": 0, "CountryId": 0, "ShippingId": 0, "DeliveryOptionId": "00000000-0000-0000-0000-000000000000", "Order": { "OrderId": "string", "ExternalOrderId": "string", "CartId": "string", "SessionId": "string", "SiteId": 0, "Currency": "string", "Status": "string", "IpAddress": "string", "Message": "string", "InternalMessage": "string", "Locale": "string", "Rows": [ { "Sku": "string", "ProductId": 0, "ExternalId": "string", "DiscountRate": 0, "CartRowId": 0, "ProductContainerBuildId": 0, "Message": "string", "ArticleNumber": "string", "Gtin": "string", "Brand": "string", "Categories": [ "string" ], "Name": "string", "Variant": "string", "Quantity": 0, "PriceIncVat": 0, "PriceExVat": 0, "ExpectedTotalPriceIncVat": 0, "DiscountIncVat": 0, "DiscountExVat": 0, "ExpectedTotalDiscountIncVat": 0, "ProductUrl": "string", "ImageUrl": "string", "Weight": 0, "Height": 0, "Width": 0, "Length": 0, "CampaignIds": [ "string" ], "CampaignGroupData": "string", "CampaignNames": [ "string" ], "ProductPriceCampaignId": 0, "ProductPriceListId": 0, "ProductPackageId": 0, "ProductPackageName": "string", "ProductPackageGroupId": "00000000-0000-0000-0000-000000000000" } ], "CheckoutUrls": { "Redirect": "string", "Checkout": "string", "Terms": "string" }, "CampaignId": 0, "CampaignCode": "string", "CampaignName": "string", "CampaignIds": [ "string" ], "CampaignNames": [ "string" ], "CustomerId": 0, "CustomerTypeId": 0, "Gender": 0, "DateOfBirth": "string", "PersonalId": "string", "UserAgent": "string", "MetaData": {}, "MemberId": 0, "PaymentId": 0, "TransactionId": "string", "SecondaryTransactionId": "string", "Country": "string", "Company": "string", "OrganizationNumber": "string", "FirstName": "string", "LastName": "string", "Email": "string", "Address1": "string", "Address2": "string", "Zip": "string", "City": "string", "Region": "string", "Phone": "string", "MobilePhone": "string", "CareOf": "string", "ShippingId": 0, "ShippingCountry": "string", "ShippingCompany": "string", "ShippingOrganizationNumber": "string", "ShippingFirstName": "string", "ShippingLastName": "string", "ShippingEmail": "string", "ShippingAddress1": "string", "ShippingAddress2": "string", "ShippingZip": "string", "ShippingCity": "string", "ShippingRegion": "string", "ShippingPhone": "string", "ShippingMobilePhone": "string", "ShippingCareOf": "string", "PickupPoint": "string", "DesiredDeliveryDate": "string", "FreightClass": { "Id": 0, "Type": 0, "Name": "string", "TypeAsEnum": 0 }, "FreeShippingLimit": 0, "FreeShippingFromLimit": true, "FreeShippingFromCampaign": true, "Sum": 0, "ExpectedSum": 0, "OrderValueIncVat": 0, "OrderValueExVat": 0, "ItemValueIncVat": 0, "ItemValueExVat": 0, "DiscountIncVat": 0, "DiscountExVat": 0, "PercentDiscount": 0, "Balance": 0, "ShippingFeeIncVat": 0, "ShippingFeeExVat": 0, "PaymentFeeIncVat": 0, "PaymentFeeExVat": 0 }, "MinimumFreeShippingLimit": 0 } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Shipping/Query', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "SiteId": 0, "CountryId": 0, "ShippingId": 0, "DeliveryOptionId": "00000000-0000-0000-0000-000000000000", "Order": { "OrderId": "string", "ExternalOrderId": "string", "CartId": "string", "SessionId": "string", "SiteId": 0, "Currency": "string", "Status": "string", "IpAddress": "string", "Message": "string", "InternalMessage": "string", "Locale": "string", "Rows": [ { "Sku": "string", "ProductId": 0, "ExternalId": "string", "DiscountRate": 0, "CartRowId": 0, "ProductContainerBuildId": 0, "Message": "string", "ArticleNumber": "string", "Gtin": "string", "Brand": "string", "Categories": [ "string" ], "Name": "string", "Variant": "string", "Quantity": 0, "PriceIncVat": 0, "PriceExVat": 0, "ExpectedTotalPriceIncVat": 0, "DiscountIncVat": 0, "DiscountExVat": 0, "ExpectedTotalDiscountIncVat": 0, "ProductUrl": "string", "ImageUrl": "string", "Weight": 0, "Height": 0, "Width": 0, "Length": 0, "CampaignIds": [ "string" ], "CampaignGroupData": "string", "CampaignNames": [ "string" ], "ProductPriceCampaignId": 0, "ProductPriceListId": 0, "ProductPackageId": 0, "ProductPackageName": "string", "ProductPackageGroupId": "00000000-0000-0000-0000-000000000000" } ], "CheckoutUrls": { "Redirect": "string", "Checkout": "string", "Terms": "string" }, "CampaignId": 0, "CampaignCode": "string", "CampaignName": "string", "CampaignIds": [ "string" ], "CampaignNames": [ "string" ], "CustomerId": 0, "CustomerTypeId": 0, "Gender": 0, "DateOfBirth": "string", "PersonalId": "string", "UserAgent": "string", "MetaData": {}, "MemberId": 0, "PaymentId": 0, "TransactionId": "string", "SecondaryTransactionId": "string", "Country": "string", "Company": "string", "OrganizationNumber": "string", "FirstName": "string", "LastName": "string", "Email": "string", "Address1": "string", "Address2": "string", "Zip": "string", "City": "string", "Region": "string", "Phone": "string", "MobilePhone": "string", "CareOf": "string", "ShippingId": 0, "ShippingCountry": "string", "ShippingCompany": "string", "ShippingOrganizationNumber": "string", "ShippingFirstName": "string", "ShippingLastName": "string", "ShippingEmail": "string", "ShippingAddress1": "string", "ShippingAddress2": "string", "ShippingZip": "string", "ShippingCity": "string", "ShippingRegion": "string", "ShippingPhone": "string", "ShippingMobilePhone": "string", "ShippingCareOf": "string", "PickupPoint": "string", "DesiredDeliveryDate": "string", "FreightClass": { "Id": 0, "Type": 0, "Name": "string", "TypeAsEnum": 0 }, "FreeShippingLimit": 0, "FreeShippingFromLimit": true, "FreeShippingFromCampaign": true, "Sum": 0, "ExpectedSum": 0, "OrderValueIncVat": 0, "OrderValueExVat": 0, "ItemValueIncVat": 0, "ItemValueExVat": 0, "DiscountIncVat": 0, "DiscountExVat": 0, "PercentDiscount": 0, "Balance": 0, "ShippingFeeIncVat": 0, "ShippingFeeExVat": 0, "PaymentFeeIncVat": 0, "PaymentFeeExVat": 0 }, "MinimumFreeShippingLimit": 0 }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Shipping/Query" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "SiteId": 0, "CountryId": 0, "ShippingId": 0, "DeliveryOptionId": "00000000-0000-0000-0000-000000000000", "Order": { "OrderId": "string", "ExternalOrderId": "string", "CartId": "string", "SessionId": "string", "SiteId": 0, "Currency": "string", "Status": "string", "IpAddress": "string", "Message": "string", "InternalMessage": "string", "Locale": "string", "Rows": [ { "Sku": "string", "ProductId": 0, "ExternalId": "string", "DiscountRate": 0, "CartRowId": 0, "ProductContainerBuildId": 0, "Message": "string", "ArticleNumber": "string", "Gtin": "string", "Brand": "string", "Categories": [ "string" ], "Name": "string", "Variant": "string", "Quantity": 0, "PriceIncVat": 0, "PriceExVat": 0, "ExpectedTotalPriceIncVat": 0, "DiscountIncVat": 0, "DiscountExVat": 0, "ExpectedTotalDiscountIncVat": 0, "ProductUrl": "string", "ImageUrl": "string", "Weight": 0, "Height": 0, "Width": 0, "Length": 0, "CampaignIds": [ "string" ], "CampaignGroupData": "string", "CampaignNames": [ "string" ], "ProductPriceCampaignId": 0, "ProductPriceListId": 0, "ProductPackageId": 0, "ProductPackageName": "string", "ProductPackageGroupId": "00000000-0000-0000-0000-000000000000" } ], "CheckoutUrls": { "Redirect": "string", "Checkout": "string", "Terms": "string" }, "CampaignId": 0, "CampaignCode": "string", "CampaignName": "string", "CampaignIds": [ "string" ], "CampaignNames": [ "string" ], "CustomerId": 0, "CustomerTypeId": 0, "Gender": 0, "DateOfBirth": "string", "PersonalId": "string", "UserAgent": "string", "MetaData": {}, "MemberId": 0, "PaymentId": 0, "TransactionId": "string", "SecondaryTransactionId": "string", "Country": "string", "Company": "string", "OrganizationNumber": "string", "FirstName": "string", "LastName": "string", "Email": "string", "Address1": "string", "Address2": "string", "Zip": "string", "City": "string", "Region": "string", "Phone": "string", "MobilePhone": "string", "CareOf": "string", "ShippingId": 0, "ShippingCountry": "string", "ShippingCompany": "string", "ShippingOrganizationNumber": "string", "ShippingFirstName": "string", "ShippingLastName": "string", "ShippingEmail": "string", "ShippingAddress1": "string", "ShippingAddress2": "string", "ShippingZip": "string", "ShippingCity": "string", "ShippingRegion": "string", "ShippingPhone": "string", "ShippingMobilePhone": "string", "ShippingCareOf": "string", "PickupPoint": "string", "DesiredDeliveryDate": "string", "FreightClass": { "Id": 0, "Type": 0, "Name": "string", "TypeAsEnum": 0 }, "FreeShippingLimit": 0, "FreeShippingFromLimit": true, "FreeShippingFromCampaign": true, "Sum": 0, "ExpectedSum": 0, "OrderValueIncVat": 0, "OrderValueExVat": 0, "ItemValueIncVat": 0, "ItemValueExVat": 0, "DiscountIncVat": 0, "DiscountExVat": 0, "PercentDiscount": 0, "Balance": 0, "ShippingFeeIncVat": 0, "ShippingFeeExVat": 0, "PaymentFeeIncVat": 0, "PaymentFeeExVat": 0 }, "MinimumFreeShippingLimit": 0 } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Shipping/Query" payload := []byte(`{ "SiteId": 0, "CountryId": 0, "ShippingId": 0, "DeliveryOptionId": "00000000-0000-0000-0000-000000000000", "Order": { "OrderId": "string", "ExternalOrderId": "string", "CartId": "string", "SessionId": "string", "SiteId": 0, "Currency": "string", "Status": "string", "IpAddress": "string", "Message": "string", "InternalMessage": "string", "Locale": "string", "Rows": [ { "Sku": "string", "ProductId": 0, "ExternalId": "string", "DiscountRate": 0, "CartRowId": 0, "ProductContainerBuildId": 0, "Message": "string", "ArticleNumber": "string", "Gtin": "string", "Brand": "string", "Categories": [ "string" ], "Name": "string", "Variant": "string", "Quantity": 0, "PriceIncVat": 0, "PriceExVat": 0, "ExpectedTotalPriceIncVat": 0, "DiscountIncVat": 0, "DiscountExVat": 0, "ExpectedTotalDiscountIncVat": 0, "ProductUrl": "string", "ImageUrl": "string", "Weight": 0, "Height": 0, "Width": 0, "Length": 0, "CampaignIds": [ "string" ], "CampaignGroupData": "string", "CampaignNames": [ "string" ], "ProductPriceCampaignId": 0, "ProductPriceListId": 0, "ProductPackageId": 0, "ProductPackageName": "string", "ProductPackageGroupId": "00000000-0000-0000-0000-000000000000" } ], "CheckoutUrls": { "Redirect": "string", "Checkout": "string", "Terms": "string" }, "CampaignId": 0, "CampaignCode": "string", "CampaignName": "string", "CampaignIds": [ "string" ], "CampaignNames": [ "string" ], "CustomerId": 0, "CustomerTypeId": 0, "Gender": 0, "DateOfBirth": "string", "PersonalId": "string", "UserAgent": "string", "MetaData": {}, "MemberId": 0, "PaymentId": 0, "TransactionId": "string", "SecondaryTransactionId": "string", "Country": "string", "Company": "string", "OrganizationNumber": "string", "FirstName": "string", "LastName": "string", "Email": "string", "Address1": "string", "Address2": "string", "Zip": "string", "City": "string", "Region": "string", "Phone": "string", "MobilePhone": "string", "CareOf": "string", "ShippingId": 0, "ShippingCountry": "string", "ShippingCompany": "string", "ShippingOrganizationNumber": "string", "ShippingFirstName": "string", "ShippingLastName": "string", "ShippingEmail": "string", "ShippingAddress1": "string", "ShippingAddress2": "string", "ShippingZip": "string", "ShippingCity": "string", "ShippingRegion": "string", "ShippingPhone": "string", "ShippingMobilePhone": "string", "ShippingCareOf": "string", "PickupPoint": "string", "DesiredDeliveryDate": "string", "FreightClass": { "Id": 0, "Type": 0, "Name": "string", "TypeAsEnum": 0 }, "FreeShippingLimit": 0, "FreeShippingFromLimit": true, "FreeShippingFromCampaign": true, "Sum": 0, "ExpectedSum": 0, "OrderValueIncVat": 0, "OrderValueExVat": 0, "ItemValueIncVat": 0, "ItemValueExVat": 0, "DiscountIncVat": 0, "DiscountExVat": 0, "PercentDiscount": 0, "Balance": 0, "ShippingFeeIncVat": 0, "ShippingFeeExVat": 0, "PaymentFeeIncVat": 0, "PaymentFeeExVat": 0 }, "MinimumFreeShippingLimit": 0 }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { SiteId = 0, CountryId = 0, ShippingId = 0, DeliveryOptionId = "00000000-0000-0000-0000-000000000000", Order = new { OrderId = "string", ExternalOrderId = "string", CartId = "string", SessionId = "string", SiteId = 0, Currency = "string", Status = "string", IpAddress = "string", Message = "string", InternalMessage = "string", Locale = "string", Rows = new[] { new { Sku = "string", ProductId = 0, ExternalId = "string", DiscountRate = 0, CartRowId = 0, ProductContainerBuildId = 0, Message = "string", ArticleNumber = "string", Gtin = "string", Brand = "string", Categories = new[] { "string" }, Name = "string", Variant = "string", Quantity = 0, PriceIncVat = 0, PriceExVat = 0, ExpectedTotalPriceIncVat = 0, DiscountIncVat = 0, DiscountExVat = 0, ExpectedTotalDiscountIncVat = 0, ProductUrl = "string", ImageUrl = "string", Weight = 0, Height = 0, Width = 0, Length = 0, CampaignIds = new[] { "string" }, CampaignGroupData = "string", CampaignNames = new[] { "string" }, ProductPriceCampaignId = 0, ProductPriceListId = 0, ProductPackageId = 0, ProductPackageName = "string", ProductPackageGroupId = "00000000-0000-0000-0000-000000000000" } }, CheckoutUrls = new { Redirect = "string", Checkout = "string", Terms = "string" }, CampaignId = 0, CampaignCode = "string", CampaignName = "string", CampaignIds = new[] { "string" }, CampaignNames = new[] { "string" }, CustomerId = 0, CustomerTypeId = 0, Gender = 0, DateOfBirth = "string", PersonalId = "string", UserAgent = "string", MetaData = new { }, MemberId = 0, PaymentId = 0, TransactionId = "string", SecondaryTransactionId = "string", Country = "string", Company = "string", OrganizationNumber = "string", FirstName = "string", LastName = "string", Email = "string", Address1 = "string", Address2 = "string", Zip = "string", City = "string", Region = "string", Phone = "string", MobilePhone = "string", CareOf = "string", ShippingId = 0, ShippingCountry = "string", ShippingCompany = "string", ShippingOrganizationNumber = "string", ShippingFirstName = "string", ShippingLastName = "string", ShippingEmail = "string", ShippingAddress1 = "string", ShippingAddress2 = "string", ShippingZip = "string", ShippingCity = "string", ShippingRegion = "string", ShippingPhone = "string", ShippingMobilePhone = "string", ShippingCareOf = "string", PickupPoint = "string", DesiredDeliveryDate = "string", FreightClass = new { Id = 0, Type = 0, Name = "string", TypeAsEnum = 0 }, FreeShippingLimit = 0, FreeShippingFromLimit = true, FreeShippingFromCampaign = true, Sum = 0, ExpectedSum = 0, OrderValueIncVat = 0, OrderValueExVat = 0, ItemValueIncVat = 0, ItemValueExVat = 0, DiscountIncVat = 0, DiscountExVat = 0, PercentDiscount = 0, Balance = 0, ShippingFeeIncVat = 0, ShippingFeeExVat = 0, PaymentFeeIncVat = 0, PaymentFeeExVat = 0 }, MinimumFreeShippingLimit = 0 }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Shipping/Query", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] [ { "Id": 0, "ExternalId": "string", "Name": "string", "Fee": 0, "Logo": "string", "ShippingData": "string", "Options": [ { "Id": 0, "ExternalId": "string", "Name": "string", "Fee": 0, "Logo": "string", "ShippingData": "string" } ] } ] ``` :::: ::: :: # Get sitemap ::api-endpoint --- api: mgmtapi endpointUrl: /API/Sitemap/{market} operationId: Get sitemap --- #sidebar :::api-endpoint-path{method="GET" path="/API/Sitemap/{market}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Sitemap/{market}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Sitemap/{market}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Sitemap/{market}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Sitemap/{market}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Sitemap/{market}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Sitemap/{market}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Urlset": [ { "Url": "string", "Type": "string", "Hreflang": "string" } ] } ``` ```ts [404] {} ``` :::: ::: :: # Get supplier ::api-endpoint --- api: mgmtapi endpointUrl: /API/Supplier/{id} operationId: Get supplier --- #sidebar :::api-endpoint-path{method="GET" path="/API/Supplier/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Supplier/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Supplier/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Supplier/{id}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Supplier/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Supplier/{id}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Supplier/{id}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "SupplierId": 0, "Name": "string", "Address1": "string", "Address2": "string", "Address3": "string", "ZipCode": "string", "City": "string", "Country": "string", "ContactPerson": "string", "Phone1": "string", "Phone2": "string", "Email": "string", "ExternalId": "string" }, "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create supplier ::api-endpoint --- api: mgmtapi endpointUrl: /API/Supplier operationId: Create supplier --- #sidebar :::api-endpoint-path{method="POST" path="/API/Supplier"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Supplier' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Name": "string", "Address1": "string", "Address2": "string", "Address3": "string", "ZipCode": "string", "City": "string", "Country": "string", "ContactPerson": "string", "Phone1": "string", "Phone2": "string", "Email": "string", "ExternalId": "string" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Supplier', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Name": "string", "Address1": "string", "Address2": "string", "Address3": "string", "ZipCode": "string", "City": "string", "Country": "string", "ContactPerson": "string", "Phone1": "string", "Phone2": "string", "Email": "string", "ExternalId": "string" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Supplier', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Name": "string", "Address1": "string", "Address2": "string", "Address3": "string", "ZipCode": "string", "City": "string", "Country": "string", "ContactPerson": "string", "Phone1": "string", "Phone2": "string", "Email": "string", "ExternalId": "string" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Supplier" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Name": "string", "Address1": "string", "Address2": "string", "Address3": "string", "ZipCode": "string", "City": "string", "Country": "string", "ContactPerson": "string", "Phone1": "string", "Phone2": "string", "Email": "string", "ExternalId": "string" } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Supplier" payload := []byte(`{ "Name": "string", "Address1": "string", "Address2": "string", "Address3": "string", "ZipCode": "string", "City": "string", "Country": "string", "ContactPerson": "string", "Phone1": "string", "Phone2": "string", "Email": "string", "ExternalId": "string" }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Name = "string", Address1 = "string", Address2 = "string", Address3 = "string", ZipCode = "string", City = "string", Country = "string", ContactPerson = "string", Phone1 = "string", Phone2 = "string", Email = "string", ExternalId = "string" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Supplier", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "SupplierId": 0, "Name": "string", "Address1": "string", "Address2": "string", "Address3": "string", "ZipCode": "string", "City": "string", "Country": "string", "ContactPerson": "string", "Phone1": "string", "Phone2": "string", "Email": "string", "ExternalId": "string" }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update supplier ::api-endpoint --- api: mgmtapi endpointUrl: /API/Supplier/{id} operationId: Update supplier --- #sidebar :::api-endpoint-path{method="PUT" path="/API/Supplier/{id}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Supplier/{id}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Name": "string", "Address1": "string", "Address2": "string", "Address3": "string", "ZipCode": "string", "City": "string", "Country": "string", "ContactPerson": "string", "Phone1": "string", "Phone2": "string", "Email": "string", "ExternalId": "string" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Supplier/{id}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Name": "string", "Address1": "string", "Address2": "string", "Address3": "string", "ZipCode": "string", "City": "string", "Country": "string", "ContactPerson": "string", "Phone1": "string", "Phone2": "string", "Email": "string", "ExternalId": "string" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Supplier/{id}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Name": "string", "Address1": "string", "Address2": "string", "Address3": "string", "ZipCode": "string", "City": "string", "Country": "string", "ContactPerson": "string", "Phone1": "string", "Phone2": "string", "Email": "string", "ExternalId": "string" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Supplier/{id}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Name": "string", "Address1": "string", "Address2": "string", "Address3": "string", "ZipCode": "string", "City": "string", "Country": "string", "ContactPerson": "string", "Phone1": "string", "Phone2": "string", "Email": "string", "ExternalId": "string" } response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Supplier/{id}" payload := []byte(`{ "Name": "string", "Address1": "string", "Address2": "string", "Address3": "string", "ZipCode": "string", "City": "string", "Country": "string", "ContactPerson": "string", "Phone1": "string", "Phone2": "string", "Email": "string", "ExternalId": "string" }`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Name = "string", Address1 = "string", Address2 = "string", Address3 = "string", ZipCode = "string", City = "string", Country = "string", ContactPerson = "string", Phone1 = "string", Phone2 = "string", Email = "string", ExternalId = "string" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Supplier/{id}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "SupplierId": 0, "Name": "string", "Address1": "string", "Address2": "string", "Address3": "string", "ZipCode": "string", "City": "string", "Country": "string", "ContactPerson": "string", "Phone1": "string", "Phone2": "string", "Email": "string", "ExternalId": "string" }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Query suppliers ::api-endpoint --- api: mgmtapi endpointUrl: /API/Supplier/Query operationId: Query suppliers --- #sidebar :::api-endpoint-path{method="POST" path="/API/Supplier/Query"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Supplier/Query' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "NameContains": "string", "ExternalIds": [ "string" ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Supplier/Query', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "NameContains": "string", "ExternalIds": [ "string" ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Supplier/Query', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "NameContains": "string", "ExternalIds": [ "string" ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Supplier/Query" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "NameContains": "string", "ExternalIds": [ "string" ] } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Supplier/Query" payload := []byte(`{ "NameContains": "string", "ExternalIds": [ "string" ] }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { NameContains = "string", ExternalIds = new[] { "string" } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Supplier/Query", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] [ { "SupplierId": 0, "Name": "string", "Address1": "string", "Address2": "string", "Address3": "string", "ZipCode": "string", "City": "string", "Country": "string", "ContactPerson": "string", "Phone1": "string", "Phone2": "string", "Email": "string", "ExternalId": "string" } ] ``` :::: ::: :: # Get user profile (email) ::api-endpoint --- api: mgmtapi endpointUrl: /API/User/{email} operationId: Get user profile (email) --- #sidebar :::api-endpoint-path{method="GET" path="/API/User/{email}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/User/{email}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/User/{email}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/User/{email}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/User/{email}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/User/{email}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/User/{email}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "AvailableMarkets": [ { "Id": 0, "ChannelId": "string", "Countries": [ { "CurrencyId": 0, "Currency": "string", "CountryId": 0, "Country": "string" } ] } ], "UserId": 0, "SiteId": 0, "Email": "string", "FirstName": "string", "LastName": "string", "PhoneNr": "string", "MobilePhoneNr": "string", "Company": "string", "Address": "string", "Address2": "string", "Address3": "string", "DoorCode": "string", "PersonalId": "string", "Birthyear": "string", "Zip": "string", "City": "string", "CareOf": "string", "Country": "string", "State": "string", "CustomerGroupId": 0, "CustomerGroupName": "string", "MemberId": 0, "MemberType": "string", "CountryId": 0, "UserTypeId": 0, "GenderType": 0, "MemberDiscount": 0, "Newsletter": true, "Blacklisted": true, "Active": true, "CreatedOn": "string", "UpdatedOn": "string", "MetaData": "string", "BlacklistedOn": "string", "BlacklistReason": "string" }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Query user profiles ::api-endpoint --- api: mgmtapi endpointUrl: /API/User/Query/{page} operationId: Query user profiles --- #sidebar :::api-endpoint-path{method="POST" path="/API/User/Query/{page}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/User/Query/{page}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "CreatedBefore": "string", "CreatedAfter": "string", "UpdatedAfter": "string", "IncludeInactive": true, "BatchId": "00000000-0000-0000-0000-000000000000", "UserId": 0, "Email": "string" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/User/Query/{page}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "CreatedBefore": "string", "CreatedAfter": "string", "UpdatedAfter": "string", "IncludeInactive": true, "BatchId": "00000000-0000-0000-0000-000000000000", "UserId": 0, "Email": "string" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/User/Query/{page}', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "CreatedBefore": "string", "CreatedAfter": "string", "UpdatedAfter": "string", "IncludeInactive": true, "BatchId": "00000000-0000-0000-0000-000000000000", "UserId": 0, "Email": "string" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/User/Query/{page}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "CreatedBefore": "string", "CreatedAfter": "string", "UpdatedAfter": "string", "IncludeInactive": true, "BatchId": "00000000-0000-0000-0000-000000000000", "UserId": 0, "Email": "string" } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/User/Query/{page}" payload := []byte(`{ "CreatedBefore": "string", "CreatedAfter": "string", "UpdatedAfter": "string", "IncludeInactive": true, "BatchId": "00000000-0000-0000-0000-000000000000", "UserId": 0, "Email": "string" }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { CreatedBefore = "string", CreatedAfter = "string", UpdatedAfter = "string", IncludeInactive = true, BatchId = "00000000-0000-0000-0000-000000000000", UserId = 0, Email = "string" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/User/Query/{page}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "PageResult": { "BatchId": "00000000-0000-0000-0000-000000000000", "Page": 0, "RowCount": 0, "PageCount": 0, "PageSize": 0, "HasMoreRows": true }, "Resource": [ { "UserId": 0, "SiteId": 0, "Email": "string", "FirstName": "string", "LastName": "string", "PhoneNr": "string", "MobilePhoneNr": "string", "Company": "string", "Address": "string", "Address2": "string", "Address3": "string", "DoorCode": "string", "PersonalId": "string", "Birthyear": "string", "Zip": "string", "City": "string", "CareOf": "string", "Country": "string", "State": "string", "CustomerGroupId": 0, "CustomerGroupName": "string", "MemberId": 0, "MemberType": "string", "CountryId": 0, "UserTypeId": 0, "GenderType": 0, "MemberDiscount": 0, "Newsletter": true, "Blacklisted": true, "Active": true, "CreatedOn": "string", "UpdatedOn": "string", "MetaData": "string", "BlacklistedOn": "string", "BlacklistReason": "string" } ], "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get user profile (id) ::api-endpoint --- api: mgmtapi endpointUrl: /API/User/{userId} operationId: Get user profile (id) --- #sidebar :::api-endpoint-path{method="GET" path="/API/User/{userId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/User/{userId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/User/{userId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/User/{userId}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/User/{userId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/User/{userId}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/User/{userId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "AvailableMarkets": [ { "Id": 0, "ChannelId": "string", "Countries": [ { "CurrencyId": 0, "Currency": "string", "CountryId": 0, "Country": "string" } ] } ], "UserId": 0, "SiteId": 0, "Email": "string", "FirstName": "string", "LastName": "string", "PhoneNr": "string", "MobilePhoneNr": "string", "Company": "string", "Address": "string", "Address2": "string", "Address3": "string", "DoorCode": "string", "PersonalId": "string", "Birthyear": "string", "Zip": "string", "City": "string", "CareOf": "string", "Country": "string", "State": "string", "CustomerGroupId": 0, "CustomerGroupName": "string", "MemberId": 0, "MemberType": "string", "CountryId": 0, "UserTypeId": 0, "GenderType": 0, "MemberDiscount": 0, "Newsletter": true, "Blacklisted": true, "Active": true, "CreatedOn": "string", "UpdatedOn": "string", "MetaData": "string", "BlacklistedOn": "string", "BlacklistReason": "string" }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create user profile ::api-endpoint --- api: mgmtapi endpointUrl: /API/User operationId: Create user profile --- #sidebar :::api-endpoint-path{method="POST" path="/API/User"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/User' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "SiteId": 0, "Email": "string", "FirstName": "string", "LastName": "string", "PhoneNr": "string", "MobilePhoneNr": "string", "Company": "string", "UserTypeId": 0, "MemberId": 0, "CustomerGroupId": 0, "Address": "string", "Address2": "string", "Address3": "string", "DoorCode": "string", "PersonalId": "string", "Birthyear": "string", "Zip": "string", "City": "string", "CareOf": "string", "Country": "string", "State": "string", "CountryId": 0, "GenderType": 0, "Password": "string", "Newsletter": true, "MetaData": "string" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/User', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "SiteId": 0, "Email": "string", "FirstName": "string", "LastName": "string", "PhoneNr": "string", "MobilePhoneNr": "string", "Company": "string", "UserTypeId": 0, "MemberId": 0, "CustomerGroupId": 0, "Address": "string", "Address2": "string", "Address3": "string", "DoorCode": "string", "PersonalId": "string", "Birthyear": "string", "Zip": "string", "City": "string", "CareOf": "string", "Country": "string", "State": "string", "CountryId": 0, "GenderType": 0, "Password": "string", "Newsletter": true, "MetaData": "string" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/User', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "SiteId": 0, "Email": "string", "FirstName": "string", "LastName": "string", "PhoneNr": "string", "MobilePhoneNr": "string", "Company": "string", "UserTypeId": 0, "MemberId": 0, "CustomerGroupId": 0, "Address": "string", "Address2": "string", "Address3": "string", "DoorCode": "string", "PersonalId": "string", "Birthyear": "string", "Zip": "string", "City": "string", "CareOf": "string", "Country": "string", "State": "string", "CountryId": 0, "GenderType": 0, "Password": "string", "Newsletter": true, "MetaData": "string" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/User" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "SiteId": 0, "Email": "string", "FirstName": "string", "LastName": "string", "PhoneNr": "string", "MobilePhoneNr": "string", "Company": "string", "UserTypeId": 0, "MemberId": 0, "CustomerGroupId": 0, "Address": "string", "Address2": "string", "Address3": "string", "DoorCode": "string", "PersonalId": "string", "Birthyear": "string", "Zip": "string", "City": "string", "CareOf": "string", "Country": "string", "State": "string", "CountryId": 0, "GenderType": 0, "Password": "string", "Newsletter": true, "MetaData": "string" } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/User" payload := []byte(`{ "SiteId": 0, "Email": "string", "FirstName": "string", "LastName": "string", "PhoneNr": "string", "MobilePhoneNr": "string", "Company": "string", "UserTypeId": 0, "MemberId": 0, "CustomerGroupId": 0, "Address": "string", "Address2": "string", "Address3": "string", "DoorCode": "string", "PersonalId": "string", "Birthyear": "string", "Zip": "string", "City": "string", "CareOf": "string", "Country": "string", "State": "string", "CountryId": 0, "GenderType": 0, "Password": "string", "Newsletter": true, "MetaData": "string" }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { SiteId = 0, Email = "string", FirstName = "string", LastName = "string", PhoneNr = "string", MobilePhoneNr = "string", Company = "string", UserTypeId = 0, MemberId = 0, CustomerGroupId = 0, Address = "string", Address2 = "string", Address3 = "string", DoorCode = "string", PersonalId = "string", Birthyear = "string", Zip = "string", City = "string", CareOf = "string", Country = "string", State = "string", CountryId = 0, GenderType = 0, Password = "string", Newsletter = true, MetaData = "string" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/User", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "UserId": 0, "SiteId": 0, "Email": "string", "FirstName": "string", "LastName": "string", "PhoneNr": "string", "MobilePhoneNr": "string", "Company": "string", "Address": "string", "Address2": "string", "Address3": "string", "DoorCode": "string", "PersonalId": "string", "Birthyear": "string", "Zip": "string", "City": "string", "CareOf": "string", "Country": "string", "State": "string", "CustomerGroupId": 0, "CustomerGroupName": "string", "MemberId": 0, "MemberType": "string", "CountryId": 0, "UserTypeId": 0, "GenderType": 0, "MemberDiscount": 0, "Newsletter": true, "Blacklisted": true, "Active": true, "CreatedOn": "string", "UpdatedOn": "string", "MetaData": "string", "BlacklistedOn": "string", "BlacklistReason": "string" }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update user profile ::api-endpoint --- api: mgmtapi endpointUrl: /API/User/{userId} operationId: Update user profile --- #sidebar :::api-endpoint-path{method="PATCH" path="/API/User/{userId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PATCH 'https://mgmtapi.geins.io/API/User/{userId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "SiteId": 0, "Email": "string", "FirstName": "string", "LastName": "string", "PhoneNr": "string", "MobilePhoneNr": "string", "Company": "string", "UserTypeId": 0, "MemberId": 0, "CustomerGroupId": 0, "Address": "string", "Address2": "string", "Address3": "string", "DoorCode": "string", "PersonalId": "string", "Birthyear": "string", "Zip": "string", "City": "string", "CareOf": "string", "Country": "string", "State": "string", "CountryId": 0, "GenderType": 0, "Password": "string", "Newsletter": true, "MetaData": "string" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PATCH', url: 'https://mgmtapi.geins.io/API/User/{userId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "SiteId": 0, "Email": "string", "FirstName": "string", "LastName": "string", "PhoneNr": "string", "MobilePhoneNr": "string", "Company": "string", "UserTypeId": 0, "MemberId": 0, "CustomerGroupId": 0, "Address": "string", "Address2": "string", "Address3": "string", "DoorCode": "string", "PersonalId": "string", "Birthyear": "string", "Zip": "string", "City": "string", "CareOf": "string", "Country": "string", "State": "string", "CountryId": 0, "GenderType": 0, "Password": "string", "Newsletter": true, "MetaData": "string" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/User/{userId}', { method: 'PATCH', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "SiteId": 0, "Email": "string", "FirstName": "string", "LastName": "string", "PhoneNr": "string", "MobilePhoneNr": "string", "Company": "string", "UserTypeId": 0, "MemberId": 0, "CustomerGroupId": 0, "Address": "string", "Address2": "string", "Address3": "string", "DoorCode": "string", "PersonalId": "string", "Birthyear": "string", "Zip": "string", "City": "string", "CareOf": "string", "Country": "string", "State": "string", "CountryId": 0, "GenderType": 0, "Password": "string", "Newsletter": true, "MetaData": "string" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/User/{userId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "SiteId": 0, "Email": "string", "FirstName": "string", "LastName": "string", "PhoneNr": "string", "MobilePhoneNr": "string", "Company": "string", "UserTypeId": 0, "MemberId": 0, "CustomerGroupId": 0, "Address": "string", "Address2": "string", "Address3": "string", "DoorCode": "string", "PersonalId": "string", "Birthyear": "string", "Zip": "string", "City": "string", "CareOf": "string", "Country": "string", "State": "string", "CountryId": 0, "GenderType": 0, "Password": "string", "Newsletter": true, "MetaData": "string" } response = requests.PATCH(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/User/{userId}" payload := []byte(`{ "SiteId": 0, "Email": "string", "FirstName": "string", "LastName": "string", "PhoneNr": "string", "MobilePhoneNr": "string", "Company": "string", "UserTypeId": 0, "MemberId": 0, "CustomerGroupId": 0, "Address": "string", "Address2": "string", "Address3": "string", "DoorCode": "string", "PersonalId": "string", "Birthyear": "string", "Zip": "string", "City": "string", "CareOf": "string", "Country": "string", "State": "string", "CountryId": 0, "GenderType": 0, "Password": "string", "Newsletter": true, "MetaData": "string" }`) req, _ := http.NewRequest("PATCH", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { SiteId = 0, Email = "string", FirstName = "string", LastName = "string", PhoneNr = "string", MobilePhoneNr = "string", Company = "string", UserTypeId = 0, MemberId = 0, CustomerGroupId = 0, Address = "string", Address2 = "string", Address3 = "string", DoorCode = "string", PersonalId = "string", Birthyear = "string", Zip = "string", City = "string", CareOf = "string", Country = "string", State = "string", CountryId = 0, GenderType = 0, Password = "string", Newsletter = true, MetaData = "string" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PATCHAsync("https://mgmtapi.geins.io/API/User/{userId}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Delete user profile (email) ::api-endpoint --- api: mgmtapi endpointUrl: /API/User/{email} operationId: Delete user profile (email) --- #sidebar :::api-endpoint-path{method="DELETE" path="/API/User/{email}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/User/{email}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/User/{email}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/User/{email}', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/User/{email}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/User/{email}" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/User/{email}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Delete user profile (id) ::api-endpoint --- api: mgmtapi endpointUrl: /API/User/{userId} operationId: Delete user profile (id) --- #sidebar :::api-endpoint-path{method="DELETE" path="/API/User/{userId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/User/{userId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/User/{userId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/User/{userId}', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/User/{userId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/User/{userId}" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/User/{userId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get user balance ::api-endpoint --- api: mgmtapi endpointUrl: /API/User/{userId}/Balance/{currency} operationId: Get user balance --- #sidebar :::api-endpoint-path{method="GET" path="/API/User/{userId}/Balance/{currency}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/User/{userId}/Balance/{currency}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/User/{userId}/Balance/{currency}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/User/{userId}/Balance/{currency}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/User/{userId}/Balance/{currency}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/User/{userId}/Balance/{currency}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/User/{userId}/Balance/{currency}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "CurrentBalance": 0, "Currency": "string" }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Add user balance ::api-endpoint --- api: mgmtapi endpointUrl: /API/User/{userId}/Balance operationId: Add user balance --- #sidebar :::api-endpoint-path{method="POST" path="/API/User/{userId}/Balance"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/User/{userId}/Balance' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "BalanceType": "string", "Currency": "string", "ExternalId": 0, "Text": "string", "Amount": 0 }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/User/{userId}/Balance', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "BalanceType": "string", "Currency": "string", "ExternalId": 0, "Text": "string", "Amount": 0 } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/User/{userId}/Balance', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "BalanceType": "string", "Currency": "string", "ExternalId": 0, "Text": "string", "Amount": 0 }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/User/{userId}/Balance" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "BalanceType": "string", "Currency": "string", "ExternalId": 0, "Text": "string", "Amount": 0 } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/User/{userId}/Balance" payload := []byte(`{ "BalanceType": "string", "Currency": "string", "ExternalId": 0, "Text": "string", "Amount": 0 }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { BalanceType = "string", Currency = "string", ExternalId = 0, Text = "string", Amount = 0 }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/User/{userId}/Balance", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get user balance transactions ::api-endpoint --- api: mgmtapi endpointUrl: /API/User/{userId}/BalanceTransaction/List/{currency} operationId: Get user balance transactions --- #sidebar :::api-endpoint-path --- method: GET path: /API/User/{userId}/BalanceTransaction/List/{currency} --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/User/{userId}/BalanceTransaction/List/{currency}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/User/{userId}/BalanceTransaction/List/{currency}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/User/{userId}/BalanceTransaction/List/{currency}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/User/{userId}/BalanceTransaction/List/{currency}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/User/{userId}/BalanceTransaction/List/{currency}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/User/{userId}/BalanceTransaction/List/{currency}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ { "BalanceType": "string", "Currency": "string", "ExternalId": 0, "Text": "string", "Amount": 0, "CreatedOn": "string" } ], "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update variant ::api-endpoint --- api: mgmtapi endpointUrl: /API/Variant/{productId} operationId: Update variant --- #sidebar :::api-endpoint-path{method="PUT" path="/API/Variant/{productId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Variant/{productId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '[ { "Label": "string", "Value": "string" } ]' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Variant/{productId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: [ { "Label": "string", "Value": "string" } ] }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Variant/{productId}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify([ { "Label": "string", "Value": "string" } ]) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Variant/{productId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = [ { "Label": "string", "Value": "string" } ] response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Variant/{productId}" payload := []byte(`[ { "Label": "string", "Value": "string" } ]`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new[] { new { Label = "string", Value = "string" } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Variant/{productId}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ { "ProductId": 0, "GroupId": 0, "Label": "string", "Value": "string" } ], "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get variant labels ::api-endpoint --- api: mgmtapi endpointUrl: /API/Variant/Labels operationId: Get variant labels --- #sidebar :::api-endpoint-path{method="GET" path="/API/Variant/Labels"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Variant/Labels' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Variant/Labels', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Variant/Labels', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Variant/Labels" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Variant/Labels" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Variant/Labels", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ "string" ], "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Add product to variant group (product) ::api-endpoint --- api: mgmtapi endpointUrl: /API/Variant/{productId1}/{productId2} operationId: Add product to variant group (product) --- #sidebar :::api-endpoint-path{method="PUT" path="/API/Variant/{productId1}/{productId2}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Variant/{productId1}/{productId2}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Variant/{productId1}/{productId2}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Variant/{productId1}/{productId2}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Variant/{productId1}/{productId2}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.PUT(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Variant/{productId1}/{productId2}" payload := []byte{} req, _ := http.NewRequest("PUT", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Variant/{productId1}/{productId2}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "GroupId": 0, "Name": "string", "CollapseInLists": true, "MainProductId": 0, "ProductIds": [ 0 ], "Products": [ { "ProductId": 0, "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "DateCreated": "string", "DateUpdated": "string", "DateFirstAvailable": "string", "MaxDiscountPercentage": 0, "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "Items": [ { "ItemId": 0, "ArticleNumber": "string", "ProductId": 0, "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "DateCreated": "string", "DateUpdated": "string", "DateIncoming": "string", "Active": true, "ExternalId": "string", "Stock": { "ItemId": 0, "Stock": 0, "StockOversellable": 0, "StockStatic": 0, "StockSellable": 0 }, "ShippingFees": [ { "Market": 0, "Country": "string", "Service": "string", "ServiceId": 0, "Fee": 0 } ] } ], "Prices": [ { "ProductId": 0, "PriceListId": 0, "PriceListName": "string", "PriceIncVat": 0, "PriceExVat": 0, "VatRate": 0, "Country": "string", "Currency": "string", "StaggeredCount": 0, "ValidFrom": "string", "ValidTo": "string" } ], "Categories": [ { "CategoryId": 0, "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "GoogleCategoryPath": "string", "Hidden": true, "Active": true } ], "Images": [ { "ProductId": 0, "Url": "string", "Order": 0, "Tags": [ "string" ] } ], "BrandId": 0, "BrandName": "string", "SupplierId": 0, "SupplierName": "string", "ParameterValues": [ { "ParameterValueId": 0, "ProductId": 0, "ParameterId": 0, "ParameterName": "string", "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Value": "string", "Description": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "InternalIdentifier": "string", "Order": "string" } ], "Variants": [ { "ProductId": 0, "GroupId": 0, "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "Vat": 0, "PrimaryImage": "string", "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "VatId": 0, "ExternalId": "string", "ActivationDate": "string", "Feeds": [ { "FeedId": 0, "AllowSale": true } ], "Urls": [ { "Url": "string", "Market": 0, "Countries": [ "string" ], "Language": "string" } ], "MainCategoryId": 0, "RelatedProducts": [ { "ProductId": 0, "RelatedProductId": 0, "RelationTypeId": 0 } ], "DiscountCampaigns": [ { "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignName": "string", "Title": "string", "HideTitle": true, "RuleType": "string", "Category": "string", "Enabled": true, "ValidFrom": "string", "ValidTo": "string", "Markets": "string", "Action": "string", "ActionValue": "string", "Quantity": 0, "Titles": [ { "LanguageCode": "string", "Content": "string" } ], "Urls": [ { "LanguageCode": "string", "Content": "string" } ] } ], "LowestPrice": [ { "LowestPrice": 0, "ComparisonPrice": 0, "MarketId": 0, "Currency": "string" } ], "SortOrder": { "Default": 0, "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 }, "Weight": 0, "Length": 0, "Width": 0, "Height": 0 } ] }, "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Remove product from variant group ::api-endpoint --- api: mgmtapi endpointUrl: /API/Variant/{productId} operationId: Remove product from variant group --- #sidebar :::api-endpoint-path{method="DELETE" path="/API/Variant/{productId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/Variant/{productId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/Variant/{productId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Variant/{productId}', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Variant/{productId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Variant/{productId}" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/Variant/{productId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "GroupId": 0, "Name": "string", "CollapseInLists": true, "MainProductId": 0, "ProductIds": [ 0 ], "Products": [ { "ProductId": 0, "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "DateCreated": "string", "DateUpdated": "string", "DateFirstAvailable": "string", "MaxDiscountPercentage": 0, "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "Items": [ { "ItemId": 0, "ArticleNumber": "string", "ProductId": 0, "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "DateCreated": "string", "DateUpdated": "string", "DateIncoming": "string", "Active": true, "ExternalId": "string", "Stock": { "ItemId": 0, "Stock": 0, "StockOversellable": 0, "StockStatic": 0, "StockSellable": 0 }, "ShippingFees": [ { "Market": 0, "Country": "string", "Service": "string", "ServiceId": 0, "Fee": 0 } ] } ], "Prices": [ { "ProductId": 0, "PriceListId": 0, "PriceListName": "string", "PriceIncVat": 0, "PriceExVat": 0, "VatRate": 0, "Country": "string", "Currency": "string", "StaggeredCount": 0, "ValidFrom": "string", "ValidTo": "string" } ], "Categories": [ { "CategoryId": 0, "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "GoogleCategoryPath": "string", "Hidden": true, "Active": true } ], "Images": [ { "ProductId": 0, "Url": "string", "Order": 0, "Tags": [ "string" ] } ], "BrandId": 0, "BrandName": "string", "SupplierId": 0, "SupplierName": "string", "ParameterValues": [ { "ParameterValueId": 0, "ProductId": 0, "ParameterId": 0, "ParameterName": "string", "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Value": "string", "Description": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "InternalIdentifier": "string", "Order": "string" } ], "Variants": [ { "ProductId": 0, "GroupId": 0, "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "Vat": 0, "PrimaryImage": "string", "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "VatId": 0, "ExternalId": "string", "ActivationDate": "string", "Feeds": [ { "FeedId": 0, "AllowSale": true } ], "Urls": [ { "Url": "string", "Market": 0, "Countries": [ "string" ], "Language": "string" } ], "MainCategoryId": 0, "RelatedProducts": [ { "ProductId": 0, "RelatedProductId": 0, "RelationTypeId": 0 } ], "DiscountCampaigns": [ { "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignName": "string", "Title": "string", "HideTitle": true, "RuleType": "string", "Category": "string", "Enabled": true, "ValidFrom": "string", "ValidTo": "string", "Markets": "string", "Action": "string", "ActionValue": "string", "Quantity": 0, "Titles": [ { "LanguageCode": "string", "Content": "string" } ], "Urls": [ { "LanguageCode": "string", "Content": "string" } ] } ], "LowestPrice": [ { "LowestPrice": 0, "ComparisonPrice": 0, "MarketId": 0, "Currency": "string" } ], "SortOrder": { "Default": 0, "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 }, "Weight": 0, "Length": 0, "Width": 0, "Height": 0 } ] }, "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get variant group (product id) ::api-endpoint --- api: mgmtapi endpointUrl: /API/Variant/{productId}/VariantGroup operationId: Get variant group (product id) --- #sidebar :::api-endpoint-path{method="GET" path="/API/Variant/{productId}/VariantGroup"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Variant/{productId}/VariantGroup' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Variant/{productId}/VariantGroup', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Variant/{productId}/VariantGroup', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Variant/{productId}/VariantGroup" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Variant/{productId}/VariantGroup" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Variant/{productId}/VariantGroup", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "GroupId": 0, "Name": "string", "CollapseInLists": true, "MainProductId": 0, "ProductIds": [ 0 ], "Products": [ { "ProductId": 0, "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "DateCreated": "string", "DateUpdated": "string", "DateFirstAvailable": "string", "MaxDiscountPercentage": 0, "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "Items": [ { "ItemId": 0, "ArticleNumber": "string", "ProductId": 0, "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "DateCreated": "string", "DateUpdated": "string", "DateIncoming": "string", "Active": true, "ExternalId": "string", "Stock": { "ItemId": 0, "Stock": 0, "StockOversellable": 0, "StockStatic": 0, "StockSellable": 0 }, "ShippingFees": [ { "Market": 0, "Country": "string", "Service": "string", "ServiceId": 0, "Fee": 0 } ] } ], "Prices": [ { "ProductId": 0, "PriceListId": 0, "PriceListName": "string", "PriceIncVat": 0, "PriceExVat": 0, "VatRate": 0, "Country": "string", "Currency": "string", "StaggeredCount": 0, "ValidFrom": "string", "ValidTo": "string" } ], "Categories": [ { "CategoryId": 0, "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "GoogleCategoryPath": "string", "Hidden": true, "Active": true } ], "Images": [ { "ProductId": 0, "Url": "string", "Order": 0, "Tags": [ "string" ] } ], "BrandId": 0, "BrandName": "string", "SupplierId": 0, "SupplierName": "string", "ParameterValues": [ { "ParameterValueId": 0, "ProductId": 0, "ParameterId": 0, "ParameterName": "string", "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Value": "string", "Description": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "InternalIdentifier": "string", "Order": "string" } ], "Variants": [ { "ProductId": 0, "GroupId": 0, "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "Vat": 0, "PrimaryImage": "string", "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "VatId": 0, "ExternalId": "string", "ActivationDate": "string", "Feeds": [ { "FeedId": 0, "AllowSale": true } ], "Urls": [ { "Url": "string", "Market": 0, "Countries": [ "string" ], "Language": "string" } ], "MainCategoryId": 0, "RelatedProducts": [ { "ProductId": 0, "RelatedProductId": 0, "RelationTypeId": 0 } ], "DiscountCampaigns": [ { "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignName": "string", "Title": "string", "HideTitle": true, "RuleType": "string", "Category": "string", "Enabled": true, "ValidFrom": "string", "ValidTo": "string", "Markets": "string", "Action": "string", "ActionValue": "string", "Quantity": 0, "Titles": [ { "LanguageCode": "string", "Content": "string" } ], "Urls": [ { "LanguageCode": "string", "Content": "string" } ] } ], "LowestPrice": [ { "LowestPrice": 0, "ComparisonPrice": 0, "MarketId": 0, "Currency": "string" } ], "SortOrder": { "Default": 0, "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 }, "Weight": 0, "Length": 0, "Width": 0, "Height": 0 } ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create variant group (product) ::api-endpoint --- api: mgmtapi endpointUrl: /API/Variant/{productId}/VariantGroup operationId: Create variant group (product) --- #sidebar :::api-endpoint-path{method="POST" path="/API/Variant/{productId}/VariantGroup"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Variant/{productId}/VariantGroup' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Name": "string", "CollapseInLists": true, "VariantLabels": [ "string" ], "Products": [ { "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } } ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Variant/{productId}/VariantGroup', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Name": "string", "CollapseInLists": true, "VariantLabels": [ "string" ], "Products": [ { "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } } ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Variant/{productId}/VariantGroup', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Name": "string", "CollapseInLists": true, "VariantLabels": [ "string" ], "Products": [ { "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } } ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Variant/{productId}/VariantGroup" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Name": "string", "CollapseInLists": true, "VariantLabels": [ "string" ], "Products": [ { "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } } ] } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Variant/{productId}/VariantGroup" payload := []byte(`{ "Name": "string", "CollapseInLists": true, "VariantLabels": [ "string" ], "Products": [ { "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } } ] }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Name = "string", CollapseInLists = true, VariantLabels = new[] { "string" }, Products = new[] { new { ArticleNumber = "string", Names = new[] { new { LanguageCode = "string", Content = "string" } }, Active = true, PurchasePrice = 0, PurchasePriceCurrency = "string", ShortTexts = new[] { new { LanguageCode = "string", Content = "string" } }, LongTexts = new[] { new { LanguageCode = "string", Content = "string" } }, TechTexts = new[] { new { LanguageCode = "string", Content = "string" } }, BrandId = 0, MaxDiscountPercentage = 0, SupplierId = 0, Items = new[] { new { ItemId = 0, ArticleNumber = "string", Name = "string", Shelf = "string", Weight = 0, Length = 0, Width = 0, Height = 0, Gtin = "string", Active = true, ExternalId = "string", DateIncoming = "string" } }, CategoryIds = new[] { 0 }, ParameterValues = new[] { new { ProductId = 0, ParameterId = 0, Value = "string", LocalizedDescriptions = new[] { new { LanguageCode = "string", Content = "string" } } } }, Variants = new[] { new { Label = "string", Value = "string" } }, Markets = new[] { new { Id = 0, ChannelId = "string", Name = "string", DisplayName = "string", Url = "string", Currency = "string", VatRate = 0, MarketPrefix = "string", CountryId = 0, CurrencyId = 0, CurrencyRate = 0, LanguageId = 0, Language = "string", Languages = new[] { new { LanguageId = 0, Name = "string", Code = "string" } }, Countries = new[] { new { CountryId = 0, Name = "string", Code = "string", VatRate = 0, CurrencyId = 0 } }, Currencies = new[] { new { Name = "string", Code = "string", CurrencyId = 0, CurrencyRate = 0 } } } }, FreightClassId = 0, IntrastatCode = "string", CountryOfOrigin = "string", VariantGroupId = 0, Vat = 0, VatType = "string", ExternalId = "string", ActivationDate = "string", Weight = 0, Length = 0, Width = 0, Height = 0, SortOrder = new { Custom1 = 0, Custom2 = 0, Custom3 = 0, Custom4 = 0, Custom5 = 0 } } } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Variant/{productId}/VariantGroup", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "GroupId": 0, "Name": "string", "CollapseInLists": true, "MainProductId": 0, "ProductIds": [ 0 ], "Products": [ { "ProductId": 0, "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "DateCreated": "string", "DateUpdated": "string", "DateFirstAvailable": "string", "MaxDiscountPercentage": 0, "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "Items": [ { "ItemId": 0, "ArticleNumber": "string", "ProductId": 0, "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "DateCreated": "string", "DateUpdated": "string", "DateIncoming": "string", "Active": true, "ExternalId": "string", "Stock": { "ItemId": 0, "Stock": 0, "StockOversellable": 0, "StockStatic": 0, "StockSellable": 0 }, "ShippingFees": [ { "Market": 0, "Country": "string", "Service": "string", "ServiceId": 0, "Fee": 0 } ] } ], "Prices": [ { "ProductId": 0, "PriceListId": 0, "PriceListName": "string", "PriceIncVat": 0, "PriceExVat": 0, "VatRate": 0, "Country": "string", "Currency": "string", "StaggeredCount": 0, "ValidFrom": "string", "ValidTo": "string" } ], "Categories": [ { "CategoryId": 0, "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "GoogleCategoryPath": "string", "Hidden": true, "Active": true } ], "Images": [ { "ProductId": 0, "Url": "string", "Order": 0, "Tags": [ "string" ] } ], "BrandId": 0, "BrandName": "string", "SupplierId": 0, "SupplierName": "string", "ParameterValues": [ { "ParameterValueId": 0, "ProductId": 0, "ParameterId": 0, "ParameterName": "string", "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Value": "string", "Description": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "InternalIdentifier": "string", "Order": "string" } ], "Variants": [ { "ProductId": 0, "GroupId": 0, "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "Vat": 0, "PrimaryImage": "string", "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "VatId": 0, "ExternalId": "string", "ActivationDate": "string", "Feeds": [ { "FeedId": 0, "AllowSale": true } ], "Urls": [ { "Url": "string", "Market": 0, "Countries": [ "string" ], "Language": "string" } ], "MainCategoryId": 0, "RelatedProducts": [ { "ProductId": 0, "RelatedProductId": 0, "RelationTypeId": 0 } ], "DiscountCampaigns": [ { "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignName": "string", "Title": "string", "HideTitle": true, "RuleType": "string", "Category": "string", "Enabled": true, "ValidFrom": "string", "ValidTo": "string", "Markets": "string", "Action": "string", "ActionValue": "string", "Quantity": 0, "Titles": [ { "LanguageCode": "string", "Content": "string" } ], "Urls": [ { "LanguageCode": "string", "Content": "string" } ] } ], "LowestPrice": [ { "LowestPrice": 0, "ComparisonPrice": 0, "MarketId": 0, "Currency": "string" } ], "SortOrder": { "Default": 0, "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 }, "Weight": 0, "Length": 0, "Width": 0, "Height": 0 } ] }, "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Delete variant group (product id) ::api-endpoint --- api: mgmtapi endpointUrl: /API/Variant/{productId}/VariantGroup operationId: Delete variant group (product id) --- #sidebar :::api-endpoint-path --- method: DELETE path: /API/Variant/{productId}/VariantGroup --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/Variant/{productId}/VariantGroup' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/Variant/{productId}/VariantGroup', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Variant/{productId}/VariantGroup', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Variant/{productId}/VariantGroup" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Variant/{productId}/VariantGroup" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/Variant/{productId}/VariantGroup", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Add variant label ::api-endpoint --- api: mgmtapi endpointUrl: /API/Variant/Label operationId: Add variant label --- #sidebar :::api-endpoint-path{method="POST" path="/API/Variant/Label"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Variant/Label' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Label": "string" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Variant/Label', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Label": "string" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Variant/Label', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Label": "string" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Variant/Label" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Label": "string" } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Variant/Label" payload := []byte(`{ "Label": "string" }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Label = "string" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Variant/Label", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ "string" ], "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update variant label ::api-endpoint --- api: mgmtapi endpointUrl: /API/Variant/Label/{oldLabel} operationId: Update variant label --- #sidebar :::api-endpoint-path{method="PUT" path="/API/Variant/Label/{oldLabel}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Variant/Label/{oldLabel}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Label": "string" }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Variant/Label/{oldLabel}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Label": "string" } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Variant/Label/{oldLabel}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Label": "string" }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Variant/Label/{oldLabel}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Label": "string" } response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Variant/Label/{oldLabel}" payload := []byte(`{ "Label": "string" }`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Label = "string" }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Variant/Label/{oldLabel}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Delete variant label ::api-endpoint --- api: mgmtapi endpointUrl: /API/Variant/Label/{label} operationId: Delete variant label --- #sidebar :::api-endpoint-path{method="DELETE" path="/API/Variant/Label/{label}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/Variant/Label/{label}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/Variant/Label/{label}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Variant/Label/{label}', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Variant/Label/{label}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Variant/Label/{label}" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/Variant/Label/{label}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get variant group (group id) ::api-endpoint --- api: mgmtapi endpointUrl: /API/VariantGroup/{groupId} operationId: Get variant group (group id) --- #sidebar :::api-endpoint-path{method="GET" path="/API/VariantGroup/{groupId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/VariantGroup/{groupId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/VariantGroup/{groupId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/VariantGroup/{groupId}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/VariantGroup/{groupId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/VariantGroup/{groupId}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/VariantGroup/{groupId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "GroupId": 0, "Name": "string", "CollapseInLists": true, "MainProductId": 0, "ProductIds": [ 0 ], "Products": [ { "ProductId": 0, "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "DateCreated": "string", "DateUpdated": "string", "DateFirstAvailable": "string", "MaxDiscountPercentage": 0, "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "Items": [ { "ItemId": 0, "ArticleNumber": "string", "ProductId": 0, "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "DateCreated": "string", "DateUpdated": "string", "DateIncoming": "string", "Active": true, "ExternalId": "string", "Stock": { "ItemId": 0, "Stock": 0, "StockOversellable": 0, "StockStatic": 0, "StockSellable": 0 }, "ShippingFees": [ { "Market": 0, "Country": "string", "Service": "string", "ServiceId": 0, "Fee": 0 } ] } ], "Prices": [ { "ProductId": 0, "PriceListId": 0, "PriceListName": "string", "PriceIncVat": 0, "PriceExVat": 0, "VatRate": 0, "Country": "string", "Currency": "string", "StaggeredCount": 0, "ValidFrom": "string", "ValidTo": "string" } ], "Categories": [ { "CategoryId": 0, "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "GoogleCategoryPath": "string", "Hidden": true, "Active": true } ], "Images": [ { "ProductId": 0, "Url": "string", "Order": 0, "Tags": [ "string" ] } ], "BrandId": 0, "BrandName": "string", "SupplierId": 0, "SupplierName": "string", "ParameterValues": [ { "ParameterValueId": 0, "ProductId": 0, "ParameterId": 0, "ParameterName": "string", "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Value": "string", "Description": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "InternalIdentifier": "string", "Order": "string" } ], "Variants": [ { "ProductId": 0, "GroupId": 0, "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "Vat": 0, "PrimaryImage": "string", "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "VatId": 0, "ExternalId": "string", "ActivationDate": "string", "Feeds": [ { "FeedId": 0, "AllowSale": true } ], "Urls": [ { "Url": "string", "Market": 0, "Countries": [ "string" ], "Language": "string" } ], "MainCategoryId": 0, "RelatedProducts": [ { "ProductId": 0, "RelatedProductId": 0, "RelationTypeId": 0 } ], "DiscountCampaigns": [ { "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignName": "string", "Title": "string", "HideTitle": true, "RuleType": "string", "Category": "string", "Enabled": true, "ValidFrom": "string", "ValidTo": "string", "Markets": "string", "Action": "string", "ActionValue": "string", "Quantity": 0, "Titles": [ { "LanguageCode": "string", "Content": "string" } ], "Urls": [ { "LanguageCode": "string", "Content": "string" } ] } ], "LowestPrice": [ { "LowestPrice": 0, "ComparisonPrice": 0, "MarketId": 0, "Currency": "string" } ], "SortOrder": { "Default": 0, "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 }, "Weight": 0, "Length": 0, "Width": 0, "Height": 0 } ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create variant group ::api-endpoint --- api: mgmtapi endpointUrl: /API/VariantGroup operationId: Create variant group --- #sidebar :::api-endpoint-path{method="POST" path="/API/VariantGroup"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/VariantGroup' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Name": "string", "CollapseInLists": true, "VariantLabels": [ "string" ], "Products": [ { "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } } ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/VariantGroup', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Name": "string", "CollapseInLists": true, "VariantLabels": [ "string" ], "Products": [ { "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } } ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/VariantGroup', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Name": "string", "CollapseInLists": true, "VariantLabels": [ "string" ], "Products": [ { "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } } ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/VariantGroup" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Name": "string", "CollapseInLists": true, "VariantLabels": [ "string" ], "Products": [ { "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } } ] } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/VariantGroup" payload := []byte(`{ "Name": "string", "CollapseInLists": true, "VariantLabels": [ "string" ], "Products": [ { "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } } ] }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Name = "string", CollapseInLists = true, VariantLabels = new[] { "string" }, Products = new[] { new { ArticleNumber = "string", Names = new[] { new { LanguageCode = "string", Content = "string" } }, Active = true, PurchasePrice = 0, PurchasePriceCurrency = "string", ShortTexts = new[] { new { LanguageCode = "string", Content = "string" } }, LongTexts = new[] { new { LanguageCode = "string", Content = "string" } }, TechTexts = new[] { new { LanguageCode = "string", Content = "string" } }, BrandId = 0, MaxDiscountPercentage = 0, SupplierId = 0, Items = new[] { new { ItemId = 0, ArticleNumber = "string", Name = "string", Shelf = "string", Weight = 0, Length = 0, Width = 0, Height = 0, Gtin = "string", Active = true, ExternalId = "string", DateIncoming = "string" } }, CategoryIds = new[] { 0 }, ParameterValues = new[] { new { ProductId = 0, ParameterId = 0, Value = "string", LocalizedDescriptions = new[] { new { LanguageCode = "string", Content = "string" } } } }, Variants = new[] { new { Label = "string", Value = "string" } }, Markets = new[] { new { Id = 0, ChannelId = "string", Name = "string", DisplayName = "string", Url = "string", Currency = "string", VatRate = 0, MarketPrefix = "string", CountryId = 0, CurrencyId = 0, CurrencyRate = 0, LanguageId = 0, Language = "string", Languages = new[] { new { LanguageId = 0, Name = "string", Code = "string" } }, Countries = new[] { new { CountryId = 0, Name = "string", Code = "string", VatRate = 0, CurrencyId = 0 } }, Currencies = new[] { new { Name = "string", Code = "string", CurrencyId = 0, CurrencyRate = 0 } } } }, FreightClassId = 0, IntrastatCode = "string", CountryOfOrigin = "string", VariantGroupId = 0, Vat = 0, VatType = "string", ExternalId = "string", ActivationDate = "string", Weight = 0, Length = 0, Width = 0, Height = 0, SortOrder = new { Custom1 = 0, Custom2 = 0, Custom3 = 0, Custom4 = 0, Custom5 = 0 } } } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/VariantGroup", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "GroupId": 0, "Name": "string", "CollapseInLists": true, "MainProductId": 0, "ProductIds": [ 0 ], "Products": [ { "ProductId": 0, "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "DateCreated": "string", "DateUpdated": "string", "DateFirstAvailable": "string", "MaxDiscountPercentage": 0, "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "Items": [ { "ItemId": 0, "ArticleNumber": "string", "ProductId": 0, "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "DateCreated": "string", "DateUpdated": "string", "DateIncoming": "string", "Active": true, "ExternalId": "string", "Stock": { "ItemId": 0, "Stock": 0, "StockOversellable": 0, "StockStatic": 0, "StockSellable": 0 }, "ShippingFees": [ { "Market": 0, "Country": "string", "Service": "string", "ServiceId": 0, "Fee": 0 } ] } ], "Prices": [ { "ProductId": 0, "PriceListId": 0, "PriceListName": "string", "PriceIncVat": 0, "PriceExVat": 0, "VatRate": 0, "Country": "string", "Currency": "string", "StaggeredCount": 0, "ValidFrom": "string", "ValidTo": "string" } ], "Categories": [ { "CategoryId": 0, "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "GoogleCategoryPath": "string", "Hidden": true, "Active": true } ], "Images": [ { "ProductId": 0, "Url": "string", "Order": 0, "Tags": [ "string" ] } ], "BrandId": 0, "BrandName": "string", "SupplierId": 0, "SupplierName": "string", "ParameterValues": [ { "ParameterValueId": 0, "ProductId": 0, "ParameterId": 0, "ParameterName": "string", "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Value": "string", "Description": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "InternalIdentifier": "string", "Order": "string" } ], "Variants": [ { "ProductId": 0, "GroupId": 0, "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "Vat": 0, "PrimaryImage": "string", "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "VatId": 0, "ExternalId": "string", "ActivationDate": "string", "Feeds": [ { "FeedId": 0, "AllowSale": true } ], "Urls": [ { "Url": "string", "Market": 0, "Countries": [ "string" ], "Language": "string" } ], "MainCategoryId": 0, "RelatedProducts": [ { "ProductId": 0, "RelatedProductId": 0, "RelationTypeId": 0 } ], "DiscountCampaigns": [ { "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignName": "string", "Title": "string", "HideTitle": true, "RuleType": "string", "Category": "string", "Enabled": true, "ValidFrom": "string", "ValidTo": "string", "Markets": "string", "Action": "string", "ActionValue": "string", "Quantity": 0, "Titles": [ { "LanguageCode": "string", "Content": "string" } ], "Urls": [ { "LanguageCode": "string", "Content": "string" } ] } ], "LowestPrice": [ { "LowestPrice": 0, "ComparisonPrice": 0, "MarketId": 0, "Currency": "string" } ], "SortOrder": { "Default": 0, "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 }, "Weight": 0, "Length": 0, "Width": 0, "Height": 0 } ] }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update variant group ::api-endpoint --- api: mgmtapi endpointUrl: /API/VariantGroup/{groupId} operationId: Update variant group --- #sidebar :::api-endpoint-path{method="PUT" path="/API/VariantGroup/{groupId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/VariantGroup/{groupId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Name": "string", "CollapseInLists": true, "VariantLabels": [ "string" ], "Products": [ { "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } } ] }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/VariantGroup/{groupId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Name": "string", "CollapseInLists": true, "VariantLabels": [ "string" ], "Products": [ { "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } } ] } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/VariantGroup/{groupId}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Name": "string", "CollapseInLists": true, "VariantLabels": [ "string" ], "Products": [ { "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } } ] }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/VariantGroup/{groupId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Name": "string", "CollapseInLists": true, "VariantLabels": [ "string" ], "Products": [ { "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } } ] } response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/VariantGroup/{groupId}" payload := []byte(`{ "Name": "string", "CollapseInLists": true, "VariantLabels": [ "string" ], "Products": [ { "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "BrandId": 0, "MaxDiscountPercentage": 0, "SupplierId": 0, "Items": [ { "ItemId": 0, "ArticleNumber": "string", "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "Active": true, "ExternalId": "string", "DateIncoming": "string" } ], "CategoryIds": [ 0 ], "ParameterValues": [ { "ProductId": 0, "ParameterId": 0, "Value": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ] } ], "Variants": [ { "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "Vat": 0, "VatType": "string", "ExternalId": "string", "ActivationDate": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "SortOrder": { "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 } } ] }`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Name = "string", CollapseInLists = true, VariantLabels = new[] { "string" }, Products = new[] { new { ArticleNumber = "string", Names = new[] { new { LanguageCode = "string", Content = "string" } }, Active = true, PurchasePrice = 0, PurchasePriceCurrency = "string", ShortTexts = new[] { new { LanguageCode = "string", Content = "string" } }, LongTexts = new[] { new { LanguageCode = "string", Content = "string" } }, TechTexts = new[] { new { LanguageCode = "string", Content = "string" } }, BrandId = 0, MaxDiscountPercentage = 0, SupplierId = 0, Items = new[] { new { ItemId = 0, ArticleNumber = "string", Name = "string", Shelf = "string", Weight = 0, Length = 0, Width = 0, Height = 0, Gtin = "string", Active = true, ExternalId = "string", DateIncoming = "string" } }, CategoryIds = new[] { 0 }, ParameterValues = new[] { new { ProductId = 0, ParameterId = 0, Value = "string", LocalizedDescriptions = new[] { new { LanguageCode = "string", Content = "string" } } } }, Variants = new[] { new { Label = "string", Value = "string" } }, Markets = new[] { new { Id = 0, ChannelId = "string", Name = "string", DisplayName = "string", Url = "string", Currency = "string", VatRate = 0, MarketPrefix = "string", CountryId = 0, CurrencyId = 0, CurrencyRate = 0, LanguageId = 0, Language = "string", Languages = new[] { new { LanguageId = 0, Name = "string", Code = "string" } }, Countries = new[] { new { CountryId = 0, Name = "string", Code = "string", VatRate = 0, CurrencyId = 0 } }, Currencies = new[] { new { Name = "string", Code = "string", CurrencyId = 0, CurrencyRate = 0 } } } }, FreightClassId = 0, IntrastatCode = "string", CountryOfOrigin = "string", VariantGroupId = 0, Vat = 0, VatType = "string", ExternalId = "string", ActivationDate = "string", Weight = 0, Length = 0, Width = 0, Height = 0, SortOrder = new { Custom1 = 0, Custom2 = 0, Custom3 = 0, Custom4 = 0, Custom5 = 0 } } } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/VariantGroup/{groupId}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "GroupId": 0, "Name": "string", "CollapseInLists": true, "MainProductId": 0, "ProductIds": [ 0 ], "Products": [ { "ProductId": 0, "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "DateCreated": "string", "DateUpdated": "string", "DateFirstAvailable": "string", "MaxDiscountPercentage": 0, "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "Items": [ { "ItemId": 0, "ArticleNumber": "string", "ProductId": 0, "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "DateCreated": "string", "DateUpdated": "string", "DateIncoming": "string", "Active": true, "ExternalId": "string", "Stock": { "ItemId": 0, "Stock": 0, "StockOversellable": 0, "StockStatic": 0, "StockSellable": 0 }, "ShippingFees": [ { "Market": 0, "Country": "string", "Service": "string", "ServiceId": 0, "Fee": 0 } ] } ], "Prices": [ { "ProductId": 0, "PriceListId": 0, "PriceListName": "string", "PriceIncVat": 0, "PriceExVat": 0, "VatRate": 0, "Country": "string", "Currency": "string", "StaggeredCount": 0, "ValidFrom": "string", "ValidTo": "string" } ], "Categories": [ { "CategoryId": 0, "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "GoogleCategoryPath": "string", "Hidden": true, "Active": true } ], "Images": [ { "ProductId": 0, "Url": "string", "Order": 0, "Tags": [ "string" ] } ], "BrandId": 0, "BrandName": "string", "SupplierId": 0, "SupplierName": "string", "ParameterValues": [ { "ParameterValueId": 0, "ProductId": 0, "ParameterId": 0, "ParameterName": "string", "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Value": "string", "Description": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "InternalIdentifier": "string", "Order": "string" } ], "Variants": [ { "ProductId": 0, "GroupId": 0, "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "Vat": 0, "PrimaryImage": "string", "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "VatId": 0, "ExternalId": "string", "ActivationDate": "string", "Feeds": [ { "FeedId": 0, "AllowSale": true } ], "Urls": [ { "Url": "string", "Market": 0, "Countries": [ "string" ], "Language": "string" } ], "MainCategoryId": 0, "RelatedProducts": [ { "ProductId": 0, "RelatedProductId": 0, "RelationTypeId": 0 } ], "DiscountCampaigns": [ { "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignName": "string", "Title": "string", "HideTitle": true, "RuleType": "string", "Category": "string", "Enabled": true, "ValidFrom": "string", "ValidTo": "string", "Markets": "string", "Action": "string", "ActionValue": "string", "Quantity": 0, "Titles": [ { "LanguageCode": "string", "Content": "string" } ], "Urls": [ { "LanguageCode": "string", "Content": "string" } ] } ], "LowestPrice": [ { "LowestPrice": 0, "ComparisonPrice": 0, "MarketId": 0, "Currency": "string" } ], "SortOrder": { "Default": 0, "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 }, "Weight": 0, "Length": 0, "Width": 0, "Height": 0 } ] }, "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Add product to variant group ::api-endpoint --- api: mgmtapi endpointUrl: /API/VariantGroup/{groupId}/{productId} operationId: Add product to variant group --- #sidebar :::api-endpoint-path --- method: PUT path: /API/VariantGroup/{groupId}/{productId} --- ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/VariantGroup/{groupId}/{productId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '[ { "Label": "string", "Value": "string" } ]' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/VariantGroup/{groupId}/{productId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: [ { "Label": "string", "Value": "string" } ] }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/VariantGroup/{groupId}/{productId}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify([ { "Label": "string", "Value": "string" } ]) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/VariantGroup/{groupId}/{productId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = [ { "Label": "string", "Value": "string" } ] response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/VariantGroup/{groupId}/{productId}" payload := []byte(`[ { "Label": "string", "Value": "string" } ]`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new[] { new { Label = "string", Value = "string" } }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/VariantGroup/{groupId}/{productId}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "GroupId": 0, "Name": "string", "CollapseInLists": true, "MainProductId": 0, "ProductIds": [ 0 ], "Products": [ { "ProductId": 0, "ArticleNumber": "string", "Names": [ { "LanguageCode": "string", "Content": "string" } ], "DateCreated": "string", "DateUpdated": "string", "DateFirstAvailable": "string", "MaxDiscountPercentage": 0, "Active": true, "PurchasePrice": 0, "PurchasePriceCurrency": "string", "ShortTexts": [ { "LanguageCode": "string", "Content": "string" } ], "LongTexts": [ { "LanguageCode": "string", "Content": "string" } ], "TechTexts": [ { "LanguageCode": "string", "Content": "string" } ], "Items": [ { "ItemId": 0, "ArticleNumber": "string", "ProductId": 0, "Name": "string", "Shelf": "string", "Weight": 0, "Length": 0, "Width": 0, "Height": 0, "Gtin": "string", "DateCreated": "string", "DateUpdated": "string", "DateIncoming": "string", "Active": true, "ExternalId": "string", "Stock": { "ItemId": 0, "Stock": 0, "StockOversellable": 0, "StockStatic": 0, "StockSellable": 0 }, "ShippingFees": [ { "Market": 0, "Country": "string", "Service": "string", "ServiceId": 0, "Fee": 0 } ] } ], "Prices": [ { "ProductId": 0, "PriceListId": 0, "PriceListName": "string", "PriceIncVat": 0, "PriceExVat": 0, "VatRate": 0, "Country": "string", "Currency": "string", "StaggeredCount": 0, "ValidFrom": "string", "ValidTo": "string" } ], "Categories": [ { "CategoryId": 0, "ParentCategoryId": 0, "Names": [ { "LanguageCode": "string", "Content": "string" } ], "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "SecondaryDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Meta": { "Descriptions": [ { "LanguageCode": "string", "Content": "string" } ], "Keywords": [ { "LanguageCode": "string", "Content": "string" } ], "Titles": [ { "LanguageCode": "string", "Content": "string" } ] }, "GoogleCategoryPath": "string", "Hidden": true, "Active": true } ], "Images": [ { "ProductId": 0, "Url": "string", "Order": 0, "Tags": [ "string" ] } ], "BrandId": 0, "BrandName": "string", "SupplierId": 0, "SupplierName": "string", "ParameterValues": [ { "ParameterValueId": 0, "ProductId": 0, "ParameterId": 0, "ParameterName": "string", "GroupId": 0, "GroupName": "string", "ParameterType": 0, "Value": "string", "Description": "string", "LocalizedDescriptions": [ { "LanguageCode": "string", "Content": "string" } ], "InternalIdentifier": "string", "Order": "string" } ], "Variants": [ { "ProductId": 0, "GroupId": 0, "Label": "string", "Value": "string" } ], "Markets": [ { "Id": 0, "ChannelId": "string", "Name": "string", "DisplayName": "string", "Url": "string", "Currency": "string", "VatRate": 0, "MarketPrefix": "string", "CountryId": 0, "CurrencyId": 0, "CurrencyRate": 0, "LanguageId": 0, "Language": "string", "Languages": [ { "LanguageId": 0, "Name": "string", "Code": "string" } ], "Countries": [ { "CountryId": 0, "Name": "string", "Code": "string", "VatRate": 0, "CurrencyId": 0 } ], "Currencies": [ { "Name": "string", "Code": "string", "CurrencyId": 0, "CurrencyRate": 0 } ] } ], "Vat": 0, "PrimaryImage": "string", "FreightClassId": 0, "IntrastatCode": "string", "CountryOfOrigin": "string", "VariantGroupId": 0, "VatId": 0, "ExternalId": "string", "ActivationDate": "string", "Feeds": [ { "FeedId": 0, "AllowSale": true } ], "Urls": [ { "Url": "string", "Market": 0, "Countries": [ "string" ], "Language": "string" } ], "MainCategoryId": 0, "RelatedProducts": [ { "ProductId": 0, "RelatedProductId": 0, "RelationTypeId": 0 } ], "DiscountCampaigns": [ { "CampaignId": "00000000-0000-0000-0000-000000000000", "CampaignName": "string", "Title": "string", "HideTitle": true, "RuleType": "string", "Category": "string", "Enabled": true, "ValidFrom": "string", "ValidTo": "string", "Markets": "string", "Action": "string", "ActionValue": "string", "Quantity": 0, "Titles": [ { "LanguageCode": "string", "Content": "string" } ], "Urls": [ { "LanguageCode": "string", "Content": "string" } ] } ], "LowestPrice": [ { "LowestPrice": 0, "ComparisonPrice": 0, "MarketId": 0, "Currency": "string" } ], "SortOrder": { "Default": 0, "Custom1": 0, "Custom2": 0, "Custom3": 0, "Custom4": 0, "Custom5": 0 }, "Weight": 0, "Length": 0, "Width": 0, "Height": 0 } ] }, "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Delete variant group (group id) ::api-endpoint --- api: mgmtapi endpointUrl: /API/VariantGroup/{groupId} operationId: Delete variant group (group id) --- #sidebar :::api-endpoint-path{method="DELETE" path="/API/VariantGroup/{groupId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/VariantGroup/{groupId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/VariantGroup/{groupId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/VariantGroup/{groupId}', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/VariantGroup/{groupId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/VariantGroup/{groupId}" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/VariantGroup/{groupId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Get webhook ::api-endpoint --- api: mgmtapi endpointUrl: /API/Webhook/{webhookId} operationId: Get webhook --- #sidebar :::api-endpoint-path{method="GET" path="/API/Webhook/{webhookId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Webhook/{webhookId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Webhook/{webhookId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Webhook/{webhookId}', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Webhook/{webhookId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Webhook/{webhookId}" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Webhook/{webhookId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": { "Id": "00000000-0000-0000-0000-000000000000", "Entity": 0, "Name": "string", "Description": "string", "Actions": "string", "Method": "string", "Url": "string", "Body": "string", "Headers": "string", "Retry": true }, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` ```ts [500] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Create webhook ::api-endpoint --- api: mgmtapi endpointUrl: /API/Webhook operationId: Create webhook --- #sidebar :::api-endpoint-path{method="POST" path="/API/Webhook"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X POST 'https://mgmtapi.geins.io/API/Webhook' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Entity": 0, "Name": "string", "Description": "string", "Actions": "string", "Method": "string", "Url": "string", "Body": "string", "Headers": "string", "Retry": true }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'POST', url: 'https://mgmtapi.geins.io/API/Webhook', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Entity": 0, "Name": "string", "Description": "string", "Actions": "string", "Method": "string", "Url": "string", "Body": "string", "Headers": "string", "Retry": true } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Webhook', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Entity": 0, "Name": "string", "Description": "string", "Actions": "string", "Method": "string", "Url": "string", "Body": "string", "Headers": "string", "Retry": true }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Webhook" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Entity": 0, "Name": "string", "Description": "string", "Actions": "string", "Method": "string", "Url": "string", "Body": "string", "Headers": "string", "Retry": true } response = requests.POST(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Webhook" payload := []byte(`{ "Entity": 0, "Name": "string", "Description": "string", "Actions": "string", "Method": "string", "Url": "string", "Body": "string", "Headers": "string", "Retry": true }`) req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Entity = 0, Name = "string", Description = "string", Actions = "string", Method = "string", Url = "string", Body = "string", Headers = "string", Retry = true }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.POSTAsync("https://mgmtapi.geins.io/API/Webhook", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": "00000000-0000-0000-0000-000000000000", "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Resource": "00000000-0000-0000-0000-000000000000", "Message": "string", "Details": [ "string" ] } ``` ```ts [500] { "Resource": "00000000-0000-0000-0000-000000000000", "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Update webhook ::api-endpoint --- api: mgmtapi endpointUrl: /API/Webhook/{webhookId} operationId: Update webhook --- #sidebar :::api-endpoint-path{method="PUT" path="/API/Webhook/{webhookId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X PUT 'https://mgmtapi.geins.io/API/Webhook/{webhookId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}'\ -d '{ "Entity": 0, "Name": "string", "Description": "string", "Actions": "string", "Method": "string", "Url": "string", "Body": "string", "Headers": "string", "Retry": true }' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'PUT', url: 'https://mgmtapi.geins.io/API/Webhook/{webhookId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, data: { "Entity": 0, "Name": "string", "Description": "string", "Actions": "string", "Method": "string", "Url": "string", "Body": "string", "Headers": "string", "Retry": true } }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Webhook/{webhookId}', { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, body: JSON.stringify({ "Entity": 0, "Name": "string", "Description": "string", "Actions": "string", "Method": "string", "Url": "string", "Body": "string", "Headers": "string", "Retry": true }) }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Webhook/{webhookId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } payload = { "Entity": 0, "Name": "string", "Description": "string", "Actions": "string", "Method": "string", "Url": "string", "Body": "string", "Headers": "string", "Retry": true } response = requests.PUT(url, json=payload, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Webhook/{webhookId}" payload := []byte(`{ "Entity": 0, "Name": "string", "Description": "string", "Actions": "string", "Method": "string", "Url": "string", "Body": "string", "Headers": "string", "Retry": true }`) req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(payload)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var body = new { Entity = 0, Name = "string", Description = "string", Actions = "string", Method = "string", Url = "string", Body = "string", Headers = "string", Retry = true }; var jsonContent = JsonSerializer.Serialize(body); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await client.PUTAsync("https://mgmtapi.geins.io/API/Webhook/{webhookId}", content); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": true, "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Resource": "00000000-0000-0000-0000-000000000000", "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` ```ts [500] { "Resource": "00000000-0000-0000-0000-000000000000", "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # Delete webhook ::api-endpoint --- api: mgmtapi endpointUrl: /API/Webhook/{webhookId} operationId: Delete webhook --- #sidebar :::api-endpoint-path{method="DELETE" path="/API/Webhook/{webhookId}"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X DELETE 'https://mgmtapi.geins.io/API/Webhook/{webhookId}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'DELETE', url: 'https://mgmtapi.geins.io/API/Webhook/{webhookId}', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Webhook/{webhookId}', { method: 'DELETE', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Webhook/{webhookId}" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.DELETE(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Webhook/{webhookId}" payload := []byte{} req, _ := http.NewRequest("DELETE", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.DELETEAsync("https://mgmtapi.geins.io/API/Webhook/{webhookId}", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` ```ts [500] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # List webhooks ::api-endpoint --- api: mgmtapi endpointUrl: /API/Webhook/List operationId: List webhooks --- #sidebar :::api-endpoint-path{method="GET" path="/API/Webhook/List"} ::: ### Request Example :::code-collapse{sync="request"} ::::code-group{sync="request"} ```shell [cURL] curl -X GET 'https://mgmtapi.geins.io/API/Webhook/List' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic [USER-CREDENTIALS-BASE64-ENCODED]' \ -H 'X-ApiKey: {MGMT_API_KEY}' ``` ```ts [axios.js] import axios from 'axios'; const config = { method: 'GET', url: 'https://mgmtapi.geins.io/API/Webhook/List', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' }, }; axios.request(config) .then(response => response.data) .catch(error => console.error(error)); ``` ```ts [fetch.js] fetch('https://mgmtapi.geins.io/API/Webhook/List', { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } }) .then(res => res.json()) .then((response) => response) .catch(console.error); ``` ```python [python] import requests url = "https://mgmtapi.geins.io/API/Webhook/List" headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Basic [USER-CREDENTIALS-BASE64-ENCODED]', 'X-ApiKey': '{MGMT_API_KEY}' } response = requests.GET(url, headers=headers) print(response.json()) ``` ```go [go] package main import ( "bytes" "fmt" "io" "net/http" ) func main() { url := "https://mgmtapi.geins.io/API/Webhook/List" payload := []byte{} req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]") req.Header.Add("X-ApiKey", "{MGMT_API_KEY}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```csharp [csharp] using System.Text; using System.Text.Json; using System.Net.Http; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Basic [USER-CREDENTIALS-BASE64-ENCODED]"); client.DefaultRequestHeaders.Add("X-ApiKey", "{MGMT_API_KEY}"); var response = await client.GETAsync("https://mgmtapi.geins.io/API/Webhook/List", null); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result); ``` :::: ::: ### Response :::code-collapse{sync="response"} ::::code-group{sync="response"} ```ts [200] { "Resource": [ { "Id": "00000000-0000-0000-0000-000000000000", "Entity": 0, "Name": "string", "Description": "string", "Actions": "string", "Method": "string", "Url": "string", "Body": "string", "Headers": "string", "Retry": true } ], "Message": "string", "Details": [ "string" ] } ``` ```ts [400] { "Message": "string", "Details": [ "string" ] } ``` ```ts [404] { "Message": "string", "Details": [ "string" ] } ``` ```ts [500] { "Message": "string", "Details": [ "string" ] } ``` :::: ::: :: # ATV Huset ::case-intro #header ATV-huset migrated to Geins Commerce and excelled on their customers high expectations #text ATV-huset has been selling quad parts from their store in Mölndal (Sweden) and online all the way since 2005. Their inventory is enormous, and they’ve built a reputation throughout the Nordics as the category leader within their industry vertical. You can definitely say that ATV-huset has something for every quad-rider out there. :: ::case-image --- file: https://images.ctfassets.net/mzo5en1l4avc/1APLwawoT45bujBnyu0vP2/a46ea93100ae2e74831c175c4aa8bba4/ATV-HUSET_FEATURED_-_DESKTOP-min.png --- :: ::case-text #header Migrating from Magento #text ATV Huset had long been battling with a dated commerce solution (Magento) that was nothing but a struggle for the for it organization to manage. The administration of the business was nothing but a nightmare. With its four different sites, ATV Huset had to administer its operations via four separate PIM and CMS systems, which made the work difficult for the staff. And given large amount of products ATV-huset, with complementary sites had in stock - the situation was becoming untenable. ATV Huset also lacked an integration between their ERP and WMS, which meant that inventory, prices, and product information were not automatically synchronized - resulting in a ton of work for the staff managing the business, and a bad customer experience. :: ::case-text #header Mapping every spare part with the correct vehicle #text With ATV Huset's challenges in mind, work began on moving their business to the commerce platform Geins Commerce - a platform built on MACH technology. To raise the level of customer experience, the implementation partner Carismar Agency used the flexible parameter system in Geins PIM to develop an app mapping every spare part to the correct vehicle. This was made possible through a sync with the Swedish database Fordonsverket. The other issues involving ERP & WMS were soon taken care of as well. :: ::case-quote #quote "The parameter system is a game-changer for us - now can every customer find the correct spare parts" #author Andreas Grund, CEO :: ::case-text #header All systems go #text With the migration to Geins Commerce, ATV Huset got a complete commerce solution where all sites are administered through a single system. The organization now has its e-commerce solution fully integrated with its ERP and can focus on marketing and product enrichment. After the installment of the search function linking the registration number and vehicle model, the conversion rate increased significantly. At the same time, cases/returns concerning spare parts have decreased, which means that the pressure on ATV Huset's customer service department is not as high as earlier. Since the migration to Geins Commerce, sales have gone through the roof - And the organization itself is a lot happier and can fully focus on the right things and be more efficient. :: ::case-summary #header Learn more #text Explore more about how ATV Huset leveraged Geins to streamline operations, improve customer experience, and drive growth in the Nordic market. :: # Ka-Yo ::case-intro #header KA YO truly deserves to be called a pioneer within the outdoor segment, blending tech with design to create the best possible omni-experience on the market. #text KA YO intends to equip the modern explorer with pioneering sports brands in an inspiring and experiential framework—as close to nature as to urbanity. Focusing on apparel and equipment for outdoor, running, and trail running experiences for men and women, KA YO presents a highly curated selection of progressive industry leaders and niche brands. Celebrating a culture of community and creative expression, the omnichannel boutique puts a high-fashion spin on sportswear retail to fuel a renewed approach to how these categories are presented and consumed. :: ::case-gallery --- file: https://images.ctfassets.net/mzo5en1l4avc/10moEtzHVM36qJGZ5tSj6j/fdc70e1a8d9b7d4e5bbc7cb7813db32b/KAYO_1.jpg?w=1000&fit=fill --- :: ::case-text #header Leaving a monolith to pursue flexibility and scalability #text For years, enterprise monotliths was the go-to platforms for organizations like Nymans Ur. However, the licensing models and consultant-driven projects prompted brands and retailers to seek Software as a Service (SaaS) solutions. :: ::case-text #pre-header BACKGROUND #header All out experience #text KA YO was born out of the well-known department store Nordiska Kompaniet, where premium brands present their latest and most sought-after products. And since KA YO aims to take it a step further, they decided to bring in the well-known design Agency Public Image, to craft the brand identity. The result is a precise and minimal, yet distinctive design combined with imagery setting KA YO miles apart from traditional retailers. :: ::case-quote #quote To find a commerce suite like Geins, that has all the parts you need to build a competitive store out of the box - AND be able to integrate anything for future needs - Is really rare today :: ::case-quote #quote Normally you have to pick a CMS, PIM, and everything else. It’s expensive and often you end up spending a big portion of the budget on fees for licenses and development. :: ::case-quote #quote With Geins, we’re free to mix and match to find the perfect fit, and we’re ready for future needs thanks to the API-first approach #author Anders Hesselmann, Head of E-commerce :: ::case-text #pre-header FRONTEND & CONTENT #header Speed and flexible content management #text The store itself was built upon Geins Ralph, a PWA storefront known for its speed. Thanks to the pre-built assets, Carismar Agency (implementation partner) needed only about one month to complete the project and launch the site. The CMS used for the KA YO project was Geins native cms. With the features the cms are packed with, the eCommerce team can now fully schedule everything from content to products months in advance and segment where and when it will be shown. :: ::case-gallery --- file: https://images.ctfassets.net/mzo5en1l4avc/i2jTTPWQ6YzXpavb3rNzu/eb93257d028bddbfc192f970ce3749ee/KAYO_2.jpg?w=1000&fit=fill --- :: ::case-quote #quote The best thing about Geins, is that you get pretty much everything out of the box, and I was surprised by the performance of every module within the suite :: ::case-quote #quote The best thing about Geins, is that you get pretty much everything out of the box, and I was surprised by the performance of every module within the suite #author Anders Hesselmann, Head of E-commerce :: ::case-text #pre-header BACKEND :: # Köttfabriken ::case-intro #header From local challenges to global opportunities: Köttfabriken’s journey to redefine how people experience and purchase meat products online #text Köttfabriken is a venture born from a noticeable market need. Established in 2022 and headquartered in Täby, north of Stockholm, Köttfabriken has distinguished itself as a leader in the premium meat sector. Their mission? To redefine how people experience and purchase meat products online. :: ::case-image --- file: https://images.ctfassets.net/mzo5en1l4avc/1aB2eSKqZkiUCv40XJlRpF/9eef314c4255304dddef887128cc885e/Kottfabriken03.png --- :: ::case-text #header Overcoming WooCommerce limitations: Köttfabriken's Path to enhanced efficiency #text As Köttfabriken's operations began to expand, the limitations of their initial WooCommerce setup became increasingly apparent. Initially chosen for its simplicity and ease of entry into the e-commerce market, WooCommerce soon posed significant challenges that obstructed the company's growth and efficiency. :: ::case-quote #quote "First and foremost, it took an extremely long time to get things done. When you're running multiple plugins, you completely lose compatibility. The order management just doesn't work once you start to increase the number of orders. We estimated that we were only achieving 30% of our potential, and that's precisely why we decided that we needed to move." #author Leo Brogren, CTO :: ::case-text #header Choosing Geins: A strategic decision for integrated digital commerce #text Before deciding on their next step, Köttfabriken extensively explored various platforms to find the best fit for their growing business needs. They reviewed numerous solutions, each offering a range of features and capabilities. Ultimately, Köttfabriken chose Geins due to its comprehensive architecture and the inclusion of several competitive modules that other platforms lacked. Geins stood out because it offered not just a Product Information Management (PIM) system but also integrated modules for Content Management (CMS), Customer Relationship Management (CRM), and even a WMS (Warehouse Management System). This all-in-one solution provided Köttfabriken with a more holistic approach to managing their online presence. In contrast, other platforms they considered were primarily focused on PIM functionalities and did not offer the additional tools necessary for a fully integrated digital commerce strategy. :: ::case-quote #quote "We looked at several other platforms, but we didn't find what we were looking for. Most of them offered mainly PIM systems, which required us to piece together additional functionalities. Geins, on the other hand, came with standard modules which made the whole process much easier." #author Leo Brogren, CTO :: ::case-text #header Köttfabriken achieves operational success with Geins from day one #text Köttfabriken, like many others, values the comprehensive and integrated nature of Geins, which allows for operational efficiency from day one. They appreciated that Geins provided a suite of seamlessly integrated tools, eliminating the need for the extensive setup, time, and budget often required to integrate multiple disparate systems. This efficiency and the ability to quickly become fully operational are key factors in Köttfabriken's satisfaction with Geins, showcasing its effectiveness for businesses eager to streamline operations and minimize delays. :: ::case-quote #quote "We're impressed by the whole package, I would say. Having so many features from the start and being able to scale—it's incredibly valuable. The flexibility, especially with the API-first approach, allows us to adapt our tech stack as needed, which is a huge advantage." #author Leo Brogren, CTO :: ::case-quote #quote "Product enrichment used to require ten people working for several weeks. Now, we just need one person—it's totally streamlined. The same goes for our incoming and outgoing shipments." #author Leo Brogren, CTO :: ::case-text #header Köttfabriken sets sights on expansion across the Nordics and beyond #text Köttfabriken is actively continuing to expand their business, with a primary focus on the Nordic region. However, they are not stopping there; they are also laying the groundwork for extending their operations throughout the rest of Europe. These expansion plans underscore Köttfabriken's ambition to bring their high-quality products and innovative shopping experience to a broader audience, leveraging their operational efficiencies and robust platform capabilities to meet new market demands. :: ::case-summary #header Learn more #text Explore more about how Köttfabriken leveraged Geins to streamline operations, scale efficiently, and set the stage for future growth in the premium meat sector. :: # Maze ::case-intro #title Maze Interior and Pilke Lights looked to accelerate their focus on digital commerce - Geins became the clear option when the two brands needed to be merged into the same backend #description Maze Interior AB was founded in 2003 creating minimalistic and functional interiors for a stylish and smart home environment, with designs that are playful & iconic. In close collaboration with Swedish craftsmen, most of the production takes place locally, which enables quality and environmental control from idea to product. All products are created in line with Maze Interior's philosophy Slow Production, where the creation process is allowed to take time, the production is sustainability-focused, and the design long-lasting. In 2021 Maze Interior acquired Pilke Lights which focuses on unique and innovative Finnish handcrafted lamps made out of Finnish birch plywood. :: ::case-text #header Merging two separate brands and the challenge that comes with it #text Having merged two unique brands together with two different e-commerce platforms and overall systems, the company found it hard and time-consuming to work both agile and effectively to position itself as a brand. Their previous solutions made it difficult to expand to new markets, and it was almost impossible to sell globally at a fast pace under the same flag. Maze Interior's previous platforms weren't integrated with their ERP(Visma Business) which gave them a lot of manual workloads. With the migration to Geins, the team at Maze Interior also wished for a new and fresh design that could reflect the brand's identity. :: ::case-text #header Running two brands from the same backend #text With the migration over to Geins, a lot of things were made possible - mainly because of the setup within the native-PIM and the standard features found in Geins CMS. With the new setup, Maze Interior managed to merge both brands under the same roof and administer their whole business from the same user-friendly interface. Maze Interior and Pilke now co-exist without creating any headaches for the admins. Thanks to the new commerce setup, the teams can manage everything from product enrichment to content and further on to languages and currencies, and be in full control of where it would be published. Both Maze Interior and Pilke Lights launched on Geins PWA, with a design based on Geins Theme 1. :: ::case-quote #quote We chose to go with Geins because the platform is built upon the latest technology, and can integrate with anything #author Christian Resell, CEO :: ::case-text #header Modularity out of the box #text With its composable core, Geins Commerce can easily be integrated with anything and be shaped after your business needs. If Maze and Pilke decide to change something within their commerce stack, or need to integrate some other 3rd-party tool in the future, they're free to do so thanks to Geins REST API. :: ::case-summary #header Learn more #text Explore more about how Maze Interior and Pilke Lights leveraged Geins to unify their brands, streamline operations, and enable future growth with a modular, API-first commerce platform. :: # Motostar ::case-intro #header To continue expanding into Europe, Motostar needed a new commerce stack. They found everything they were looking for within Geins Commerce #text Motostar started its operations in Sjöbo in 2006, focusing on Motocross & Enduro. The idea was to gather verything for motorcycle sports under one roof with a range for both elite riders and amateurs. Today, Motostar has built up a gigantic range of both accessories and spare parts from the best suppliers in the moto industry. :: ::case-video{:file="video"} :: ::case-text #header Researching the market #text The team at Motostar had long been struggling with their previous commerce platform. The time they needed to spend on admin just to keep their inventory up to date was off the charts and even though they did stellar work maintaining everything - it just wasn't enough. For people in ecommerce, it comes as no news that it's pretty much about admin, and if the admin part is struggling it can lead to big issues. And that was the case with Motostar. Before they decided to go with Geins, Motostar did their homework very well. They dug deep into the market researching the leading nordic platforms. And even though there are a ton of competent alternatives on the market, Motostar couldn't find any option suitable for their business - except Geins Commerce, a platform built upon MACH technology. The deciding part came down to the flexibility and that you get everything you need out of the box while at the same time being ready for future needs thanks to the API-first approach. That's what Geins is all about - You get everything you need to build a competitive store made for global expansion and are free to build your commerce stack as you go because of the composable core. :: ::case-quote #quote "We evaluated a lot of e-commerce platforms. Geins was the only supplier that had the components we were looking for and it feels good to be able to have everything gathered in one place." #author Pontus Jönsson, E-commerce Manager :: ::case-text #header Setting up everything #text As Motostar's assortment covers everything within spare parts for both motocross and motorcycles, product management became the key challenge to solve. Moto riders shop in a certain way and expect to find all of the spare parts they need within a few clicks so everything needed to be smooth. With the migration to Geins Commerce, Motostar also wished that they would be able to manage content for multiple markets and run campaigns and promos on the fly. To get everything in sync with their store operations, Motostar needed to integrate their ERP DL Software with the e-commerce store for overall inventory and fulfillment (Deliveries etc). :: ::case-quote #quote "Even though our customers are extremely professional and caring about their rides, they also need some guidance to the correct spare parts. No matter how good of a mechanic you are, sometimes you need a blueprint to help you along the way" #author Pontus Jönsson, E-commerce Manager :: ::case-text #header Mapping spare parts #text In order to create the best possible shopping experience, the implementation partner Carismar Agency built an external application upon the presentation layer (PWA). This was made possible thanks to the flexible parameter feature found in Geins native PIM. Thanks to the application all of the spare parts could be mapped to the right bike and mapped to the available blueprints and drawings. The content Motostar wanted to shift to different markets was easily managed via the native CMS in Geins Commerce. Thanks to the widget library, the team at Motostar is in full control of their media files and assets, and where and when their campaigns are published. :: ::case-text #header Designing customer experience #text Design agency [Bäck Studios](https://www.xn--bck-qla.studio/) is behind the design of Motostar's new e-commerce. Bäck has previously worked with brands such as Svenskt Tenn and Gant. The task Bäck was assigned was to modernize Motostar's expression and assets as well as UX and navigation. Once the design was complete, the project was handed over to Carismar Agency for coding and performance. The storefront used for the project was Geins PWA storefront (Ralph). :: ::case-video --- file: https://videos.ctfassets.net/mzo5en1l4avc/5NL9rYURlHtJ3hnK57yU8S/96bc2a8e4bfb7f14d2af6e1549957a0e/Motostar_1phone.mp4 --- :: ::case-gallery --- file: https://images.ctfassets.net/mzo5en1l4avc/63uGEz69ffsH8rE7PFEPfS/20f582d26182c3542233a9e37e40c110/Motostar_mobile_screens.jpg?w=1000&fit=fill --- :: ::case-summary #header Motostar on Geins - Summary #text Since the migration, Motostar can now fully focus on sales and customer experience. With Geins Commerce as the backbone, they are ready for anything - even future needs and don’t have to waste a ton of time on everyday admin as they used to. - **Better customer experience** thanks to the combination of the parameter system and the mapped blueprints and drawings. - **Unbeatable total cost of ownership** because of all of the native functionality Geins deliver. - **Flexible content management** because of the native CMS found in Geins Commerce. - **Superior stability.** Geins Commerce suite is cloud-native and ready for extreme traffic spikes and can scale up and down in no time. - **Smooth imports & exports** make a retailer like Motostar ready for any product release and seasoned products without having to waste tons of time on administration just to keep their inventory up to date. - **Ready for future needs** because of the API-first approach that comes with Geins. :: # Nymansur ::case-intro #header Embracing the digital future of premium retail #text Nymans Ur is a trailblazer in Scandinavia, boasting the most extensive collection of premium watches in the region. As an authorized retailer for renowned brands such as Rolex, Vacheron Constantin, Breguet, Blancpain, and Chopard, their selection embodies exclusivity and excellence in the watch market. In addition to their exquisite watches, Nymans Ur also offers a curated range of fine jewelry including their own brand RARE Jewelry. With a legacy that stretches over 170 years, Nymans Ur is a name synonymous with exclusivity and uncompromising quality. :: ::case-image --- :file: https://images.ctfassets.net/mzo5en1l4avc/2McnKFrUkIGnnMh0XNTdwH/9c6e8fe044353a5f9452a0ee4770ff9d/Nymans06-min.jpg --- :: ::case-text #header Embracing a Digital Future #text Long celebrated as one of the most exclusive watch destinations in the Nordic region, Nymans Ur embarked on a journey to redefine its digital presence. A thorough evaluation was conducted to understand what was already in place and what needed to evolve: :: ::case-quote #quote "We quickly realized that, like many others, we were sitting on a legacy of technical debt inherited from our physical retail origins. Transitioning to a digital business model required a fundamentally different approach, prompting our comprehensive assessment." #author Oskar Wessman, Head of E-Commerce & CX :: ::case-text #header Leaving a monolith to pursue flexibility and scalability #text For years, enterprise monotliths was the go-to platforms for organizations like Nymans Ur. However, the licensing models and consultant-driven projects prompted brands and retailers to seek Software as a Service (SaaS) solutions. :: ::case-quote #quote "We sought simplicity. A SaaS product that's continuously updated allows us to focus on growing our business. Being a small team, bespoke development isn't sustainable for us. Having the capability to manage most tasks in-house was crucial" #author Oskar Wessman, Head of E-Commerce & CX :: ::case-text #header Choosing a future-proof platform #text Everyone involved in e-commerce knows how rapidly technology evolves. The architecture of platforms changes frequently, prompting brands to think carefully before settling on a platform. Nymans Ur was no exception. :: ::case-quote #quote "We can't predict all our future needs. Choosing a platform that provided a solid foundation with open architecture was critically important. Opting for Geins, equipped with both a powerful Product Information Management (PIM) system and a competitive Content Management System (CMS), meant we could avoid future dependencies and external integrations. This was a significant advantage for us." #author Oskar Wessman, Head of E-Commerce & CX :: ::case-image --- :file: https://images.ctfassets.net/mzo5en1l4avc/5714eJvkLckkvHLko0KStC/2e98396ec6cb8532b3e4c0919bb8a29f/Nymans07-min.jpg --- :: ::case-text #header Focusing on brand experience #text Beyond Nymans Ur, the team also manage [Krons](https://krons.se/){rel="nofollow"}, necessitating a platform that could support two distinct stores with different design systems from a single admin interface. :: ::case-quote #quote "To translate our physical store experience to the digital realm, nothing but a headless approach would do. Even though we're not a high-volume business, the digital experience is crucial. Our online store supports the physical store, and the omni experience is high priority Geins made this easy with its API-first design." #author Oskar Wessman, Head of E-Commerce & CX :: ::case-text #header Simplifying product management and overview #text Selling both new and pre-owned products meant product management was a priority, and it was essential that multiple team members could utilize the system from day one. :: ::case-quote #quote "Geins' PIM system is great. It's powerful, flexible, and simplifies product setup. I've worked with external PIM systems before, and it often gets complicated with the integrations. With Geins' PIM, we have a clear overview." #author Oskar Wessman, Head of E-Commerce & CX :: ::case-quote #quote "Given our suppliers' strict guidelines on product and category presentation, the flexibility of our chosen platform was non-negotiable. Geins delivered with a flexible foundation that made this possible" #author Oskar Wessman, Head of E-Commerce & CX :: ::case-text #header Fast market entry and scalability from day one #text Traditionally, platform migrations are seen as costly, never-ending projects. However, advancements in technology and architecture have changed this narrative. :: ::case-quote #quote "With Geins, we achieved a quick time to market and scalability for the future. It provided everything we needed to operate our business efficiently. We can choose our designs freely, have a clear product overview, and maintain full control of our inventory. The best part is, we don't need a large organization to manage everything." #author Oskar Wessman, Head of E-Commerce & CX :: ::case-summary #header From this day and forward in the digital era #text As Nymans Ur forges ahead in the digital era, its journey from a physical retailer to a digital flagship showcases its commitment to innovation, quality, and customer experience. With a strategic approach to technology and a focus on scalability, flexibility, and brand experience, Nymans Ur is well-positioned to continue its legacy of excellence in premium watch and jewelry market. :: # The Prerequisites of Agentic Commerce The conversation around Agentic Commerce often drifts into the abstract: "AI will buy things." But practically, **how?** If you point a sophisticated AI agent at a traditional e-commerce site today, it will fail. Not because the AI isn't smart enough, but because the infrastructure assumes a human is driving. To prepare for 2026, you don't need more AI. You need better infrastructure. specifically, you need two fundamental building blocks: **A Cloud Cart** and **A Drop-in Checkout**. # The Session Problem Traditional e-commerce relies on the "Session". A user visits a site, a cookie is dropped, and a cart is created in the browser's temporary storage or loosely tied to that cookie. **Agents don't browse lie humans.** - They don't maintain long-lived browser sessions. - They might "think" (process) for hours between adding an item and checking out. - They switch contexts (mobile app, server-side cron job, chat interface). If your cart lives in a browser session, it is invisible and inaccessible to an agent. ## Prerequisite 1: The Cloud Cart An Agentic Cart must be **API-First** and **Persistent**. It cannot rely on cookies. It must exist as a standalone entity in the cloud, addressable by an ID, and manipulatable via strictly typed API calls. - **Logic-First**: The cart must calculate totals, taxes, and promotions server-side. An agent shouldn't have to "guess" the final price; the API must return the exact, legally binding total in real-time. - **Context-Agnostic**: The same cart must be accessible by the user on their phone, the procurement bot running on a server, and the support agent in their dashboard. **Geins Cart** is built sessionless by default. It allows an agent to instantiate a cart, add items, and validate stock without ever rendering a distinct frontend page. # The Interface Problem Most checkout flows are designed for eyeballs. They are littered with: - Visual distractions (Upsells, Banners). - Unpredictable DOM structures (`
` vs `