EMDI connects to any e-shop (or your own backend) through simple HTTP calls. The response is text with fields separated by a semicolon (;), i.e. CSV. You do not need a JSON API or a specific programming language.
Any language that can open a URL and answer GET or POST is enough: C#, Java, Python, Node.js, Go, ASP / .NET, Ruby, PHP, even a static file. The ready-made SBZ bridges are PHP because OpenCart, WooCommerce, Magento and CS-Cart run on PHP. If you want to connect your own e-shop or service, implement the same links in the programming language you use.
The ready-made SBZ bridges are open source on GitHub: https://github.com/sbzsystems/emdi-eshop-bridges-connectors.
Open Settings → E-shop connection. Enable the connection, enter the site address and the key, then apply so the links are filled in. You can open each link with the button next to it for a test. In the browser you should see CSV, not an HTML error page.
In Sales, on a new document, press Insert. The window «Insert item lines from the internet» opens. Select an order on the left, press Import, and close the window. The document is filled automatically with customer, payment/shipping method, comment and lines. The e-shop is updated when you press Save, not when you close the orders window.
Call order when you open the window:modifiedcustomers → (if rows arrived)customersconfirm → modifiedproducts → (if rows arrived) productsconfirm → orderlist.
Each time you select an order, selectedorder is called.
On save, confirmorder is called and then, for every item with the internet option, productavailability together with quantityvariable.
Sending an item from the warehouse is POST multipart. The response must be UTF-8. The first line is a header and is ignored. Do not change the field order. Leave an empty field between two ;. Do not put a semicolon inside a field value.
Endpoints
| Method | Name | Example URL |
|---|---|---|
| GET | orderlist |
https://www.domain.com/orders |
| GET | selectedorder |
https://www.domain.com/order?id= |
| GET | confirmorder |
https://www.domain.com/confirm?docid=#docid&shipcomp=#shipcomp&voucherno=#voucherno&orderid= |
| GET | cancelorder |
https://www.domain.com/cancel?orderid= |
| GET | modifiedcustomers |
https://www.domain.com/customers |
| GET | customersconfirm |
https://www.domain.com/customersok |
| GET | modifiedproducts |
https://www.domain.com/products |
| GET | productsconfirm |
https://www.domain.com/productsok |
| GET | productavailability |
https://www.domain.com/stock?productid= |
| QUERY | quantityvariable |
&stock= |
| GET | deletetmp |
https://www.domain.com/reset |
| POST | senditem / uploadproduct |
https://www.domain.com/uploadproduct |
| GET | redirect |
https://www.domain.com/redirect?customerid=#CID |
Endpoints that change state in the e-shop (confirmorder, cancelorder, customersconfirm, productsconfirm, productavailability, deletetmp) are called by EMDI with GET (parameters in the URL).
Only uploadproduct is POST multipart.
In the ready-made PHP bridges the names look like ?key=…&action=orders. Another implementation may use paths such as /orders.
Each line is one pending order. Preferably send only orders that are not completed yet.
|
1 2 3 4 5 |
ORDER ID;CUSTOMER ID;SHIPPING COST;COD COST;DISCOUNT;DATE;NOTE;USER;VOUCHER;STATUS;SHIPPING CUSTOMER ID;PAYMENT METHOD;SHIPPING METHOD;DOCUMENT;CUSTOM FIELD 1;CUSTOM FIELD 2;CUSTOM FIELD 3;CUSTOM FIELD 4;CUSTOM FIELD 5; 405;C209;5,00;0;0;01/12/2026 21:40:20;Morning delivery;MARIA;;pending;;Cash on delivery;ACS;RET;;;;; 407;C215;0;0,01;0;02/12/2026 23:18:35;;;;;;;Card;ELTA;INV;;;;; 412;C222;8,00;0;0;01/12/2026 22:40:20;Afternoon delivery;ΜARIA;101755210|skroutz_demo;pending;;Card;Skroutz Point;RET;;;;; 413;C223;8,00;0;0;01/12/2026 22:42:20;Morning delivery;GEORGE;|11474;pending;;Card;Box Now Locker;RET;;;;; |
The customer is matched by code in EMDI. The user field matches the EMDI user name. Shipping cost and discount become extra document lines. If COD cost is exactly 0.01, a COD line with value 0 is inserted. Status is stored in the field you set as «Status field in field». Payment and shipping methods must match the descriptions in EMDI settings. Document is the document-type title (e.g. SALES INVOICE).
In the VOUCHER field, in addition to the voucher number, there can also be the locker id after the separator |
VOUCHER|LOCKER ID
In the above example, order number 412 has voucher number 101755210 and locker id skroutz_demo (example for Skroutz Locker)
Also in the above example, order number 413 does not have a voucher number but has locker_id 11474 (example for Box Now Locker)
|
1 2 3 |
CODE;DESCRIPTION1;DESCRIPTION2;DESCRIPTION3;QUANTITY;UNIT;PRICE;VAT;DISCOUNT;START;END;POSITION;ORDER ID; 6314;CUP;WHITE;12,5hx19,5d;1;PIECES;9,50;24;0;;;;405; 6307;CUP;BLUE;Large;1;PIECES;15,00;24;10;;;;405; |
The call works in 2 ways:
- If the link in settings ends with
=, EMDI appends the order code and reads only that order. - If it does not end with
=, it reads the whole file and keeps the lines with the selected order code.
Line discount is a percentage.
Note: With this call EMDI changes data in the e-shop using a GET request with parameters in the URL.
Called when you save the document.
EMDI replaces #docid, #shipcomp, #voucherno and appends the e-shop order number (from Related, without the related prefix; default in settings ^).
| Query | Description |
|---|---|
orderid |
E-shop order number |
shipcomp |
Shipping method (title) |
voucherno |
Voucher number |
docid |
Document-type row ID in EMDI (Aa) |
PHP example (same logic in any language):
|
1 2 3 4 5 6 7 |
if ($action == 'confirmorder') { $orderid = $_REQUEST['orderid']; $voucherno = $_REQUEST['voucherno']; $shipcomp = $_REQUEST['shipcomp']; $docid = $_REQUEST['docid']; // change status in the e-shop, e.g. depending on $docid } |
The Receive button in the orders window also calls this link (without voucher and shipping method). The normal flow is saving the document.
Note: With this call EMDI changes data in the e-shop using a GET request with parameters in the URL.
EMDI appends the order number to the link. The Cancel line button appears only when the link is filled in settings.
EMDI updates by code or creates a new customer. With «Uppercase» selected in settings, the code becomes uppercase without special characters.
|
1 2 |
CODE;FIRST NAME;LAST NAME;ADDRESS;ZIP;COUNTRY;CITY/STATE;AREA;PHONE;MOBILE;EMAIL;VAT;TAX OFFICE;COMPANY;OCCUPATION;CUSTOM FIELDS;PO BOX C62;SOLON;ZENETZIS;PLAPOUTA 10;16777;GR;ATTICA;HELLINIKO;2109648161;6944777777;host@sound.gr;045313872;ARGYROUPOLI;SOLON ZENETZIS;SOFTWARE SERVICES;STORE:E-SHOP1\n; |
Country is an alpha-2 code (GR, CY, DE, …). In custom fields put Field_name:Value and separate several fields with the two characters \n. Spaces in the name become _. The last field is P.O. Box.
The item code must be the same in the e-shop and in EMDI.
|
1 2 3 |
CODE;DESCRIPTION1;DESCRIPTION2;VAT;SALES PRICE;PURCHASE PRICE;AVAILABILITY;UNIT;CATEGORY;PHOTO;URL;CATEGORY ORDER;WEIGHT;ACTIVE; P1;Pork pita gyros;;24,00;1,80;;;Piece;Pita gyros;;;1;;1; P2|T2;Chicken pita gyros;Color:Black\nModel:A\n;24,00;2,00|2:1,20;;;Piece;Pita gyros,Lunch;;;1;;1; |
Second code (MPN): CODE|CODE2. Extra price-list prices: 1,80|2:2,00|4:3,50 (up to 4 extra). «VAT included» controls whether prices include VAT.

Several categories are comma-separated; the first is the main one. Keep the category-order field (even empty) so weight/active stay aligned. In description 2: text without : goes to notes; lines Name:Value fill custom fields (separator \n).
Note: With this call EMDI changes data in the e-shop using a GET request with parameters in the URL.
After you save a purchase/sale that moves stock, for each item with the internet flag:
|
1 |
https://www.domain.com/stock?productid=P1&stock=12 |
that is productavailability + code + quantityvariable + availability. Also save purchases in EMDI. If you do not want stock updates, leave these links empty.
Note: With this call EMDI changes data in the e-shop using a GET request with parameters in the URL.
With productsconfirm/customersconfirm the e-shop stores that EMDI received the data. The Delete confirmations button calls this link so those receipt confirmation dates are cleared.
Then the next modifiedproducts/modifiedcustomers call returns the full list.
«Create/edit product» (senditem) must be filled in. EMDI sends POST multipart/form-data.
In Warehouse, only for items with the internet flag:
- Save the item — data and photos.
- Menu Send selected products/services to e-shop — Yes to all = with photos, Yes = fields only.
If database sync has a separate «upload products», the automatic send on save is skipped. Photos are compressed (max side/quality from settings).
| Field | Description |
|---|---|
productid |
Item code |
productmpn |
Supplier code |
title |
Description |
descr |
Notes (line breaks → <br>) |
price/sprice |
Sales/purchase price (with/without VAT per «VAT included») |
tax |
VAT rate |
cat/cattitle |
Category (Aa and title) |
subcat/subcattitle |
Subcategory (Aa and title) |
weight |
Weight |
field_Name |
Custom fields (spaces → _) |
cprice_Name |
Price-list prices, e.g. cprice_Retail |
file, file2, … |
JPEG photos |
The menu Update availabilities in e-shop in the warehouse calls only productavailability, not uploadproduct.
Settings can show an extra button on customers, warehouse and sales. EMDI opens the link after replacing:
- customer:
customerid=#CID - item:
productid=#SID - document:
orderid=#DID
Note
Keep the same codes on both sides. If nothing downloads, open the link in the browser: you should see plain CSV with the header on the first line.
