{"id":565,"date":"2026-03-21T17:00:00","date_gmt":"2026-03-21T22:00:00","guid":{"rendered":"https:\/\/tolinku.com\/blog\/?p=565"},"modified":"2026-03-07T03:48:17","modified_gmt":"2026-03-07T08:48:17","slug":"jetpack-navigation-deep-links","status":"publish","type":"post","link":"https:\/\/tolinku.com\/blog\/jetpack-navigation-deep-links\/","title":{"rendered":"Jetpack Navigation and Deep Links: Setup Tutorial"},"content":{"rendered":"\n<p>The Jetpack Navigation component handles the mechanics of fragment transactions, back stack management, and argument passing. It also has first-class support for deep links, which means you can define your URL patterns in the nav graph XML and let Navigation handle routing rather than writing manual intent parsing code.<\/p>\n\n\n\n<p>This tutorial walks through setting up deep links with the Navigation component from scratch, covering the nav graph definitions, Activity setup, argument passing, nested graphs, and testing. It assumes you have already verified your App Links (the <code>assetlinks.json<\/code> file is in place and Android has confirmed the association). If not, start with our <a href=\"https:\/\/tolinku.com\/docs\/developer\/app-links\/\">Android App Links developer documentation<\/a> first.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Project Setup<\/h2>\n\n\n\n<p>Add the Navigation component dependencies to your <code>build.gradle<\/code>:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">dependencies {\n    val navVersion = &quot;2.7.7&quot;\n    implementation(&quot;androidx.navigation:navigation-fragment-ktx:$navVersion&quot;)\n    implementation(&quot;androidx.navigation:navigation-ui-ktx:$navVersion&quot;)\n}\n<\/code><\/pre>\n\n\n\n<p>The Navigation component uses a nav graph XML file to define your destinations and the connections between them. Create one at <code>res\/navigation\/nav_graph.xml<\/code> if you do not already have one.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Defining Deep Links in the Nav Graph<\/h2>\n\n\n\n<p>A deep link in the nav graph is declared as a child element of a destination. This is called an implicit deep link because it maps incoming URLs to destinations without code.<\/p>\n\n\n\n<pre><code class=\"language-xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n&lt;navigation\n    xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\n    xmlns:app=&quot;http:\/\/schemas.android.com\/apk\/res-auto&quot;\n    android:id=&quot;@+id\/nav_graph&quot;\n    app:startDestination=&quot;@id\/homeFragment&quot;&gt;\n\n    &lt;fragment\n        android:id=&quot;@+id\/homeFragment&quot;\n        android:name=&quot;com.example.app.HomeFragment&quot;\n        android:label=&quot;Home&quot; \/&gt;\n\n    &lt;fragment\n        android:id=&quot;@+id\/productDetailFragment&quot;\n        android:name=&quot;com.example.app.ProductDetailFragment&quot;\n        android:label=&quot;Product&quot;&gt;\n\n        &lt;argument\n            android:name=&quot;productId&quot;\n            app:argType=&quot;string&quot; \/&gt;\n\n        &lt;deepLink\n            android:id=&quot;@+id\/productDeepLink&quot;\n            app:uri=&quot;https:\/\/yourdomain.com\/products\/{productId}&quot; \/&gt;\n    &lt;\/fragment&gt;\n\n    &lt;fragment\n        android:id=&quot;@+id\/checkoutFragment&quot;\n        android:name=&quot;com.example.app.CheckoutFragment&quot;\n        android:label=&quot;Checkout&quot;&gt;\n\n        &lt;argument\n            android:name=&quot;cartToken&quot;\n            app:argType=&quot;string&quot; \/&gt;\n\n        &lt;argument\n            android:name=&quot;promoCode&quot;\n            app:argType=&quot;string&quot;\n            android:defaultValue=&quot;&quot; \/&gt;\n\n        &lt;deepLink\n            android:id=&quot;@+id\/checkoutDeepLink&quot;\n            app:uri=&quot;https:\/\/yourdomain.com\/checkout?token={cartToken}&amp;amp;promo={promoCode}&quot; \/&gt;\n    &lt;\/fragment&gt;\n\n&lt;\/navigation&gt;\n<\/code><\/pre>\n\n\n\n<p>The <code>{productId}<\/code> syntax in the URI template is a placeholder. Navigation extracts the value from the actual URL and passes it as a navigation argument with the same name. For path parameters like <code>\/products\/{productId}<\/code>, the value is extracted from the URL path. For query parameters like <code>?token={cartToken}<\/code>, the value is extracted from the query string.<\/p>\n\n\n\n<p>Note the <code>&amp;amp;<\/code> encoding for <code>&amp;<\/code> in XML. This is required in XML attribute values.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Activity Setup<\/h2>\n\n\n\n<p>Your Activity needs to connect the NavController to incoming intents. Add the nav graph to your <code>AndroidManifest.xml<\/code>:<\/p>\n\n\n\n<pre><code class=\"language-xml\">&lt;activity android:name=&quot;.MainActivity&quot;&gt;\n    &lt;nav-graph android:value=&quot;@navigation\/nav_graph&quot; \/&gt;\n\n    &lt;intent-filter&gt;\n        &lt;action android:name=&quot;android.intent.action.MAIN&quot; \/&gt;\n        &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; \/&gt;\n    &lt;\/intent-filter&gt;\n&lt;\/activity&gt;\n<\/code><\/pre>\n\n\n\n<p>The <code>&lt;nav-graph&gt;<\/code> element tells the build system to read your nav graph and generate the corresponding <code>&lt;intent-filter&gt;<\/code> entries in the manifest automatically at build time. You do not need to write the intent filters by hand. This is a significant advantage of using Navigation&#39;s deep link support.<\/p>\n\n\n\n<p>In your Activity:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">class MainActivity : AppCompatActivity() {\n\n    private lateinit var navController: NavController\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n\n        val navHostFragment = supportFragmentManager\n            .findFragmentById(R.id.nav_host_fragment) as NavHostFragment\n        navController = navHostFragment.navController\n\n        \/\/ Navigation component handles deep link routing automatically\n        \/\/ when activity is launched with a matching intent\n    }\n\n    override fun onNewIntent(intent: Intent) {\n        super.onNewIntent(intent)\n        navController.handleDeepLink(intent)\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>The <code>navController.handleDeepLink(intent)<\/code> call in <code>onNewIntent<\/code> is important. When your app is already running and the user clicks a deep link (with <code>android:launchMode=&quot;singleTop&quot;<\/code> or <code>singleTask<\/code>), the Activity receives <code>onNewIntent<\/code> rather than re-creating. Without this call, the navigation would not happen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Accessing Arguments in Fragments<\/h2>\n\n\n\n<p>When the Navigation component routes a deep link to a destination, it parses the URL arguments and passes them as a navigation Bundle. Access them in your Fragment using the Safe Args generated class or the arguments Bundle directly.<\/p>\n\n\n\n<p>With Safe Args (recommended):<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">class ProductDetailFragment : Fragment() {\n\n    private val args: ProductDetailFragmentArgs by navArgs()\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        val productId = args.productId\n        viewModel.loadProduct(productId)\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>Safe Args generates <code>ProductDetailFragmentArgs<\/code> from your nav graph arguments, giving you type-safe access. To enable Safe Args, add the plugin to your <code>build.gradle<\/code>:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">\/\/ build.gradle (app)\nplugins {\n    id(&quot;androidx.navigation.safeargs.kotlin&quot;)\n}\n<\/code><\/pre>\n\n\n\n<pre><code class=\"language-kotlin\">\/\/ build.gradle (project)\nbuildscript {\n    dependencies {\n        classpath(&quot;androidx.navigation:navigation-safe-args-gradle-plugin:2.7.7&quot;)\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>Without Safe Args, access arguments directly:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">val productId = arguments?.getString(&quot;productId&quot;) ?: return\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Nested Navigation Graphs<\/h2>\n\n\n\n<p>Real apps often have nested navigation graphs, for example a checkout flow that is a separate graph from the main navigation. Deep links work with nested graphs, but require care.<\/p>\n\n\n\n<p>Define a nested graph:<\/p>\n\n\n\n<pre><code class=\"language-xml\">&lt;navigation\n    android:id=&quot;@+id\/nav_graph&quot;\n    app:startDestination=&quot;@id\/homeFragment&quot;&gt;\n\n    &lt;fragment\n        android:id=&quot;@+id\/homeFragment&quot;\n        android:name=&quot;com.example.app.HomeFragment&quot; \/&gt;\n\n    &lt;navigation\n        android:id=&quot;@+id\/checkout_graph&quot;\n        app:startDestination=&quot;@id\/checkoutFragment&quot;&gt;\n\n        &lt;fragment\n            android:id=&quot;@+id\/checkoutFragment&quot;\n            android:name=&quot;com.example.app.CheckoutFragment&quot;&gt;\n            &lt;argument\n                android:name=&quot;cartToken&quot;\n                app:argType=&quot;string&quot; \/&gt;\n            &lt;deepLink\n                app:uri=&quot;https:\/\/yourdomain.com\/checkout\/{cartToken}&quot; \/&gt;\n        &lt;\/fragment&gt;\n\n        &lt;fragment\n            android:id=&quot;@+id\/paymentFragment&quot;\n            android:name=&quot;com.example.app.PaymentFragment&quot; \/&gt;\n\n        &lt;fragment\n            android:id=&quot;@+id\/confirmationFragment&quot;\n            android:name=&quot;com.example.app.ConfirmationFragment&quot;&gt;\n            &lt;argument\n                android:name=&quot;orderId&quot;\n                app:argType=&quot;string&quot; \/&gt;\n            &lt;deepLink\n                app:uri=&quot;https:\/\/yourdomain.com\/orders\/{orderId}&quot; \/&gt;\n        &lt;\/fragment&gt;\n\n    &lt;\/navigation&gt;\n\n&lt;\/navigation&gt;\n<\/code><\/pre>\n\n\n\n<p>Deep links defined in nested graph destinations work correctly. The Navigation component builds the back stack from the nested graph&#39;s start destination, so pressing Back from a deep-linked destination within the checkout flow navigates to <code>checkoutFragment<\/code> rather than exiting the app.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Back Stack Construction<\/h2>\n\n\n\n<p>The back stack behavior for deep links differs from standard navigation. When a user arrives via a deep link, Navigation builds the back stack from the start destination of the graph to the linked destination. This means:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>User clicks <code>https:\/\/yourdomain.com\/products\/123<\/code><\/li>\n<li>Navigation routes to <code>productDetailFragment<\/code><\/li>\n<li>Back stack: <code>homeFragment<\/code> -&gt; <code>productDetailFragment<\/code><\/li>\n<li>User presses Back: arrives at <code>homeFragment<\/code><\/li>\n<li>User presses Back again: exits app<\/li>\n<\/ul>\n\n\n\n<p>This is the correct behavior: the user can always navigate back to a logical parent. Without this, pressing Back after a deep link would exit the app entirely.<\/p>\n\n\n\n<p>To customize the back stack for a specific deep link, use the <code>app:action<\/code> attribute on the deep link element to reference an action with <code>popUpTo<\/code> configuration:<\/p>\n\n\n\n<pre><code class=\"language-xml\">&lt;deepLink\n    app:uri=&quot;https:\/\/yourdomain.com\/products\/{productId}&quot;\n    app:action=&quot;@id\/action_to_product_detail&quot; \/&gt;\n\n&lt;action\n    android:id=&quot;@+id\/action_to_product_detail&quot;\n    app:destination=&quot;@id\/productDetailFragment&quot;\n    app:popUpTo=&quot;@id\/homeFragment&quot;\n    app:popUpToInclusive=&quot;false&quot; \/&gt;\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Handling Deep Links Programmatically<\/h2>\n\n\n\n<p>Sometimes you need to navigate to a deep link destination programmatically, for example after processing a push notification payload or after an async validation step.<\/p>\n\n\n\n<p>Use <code>NavDeepLinkRequest<\/code>:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">val request = NavDeepLinkRequest.Builder\n    .fromUri(&quot;https:\/\/yourdomain.com\/products\/abc123&quot;.toUri())\n    .build()\n\nnavController.navigate(request)\n<\/code><\/pre>\n\n\n\n<p>This is equivalent to the user clicking the URL but triggers the navigation within your app without needing an actual Intent. The nav graph is consulted to match the URI to a destination, and arguments are extracted from the URI the same way.<\/p>\n\n\n\n<p>You can also navigate directly to a destination using the generated directions class:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">\/\/ Equivalent, bypasses URI matching, goes directly to destination\nnavController.navigate(\n    NavGraphDirections.actionToProductDetail(&quot;abc123&quot;)\n)\n<\/code><\/pre>\n\n\n\n<p>The programmatic approach is useful when you receive a deep link URI from a notification or from your own deferred linking logic, and want to route the user after your app is already running.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Implicit vs Explicit Deep Links<\/h2>\n\n\n\n<p>The Navigation component distinguishes between two types:<\/p>\n\n\n\n<p><strong>Implicit deep links<\/strong> are URI patterns defined in the nav graph, handled by Android when the user clicks a link from outside the app (email, SMS, browser, etc.). These are what the <code>&lt;deepLink&gt;<\/code> element in the nav graph configures.<\/p>\n\n\n\n<p><strong>Explicit deep links<\/strong> are <code>PendingIntent<\/code> objects that navigate to a specific destination when triggered. These are typically used in notifications. They are constructed with <code>NavDeepLinkBuilder<\/code>:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">val pendingIntent = NavDeepLinkBuilder(context)\n    .setGraph(R.navigation.nav_graph)\n    .setDestination(R.id.productDetailFragment)\n    .setArguments(bundleOf(&quot;productId&quot; to &quot;abc123&quot;))\n    .createPendingIntent()\n<\/code><\/pre>\n\n\n\n<p>Explicit deep links build a complete back stack automatically, just like implicit deep links. When the user taps the notification and the <code>PendingIntent<\/code> fires, they land in the correct destination with the correct back stack. For a full treatment of notification deep links, see our article on <a href=\"https:\/\/tolinku.com\/blog\/android-app-links-notifications\/\">deep linking from Android notifications<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testing Navigation Deep Links<\/h2>\n\n\n\n<p>Navigation component provides a test artifact for instrumented tests:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">\/\/ build.gradle\nandroidTestImplementation(&quot;androidx.navigation:navigation-testing:2.7.7&quot;)\n<\/code><\/pre>\n\n\n\n<p>Use <code>TestNavHostController<\/code> to verify navigation without running on a real device:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">@Test\nfun deepLinkNavigatesToProductDetail() {\n    val navController = TestNavHostController(ApplicationProvider.getApplicationContext())\n\n    val scenario = launchFragmentInContainer&lt;HomeFragment&gt;()\n    scenario.onFragment { fragment -&gt;\n        navController.setGraph(R.navigation.nav_graph)\n        Navigation.setViewNavController(fragment.requireView(), navController)\n    }\n\n    \/\/ Simulate deep link navigation\n    val request = NavDeepLinkRequest.Builder\n        .fromUri(&quot;https:\/\/yourdomain.com\/products\/test123&quot;.toUri())\n        .build()\n\n    scenario.onFragment {\n        navController.navigate(request)\n    }\n\n    \/\/ Verify navigation happened\n    assertThat(navController.currentDestination?.id).isEqualTo(R.id.productDetailFragment)\n}\n<\/code><\/pre>\n\n\n\n<p>For testing the full deep link entry from an external intent, use <code>ActivityScenario<\/code>:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">@Test\nfun externalDeepLinkOpensProductDetail() {\n    val intent = Intent(\n        Intent.ACTION_VIEW,\n        &quot;https:\/\/yourdomain.com\/products\/test123&quot;.toUri()\n    ).apply {\n        setPackage(ApplicationProvider.getApplicationContext&lt;Context&gt;().packageName)\n    }\n\n    val scenario = ActivityScenario.launch&lt;MainActivity&gt;(intent)\n    scenario.onActivity { activity -&gt;\n        val navController = activity.findNavController(R.id.nav_host_fragment)\n        assertThat(navController.currentDestination?.id).isEqualTo(R.id.productDetailFragment)\n    }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">URL Matching Behavior<\/h2>\n\n\n\n<p>Navigation&#39;s URI matching has some nuances worth knowing:<\/p>\n\n\n\n<p><strong>Query parameters are optional by default.<\/strong> If you define <code>app:uri=&quot;https:\/\/yourdomain.com\/search?q={query}&quot;<\/code>, the deep link matches URLs both with and without the <code>?q=<\/code> parameter. If the parameter is absent, the argument receives its default value.<\/p>\n\n\n\n<p><strong>Path parameters are required.<\/strong> <code>https:\/\/yourdomain.com\/products\/{productId}<\/code> will not match <code>https:\/\/yourdomain.com\/products\/<\/code>.<\/p>\n\n\n\n<p><strong>No wildcard matching.<\/strong> You cannot use <code>*<\/code> in URI templates. Each path segment must be a literal or a named parameter.<\/p>\n\n\n\n<p><strong>Scheme is part of matching.<\/strong> <code>https:\/\/yourdomain.com\/products\/{id}<\/code> matches only HTTPS URLs, not HTTP or custom scheme URLs. Define separate deep link elements for each scheme you want to handle.<\/p>\n\n\n\n<p>For apps with complex URL structures, Navigation&#39;s matching may not cover every case. In those situations, combining Navigation&#39;s implicit deep link handling for simple cases with custom logic in <code>onNewIntent<\/code> for complex cases is a reasonable approach.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Combining with App Links Configuration<\/h2>\n\n\n\n<p>The <code>&lt;nav-graph&gt;<\/code> element in the manifest generates intent filters automatically, but it does not add <code>android:autoVerify=&quot;true&quot;<\/code>. You need to either add that manually to the generated intent filters or add your own explicit intent filter alongside the nav-graph element:<\/p>\n\n\n\n<pre><code class=\"language-xml\">&lt;activity android:name=&quot;.MainActivity&quot;&gt;\n    &lt;nav-graph android:value=&quot;@navigation\/nav_graph&quot; \/&gt;\n\n    &lt;!-- Explicit verified intent filter for App Links --&gt;\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; android:host=&quot;yourdomain.com&quot; \/&gt;\n    &lt;\/intent-filter&gt;\n&lt;\/activity&gt;\n<\/code><\/pre>\n\n\n\n<p>The nav-graph element adds unverified intent filters that handle the routing. The explicit <code>android:autoVerify=&quot;true&quot;<\/code> filter handles the verification. Both are needed for full App Link behavior.<\/p>\n\n\n\n<p>For configuration details and the <code>assetlinks.json<\/code> setup, see the <a href=\"https:\/\/tolinku.com\/docs\/user-guide\/configuring-android\/\">configuring Android guide<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<p>Jetpack Navigation&#39;s deep link support reduces the boilerplate of deep link handling significantly. Defining URI patterns in the nav graph means the build system generates intent filters for you, argument extraction is handled automatically, and back stack construction follows your graph structure.<\/p>\n\n\n\n<p>The key steps are: add <code>&lt;deepLink&gt;<\/code> elements to your nav graph destinations, use <code>&lt;nav-graph&gt;<\/code> in the manifest for automatic intent filter generation, add a separate <code>android:autoVerify=&quot;true&quot;<\/code> filter for App Link verification, and call <code>navController.handleDeepLink(intent)<\/code> in <code>onNewIntent<\/code>.<\/p>\n\n\n\n<p>For more patterns around the Kotlin code that handles deep link routing, see <a href=\"https:\/\/tolinku.com\/blog\/kotlin-deep-link-handling\/\">Kotlin deep link handling: modern Android patterns<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A complete tutorial for integrating Android App Links with the Jetpack Navigation component. Covers nav graph deep link definitions, argument passing, nested graphs, implicit deep links, and testing strategies.<\/p>\n","protected":false},"author":2,"featured_media":564,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"Jetpack Navigation Deep Links: Setup Tutorial (2026)","rank_math_description":"Complete guide to Jetpack Navigation deep links. Learn nav graph setup, argument passing, nested navigation graphs, implicit deep links, and testing with full Kotlin code examples.","rank_math_focus_keyword":"jetpack navigation 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-jetpack-navigation-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-jetpack-navigation-deep-links.png","footnotes":""},"categories":[10],"tags":[25,23,20,95,34,72],"class_list":["post-565","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android","tag-android","tag-app-links","tag-deep-linking","tag-jetpack-navigation","tag-kotlin","tag-tutorial"],"_links":{"self":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/565","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=565"}],"version-history":[{"count":3,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/565\/revisions"}],"predecessor-version":[{"id":2485,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/565\/revisions\/2485"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media\/564"}],"wp:attachment":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media?parent=565"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/categories?post=565"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/tags?post=565"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}