DynaMod Web API 2026.2 Build 0000 (10 September 2026)

New Enhancement List

New Module — Meter Reading API (Machine Rental Billing)

A new set of REST APIs for machine rental meter billing. An external system (e.g. Tricomas) logs in with a Client ID and Secret, submits the meter reading, and DynaMod creates the billing invoice automatically. It also supports amending a reading (with in-app notification to staff), reading history, invoice enquiry and void, rental invoice creation, and contract / rental machine enquiry.

API Affected (New)

  • POST /auth/token – API client login (token based)
  • POST /api/meter-readings – submit meter reading and auto-create billing invoice
  • PUT /api/meter-readings/{Id} – amend a meter reading
  • GET /api/meter-readings – meter reading history
  • GET /api/invoices, GET /api/invoices/{Id}, GET /api/invoices/pending-review – invoice enquiry
  • POST /api/invoices/{Id}/void – void an invoice
  • POST /api/rental-invoices – create rental invoice
  • GET /api/contracts/{No}/machines, GET /api/contracts/{No}/rental-stocks – contract enquiry
  • GET /api/rental-stocks/{Id}, GET /api/rental-stock – rental stock enquiry

Note: these endpoints use their own API client credential (AcApiClientCredential) instead of the normal API key.

New Module — Grab Food Integration

DynaMod Web API can now receive Grab Food orders directly. When Grab sends an order, the system saves it and pushes it to TouchPOS automatically (with retry and a submit status, so a failed push can be found and re-sent). Grab can also pull the store menu from DynaMod.

API Affected (New)

  • POST /GrabFood/oauth/token – partner access token
  • GET /GrabFood/merchant/menu – Grab pulls the store menu
  • POST /GrabFood/orders – Grab submits a new order (webhook)
  • PUT /GrabFood/order/state – Grab updates the order status (webhook)

Note: Grab Food and Grab Mart require DynaMod 2026.2 or later. The tables, functions and stored procedures they use ship with the DynaMod 2026.2 upgrade. See "DynaMod Version Check for Grab Food / Grab Mart" below.


New Module — Grab Mart Integration

Same integration flow as Grab Food, for Grab Mart stores, plus a menu sync trigger.

API Affected (New)

  • POST /grabmart/oauth/token – partner access token
  • GET /grabmart/merchant/menu – Grab pulls the store menu
  • POST /grabmart/orders – Grab submits a new order (webhook)
  • PUT /grabmart/order/state – Grab updates the order status (webhook)
  • POST /grabmart/menu/sync – menu sync state

Performance Enhancement — Faster Listing Endpoints

Paging on the listing endpoints now runs inside the database query (OFFSET/FETCH) instead of loading the whole table first. The response content is the same — same records, same order, same TotalRecords — but large databases will see a much shorter response time. No change is needed on the caller side.

API Affected

  • Customers, CustomersSimple, SuppliersSimple
  • StocksWithLocationBalance
  • SupplierPurchaseOrders, SupplierGoodsReturnNotesSimple, SupplierOtherPaymentsSimple, SupplierRefundNotesSimple
  • CustomerDebitNotesSimple, CustomerRefundNotesSimple, CustomerDeliveryOrders, CustomerDeliveryOrdersSimple
  • StockAdjustmentsSimple, StockAdjustmentsRFIDSimple, StockIssuesSimple, StockReceivesSimple, StockTakesSimple, StockWriteOffsSimple
  • RFIDAntzStocks, ACMMSalesReconsSimple

Enhancement — Real HTTP Status Code on Error Response

Before this version, some endpoints always answered HTTP 200 even when the call failed, and the real result was only inside the response body. Now the HTTP status code reflects the real result (e.g. 400 for a bad request, 401 for wrong credentials, 500 for a server error). The response body format is unchanged. A configuration switch (EnvelopeRealHttpStatusScope) can restore the old behaviour without recompiling.

