Recognizer SDK (2.5.0)
- Breaking:
com.microblink.ProductLookupis no longer public. This interface was never intended for public use, and its name now belongs to the newcom.microblink.core.ProductLookupmodel described below. Remove any references to the old interface. - New: UPC product lookup is available again.
RecognizerClient().lookup(upc)returns aTask<ProductLookup>with the product's name, brand, and URL, and whether the product is rewarded or its brand participates. Pass aCancellationTokenaslookup(upc, token)to abandon the request, which cancels the task. The task never fails otherwise: network or server errors are reported inProductLookup.message, and an unknown UPC returns an emptyProductLookup. Kotlin callers can tie the lookup to a coroutine withlookup(upc, cts.token).await(cts), which requireskotlinx-coroutines-play-services. This replacescom.microblink.barcode.RecognizerClient, which was removed with the barcode module.- The module now exposes
com.google.android.gms:play-services-tasksas an API dependency, soTaskandCancellationTokenresolve at compile time.
- The module now exposes
- New: last-resort merchant lookup at the end of a scan. When a US scan ends with no merchant after every other merchant detector has come up empty, the SDK now queries the Trip Resolution service. If a merchant comes back within 4 seconds, it fills
ScanResults.merchantNamewithmerchantSourceset toTRIP_RESOLUTION.retailerIdis filled from the result only when no retailer was already detected and the banner is a knownRetailervalue; otherwise it staysUNKNOWN. A failed, empty, or late response leaves the merchantnullwithout surfacing an error. Duplicate detection and promotion validation now run after this lookup resolves, so they use the resolved merchant.- Action required if your app restricts outbound traffic: add
api.actualplatform.comto your allow-list. - The lookup is US-only and honors your license's networking, PII, and in-scan restrictions.
- For Camera UI and direct
RecognizerViewintegrations, it runs on the final pass started byfinishedScanning()and adds at most 4 seconds, only when the scan has no merchant.
- Action required if your app restricts outbound traffic: add
- New:
RecognizerView.preliminaryResults(boolean tripResolution). Requests a preliminary snapshot that also runs the Trip Resolution lookup when the merchant is still missing; the no-argument overload is unchanged. These snapshots reportPreliminaryResult.tripResolutionRequested() == true, andPreliminaryResultgains a matching four-argument constructor. Request it once, for the snapshot you will treat as final, since each request can wait up to 4 seconds. If the pass cannot run, or the scan is not eligible (non-US, or networking disabled by your license), you receive an empty snapshot that is still flaggedtripResolutionRequested(); keep the snapshot you already have. In an activation session (ScanOptions.activation()), the pass skips promotion validation. - Improved receipt data extraction. Merchant, date, total, and product details are recognized more reliably. No integration changes are required.
- Dates: lowercase month abbreviations (
15-jun-2026) and more compact date-time formats (Jul6202611:46AM,Jul 23 1:50pM,Jul 17 2026 at 7:26:12 AM). - Transaction IDs:
CHK,Ticket:, andOrder Id:values are now recognized, with tighter validation to reduce false positives. - Duplicate detection now uses the authorization code attached to the receipt's last payment method.
- Line items: once a receipt's subtotal balances against its products and discounts, later frames no longer add duplicate line items.
- Merging frames into the scan results is faster on long receipts.
- Dates: lowercase month abbreviations (
- Fixed: a native crash while exporting scan results for receipts with certain coupon layouts, where a coupon's linked description line held no product or coupon description.
- Merchant-detection data sent with scan summaries and duplicate checks now keeps the receipt's phone number (the phone match source is reported separately) and includes long-tail merchant matches.
- Stability fixes and improvements
Account Linking SDK (2.5.0)
- New error code:
REAUTHENTICATION_REQUIRED(1010). When a retailer requires a human step during a background or order-fetch session, the SDK now reportsREAUTHENTICATION_REQUIREDinstead of a genericINTERNAL_ERROR, so your app can ask the user to sign in again in the foreground. It is non-recoverable and does not include a WebView. The code matches the iOS SDK. - Fixed: some retailer errors were reported as
INTERNAL_ERRORinstead ofPARSING_FAILURE. This covers unsupported pages, unexpected retailer errors, and user-input timeouts. If your app special-casesINTERNAL_ERROR, these sessions now arrive asPARSING_FAILURE. Recoverability is unchanged: both are non-recoverable, with no WebView. - Stability fixes and improvements
Camera SDK (2.5.0)
- Fixed: the camera did not open on Android 7.0–9 when only the
CAMERApermission was granted.CameraViewalso requiredWRITE_EXTERNAL_STORAGEon API 28 and below, so apps that requested onlyCAMERAreceivedonPermissionDenied()and never showed a preview. The camera never needed storage access: frames stay in memory, and anything persisted goes to app-specific storage.CAMERAis now the only permission checked on every supported API level. If you added the storage permission as a workaround, you can remove it. - Stability fixes and improvements
Camera UI SDK (2.5.0)
- Activation flow: scans with no merchant now run the Trip Resolution lookup before they are handed to the Activation SDK. The camera requests one extra preliminary pass. In device testing this added about 3 seconds, and it is capped at 8 seconds, after which the snapshot is handed over without it. The pass is skipped when the scan already has a merchant, fails the receipt check, is outside the US, or networking is disabled by your license. Like the activation final pass, it skips promotion validation, which the Activation SDK performs itself. As a result, its snapshot carries no
qualifiedPromotions,unqualifiedPromotions, orqualifiedSurveys, even whenScanOptions.validatePromotions()is set. - Stability fixes and improvements
Core SDK (2.5.0)
- New:
ScanResults.merchantDetection. Exposes the signals behind the scan's merchant (phone, logo, text, tax ID, CSV, product search, long-tail, and Trip Resolution matches), so a mis-detected merchant can be traced to the detector responsible for it. It isnullwhen no detector produced a signal. These signals are not yet passed to the Activation SDK; that requires Activation SDK 1.3.0. - New:
com.microblink.core.ProductLookup, the result model for UPC product lookup. It is aParcelablewith nullableupc,name,url,brand, andmessage, plusisRewarded()andisBrandParticipates(), which default tofalse. - Stability fixes and improvements
Digital SDK (2.5.0)
- Stability fixes and improvements
Digital Analytics SDK (2.5.0)
- Stability fixes and improvements
Earnings SDK (2.5.0)
- Stability fixes and improvements
Logcat SDK (2.5.0)
- Stability fixes and improvements
Security SDK (2.5.0)
- Stability fixes and improvements
Surveys SDK (2.5.0)
- Stability fixes and improvements