License key
Sign in at app.servquik.io, open Connect, and copy the key (sq_live_ plus 32 hex characters). A key from org A never appears for org B.
Each platform has its own SDK. You init with the organization license key from the portal. Agents signed into that org are the only people who can see the device. The live view starts only after the customer enters the 6-digit code. The SDK connects on its own — you do not pass a server URL.
Sign in at app.servquik.io, open Connect, and copy the key (sq_live_ plus 32 hex characters). A key from org A never appears for org B.
Pass the same ID the agent will look up — 3 to 64 characters, no spaces. Set it after login. Do not invent a guest UUID on every launch.
Call blockScreen when a payment or WebView opens. Call unblockScreen when that screen closes. The shopper still sees the real UI. The agent does not.
The same sequence on every platform. The SDK draws the consent overlay and connects by itself. You do not pass a server URL.
sq_live_ plus 32 hex characters). Do not commit a real key.init with that key, a stable userId (3–64 characters, no spaces), and a display name. This is the ID the agent looks up. Do not mint a new guest id on every launch.stop. When they log in again, call init or setUser with the same id.blockScreen. When that screen closes, call unblockScreen.Names differ slightly by language. The behaviour is the same. init already connects — you only call start after stop.
| Call | When to use it |
|---|---|
init | Once after login. Pass licenseKey, userId, optional displayName and appVersion. Invalid keys do not stay connected. |
start | Reconnect after stop. Not required right after init. |
stop | Logout or when you want the device off the portal list. |
setUser | The shopper’s id or name changed after init (for example they edited their profile). |
isConnected | true when this device is listed for the org. Use it for a “Live support ready” chip. |
blockScreen | A sensitive screen is on screen (checkout, payment, bank WebView). |
unblockScreen | That screen is gone. Pair this with the screen’s close / dispose / cleanup. |
deviceInfo | Optional. Returns device name, OS version, and platform for your own UI. |
blockScreen is a single on/off switch for what the agent sees. The shopper still uses the real checkout. The portal shows Blocked for security reasons until you call unblockScreen.
unblockScreen, the rest of the session stays hidden from support.reason (usually webview) is a tag. It does not change the shopper UI.Pick the SDK that matches the app. Each tab has install, init after login, and how to hide checkout. Full READMEs live in the GitLab repos.
In settings.gradle.kts add JitPack, then in the app module:
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven { url = uri("https://jitpack.io") }
}
}
// app/build.gradle.kts
dependencies {
implementation("com.gitlab.Serbus:servquik-sdk-android:0.1.2")
}minSdk 24. The library requests INTERNET. From source instead of JitPack: implementation(project(":servquik")).
Call init once the shopper has a stable user ID. Safe from Application or after your login activity succeeds. Do not call it with a placeholder key.
ServQuik.init(
context,
ServQuikConfig(
licenseKey = "sq_live_YOUR_LICENSE_KEY",
userId = shopperId,
displayName = "Asha",
appVersion = "1.0.0",
),
)Optional listener: onInvalidLicense, onConnected, onError. If the shopper’s name changes later, call ServQuik.setUser(shopperId, name). On logout call ServQuik.stop().
Block in onCreate of the payment activity. Unblock in onDestroy so a configuration change that finishes the activity does not leave the session blocked.
class CheckoutActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ServQuik.blockScreen("webview")
// setContentView / WebView …
}
override fun onDestroy() {
ServQuik.unblockScreen()
super.onDestroy()
}
}| Call | Notes |
|---|---|
init(context, ServQuikConfig) | Activates the key and lists the device. userId is required. |
start() / stop() | Reconnect or drop the device from the list. |
setUser(userId, displayName) | After profile edits. |
isConnected() | For a header chip. |
blockScreen(reason) / unblockScreen() | Pair with the payment activity lifecycle. |
deviceInfo() | deviceName, osVersion, platform. |
CocoaPods:
pod 'ServQuik', '0.1.2'Or Swift Package Manager in Xcode: File → Add Package Dependencies… and add https://gitlab.com/Serbus/servquik-sdk-ios.git.
init is a Swift keyword, so call it as ServQuik.`init`(…). Run this after the shopper signs in. Set ServQuik.onError if you want to catch invalid_license.
import ServQuik
ServQuik.onError = { message in
print(message) // e.g. invalid_license
}
ServQuik.`init`(
licenseKey: "sq_live_YOUR_LICENSE_KEY",
userId: shopperId,
displayName: "Asha",
appVersion: "1.0.0"
)Later profile changes: ServQuik.setUser(userId: shopperId, displayName: "Asha"). Logout: ServQuik.stop().
Block when the payment view appears. Unblock when it disappears.
.onAppear { ServQuik.blockScreen(reason: "webview") }
.onDisappear { ServQuik.unblockScreen() }UIKit equivalent: viewWillAppear / viewWillDisappear (or viewDidDisappear if you push another payment screen on top — keep a single owner for the flag).
| Call | Notes |
|---|---|
ServQuik.`init`(...) | Activates the key and lists the device. |
start() / stop() | Reconnect or drop the device. |
setUser(userId:displayName:) | After profile edits. |
isConnected() | For a header chip. |
blockScreen(reason:) / unblockScreen() | Pair with appear / disappear. |
deviceInfo() | deviceName, osVersion, platform. |
onError | Optional callback. Invalid keys arrive as invalid_license. |
dependencies:
servquik: ^0.1.3Then flutter pub get. Git fallback:
dependencies:
servquik:
git:
url: https://gitlab.com/Serbus/servquik-sdk-flutter.git
ref: 0.1.3No extra native permissions.
Wrap the navigator with ServQuikHost so the consent overlay sits above every route. Put it in MaterialApp.builder. Call init after the shopper signs in.
await ServQuik.init(
licenseKey: 'sq_live_YOUR_LICENSE_KEY',
userId: shopperId, // 3–64 chars, no spaces
displayName: 'Asha',
appVersion: '1.0.0',
);
MaterialApp(
builder: (context, child) => ServQuikHost(
child: child ?? const SizedBox.shrink(),
),
home: const HomePage(),
);You do not need start() unless you already called stop(). Logout: ServQuik.stop().
Prefer ServQuikBlock. It calls blockScreen while the widget is mounted and unblockScreen on dispose.
return ServQuikBlock(
reason: 'webview',
child: CheckoutPage(),
);Or call the methods yourself in the page’s initState / dispose. Do not nest two ServQuikBlock widgets — the flag is not a stack.
| Call | Notes |
|---|---|
ServQuik.init | Activates the key and lists the device. |
ServQuikHost | Required around the navigator. |
ServQuikBlock | Wrap a payment or WebView route. |
blockScreen / unblockScreen | Manual alternative to the widget. |
setUser / isConnected / deviceInfo | Same roles as the other SDKs. |
npm install @servquik/react-native @react-native-async-storage/async-storage react-native-view-shotUse a development build (npx expo run:ios / npx expo run:android). Expo Go can list the device and show consent, but not a live view.
Wrap the tree with ServQuikRoot so the consent overlay can sit above navigation. Call init after the shopper signs in. Call stop on logout or when the root unmounts.
import { useEffect } from 'react';
import { ServQuik, ServQuikRoot } from '@servquik/react-native';
export default function App() {
useEffect(() => {
void ServQuik.init({
licenseKey: 'sq_live_YOUR_LICENSE_KEY',
userId: shopperId,
displayName: 'Asha',
appVersion: '1.0.0',
});
return () => ServQuik.stop();
}, [shopperId]);
return (
<ServQuikRoot>
{/* your navigation */}
</ServQuikRoot>
);
}Block when the payment screen mounts. Unblock in the effect cleanup so leaving the screen restores the live view.
useEffect(() => {
ServQuik.blockScreen('webview');
return () => ServQuik.unblockScreen();
}, []);| Call | Notes |
|---|---|
ServQuikRoot | Required around the app. |
init({ licenseKey, userId, displayName?, appVersion? }) | After login. |
setUser({ userId, displayName }) | After profile edits. |
blockScreen(reason?) / unblockScreen() | Pair with the screen’s useEffect. |
isConnected() / deviceInfo() | Chip and device metadata. |
npm install @servquik/capacitorCall init once the shopper has a stable user ID. If you only call init, the device still connects. Call stop on logout.
import { ServQuik } from '@servquik/capacitor';
await ServQuik.init({
licenseKey: 'sq_live_YOUR_LICENSE_KEY',
userId: shopperId,
displayName: 'Asha',
appVersion: '1.0.0',
});Block when the payment route is active. Unblock when you leave it.
useEffect(() => {
if (route === 'checkout') ServQuik.blockScreen('webview');
else ServQuik.unblockScreen();
}, [route]);| Call | Notes |
|---|---|
init({ licenseKey, userId, displayName?, appVersion? }) | After login. |
start() / stop() | Reconnect or drop the device. |
setUser({ userId, displayName }) | After profile edits. |
blockScreen(reason?) / unblockScreen() | Pair with the payment route. |
isConnected() / deviceInfo() | Chip and device metadata. |
npm install @servquik/webimport ServQuik from '@servquik/web';No bundler — same file on unpkg: https://unpkg.com/@servquik/web@0.1.2/dist/servquik.js.
<script src="https://cdn.jsdelivr.net/npm/@servquik/web@0.1.2/dist/servquik.js"></script>Call init once the shopper has a stable user ID in this tab. init already connects. Call stop on logout.
ServQuik.init({
licenseKey: 'sq_live_YOUR_LICENSE_KEY',
userId: shopperId, // 3–64 chars, no spaces
displayName: 'Asha',
appVersion: '1.0.0',
});Block when checkout is shown. Unblock when the shopper leaves that page.
function showCheckout() {
ServQuik.blockScreen('webview');
// render checkout …
}
function leaveCheckout() {
ServQuik.unblockScreen();
}| Call | Notes |
|---|---|
init({ licenseKey, userId, displayName?, appVersion? }) | After login. |
start() / stop() | Reconnect or drop this tab from the list. |
setUser({ userId, displayName }) | After profile edits. |
blockScreen(reason?) / unblockScreen() | Pair with showing / hiding checkout. |
isConnected() / deviceInfo() | Chip and device metadata. |
Need a hand wiring this into a host app? Email support@servquik.io.