API Affected

  • All endpoints that return the ApiResponse envelope

Enhancement — API Documentation Pages

The API server home page now links to two new guide pages: an Integration Guide (how to get access, test in Swagger, import into Postman, and run a daily stock sync) and an API Reference (conventions, required parameters, and the module catalogue). The Swagger UI double-registration issue is also fixed.

Enhancement — Subsidiary Company Stock Balance Enquiry

When a required parameter is missing, the API now answers HTTP 400 with the field name, instead of returning an empty result. This prevents a missing parameter from being recorded as zero stock by the caller.

API Affected

  • SubCompStockBalanceLocation
  • SubCompStockBalanceLocationHTM

Enhancement — Customer Enquiry Ship-To Address

Customer enquiry now includes the customer ship-to address information.

API Affected

  • CustomersSimple

Enhancement — DynaMod Version Check for Grab Food / Grab Mart

Grab Food and Grab Mart depend on database objects that ship with DynaMod 2026.2. When the connected DynaMod database is still on an older version, only the Grab Food and Grab Mart endpoints are blocked: the API answers HTTP 503 with error code DynaModVersionNotCompatible and the message "DynaMod 2026.2 or later is required for Grab Food / Grab Mart. The connected DynaMod database is version 2026.1 Build 0000. Please upgrade DynaMod, then try again." Every other endpoint keeps working with DynaMod 2026.1. The check reads the DynaMod version (AcSystem) per request with a 60-second cache, so no restart of the Web API is needed after DynaMod is upgraded.


API Affected

  1. POST /GrabFood/oauth/token, GET /GrabFood/merchant/menu, POST /GrabFood/orders, PUT /GrabFood/order/state
  2. POST /grabmart/oauth/token, GET /grabmart/merchant/menu, POST /grabmart/orders, PUT /grabmart/order/state, POST /grabmart/menu/sync


Enhancement — License Status Screen

A new License Status button on the ribbon shows the five conditions the service checks at startup — DynaMod product license activated, Smart Cover subscribed, Smart Cover not expired, DynaMod Web API subscribed, DynaMod Web API not expired — each with a pass/fail result and detail (registered company, expiry date and days left). It also shows the mode the running service is enforcing (Licensed or Evaluation) against the license as it stands now, and tells the user when a restart is needed to apply a renewed license. A Copy button puts the whole report on the clipboard for support tickets.

Application Affected

  1. DynaMod Web API host (tray application). No API change.


Enhancement — Clean Shutdown and License Key Agent Handling

The Web API now closes properly when another program asks it to close — SmartUpdater before an update, Task Manager "End task", or a Windows shutdown / log-off. Before this version the request was ignored, SmartUpdater had to kill the process after 10 seconds, and a Windows shutdown reported the Web API as blocking. When the Web API stops, it also ends the license key agent (Ekag20nt.exe) that the license library started from the Web API folder, so the agent can no longer hold that file and fail the next update with "being used by another process". Agents belonging to other SmartAcc products on the same PC are not touched. The title-bar X still keeps the Web API running in the system tray; the version check's own restart after a database mismatch now takes effect as well.

Application Affected

  1. DynaMod Web API host (tray application). No API change.


Enhancement — Single Instance per Installation

Starting the same installation twice (same folder and same listen address) now shows "This DynaMod Web API instance is already running" instead of launching a duplicate that fails on the port and leaves a second tray icon. Sites that run several copies on purpose — one folder and one port per company database — are not affected.

Application Affected

  1. DynaMod Web API host (tray application). No API change.


Enhancement — Startup and Connection Checks

A startup preparation window now shows progress while the service starts. The database connection is checked before the service is started: when it fails, one clear "Database connection unavailable" message is shown and Connection Setup opens directly, instead of a chain of internal error boxes. A database initialization failure also leads straight to Connection Setup. Restart Connection stops the listener and hides the tray icon before the new instance starts, so the port is not clashed and no dead icon is left in the tray.

