{"id":1888,"date":"2026-07-30T09:00:00","date_gmt":"2026-07-30T14:00:00","guid":{"rendered":"https:\/\/tolinku.com\/blog\/?p=1888"},"modified":"2026-03-07T03:50:17","modified_gmt":"2026-03-07T08:50:17","slug":"kotlin-multiplatform-deep-links","status":"publish","type":"post","link":"https:\/\/tolinku.com\/blog\/kotlin-multiplatform-deep-links\/","title":{"rendered":"Deep Linking with Kotlin Multiplatform (KMP)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Kotlin Multiplatform (KMP) lets you share business logic between iOS and Android while keeping platform-specific UI and APIs. Deep link handling fits this model well: URL parsing and route matching are pure logic (shared), while receiving URLs and performing navigation are platform-specific. This article walks through building a shared deep link router in KMP.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For Android-specific deep link patterns, see <a href=\"https:\/\/tolinku.com\/blog\/kotlin-deep-link-handling\/\">Kotlin deep link handling: modern Android patterns<\/a>. For the cross-platform overview, see <a href=\"https:\/\/tolinku.com\/blog\/cross-platform-deep-linking-guide\/\">cross-platform deep linking guide for 2026<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Architecture<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">KMP projects use <code>expect<\/code>\/<code>actual<\/code> declarations for platform-specific code. For deep linking:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Shared module (<code>commonMain<\/code>)<\/strong>: URL parsing, route matching, parameter extraction<\/li>\n<li><strong>Android (<code>androidMain<\/code>)<\/strong>: Intent handling, Activity navigation<\/li>\n<li><strong>iOS (<code>iosMain<\/code>)<\/strong>: Universal Link handling, UIKit\/SwiftUI navigation<\/li>\n<\/ul>\n\n\n\n<pre><code>commonMain\/\n  DeepLinkRouter.kt       \/\/ Route matching logic\n  DeepLinkAction.kt       \/\/ Action types\n  UrlParser.kt            \/\/ URL parsing utilities\n\nandroidMain\/\n  AndroidDeepLinkHandler.kt   \/\/ Intent \u2192 action\n  AndroidNavigator.kt         \/\/ Activity\/Fragment navigation\n\niosMain\/\n  IosDeepLinkHandler.kt       \/\/ NSUserActivity \u2192 action\n  IosNavigator.kt             \/\/ UIKit navigation\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Shared Module: Route Matching<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Route Definition<\/h3>\n\n\n\n<pre><code class=\"language-kotlin\">\/\/ commonMain\/DeepLinkRouter.kt\n\ndata class RouteMatch(\n    val screen: String,\n    val params: Map&lt;String, String&gt;\n)\n\ndata class RoutePattern(\n    val regex: Regex,\n    val screen: String,\n    val paramNames: List&lt;String&gt;\n)\n\nobject DeepLinkRouter {\n    private val routes: List&lt;RoutePattern&gt; = listOf(\n        routePattern(&quot;\/products\/{productId}&quot;, &quot;ProductDetail&quot;),\n        routePattern(&quot;\/offers\/{offerId}&quot;, &quot;OfferDetail&quot;),\n        routePattern(&quot;\/referral\/{referrerId}&quot;, &quot;Referral&quot;),\n        routePattern(&quot;\/categories\/{categoryId}\/products&quot;, &quot;CategoryProducts&quot;),\n        routePattern(&quot;\/search&quot;, &quot;Search&quot;)\n    )\n\n    fun match(urlString: String): RouteMatch? {\n        val parsed = parseUrl(urlString) ?: return null\n        val path = parsed.path\n\n        for (route in routes) {\n            val matchResult = route.regex.matchEntire(path) ?: continue\n            val params = mutableMapOf&lt;String, String&gt;()\n\n            route.paramNames.forEachIndexed { index, name -&gt;\n                params[name] = matchResult.groupValues[index + 1]\n            }\n\n            \/\/ Add query parameters\n            parsed.queryParams.forEach { (key, value) -&gt;\n                params[key] = value\n            }\n\n            return RouteMatch(screen = route.screen, params = params)\n        }\n\n        return null\n    }\n\n    private fun routePattern(pattern: String, screen: String): RoutePattern {\n        val paramNames = mutableListOf&lt;String&gt;()\n        val regexStr = pattern.replace(Regex(&quot;\\\\{([^}]+)\\\\}&quot;)) { matchResult -&gt;\n            paramNames.add(matchResult.groupValues[1])\n            &quot;([^\/]+)&quot;\n        }\n        return RoutePattern(\n            regex = Regex(&quot;^$regexStr$&quot;),\n            screen = screen,\n            paramNames = paramNames\n        )\n    }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">URL Parser<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">KMP does not have <code>java.net.URL<\/code> in common code. Write a simple parser or use a multiplatform library like <a href=\"https:\/\/ktor.io\/docs\/client-requests.html\" rel=\"nofollow noopener\" target=\"_blank\">Ktor&#39;s <code>Url<\/code><\/a>:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">\/\/ commonMain\/UrlParser.kt\n\ndata class ParsedUrl(\n    val scheme: String,\n    val host: String,\n    val path: String,\n    val queryParams: Map&lt;String, String&gt;\n)\n\nfun parseUrl(urlString: String): ParsedUrl? {\n    \/\/ Basic URL parsing for deep link purposes\n    val schemeEnd = urlString.indexOf(&quot;:\/\/&quot;)\n    if (schemeEnd == -1) return null\n\n    val scheme = urlString.substring(0, schemeEnd)\n    val rest = urlString.substring(schemeEnd + 3)\n\n    val pathStart = rest.indexOf(&#39;\/&#39;)\n    if (pathStart == -1) return ParsedUrl(scheme, rest, &quot;\/&quot;, emptyMap())\n\n    val host = rest.substring(0, pathStart)\n    val pathAndQuery = rest.substring(pathStart)\n\n    val queryStart = pathAndQuery.indexOf(&#39;?&#39;)\n    val path: String\n    val queryParams: Map&lt;String, String&gt;\n\n    if (queryStart == -1) {\n        path = pathAndQuery.trimEnd(&#39;\/&#39;)\n        queryParams = emptyMap()\n    } else {\n        path = pathAndQuery.substring(0, queryStart).trimEnd(&#39;\/&#39;)\n        queryParams = parseQueryString(pathAndQuery.substring(queryStart + 1))\n    }\n\n    return ParsedUrl(scheme, host, path.ifEmpty { &quot;\/&quot; }, queryParams)\n}\n\nprivate fun parseQueryString(query: String): Map&lt;String, String&gt; {\n    return query.split(&quot;&amp;&quot;)\n        .filter { it.contains(&quot;=&quot;) }\n        .associate { param -&gt;\n            val (key, value) = param.split(&quot;=&quot;, limit = 2)\n            key to value\n        }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For production use, consider the <a href=\"https:\/\/ktor.io\/docs\/client-requests.html\" rel=\"nofollow noopener\" target=\"_blank\">Ktor client URL utilities<\/a> which handle edge cases like percent-encoding.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Shared Module: Action Types<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Define typed actions so platform code does not need to interpret raw strings:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">\/\/ commonMain\/DeepLinkAction.kt\n\nsealed class DeepLinkAction {\n    data class ViewProduct(\n        val productId: String,\n        val source: String? = null\n    ) : DeepLinkAction()\n\n    data class ViewOffer(val offerId: String) : DeepLinkAction()\n\n    data class ApplyReferral(val referrerId: String) : DeepLinkAction()\n\n    data class Search(val query: String) : DeepLinkAction()\n\n    object OpenHome : DeepLinkAction()\n}\n\nfun RouteMatch.toAction(): DeepLinkAction {\n    return when (screen) {\n        &quot;ProductDetail&quot; -&gt; DeepLinkAction.ViewProduct(\n            productId = params[&quot;productId&quot;] ?: &quot;&quot;,\n            source = params[&quot;ref&quot;]\n        )\n        &quot;OfferDetail&quot; -&gt; DeepLinkAction.ViewOffer(\n            offerId = params[&quot;offerId&quot;] ?: &quot;&quot;\n        )\n        &quot;Referral&quot; -&gt; DeepLinkAction.ApplyReferral(\n            referrerId = params[&quot;referrerId&quot;] ?: &quot;&quot;\n        )\n        &quot;Search&quot; -&gt; DeepLinkAction.Search(\n            query = params[&quot;q&quot;] ?: &quot;&quot;\n        )\n        else -&gt; DeepLinkAction.OpenHome\n    }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Android Implementation<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Intent Handling<\/h3>\n\n\n\n<pre><code class=\"language-kotlin\">\/\/ androidMain\/AndroidDeepLinkHandler.kt\n\nclass AndroidDeepLinkHandler(\n    private val navigator: AndroidNavigator\n) {\n    fun handleIntent(intent: Intent) {\n        val uri = intent.data ?: return\n        handleUrl(uri.toString())\n    }\n\n    fun handleUrl(urlString: String) {\n        val route = DeepLinkRouter.match(urlString)\n        val action = route?.toAction() ?: DeepLinkAction.OpenHome\n        navigator.execute(action)\n    }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Activity Setup<\/h3>\n\n\n\n<pre><code class=\"language-kotlin\">\/\/ Android Activity\nclass MainActivity : ComponentActivity() {\n    private val deepLinkHandler by lazy {\n        AndroidDeepLinkHandler(AndroidNavigator(this))\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        \/\/ Handle deep link from launch\n        deepLinkHandler.handleIntent(intent)\n    }\n\n    override fun onNewIntent(intent: Intent) {\n        super.onNewIntent(intent)\n        \/\/ Handle deep link when app is already running\n        deepLinkHandler.handleIntent(intent)\n    }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Android Navigation<\/h3>\n\n\n\n<pre><code class=\"language-kotlin\">\/\/ androidMain\/AndroidNavigator.kt\n\nclass AndroidNavigator(private val activity: ComponentActivity) {\n    fun execute(action: DeepLinkAction) {\n        when (action) {\n            is DeepLinkAction.ViewProduct -&gt; {\n                \/\/ Using Jetpack Navigation or direct Intent\n                val intent = Intent(activity, ProductActivity::class.java).apply {\n                    putExtra(&quot;productId&quot;, action.productId)\n                    action.source?.let { putExtra(&quot;source&quot;, it) }\n                }\n                activity.startActivity(intent)\n            }\n            is DeepLinkAction.ViewOffer -&gt; {\n                val intent = Intent(activity, OfferActivity::class.java).apply {\n                    putExtra(&quot;offerId&quot;, action.offerId)\n                }\n                activity.startActivity(intent)\n            }\n            is DeepLinkAction.ApplyReferral -&gt; {\n                \/\/ Store referral code, then navigate\n                ReferralStore.save(action.referrerId)\n                val intent = Intent(activity, HomeActivity::class.java)\n                activity.startActivity(intent)\n            }\n            is DeepLinkAction.Search -&gt; {\n                val intent = Intent(activity, SearchActivity::class.java).apply {\n                    putExtra(&quot;query&quot;, action.query)\n                }\n                activity.startActivity(intent)\n            }\n            is DeepLinkAction.OpenHome -&gt; {\n                val intent = Intent(activity, HomeActivity::class.java)\n                activity.startActivity(intent)\n            }\n        }\n    }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">AndroidManifest.xml<\/h3>\n\n\n\n<pre><code class=\"language-xml\">&lt;activity\n    android:name=&quot;.MainActivity&quot;\n    android:exported=&quot;true&quot;&gt;\n\n    &lt;intent-filter android:autoVerify=&quot;true&quot;&gt;\n        &lt;action android:name=&quot;android.intent.action.VIEW&quot; \/&gt;\n        &lt;category android:name=&quot;android.intent.category.DEFAULT&quot; \/&gt;\n        &lt;category android:name=&quot;android.intent.category.BROWSABLE&quot; \/&gt;\n        &lt;data android:scheme=&quot;https&quot;\n              android:host=&quot;yourdomain.com&quot;\n              android:pathPrefix=&quot;\/products&quot; \/&gt;\n        &lt;data android:scheme=&quot;https&quot;\n              android:host=&quot;yourdomain.com&quot;\n              android:pathPrefix=&quot;\/offers&quot; \/&gt;\n        &lt;data android:scheme=&quot;https&quot;\n              android:host=&quot;yourdomain.com&quot;\n              android:pathPrefix=&quot;\/referral&quot; \/&gt;\n    &lt;\/intent-filter&gt;\n&lt;\/activity&gt;\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">iOS Implementation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For the iOS side of a KMP project, you have two options: write the handler in Kotlin (<code>iosMain<\/code>) and call it from Swift, or write it in Swift and call the shared Kotlin router.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Option 1: Kotlin <code>iosMain<\/code> with Swift Caller<\/h3>\n\n\n\n<pre><code class=\"language-kotlin\">\/\/ iosMain\/IosDeepLinkHandler.kt\n\nclass IosDeepLinkHandler {\n    fun handleUrl(urlString: String): DeepLinkAction {\n        val route = DeepLinkRouter.match(urlString)\n        return route?.toAction() ?: DeepLinkAction.OpenHome\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call from Swift:<\/p>\n\n\n\n<pre><code class=\"language-swift\">\/\/ AppDelegate.swift\nimport shared \/\/ KMP shared framework\n\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n    let deepLinkHandler = IosDeepLinkHandler()\n\n    func application(_ application: UIApplication,\n                     continue userActivity: NSUserActivity,\n                     restorationHandler: @escaping ([UIUserActivityRestoring]?) -&gt; Void) -&gt; Bool {\n        guard let url = userActivity.webPageUrl else { return false }\n\n        let action = deepLinkHandler.handleUrl(urlString: url.absoluteString)\n        navigate(action: action)\n        return true\n    }\n\n    private func navigate(action: DeepLinkAction) {\n        switch action {\n        case let product as DeepLinkAction.ViewProduct:\n            \/\/ Navigate to product screen\n            let vc = ProductViewController(productId: product.productId)\n            rootNavigationController?.pushViewController(vc, animated: true)\n\n        case let offer as DeepLinkAction.ViewOffer:\n            let vc = OfferViewController(offerId: offer.offerId)\n            rootNavigationController?.pushViewController(vc, animated: true)\n\n        case let referral as DeepLinkAction.ApplyReferral:\n            ReferralStore.shared.save(referrerId: referral.referrerId)\n            \/\/ Navigate to home\n\n        default:\n            \/\/ Navigate to home\n            break\n        }\n    }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Option 2: Swift-Only with Shared Router<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If you prefer keeping the iOS navigation code entirely in Swift, just call the router:<\/p>\n\n\n\n<pre><code class=\"language-swift\">import shared\n\nfunc handleDeepLink(_ url: URL) {\n    guard let route = DeepLinkRouter.shared.match(urlString: url.absoluteString) else {\n        navigateToHome()\n        return\n    }\n\n    let action = DeepLinkActionKt.toAction(route)\n    \/\/ Handle action in Swift...\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">iOS Entitlements<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Add <code>applinks:yourdomain.com<\/code> to Associated Domains in Xcode, same as any iOS Universal Links setup.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testing the Shared Router<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The shared module can be tested with standard Kotlin tests:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">\/\/ commonTest\/DeepLinkRouterTest.kt\n\nclass DeepLinkRouterTest {\n    @Test\n    fun matchesProductUrl() {\n        val result = DeepLinkRouter.match(\n            &quot;https:\/\/yourdomain.com\/products\/abc123&quot;\n        )\n        assertNotNull(result)\n        assertEquals(&quot;ProductDetail&quot;, result.screen)\n        assertEquals(&quot;abc123&quot;, result.params[&quot;productId&quot;])\n    }\n\n    @Test\n    fun includesQueryParameters() {\n        val result = DeepLinkRouter.match(\n            &quot;https:\/\/yourdomain.com\/products\/abc123?ref=email&amp;campaign=summer&quot;\n        )\n        assertNotNull(result)\n        assertEquals(&quot;email&quot;, result.params[&quot;ref&quot;])\n        assertEquals(&quot;summer&quot;, result.params[&quot;campaign&quot;])\n    }\n\n    @Test\n    fun returnsNullForUnknownPath() {\n        val result = DeepLinkRouter.match(\n            &quot;https:\/\/yourdomain.com\/unknown\/path&quot;\n        )\n        assertNull(result)\n    }\n\n    @Test\n    fun convertToViewProductAction() {\n        val route = DeepLinkRouter.match(\n            &quot;https:\/\/yourdomain.com\/products\/abc123?ref=email&quot;\n        )!!\n        val action = route.toAction()\n        assertTrue(action is DeepLinkAction.ViewProduct)\n        assertEquals(&quot;abc123&quot;, (action as DeepLinkAction.ViewProduct).productId)\n        assertEquals(&quot;email&quot;, action.source)\n    }\n\n    @Test\n    fun handlesTrailingSlash() {\n        val result = DeepLinkRouter.match(\n            &quot;https:\/\/yourdomain.com\/products\/abc123\/&quot;\n        )\n        assertNotNull(result)\n        assertEquals(&quot;abc123&quot;, result.params[&quot;productId&quot;])\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">These tests run on all KMP targets (JVM, Native, JS), verifying the routing logic works identically everywhere.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Gradle Configuration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Add the shared module dependency to both platform targets:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">\/\/ shared\/build.gradle.kts\nkotlin {\n    androidTarget()\n    iosX64()\n    iosArm64()\n    iosSimulatorArm64()\n\n    sourceSets {\n        commonMain.dependencies {\n            \/\/ No external dependencies needed for basic routing\n        }\n        commonTest.dependencies {\n            implementation(kotlin(&quot;test&quot;))\n        }\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For production URL parsing, you can add Ktor:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">commonMain.dependencies {\n    implementation(&quot;io.ktor:ktor-http:3.1.0&quot;)\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Tolinku for KMP Projects<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/tolinku.com\/features\/deep-linking\">Tolinku<\/a> hosts AASA and assetlinks.json verification files and provides <a href=\"https:\/\/tolinku.com\/docs\/concepts\/deep-linking\/\">deferred deep linking<\/a> for users who install the app after tapping a link. Configure your iOS and Android app details in the <a href=\"https:\/\/tolinku.com\/docs\/user-guide\/appspace-settings\/\">Appspace settings<\/a>, and Tolinku generates the verification files automatically. <a href=\"https:\/\/tolinku.com\/docs\/user-guide\/routes\/\">Routes<\/a> with <a href=\"https:\/\/tolinku.com\/docs\/user-guide\/routes\/dynamic-routes\/\">dynamic parameters<\/a> work with any client-side routing implementation, including KMP shared routers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For Android Kotlin patterns, see <a href=\"https:\/\/tolinku.com\/blog\/kotlin-deep-link-handling\/\">Kotlin deep link handling: modern Android patterns<\/a>. For Xamarin\/.NET MAUI, see <a href=\"https:\/\/tolinku.com\/blog\/xamarin-deep-linking\/\">Xamarin deep linking: cross-platform setup<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Implement deep linking in Kotlin Multiplatform projects. Share link parsing logic across iOS and Android with platform-specific handlers.<\/p>\n","protected":false},"author":2,"featured_media":1887,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"Deep Linking with Kotlin Multiplatform (KMP)","rank_math_description":"Implement deep linking in Kotlin Multiplatform projects. Share link parsing logic across iOS and Android with platform-specific handlers.","rank_math_focus_keyword":"Kotlin Multiplatform deep links","rank_math_canonical_url":"","rank_math_facebook_title":"","rank_math_facebook_description":"","rank_math_facebook_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-kotlin-multiplatform-deep-links.png","rank_math_facebook_image_id":"","rank_math_twitter_title":"","rank_math_twitter_description":"","rank_math_twitter_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-kotlin-multiplatform-deep-links.png","footnotes":""},"categories":[15],"tags":[25,23,156,20,24,573,34,572,69,22],"class_list":["post-1888","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engineering","tag-android","tag-app-links","tag-cross-platform","tag-deep-linking","tag-ios","tag-kmp","tag-kotlin","tag-kotlin-multiplatform","tag-mobile-development","tag-universal-links"],"_links":{"self":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1888","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/comments?post=1888"}],"version-history":[{"count":1,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1888\/revisions"}],"predecessor-version":[{"id":1889,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1888\/revisions\/1889"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media\/1887"}],"wp:attachment":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media?parent=1888"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/categories?post=1888"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/tags?post=1888"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}