The EMDI web API lets your program talk to EMDI web (contacts, products, calendar events, documents) without opening the screens by hand.

You send a JSON message (structured text) and get a JSON reply. Field names are in English (e.g. name, city).

Before you start

  1. In the packages admin, enable EMDI web API for the product.
  2. In EMDI web open Settings → Apps → EMDI web API links.
  3. Generate a key and save the HTTP Key.
  4. If you changed the package, log out and log back into EMDI web.
  5. Keep handy: the username and HTTP Key (do not publish them).

Your first call

Every call uses the same URL:

https://web.sbzsystems.com/apps/api/call.php?user=YOUR_USER&key=YOUR_HTTPKEY

Replace YOUR_USER and YOUR_HTTPKEY with your own credentials.

  1. Open a terminal (or Postman if you prefer).
  2. Copy the cURL command below.
  3. Run it. If everything works, you will see "success": true and the result.
  4. If you see an error, read error.message — it usually says what is missing (wrong key, etc.).

This first call returns the lookup lists:

Successful response (example):

Failed response (example):

Rate limit

You can make up to 60 calls per minute (per user and IP). If you hit the limit, wait a moment and try again.

Action list

Click an action in the table to jump straight to the example below. Each action has a name like contact.get. Always send the full JSON (not only the action). Under each request you also see an example response.

POSTmeta.lookups· lookup lists
https://web.sbzsystems.com/apps/api/call.php?user=YOUR_USER&key=YOUR_HTTPKEY

Use this first. It returns the lists you need later (e.g. document types, VAT, relations). If you set cities, it also returns cities.

Field Meaning
action what you want to do — here always meta.lookups
with optional: set [“cities”] if you also want cities

Example response:

POSTcontact.get· one contact
https://web.sbzsystems.com/apps/api/call.php?user=YOUR_USER&key=YOUR_HTTPKEY

Reads one contact by its internal id (id). Replace 123 with a real id from your database.

Field Meaning
action contact.get
id the contact id (Aa)

Example response:

POSTcontact.list· contact list
https://web.sbzsystems.com/apps/api/call.php?user=YOUR_USER&key=YOUR_HTTPKEY

Returns many contacts. limit sets how many (max 200). offset sets where to start (0 = from the beginning).

Field Meaning
action contact.list
active 1 = active only, 0 = inactive
limit how many rows to return
offset how many to skip from the start

Example response:

POSTcontact.save· create or update contact
https://web.sbzsystems.com/apps/api/call.php?user=YOUR_USER&key=YOUR_HTTPKEY

With id = 0 you create a new one. With match = code it finds an existing code and updates it. If the city or relation does not exist yet, the system creates it.

Field Meaning
action contact.save
id 0 = new contact
match code = find/update by code
data contact fields (name, city, …)

Example response:

POSTcontact.delete· delete contact
https://web.sbzsystems.com/apps/api/call.php?user=YOUR_USER&key=YOUR_HTTPKEY

Deletes the contact. If it has documents or is locked by myDATA, the call fails (nothing is deleted).

Field Meaning
action contact.delete
id the contact id

Example response:

POSTproduct.get· one product
https://web.sbzsystems.com/apps/api/call.php?user=YOUR_USER&key=YOUR_HTTPKEY

Reads one product (and barcodes if any). Replace id.

Field Meaning
action product.get
id the product id

Example response:

POSTproduct.list· product list
https://web.sbzsystems.com/apps/api/call.php?user=YOUR_USER&key=YOUR_HTTPKEY

Returns products with filters. You can filter by code.

Field Meaning
action product.list
code product code (optional)
active 1 = active
limit / offset pagination

Example response:

POSTproduct.save· create or update product
https://web.sbzsystems.com/apps/api/call.php?user=YOUR_USER&key=YOUR_HTTPKEY

Same logic as contacts: id 0 = new, match:code = update by code. The VAT rate (vat_rate) must already exist in VAT settings.

Field Meaning
action product.save
id 0 = new
match code
data product fields

Example response:

POSTproduct.delete· delete product
https://web.sbzsystems.com/apps/api/call.php?user=YOUR_USER&key=YOUR_HTTPKEY

Deletes the product. If it is used on documents, the call fails.

Field Meaning
action product.delete
id the product id

Example response:

POSTcalendar.get· one calendar event
https://web.sbzsystems.com/apps/api/call.php?user=YOUR_USER&key=YOUR_HTTPKEY

Reads one calendar event by its id .

Field Meaning
action calendar.get
id the calendar event id

Example response:

POSTcalendar.list· calendar list
https://web.sbzsystems.com/apps/api/call.php?user=YOUR_USER&key=YOUR_HTTPKEY

Returns events between two dates. Date format looks like: 2026-09-01 00:00:00.

Field Meaning
action calendar.list
start / end from / to
contact_id optional: only for one contact
limit / offset pagination

Example response:

POSTcalendar.save· create or update calendar event
https://web.sbzsystems.com/apps/api/call.php?user=YOUR_USER&key=YOUR_HTTPKEY

For a new event set id 0 and required start inside data.

Field Meaning
action calendar.save
id 0 = new
data.start start date/time (required for new)

Example response:

POSTcalendar.delete· delete calendar event
https://web.sbzsystems.com/apps/api/call.php?user=YOUR_USER&key=YOUR_HTTPKEY

Deletes the calendar event.

Field Meaning
action calendar.delete
id the calendar event id

Example response:

POSTdocument.get· one document
https://web.sbzsystems.com/apps/api/call.php?user=YOUR_USER&key=YOUR_HTTPKEY

Reads a document with its lines. If it is locked in myDATA, you can read it but not change it.

Field Meaning
action document.get
id the document id

Example response:

POSTdocument.list· document list
https://web.sbzsystems.com/apps/api/call.php?user=YOUR_USER&key=YOUR_HTTPKEY

Returns documents. With include_lines true you also get product lines.

Field Meaning
action document.list
contact_id / doc_type_id filters
date_from / date_to dates
include_lines true = include lines

Example response:

POSTdocument.save· create or update document
https://web.sbzsystems.com/apps/api/call.php?user=YOUR_USER&key=YOUR_HTTPKEY

For a new document you need: document type (doc_type_id), contact (contact_id) and at least one line in lines. Get the correct ids from meta.lookups. Types with tax transmission (tax_docs) cannot be created via the API.

Field Meaning
action document.save
id 0 = new
data.doc_type_id document type
data.contact_id contact
data.lines product lines (at least one for new)

Example response:

POSTdocument.delete· delete document
https://web.sbzsystems.com/apps/api/call.php?user=YOUR_USER&key=YOUR_HTTPKEY

Deletes the document and its lines. If it is locked in myDATA, the call fails.

Field Meaning
action document.delete
id the document id

Example response:

Notes

  • Always start with meta.lookups before you create documents.
  • The id is the internal number and code is the code you see on screen.
  • To update by code use "match": "code".
  • Documents locked in myDATA cannot be changed or deleted via the API.