Application Affected

  1. DynaMod Web API host (tray application). No API change.


Enhancement — Modernised Host Window

Refreshed shell style with a Dark Mode toggle, modern confirmation and error dialogs (Exit, Restart, errors with detail), a minimum window size that fits 1280x720 displays, reliable restore to the front when opened from the tray icon, and no more duplicate "Connection Status" tabs after a tray restore.

Application Affected

  1. DynaMod Web API host (tray application). No API change.


Closed Issues List

  • Fixed Stock Take created through the API using the company-level stock balance as the old quantity. It now uses the balance of the location being counted, as at the document date — so the variance is correct for customers with more than one location.

API Affected

  • CreateStockTakeSimple
  • Fixed customer invoice line validation. Line amounts are now validated before saving, so a wrongly mapped request can no longer store the sales amount inside the discount field.

API Affected

  • CreateCustomerInvoiceSimple_Currency
  • Fixed API permission registration. The Supplier Purchase Order permissions were registered with a wrong spelling (“SupplierPurchaseOrderOrder…”), so the right could not be granted from the security screen; the UPDATE permission and the Promotion Plan Stock By Location enquiry permission were never registered. All are now registered with the correct names.

API Affected

  • SupplierPurchaseOrdersSimple (and _Currency / _GST_SGP / _GST_SGP_Currency)
  • PromotionPlanStockByLocation


 

Important Notes for Upgrade


  1. DynaMod compatibility: Grab Food and Grab Mart require DynaMod 2026.2 or later (see the DynaMod Version Check above). All other modules continue to work with DynaMod 2026.1.
  2. Upgrade pack content: the SmartUpdater upgrade pack (DynaMod_WebAPI_2026_2_Build0000_Upgrade.zip) no longer contains Ekag20.exe and Ekag20nt.exe. Every installed site already has these two files and they are unchanged since 2023, so nothing is lost; leaving them out lets the upgrade complete even when a license key agent left by the previous version is still running. New installations must use the full package (DynaMod_WebAPI_2026_2_Build0000.zip), which includes them.
  3. Multiple instances: at sites that run several Web API copies (one folder and port per company), apply the upgrade to every instance folder.
  4. Database upgrade: on first start the new version registers and runs DynaModWebAPI_Upgrade_2026_2_Build0000.sql against the connected database and stamps it 2026.2 Build 0000. The Web API does not serve requests until the database version matches the application version.

 

DynaMod Web API 2026.2

Common Module

  • Companies
  • Locations
  • Enquiry
    • CurrenciesAsAtDateRate
    • Taxes

EInvoice Module

  • Setup
    • StocksAdjustmentTypes
    • StockBrands
    • StockCategories
    • StockColors
    • StockGroups
    • StockIssueTypes
    • StockReceiveTypes
    • Stocks
    • StockSizes
    • StockWriteOffTypes
  • Enquiry
    • StockPriceBooks
    • StocksWithLocationBalance
    • StocksWithLocationPrice
  • Transaction
  • Stock Adjustment
    • CreateStockAdjustmentSimple
    • StockAdjustmentSimple
  • Stock Issue
    • CreateStockIssueSimple
    • StockIssueSimple
  • Stock Receive
    • CreateStockReceiveSimple
    • StockReceivesSimple
  • Stock Transit
    • CreateStockTransitSimple
    • StockTransitsSimple
  • Stock Transfer
    • CreateStockTransferSimple
    • StockTransfersSimple
  • Stock Write-Off
    • CreateStockWriteOffSimple
    • StockWriteOffsSimple
  • Stock Take
    • CreateStockTakeSimple
    • StockTakesSimple

Accounting Module

  • Setup
    • BillPaymentMethods
    • AccountDepartments
    • AccountJobs

