{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["tabs","tab"]},"redocly_category":"SDK Reference","type":"markdown"},"seo":{"title":"Overview","description":"Everything about Mosaic Journeys, SDKs, and APIs","siteUrl":"https://developer.transmitsecurity.com"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"overview","__idx":0},"children":["Overview"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cordova-plugin-identity-orchestration"]}," plugin runs Mosaic ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/concepts/journeys_overview"},"children":["Journeys"]}," from a Cordova app on iOS and Android. A journey is a server-driven flow: you start it by id, the SDK reports each step the client needs to handle, and you answer with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["submitClientResponse"]}," until the journey completes or is rejected."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The plugin exposes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cordova.tsido"]},". Journey state is pushed to a listener. It is not the return value of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["startJourney()"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For native SDK behavior, see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/getting-started/quick_start_ios"},"children":["iOS quickstart"]}," and the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/getting-started/quick_start_android"},"children":["Android quickstart"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"capabilities","__idx":1},"children":["Capabilities"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Start a journey and receive each step on a listener"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Submit a client response, including cancel, fail, and resend"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Start a mobile approve journey from a push payload"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Register an APNs or FCM token for mobile approve"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Generate a debug PIN for a journey paused on a debug break"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"requirements","__idx":2},"children":["Requirements"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cordova-ios"]}," 8.0.0 or higher"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cordova-android"]}," 14.0.1 or higher"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["iOS 13.0 or higher, Xcode 16 or higher (Swift Package Manager must reach GitHub)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Android ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["minSdk"]}," 24 (the SDK floor is API 21), ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["compileSdk"]}," 35"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["android.useAndroidX=true"]}," (cordova-android 14 sets this by default)"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"installation","__idx":3},"children":["Installation"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"cordova plugin add https://github.com/TransmitSecurity/cordova_ts_identity_orchestration_plugin.git#v1.0.0\ncordova platform add ios android\ncordova prepare ios android\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"platform-configuration","__idx":4},"children":["Platform configuration"]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"iOS","disable":false},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Set the deployment target in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["config.xml"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"xml","header":{"controls":{"copy":{}}},"source":"<platform name=\"ios\">\n    <preference name=\"deployment-target\" value=\"13.0\" />\n</platform>\n","lang":"xml"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Xcode resolves ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["IdentityOrchestration"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TSCoreSDK"]}," through Swift Package Manager on the first build. If it does not, use ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["File"]}," → ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Packages"]}," → ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Resolve Package Versions"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This plugin does not use CocoaPods. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cordova prepare"]}," removes the unused CocoaPods files that cordova-ios generates, so the iOS project stays on Swift Package Manager."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When a journey uses the camera or Face ID, add the usage strings yourself. The plugin does not request permissions it cannot know you need:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"xml","header":{"controls":{"copy":{}}},"source":"<platform name=\"ios\">\n    <config-file target=\"*-Info.plist\" parent=\"NSCameraUsageDescription\">\n        <string>Used to capture identity documents.</string>\n    </config-file>\n    <config-file target=\"*-Info.plist\" parent=\"NSFaceIDUsageDescription\">\n        <string>Used to authenticate you.</string>\n    </config-file>\n</platform>\n","lang":"xml"},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Android","disable":false},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["minSdk"]}," in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["config.xml"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"xml","header":{"controls":{"copy":{}}},"source":"<platform name=\"android\">\n    <preference name=\"android-minSdkVersion\" value=\"24\" />\n</platform>\n","lang":"xml"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The plugin adds the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["INTERNET"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ACCESS_NETWORK_STATE"]}," permissions, the Transmit Security Maven repository, and the SDK dependency."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Two ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["after_prepare"]}," hooks run on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cordova prepare"]},":"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Kotlin compilation is turned back on. cordova-android sets ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["IS_GRADLE_PLUGIN_KOTLIN_ENABLED"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]}," on every prepare, which makes Gradle skip the plugin's Kotlin file. A missing plugin at runtime is the symptom. Android Studio can still index the Kotlin when the flag is off."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The Gradle wrapper is pinned to the cordova-android version. Android Studio may bump the wrapper to 9.x, which AGP 8.7.x rejects with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Cannot select root node 'debugRuntimeClasspathCopy'"]},"."]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"credentials","__idx":5},"children":["Credentials"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["initializeSDK()"]}," reads credentials from a native config file. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["initialize(clientId, options)"]}," takes them in JavaScript. Use one of the two."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"iOS","disable":false},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Ship ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TransmitSecurity.plist"]}," as a resource:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"xml","header":{"controls":{"copy":{}}},"source":"<platform name=\"ios\">\n    <resource-file src=\"resources/ios/TransmitSecurity.plist\" target=\"TransmitSecurity.plist\" />\n</platform>\n","lang":"xml"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"xml","header":{"controls":{"copy":{}}},"source":"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n    <key>credentials</key>\n    <dict>\n        <key>baseUrl</key>\n        <string>https://api.transmitsecurity.io/</string>\n        <key>clientId</key>\n        <string>YOUR_CLIENT_ID</string>\n        <key>applicationId</key>\n        <string>default_application</string>\n    </dict>\n</dict>\n</plist>\n","lang":"xml"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["configurationFile"]}," argument is the iOS plist basename. Android ignores it and reads string resources."]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Android","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"xml","header":{"controls":{"copy":{}}},"source":"<resources>\n    <string name=\"transmit_security_client_id\">YOUR_CLIENT_ID</string>\n    <string name=\"transmit_security_base_url\">https://api.transmitsecurity.io/</string>\n    <string name=\"transmit_security_app_id\">default_application</string>\n</resources>\n","lang":"xml"},"children":[]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use the API base URL for your region:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Region"},"children":["Region"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Base URL"},"children":["Base URL"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["US"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://api.transmitsecurity.io/"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["EU"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://api.eu.transmitsecurity.io/"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Canada"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://api.ca.transmitsecurity.io/"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Australia"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://api.au.transmitsecurity.io/"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Japan"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://api.gasne1-ts01.transmitsecurity.io/"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Sandbox"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://api.sbx.transmitsecurity.io/"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Custom domain"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://<your-custom-domain>/"]}," (see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/deployment/custom_domains"},"children":["Custom domains"]},")"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"initialization","__idx":6},"children":["Initialization"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Register a journey listener before you start a journey. The plugin buffers events until the first listener attaches, on the native side and in JavaScript, up to 50 events. Treat that buffer as a safety net for the startup race."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"document.addEventListener('deviceready', function () {\n  cordova.tsido.addJourneyResponseListener(onJourneyEvent);\n\n  cordova.tsido.setLoggingEnabled(true)\n    .then(function () { return cordova.tsido.initializeSDK('TransmitSecurity'); })\n    .catch(function (e) { console.error('init failed', e); });\n}, false);\n","lang":"javascript"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["initializeSDK()"]}," with no argument uses the default plist name ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TransmitSecurity"]},". Or pass an explicit client ID:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"await cordova.tsido.initialize('YOUR_CLIENT_ID', {\n  serverPath: 'https://api.transmitsecurity.io',\n});\n","lang":"javascript"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/sdk-ref/cordova-ts-identity-orchestration/interfaces/initializeoptions"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["InitializeOptions"]}]}," for the full options object."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"next-steps","__idx":7},"children":["Next steps"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/getting-started/quick_start_cordova"},"children":["Orchestration quickstart: Cordova"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/sdk-ref/cordova-ts-identity-orchestration/functions"},"children":["Orchestration functions"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/concepts/journeys_overview"},"children":["Journeys overview"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/sdk-ref/cordova-ts-authentication/authentication_overview"},"children":["Authentication SDK"]}," for passkey, biometric, and TOTP steps that this plugin cannot complete on its own"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/sdk-ref/cordova-ts-accountprotection/drs_overview"},"children":["Fraud Prevention SDK"]}," for the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drsTriggerAction"]}," step"]}]}]},"headings":[{"value":"Overview","id":"overview","depth":1},{"value":"Capabilities","id":"capabilities","depth":2},{"value":"Requirements","id":"requirements","depth":2},{"value":"Installation","id":"installation","depth":2},{"value":"Platform configuration","id":"platform-configuration","depth":2},{"value":"Credentials","id":"credentials","depth":2},{"value":"Initialization","id":"initialization","depth":2},{"value":"Next steps","id":"next-steps","depth":2}],"frontmatter":{"title":"Orchestration SDK for Cordova","markdown":{"toc":{"depth":2}},"seo":{"title":"Overview"}},"lastModified":"2026-11-01T15:01:49.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/sdk-ref/cordova-ts-identity-orchestration/orchestration_overview","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}