Changelog
v1.9.0 (2026-08-04)
Summary
- ⚠️ Windows: this version is signed with a new certificate. If you verify the SDK's identity, replace the
signing_cert.cerfrom the zip together with the app folder — the certificate you have from an earlier version will not match this executable. See Updating to a new version.- Versions you already installed keep working, and nothing about how you verify changes.
- ⚠️ Android minimum supported versions change (see below). Your app will not compile until you update, so plan for it before you take this version.
- iOS and Windows are not affected.
- Fixed an issue where All-in-One transaction-bound receipts did not consistently report the same
receiptIdonPrintStateDetails. - Unreferenced refunds are now part of the common transactions API:
makeUnreferencedRefundlives onTeyaCommonTransactionsApi, so the same call works across integration types instead of being PosLink-only.- ⚠️ Prefer
refundPaymentfor refunds tied to a specific previous payment; usemakeUnreferencedRefundonly for card-present refunds not tied to any original payment.
- ⚠️ Prefer
- Android All-in-One now implements
makeUnreferencedRefund.
Android
PosLink & All-in-One
makeUnreferencedRefundmoved fromPosLinkTransactionsApiup toTeyaCommonTransactionsApi. Existing PosLink integrations keep compiling and behaving exactly as before.- Minimum versions changed to:
compileSdk->37Android Gradle Plugin->8.13.2Gradle->8.13kotlin->2.3.0
minSdknow depends on the integration type:- All-in-One ->
21, lowered from23. If you held back on Teya because of the23floor, you can now support Android 5.0 devices. - PosLink ->
23, no change. PosLink draws its own UI, so it pulls Compose, which needs23.
- All-in-One ->
- Take AGP
8.13.2exactly or newer, not just "some 8.13" — it is the version needed to read theandroid-37platform and to keep R8 happy with the SDK's Kotlin metadata.
All-in-One specific
makeUnreferencedRefundis implemented over the All-in-One transport. The terminal always asks for the manager PIN before processing.MissedResponseListener.onMissedUnreferencedRefundResponsedelivers the final state of an unreferenced refund whose response arrived after the ePOS process was killed and recreated.
iOS PosLink
- No behavior change —
makeUnreferencedRefundis now declared on the sharedTeyaCommonTransactionsApi.
v1.8.0 (2026-07-13)
Summary
- ⚠️ Some Android types that used to live inside
PaymentStateSubscriptionare now top-level types in the samecom.teya.unifiedepossdkpackage. Nothing about their content changed — only the import needs fixing.- iOS and Windows are not affected.
- PosLink refunds now run through the upgraded refunds endpoint.
- 🚧 Experimental: PosLink can now be used as a library by a Windows ePOS app that runs on the JVM, instead of only as a subprocess.
- Tests are ongoing, and we'll document the approach once we're confident in it.
Android - PosLink & All-in-One
- ⚠️ Two types moved and must be updated: (compilation will fail otherwise)
| Was | Now |
|---|---|
com.teya.unifiedepossdk.PaymentStateSubscription.PaymentStateDetails |
com.teya.unifiedepossdk.PaymentStateDetails |
com.teya.unifiedepossdk.PaymentStateSubscription.PaymentStateDetails.Metadata |
com.teya.unifiedepossdk.PaymentStateDetails.Metadata |
The old names are still there, but only so your IDE can fix the code for you. Put the caret on the old name and press Alt+Enter (Option+Enter on macOS), then pick "Replace usages of ... in whole project". That updates every usage and import in one go. Nothing about their content changed — only the import needs fixing.
- Some other types have moved but in a non-breaking way — you should also update them the same way, but old symbols will still work.
v1.7.0 (2026-07-09)
Summary
- New
MotoFormShownpayment in-progress state, reported over PosLink while the operator keys in the card details by hand for a MOTO (Mail Order / Telephone Order) payment. - New unreferenced refund on PosLink — return money to a card without an original sale. The customer taps their card at the terminal to receive the refund.
- ⚠️ Prefer
refundPaymentfor refunds tied to a specific previous payment; usemakeUnreferencedRefundonly for card-present refunds not tied to any original payment.
- ⚠️ Prefer
- New PosLink cancellation/failure reasons surfaced via new
PaymentStateReasonenum entries. Each shown in the built-in in-progress UI. - 🚧 Changes on Purchase data experimental APIs:
PurchaseDatanow accepts:receiptNumberto attach a pre-allocated fiscal receipt number to a payment. External ePOS apps that don't manage their own receipt series can leave itnull(default) — no action required.purchaseStoreInfofor attaching a merchant snapshot to a payment so it appears on the receipt header.
Android
PosLink & All-in-One
PaymentStateSubscriptionhas a newtransactionTypeproperty —TransactionType.PaymentorTransactionType.Refund— telling you whether the subscription tracks a payment or a refund.PaymentStateDetailshas a newgatewayTransactionIdfield (aGatewayTransactionId) — aGatewayPaymentIdfor a payment and aGatewayRefundIdfor a refund.PaymentStateSubscription.PaymentStateReasonhas new enum entries for PosLink request outcomes. The built-in in-progress UI shows a message for each.- 🚧 Changes on Purchase data experimental APIs:
PurchaseDatahas two new optional constructor parameters:receiptNumber: String? = null— fiscal receipt number pre-allocated by the ePOS. Passnull(default) if your app does not manage receipt series.purchaseStoreInfo: PurchaseStoreInfo? = null— optional merchant snapshot for the receipt header. Passnull(default) to omit.
PosLink specific
- New
InProgressState.MotoFormShownvalue (PaymentStateSubscription.InProgressState), reported through the payment state subscription while the operator types the card details by hand for a MOTO (Mail Order / Telephone Order) payment. Only delivered over the version-3 read; older reads surfaceWaitingForCardEntry. The pre-built PosLink payment UI shows a dedicated "Entering card details" title for this state. - New
makeUnreferencedRefundmethod onPosLinkTransactionsApi. It starts a card-present refund that credits the card presented at the terminal, not tied to any original payment, and returns aPaymentStateSubscriptionjust likemakePayment.- ⚠️ Prefer
refundPaymentfor refunds tied to a specific previous payment; usemakeUnreferencedRefundonly for card-present refunds not tied to any original payment.
- ⚠️ Prefer
iOS - PosLink
- New
TeyaInProgressState.MotoFormShownvalue, reported through the payment state subscription while the operator types the card details by hand for a MOTO (Mail Order / Telephone Order) payment. Only delivered over the version-3 read; older reads surfaceWaitingForCardEntry. The pre-built PosLink payment UI shows a dedicated "Entering card details" title for this state. - New
makeUnreferencedRefundmethod onPosLinkTransactionsApi. It starts a card-present refund that credits the card presented at the terminal, not tied to any original payment, and returns aPaymentStateSubscriptionjust likemakePayment.- ⚠️ Prefer
refundPaymentfor refunds tied to a specific previous payment; usemakeUnreferencedRefundonly for card-present refunds not tied to any original payment.
- ⚠️ Prefer
TeyaPaymentStateSubscriptionhas a newtransactionTypeproperty —TeyaTransactionType.paymentorTeyaTransactionType.refund— telling you whether the subscription tracks a payment or a refund.TeyaPaymentStateDetailshas a newgatewayTransactionIdfield (aTeyaGatewayTransactionId) — aTeyaGatewayPaymentIdfor a payment and aTeyaGatewayRefundIdfor a refund.TeyaPaymentStateReasonhas new enum entries for PosLink request outcomes. The built-in in-progress UI shows a message for each.- 🚧 Changes on Purchase data experimental APIs:
TeyaPurchaseDatahas two new fields:receiptNumber: String?— fiscal receipt number pre-allocated by the ePOS. Passnilif your app does not manage receipt series.purchaseStoreInfo: TeyaPurchaseStoreInfo?— merchant snapshot for the receipt header. Passnilto omit.
Windows - PosLink
- New
MOTO_FORM_SHOWNvalue on theinProgressStateof a payment state change (JSON-RPC), reported while the operator types the card details by hand for a MOTO (Mail Order / Telephone Order) payment.- ⚠️ If you are deserializing the
inProgressStateinto an enum, make sure to have a fallback branch for unrecognized values so your integration keeps working as new states are introduced.
- ⚠️ If you are deserializing the
- New
makeUnreferencedRefundJSON-RPC method. It starts a card-present refund that credits the card presented at the terminal, not tied to any original payment, and streams state updates just likemakePaymentAndSubscribe.- ⚠️ Prefer
refundPaymentfor refunds tied to a specific previous payment; usemakeUnreferencedRefundonly for card-present refunds not tied to any original payment.
- ⚠️ Prefer
- New streamed
makeUnreferencedRefund->onPaymentStateChangedresult. It mirrorsmakePaymentAndSubscribe->onPaymentStateChangedbut carries agatewayRefundId(the id of the created refund) instead ofgatewayPaymentId. PaymentStateReason(JSON-RPC) has new enum entries.
v1.6.0 (2026-06-10)
Summary
- New Pay at Table support on POSLink - register tabs, subscribe to card machine-initiated tab events, and settle tabs (full or split) from your ePOS. See the per-platform Pay at Table guides below.
- Internal improvements.
- Changes on Purchase data experimental APIs:
- New
TaxTypeenum to classify line items as VAT-applicable or VAT-exempt Productnow carriestaxTypeandtaxCodefields, enabling per-item tax classification when sending basket data on checkout
- New
- Fixed a crash on All-in-One when handling a missed print response for a custom (non-transaction) receipt.
Android - PosLink
- New Pay at Table APIs on
PosLinkSDK: atabsApifor the tab lifecycle (open/list/get/close tabs, store-level toggle), atabEventssubscription for card machine-initiated events, and a tab-awaremakePaymentoverload. See the Pay at Table guide. - Changes on Purchase data experimental APIs:
- New
TaxTypeenum (com.teya.feature.basketdata.TaxType) with two values:Vat- item is subject to VATVatExempt- item is VAT-exempt
Producthas two new constructor parameters:taxType: TaxType?- tax type classification for the line itemtaxCode: String?- tax code string (e.g."VAT_STANDARD","VAT_REDUCED"); passnullif not applicable
- New
iOS - PosLink
- New Pay at Table APIs on
PosLinkSDK: atabsApifor the tab lifecycle (open/list/get/close tabs), atabEventssubscription for card machine-initiated events, and a tab-awaremakePaymentoverload. See the Pay at Table guide. - Changes on Purchase data experimental APIs:
- New
TeyaTaxTypeenum with two values:Vat- item is subject to VATVatExempt- item is VAT-exempt
TeyaProducthas two new fields:taxType: TeyaTaxType?- tax type classification for the line itemtaxCode: String?- tax code string (e.g."VAT_STANDARD","VAT_REDUCED"); passnilif not applicable
- New
Windows - PosLink
- New Pay at Table JSON-RPC methods exposing the tab lifecycle (
openTab,listTabs,getTab,closeTab,setPayAtTableEnabledOnStore), asubscribeTabEventsstream for card machine-initiated events (plusrespondToBillRequest/respondWithError/unsubscribeTabEvents), and an optionaltabContextonmakePaymentAndSubscribefor settling tabs. See the Pay at Table guide. - Changes on Purchase data experimental APIs:
- The
productobject in basket line items now accepts two new optional fields:taxType- one of"Vat"or"VatExempt", or omit/nullif not applicabletaxCode- tax code string (e.g."VAT_STANDARD","VAT_REDUCED"), or omit/nullif not applicable
- The
v1.5.0 (2026-04-13)
Summary
- Simplified SDK APIs -
transactionsApiandprintingApiare now always available (non-nullable) after initialization - New
setupAuthAndStoremethod allows completing auth and store linking without card machine selection - New
linkedStoreandlinkedTerminalproperties for granular access to linking state clearUserAuthnow correctly clears also device and card machine linking
Android / iOS
PosLink
transactionsApiandprintingApiare now non-nullable. They are always available on thePosLinkSDKinstance - no need to check for null or wait forsetupsuccess.- New
setupAuthAndStoremethod - performs authentication and store linking without the card machine selection step. UselinkTerminalseparately when you're ready to link a card machine. - New read-only properties
linkedStoreandlinkedTerminalfor accessing the currently linked store and card machine individually. linkedDeviceDetailsis now still non-null when both store and card machine are linked.clearUserAuth()now cascades: it clears user auth, then store link, then card machine link. Previously it only cleared user auth.
Windows - PosLink
- Added new request method
setupAuthAndStorewhich performs authentication and store linking without the card machine selection step. Response type issetupAuthAndStore->onResponsewithresponse,store, anddebugErrorMessagefields (same assetup->onResponsebut without card machine info).
v1.4.0 (2026-04-08)
Summary
- Improved forward compatibility with backend changes
- PosLink - Added two new APIs to help dynamically link with card machines:
getTerminalsandlinkTerminal. - Android minimum supported versions change (see below)
Android
General
- Minimum versions changed to:
kotlin->2.2.21minSdk->23- Please contact us if you still have Android hardware running old OS versions: Lollipop aka Android 5.x (API 21 and API 22)
- We may consider maintaining a special artifact for it if we have enough demand for it
- Most official google libraries are dropping this support too (see here)
PosLink
PosLinkSDKnow has two new APIs:getTerminalsreturns the list of card machines belonging to the currently linked store. Results are cached; passforceRefresh = trueto bypass the cache.linkTerminallinks to a card machine by its id (e.g. one returned bygetTerminals), or passnullto show the SDK's card machine selection UI.
Windows - PosLink
- Added new request method
getTerminalswhich returns the list of card machines belonging to the currently linked store. Results are cached; passforceRefresh: trueto bypass the cache. - Added new request method
linkTerminalwhich links to a card machine by itsterminalId(e.g. one returned bygetTerminals), or passnullto show the SDK's card machine selection UI.
iOS - PosLink
PosLinkSDKnow has two new APIs:getTerminalsreturns the list of card machines belonging to the currently linked store. Results are cached; passforceRefresh = trueto bypass the cache.linkTerminallinks to a card machine by its id (e.g. one returned bygetTerminals), or passnilto show the SDK's card machine selection UI.
v1.3.2 (2026-03-19)
Changes from v1.3.1 (and v1.3.1-hf01 for Windows SDK)
Summary
- Improved migration from Direct API integration to SDK
- Added "hasPrinter" check on All In One
- Added a "Missing permission" screen that shows up when trying to log in with a non-admin account
- General improvements and fixes
Android
All in One
- New API to check whether connected device has printer:
AioReceiptPrintingApi.hasPrintermethod.
PosLink
- Advanced API
PosLinkSDK.AuthConfig.Delegatednow also has a way to pass in client id/secret. The SDK will use this if the provided user access token is not working in order to present the user with the login flow. If the passed in token is not working and no client id/secret was passed in, thesetupflow will end in aSetupFailure.
Windows - PosLink
- Added optional field
initialUserAccessTokento the"initialize"method that the SDK will use to avoid showing the login flow. This is useful if you are migrating from a direct API integration and your users already are logged in in their ePOS applications. Upon successful response on thesetupmethod, you can delete this token from your system.
iOS - PosLink
- Advanced API
PosLinkSDK.AuthConfig.Delegatednow also has a way to pass in client id/secret. The SDK will use this if the provided user access token is not working in order to present the user with the login flow. If the passed in token is not working and no client id/secret was passed in, thesetupflow will end in aSetupFailure.
v1.3.1-hf01 (2026-02-03) - PosLink Windows only
Changes from v1.3.1 (1.3.1 should not be used for PosLink - Windows SDK, use 1.3.1-hf01 instead)
Windows - PosLink
- Fixed an issue with the
initializerequest introduced with 1.3.0
v1.3.1 (2026-01-26)
Changes from v1.2.0 (1.3.0 was dropped, use 1.3.1 instead)
Summary
- Added DCC and transaction timestamp information on payment result related APIs.
- Added an optional
debugErrorMessageto APIs that can fail (for logging, reporting issues to Teya, and self-diagnosis). - Migrated to m2m tokens to avoid authorization being linked to specific users.
- Improved SSE client connection handling to avoid restarting the connection unconditionally after 10 seconds.
Android
General (PosLink & All In One)
- Added new
dccfield (aDccclass) toMetadata - Added new
transactionTimestampfield toPaymentStateDetails - Added new
debugErrorMessagefield toPaymentStateDetails,RefundResultSubscription.ResultDetailsandPaymentStateSubscription.CancellationResultInfo(previouslyPaymentStateSubscription.CancellationResultenum which is now still available under newCancellationResultInfo) - Added two new entries to
CardTypeenum:PrivateandDeferredDebit
PosLink
PosLinkSDK.Failurechanged toPosLinkSDK.SetupFailure(the former is deprecated). The new class contains the same failure type enum and also includesdebugErrorMessage, for logging, reporting issues to Teya, and self-diagnosis.
All In One
- Improved card-related data on
PaymentStateSubscription.PaymentStateDetails.Metadata.Card
Windows - PosLink
- Responses:
setup->onResponse,makePaymentAndSubscribe->onPaymentStateChanged,cancelPayment->onResultandrefundPayment->onResultnow includedebugErrorMessage, for logging, reporting issues to Teya, and self-diagnosis.makePaymentAndSubscribe->onPaymentStateChangednow hastransactionTimestampoptional field, UTC epoch milliseconds for when transaction occurred.makePaymentAndSubscribe->onPaymentStateChangedmetadataobject now hasdccoptional field, aDccjson object (check Windows API Reference for details).makePaymentAndSubscribe->onPaymentStateChangedmetadata.card.typeenum has two additional possible values:PrivateandDeferredDebit.
iOS - PosLink
PosLinkSDKFailurechanged toPosLinkSDKSetupFailure.- Fixed an issue with a stuck loading UI in some edge cases.
v1.2.0 (2025-11-03)
Changes from v1.1.0
Android
General
GatewayTransactionId,GatewayPaymentId,GatewayRefundIdwere moved fromcom.teya.unifiedepossdktocom.teya.unifiedepossdk.modelsTeyaCommonTransactionsApi.Typeenum was moved tocom.teya.unifiedepossdk.models.IntegrationType- New
TeyaCommonPrintingApiwith two functionsprintCustomTemplateandprintCustomImage
PosLink
- Minimum versions changed to:
compileSdkVersion->36Android Gradle Plugin->8.9.3
setupTransactionsApideprecated. Usesetupinstead.TeyaCommonTransactionsApiis now available through a property calledtransactionsApithat is always available. It is technically nullable, but will not be null ever inside theonSuccesscallback of the setup call, and for all usages between that and a clear method call.- Added
transactionsApiproperty toPosLinkSDKinterface - Added
printingApithat returns aTeyaCommonPrintingApi, ifsetupwas successful and no clear method was called. This printing API allows you to print receipts on the payments card machine.
All In One
MissedResponseListeneronMissedCustomReceiptResponseaddedReceiptPrintingApi.PrintResultchanged toPrintStateDetailsononMissedReceiptResponse
ReceiptPrintingApichanged toAioReceiptPrintingApi- Has the same method for printing a transaction receipt
- The way to get the result of that receipt has changed to be consistent with Custom Receipt actions
- Has two new methods for printing custom receipts
printCustomTemplateandprintCustomImage
setupReceiptPrintingApi()changed toprintingApi
Windows - PosLink
- Added new request method
printCustomTemplate - Added new request method
printCustomImage
iOS - PosLink
- Added
TeyaCommonTransactionsApi - Added
transactionsApiproperty toPosLinkSDKinterface - Added
printingApithat returns aTeyaCommonPrintingApi, ifsetupwas successful and no clear method was called. This printing API allows you to print receipts on the payments card machine.
v1.1.0 (2025-10-13)
Changes from v1.0.1
Android - PosLink
- Support API 21
- Minimum supported version of Kotlin is now 2.1.21 (up from 2.0.0)
- In Progress Teya UI will now be more granular and provide additional information about what is happening in the Teya card machine.
- Added
InProgressStatetoPaymentStateDetailsupdates
Windows - PosLink
- In Progress Teya UI will now be more granular and provide additional information about what is happening in the Teya card machine.
- Added
inProgressStatetomakePaymentAndSubscribe->onPaymentStateChangedresponse type
iOS - PosLink
- First release of iOS SDK for PosLink
General
- Translation improvements
v1.0.1 (2025-08-04)
Changes from v1.0.0
Windows - PosLink
Fixed: Resolved a self-cleanup issue. The SDK app process will now automatically terminate itself when the ePOS app process exits.
All Platforms - PosLink & All In One
- Hungarian Forint (HUF) currency improvements:
- Fixed inconsistencies between refund and payment APIs. Both APIs now expect real minor units, as documented.
- All amounts provided by the SDK will now be consistent with this behavior:
- Example: Consumers should pass 98700 for an amount of 987 HUF.
- Note: If an amount that doesn't end with '00' is received for HUF, the SDK will throw an exception (or return an error response for Windows).
- This update aligns with the ISO 4217 standard, which specifies two minor units for HUF, even though they are not commonly used in practice.