Supplier Module

  • Setup
    • SupplierGroups
    • SuppliersSimple
    • SupplierUDGroups
  • Transaction
  • Purchase Orders
    • CancelSupplierPurchaseOrderSimple
    • CancelSupplierPurchaseOrderSimple_Currency
    • CreateSupplierPurchaseOrderSimple
    • CreateSupplierPurchaseOrderSimple_Currency
    • ReCreateSupplierPurchaseOrderSimple
    • ReCreateSupplierPurchaseOrderSimple_Currency
    • SupplierPurchaseOrdersSimple
    • SupplierPurchaseOrdersSimple_Currency
    • CancelSupplierPurchaseOrderSimple_GST_SGP
    • CancelSupplierPurchaseOrderSimple_GST_SGP_Currency
    • CreateSupplierPurchaseOrderSimple_GST_SGP
    • CreateSupplierPurchaseOrderSimple_GST_SGP_Currency
    • ReCreateSupplierPurchaseOrderSimple_GST_SGP
    • ReCreateSupplierPurchaseOrderSimple_GST_SGP_Currency
    • SupplierPurchaseOrdersSimple_GST_SGP
    • SupplierPurchaseOrdersSimple_GST_SGP_Currency
  • Goods Receive Notes
    • SupplierGoodsReceiveNotesSimple
    • CreateSupplierGoodsReceiveNoteSimple
  • Supplier Invoices
    • CreateSupplierInvoiceSimple
    • CreateSupplierInvoiceSimple_Currency
    • SupplierInvoicesSimple
    • SupplierInvoicesSimple_Currency
  • Goods Return Notes
    • CreateSuplierGoodsReturnNoteSimple
    • SupplierGoodsReturnNotesSimple
  • Supplier Credit Notes
    • CreateSupplierCreditNoteSimple
    • CreateSupplierCreditNoteSimple_Currency
    • SupplierCreditNotesSimple
    • SupplierCreditNotesSimple_Currency
  • Supplier Debit Notes
    • CreateSupplierDebitNoteSimple
    • CreateSupplierDebitNoteSimple_Currency
    • SupplierDebitNotesSimple
    • SupplierDebitNotesSimple_Currency
  • Supplier Refund Notes
    • SupplierRefundNotesSimple
    • SupplierRefundNotesSimple_Currency
    • CreateSupplierRefundNoteSimple
    • CreateSupplierRefundNoteSimple_Currency
  • Payment Voucher
    • CreateSupplierOtherPaymentSimple
    • SupplierOtherPaymentsSimple

Customer Module

  • Setup
  • Customer
    • CreateCustomerSimple
    • UpdateCustomerSimple
    • Customers
    • CustomersSimple
    • CustomerAreas
    • CustomerGroups
    • CustomerUDGroups
    • MemberEthnics
    • MemberIncomes
    • MemberOccupations
    • Salesmans
    • Terms
  • Enquiry
    • CustomerOutstandingDocumentListing
    • CustomerPurchaseHistory
    • CustomerPurchaseHistoryPOS
  • Transaction
  • Customer Quotation
    • CreateCustomerQuotationSimple
    • RecreateCustomerQuotationSimple
    • CancelCustomerQuoationSimple
    • CustomerQuotationsSimple
  • Sales Order
    • CreateCustomerSalesOrderSimple
    • CreateCustomerSalesOrderSimple_Currency
    • RecreateCustomerSalesOrderSimple
    • RecreateCustomerSalesOrderSimple_Curency
    • CancelCustomerSalesOrderSimple
    • CancelCustomerSalesOrderSimple_Currency
    • CustomerSalesOrders (Deprecated & Removed)
    • CustomerSalesOrdersSimple
    • CustomerSalesOrdersSimple_Currency
    • CreateCustomerSalesOrderSimple_GST_SGP
    • CreateCustomerSalesOrderSimple_GST_SGP_Currency
    • CustomerSalesOrdersSimple_GST_SGP
    • CustomerSalesOrdersSimple_GST_SGP_Currency
    • DeleteCustomerSalesOrderSimple
    • ReCreateCustomerSalesOrderSimple_GST_SGP
    • ReCreateCustomerSalesOrderSimple_GST_SGP_Currency
  • Delivery Order
    • CreateCustomerDeliveryOrderSimple
    • CustomerDeliveryOrders (Deprecated & Removed)
    • CustomerDeliveryOrdersSimple
  • Customer Invoice
    • CreateCustomerInvoice (Deprecated & Removed)
    • CreateCustomerInvoiceSimple
    • CreateCustomerInvoiceSimple_Currency
    • CustomerInvoices (Deprecated & Removed)
    • CustomerInvoicesSimple
    • CustomerInvociesSimple_Currency
    • CreateCustomerInvoiceSimple_GST_SGP
    • CreateCustomerInvoiceSimple_GST_SGP_Curency
    • CustomerInvoicesSimple_GST_SGP
    • CustomerInvoicesSimple_GST_SGP_Currency
  • Cash Sales
    • CreateCustomerCashSaleSimple
    • CustomerCashSalesSimple
  • Customer Credit Note
    • CreateCustomerCreditNoteSimple
    • CustomerCreditNotesSimple
  • Customer Debit Note
    • CreateCustomerDebitNoteSimple
    • CustomerDebitNotesSimple
  • Customer Refund Note
    • CreateCustomerRefundNoteSimple
    • CustomerRefundNotesSimple
  • Customer Receipts
    • CreateCustomerOtherReceiptSimple
    • CreateCustomerReceiptSimple
    • CustomerOtherReceiptsSimple
    • CustomerReceiptsSimple

POS Management Module

  • Cashiers
  • POSPaymentTypes
  • Enquiry
    • POSMenus
    • POSModifierGroups

Promotion Module

  • PromotionMemberGroupPlanStockByLocation
  • PromotoinPlanStockByLocation
  • PromotionStockByLocationListing

Subsidiary Company Module

  • Enquiry
    • SubCompCustomerCashSalesSimple
    • SubCompStockBalanceLocation
    • SubCompStockBalanceLocationHTM

Meter Reading API Module (New)

  • AuthToken (POST /auth/token)
  • MeterReadings (GET/POST /api/meter-readings, PUT /api/meter-readings/{Id})
  • Invoices (GET /api/invoices, GET /api/invoices/{Id}, GET /api/invoices/pending-review, POST /api/invoices/{Id}/void)
  • RentalInvoices (POST /api/rental-invoices)
  • Contracts (GET /api/contracts/{No}/machines, GET /api/contracts/{No}/rental-stocks)
  • RentalStocks (GET /api/rental-stocks/{Id}, GET /api/rental-stock)

Integration Module

  • Samsung OMS
    • SamsungOMSReqAvaiStock
    • SamsungOMSReqAvaiStockV2
  • Samsung SDS
    • SDSPurchaseOrderCreation
  • Grab Food (New)
    • GrabFoodGetPartnerAccessToken (POST /GrabFood/oauth/token)
    • GrabFoodGetMenu (GET /GrabFood/merchant/menu)
    • GrabFoodSubmitOrder (POST /GrabFood/orders)
    • GrabFoodPushOrderState (PUT /GrabFood/order/state)
  • Grab Mart (New)
    • GrabMartGetPartnerAccessToken (POST /grabmart/oauth/token)
    • GrabMartGetMartMenu (GET /grabmart/merchant/menu)
    • GrabMartSubmitOrder (POST /grabmart/orders)
    • GrabMartPushOrderState (PUT /grabmart/order/state)
    • GrabMartMenuSyncState (POST /grabmart/menu/sync)

Utility Module

  • Hello
  • ACMMSalesReconsSimple
  • CreateACMMSalesReconSimple
  • RFIDAntzStocks

Authentication & Authorization Related Endpoints

  • AssignRoles
  • Authenticate
  • GetApiKeys
  • RegenerateApiKeys
  • UnAssignRoles