{"id":442,"date":"2026-03-14T13:00:00","date_gmt":"2026-03-14T18:00:00","guid":{"rendered":"https:\/\/tolinku.com\/blog\/?p=442"},"modified":"2026-03-07T04:35:13","modified_gmt":"2026-03-07T09:35:13","slug":"implement-deep-links-from-scratch","status":"publish","type":"post","link":"https:\/\/tolinku.com\/blog\/implement-deep-links-from-scratch\/","title":{"rendered":"How to Implement Deep Links from Scratch"},"content":{"rendered":"\n<p>Deep links let a URL open a specific screen inside your app instead of just launching the home screen. A user taps a link in an email, a text message, or a web page, and your app opens directly to the right product, profile, or piece of content. No detour through the home screen. No &quot;please navigate to&#8230;&quot; instructions.<\/p>\n\n\n\n<p>This tutorial walks through the full implementation: planning your URL structure, configuring iOS Universal Links, configuring Android App Links, writing route handlers in Swift and Kotlin, and dealing with the edge cases that catch most developers off guard.<\/p>\n\n\n\n<p>If you want a higher-level overview of what deep links actually are and why they matter, start with our guide on <a href=\"https:\/\/tolinku.com\/blog\/how-deep-linking-works\/\">how deep linking works<\/a> or the <a href=\"https:\/\/tolinku.com\/docs\/concepts\/deep-linking\/\">deep linking concepts guide<\/a> before continuing here.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Plan Your URL Structure<\/h2>\n\n\n\n<p>Before touching Xcode or Android Studio, decide what your URLs will look like. This matters more than most developers expect. A URL structure is hard to change once it is in the wild, and a poorly designed one leads to fragile routing logic.<\/p>\n\n\n\n<p>Good deep link URLs follow the same conventions as good web URLs:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Keep paths short and readable<\/li>\n<li>Use nouns, not verbs (<code>\/products\/123<\/code>, not <code>\/view-product?id=123<\/code>)<\/li>\n<li>Separate concerns clearly (user profiles at <code>\/u\/:username<\/code>, products at <code>\/products\/:id<\/code>)<\/li>\n<li>Avoid query strings for primary routing; use them for optional context like referral codes or campaign tracking<\/li>\n<\/ul>\n\n\n\n<p>A simple example schema:<\/p>\n\n\n\n<pre><code>https:\/\/yourapp.com\/products\/:productId\nhttps:\/\/yourapp.com\/u\/:username\nhttps:\/\/yourapp.com\/orders\/:orderId\nhttps:\/\/yourapp.com\/invite\/:code\n<\/code><\/pre>\n\n\n\n<p>Write these down before you write a single line of handler code. You will reference them throughout the implementation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Set Up iOS Universal Links<\/h2>\n\n\n\n<p>Universal Links are Apple&#39;s mechanism for opening your app from a standard HTTPS URL. When iOS sees a URL that matches your app&#39;s registered domains, it opens your app instead of Safari. If the app is not installed, it falls back to the web URL.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2a. Create the Apple App Site Association File<\/h3>\n\n\n\n<p>The AASA file is a JSON document hosted at the root of your domain. iOS fetches it when your app is installed, then uses it to decide which URL paths to intercept. For a detailed walkthrough of the AASA file format and common mistakes, see our <a href=\"https:\/\/tolinku.com\/blog\/aasa-file-setup\/\">AASA file setup guide<\/a>.<\/p>\n\n\n\n<p>Create a file called <code>apple-app-site-association<\/code> (no file extension) with this structure:<\/p>\n\n\n\n<pre><code class=\"language-json\">{\n  &quot;applinks&quot;: {\n    &quot;details&quot;: [\n      {\n        &quot;appIDs&quot;: [&quot;TEAMID.com.yourcompany.yourapp&quot;],\n        &quot;components&quot;: [\n          {\n            &quot;\/&quot;: &quot;\/products\/*&quot;,\n            &quot;comment&quot;: &quot;Product detail pages&quot;\n          },\n          {\n            &quot;\/&quot;: &quot;\/u\/*&quot;,\n            &quot;comment&quot;: &quot;User profiles&quot;\n          },\n          {\n            &quot;\/&quot;: &quot;\/orders\/*&quot;,\n            &quot;comment&quot;: &quot;Order details&quot;\n          },\n          {\n            &quot;\/&quot;: &quot;\/invite\/*&quot;,\n            &quot;comment&quot;: &quot;Invite links&quot;\n          }\n        ]\n      }\n    ]\n  }\n}\n<\/code><\/pre>\n\n\n\n<p>Replace <code>TEAMID<\/code> with your <a href=\"https:\/\/developer.apple.com\/account\" rel=\"nofollow noopener\" target=\"_blank\">Apple Developer Team ID<\/a>, and update the bundle identifier to match your app.<\/p>\n\n\n\n<p>Host this file at:<\/p>\n\n\n\n<pre><code>https:\/\/yourapp.com\/.well-known\/apple-app-site-association\nhttps:\/\/yourapp.com\/apple-app-site-association\n<\/code><\/pre>\n\n\n\n<p>Both paths work. Apple checks both. The file must be served over HTTPS with a <code>Content-Type<\/code> of <code>application\/json<\/code>. No redirects. Apple&#39;s CDN fetches this file and caches it, so changes can take time to propagate. You can verify your file using <a href=\"https:\/\/search.developer.apple.com\/appsearch-validation-tool\/\" rel=\"nofollow noopener\" target=\"_blank\">Apple&#39;s AASA validator<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2b. Enable Associated Domains in Xcode<\/h3>\n\n\n\n<p>Open your project in Xcode and go to your app target&#39;s <strong>Signing &amp; Capabilities<\/strong> tab. Click <strong>+ Capability<\/strong> and add <strong>Associated Domains<\/strong>.<\/p>\n\n\n\n<p>Add your domain with the <code>applinks:<\/code> prefix:<\/p>\n\n\n\n<pre><code>applinks:yourapp.com\n<\/code><\/pre>\n\n\n\n<p>If you use subdomains, add each one separately:<\/p>\n\n\n\n<pre><code>applinks:www.yourapp.com\napplinks:yourapp.com\n<\/code><\/pre>\n\n\n\n<p>This entitlement gets embedded in your app binary and tells iOS which domains to check for an AASA file.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2c. Handle Incoming URLs in Swift<\/h3>\n\n\n\n<p>iOS delivers Universal Links to your app through <code>UIApplicationDelegate<\/code> or <code>SceneDelegate<\/code>. The entry point is <code>application(_:continue:restorationHandler:)<\/code>.<\/p>\n\n\n\n<p>For a UIKit app:<\/p>\n\n\n\n<pre><code class=\"language-swift\">import UIKit\n\n@main\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    func application(\n        _ application: UIApplication,\n        continue userActivity: NSUserActivity,\n        restorationHandler: @escaping ([UIUserActivityRestoring]?) -&gt; Void\n    ) -&gt; Bool {\n        guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,\n              let url = userActivity.webpageURL else {\n            return false\n        }\n        return DeepLinkRouter.shared.handle(url: url)\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>For a SwiftUI app using the <code>onOpenURL<\/code> modifier:<\/p>\n\n\n\n<pre><code class=\"language-swift\">@main\nstruct YourApp: App {\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n                .onOpenURL { url in\n                    DeepLinkRouter.shared.handle(url: url)\n                }\n        }\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>The <code>DeepLinkRouter<\/code> is where your actual routing logic lives. We will build that in Step 4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Set Up Android App Links<\/h2>\n\n\n\n<p>Android App Links use a similar pattern: a JSON verification file hosted on your server, a manifest configuration, and a handler in your Activity.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3a. Create the Digital Asset Links File<\/h3>\n\n\n\n<p>Create a file called <code>assetlinks.json<\/code> (see our complete <a href=\"https:\/\/tolinku.com\/blog\/digital-asset-links-setup\/\">Digital Asset Links setup guide<\/a> for details) and host it at:<\/p>\n\n\n\n<pre><code>https:\/\/yourapp.com\/.well-known\/assetlinks.json\n<\/code><\/pre>\n\n\n\n<p>The file format looks like this:<\/p>\n\n\n\n<pre><code class=\"language-json\">[\n  {\n    &quot;relation&quot;: [&quot;delegate_permission\/common.handle_all_urls&quot;],\n    &quot;target&quot;: {\n      &quot;namespace&quot;: &quot;android_app&quot;,\n      &quot;package_name&quot;: &quot;com.yourcompany.yourapp&quot;,\n      &quot;sha256_cert_fingerprints&quot;: [\n        &quot;AA:BB:CC:DD:EE:FF:...&quot;\n      ]\n    }\n  }\n]\n<\/code><\/pre>\n\n\n\n<p>To get your SHA-256 certificate fingerprint from your keystore:<\/p>\n\n\n\n<pre><code class=\"language-bash\">keytool -list -v -keystore your-release.keystore -alias your-alias\n<\/code><\/pre>\n\n\n\n<p>For debug builds, Android Studio generates a debug keystore automatically. You can get its fingerprint with:<\/p>\n\n\n\n<pre><code class=\"language-bash\">keytool -list -v -keystore ~\/.android\/debug.keystore -alias androiddebugkey -storepass android -keypass android\n<\/code><\/pre>\n\n\n\n<p>You can verify your setup using the <a href=\"https:\/\/developers.google.com\/digital-asset-links\/tools\/generator\" rel=\"nofollow noopener\" target=\"_blank\">Android Asset Links validator<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3b. Configure Your Android Manifest<\/h3>\n\n\n\n<p>In <code>AndroidManifest.xml<\/code>, add an intent filter to the Activity that should handle deep links:<\/p>\n\n\n\n<pre><code class=\"language-xml\">&lt;activity\n    android:name=&quot;.MainActivity&quot;\n    android:exported=&quot;true&quot;\n    android:launchMode=&quot;singleTask&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\n        &lt;data\n            android:scheme=&quot;https&quot;\n            android:host=&quot;yourapp.com&quot; \/&gt;\n    &lt;\/intent-filter&gt;\n\n&lt;\/activity&gt;\n<\/code><\/pre>\n\n\n\n<p>The <code>android:autoVerify=&quot;true&quot;<\/code> attribute is what makes these App Links rather than plain deep links. Android will verify your domain ownership through the <code>assetlinks.json<\/code> file before granting automatic link handling. Without it, Android shows a disambiguation dialog asking the user which app to open the link in.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3c. Handle Incoming Intents in Kotlin<\/h3>\n\n\n\n<p>In your <code>MainActivity<\/code>, handle the incoming intent in <code>onCreate<\/code> and <code>onNewIntent<\/code>:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">import android.content.Intent\nimport android.net.Uri\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\n\nclass MainActivity : AppCompatActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n\n        intent?.let { handleIntent(it) }\n    }\n\n    override fun onNewIntent(intent: Intent) {\n        super.onNewIntent(intent)\n        handleIntent(intent)\n    }\n\n    private fun handleIntent(intent: Intent) {\n        if (intent.action == Intent.ACTION_VIEW) {\n            intent.data?.let { uri -&gt;\n                DeepLinkRouter.handle(uri, this)\n            }\n        }\n    }\n}\n<\/code><\/pre>\n\n\n\n<p><code>onNewIntent<\/code> fires when the Activity is already running and a new intent arrives (because of <code>singleTask<\/code> launch mode). You need both handlers or you will miss links that arrive while the app is open.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Build a Simple Router<\/h2>\n\n\n\n<p>Both platforms now call into a router. This is where your URL paths map to screens.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Swift Router<\/h3>\n\n\n\n<pre><code class=\"language-swift\">import UIKit\n\nfinal class DeepLinkRouter {\n\n    static let shared = DeepLinkRouter()\n    private init() {}\n\n    @discardableResult\n    func handle(url: URL) -&gt; Bool {\n        guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false) else {\n            return false\n        }\n\n        let pathComponents = components.path\n            .split(separator: &quot;\/&quot;)\n            .map(String.init)\n\n        switch pathComponents.first {\n        case &quot;products&quot;:\n            if let productId = pathComponents.dropFirst().first {\n                navigateToProduct(id: productId)\n                return true\n            }\n        case &quot;u&quot;:\n            if let username = pathComponents.dropFirst().first {\n                navigateToProfile(username: username)\n                return true\n            }\n        case &quot;invite&quot;:\n            if let code = pathComponents.dropFirst().first {\n                navigateToInvite(code: code)\n                return true\n            }\n        default:\n            break\n        }\n\n        return false\n    }\n\n    private func navigateToProduct(id: String) {\n        \/\/ Push ProductViewController onto the navigation stack\n    }\n\n    private func navigateToProfile(username: String) {\n        \/\/ Push ProfileViewController onto the navigation stack\n    }\n\n    private func navigateToInvite(code: String) {\n        \/\/ Present InviteViewController\n    }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Kotlin Router<\/h3>\n\n\n\n<pre><code class=\"language-kotlin\">import android.content.Context\nimport android.net.Uri\n\nobject DeepLinkRouter {\n\n    fun handle(uri: Uri, context: Context): Boolean {\n        val segments = uri.pathSegments\n\n        if (segments.isEmpty()) return false\n\n        return when (segments[0]) {\n            &quot;products&quot; -&gt; {\n                val productId = segments.getOrNull(1) ?: return false\n                navigateToProduct(productId, context)\n                true\n            }\n            &quot;u&quot; -&gt; {\n                val username = segments.getOrNull(1) ?: return false\n                navigateToProfile(username, context)\n                true\n            }\n            &quot;invite&quot; -&gt; {\n                val code = segments.getOrNull(1) ?: return false\n                navigateToInvite(code, context)\n                true\n            }\n            else -&gt; false\n        }\n    }\n\n    private fun navigateToProduct(id: String, context: Context) {\n        \/\/ Start ProductActivity with productId as an extra\n    }\n\n    private fun navigateToProfile(username: String, context: Context) {\n        \/\/ Start ProfileActivity with username as an extra\n    }\n\n    private fun navigateToInvite(code: String, context: Context) {\n        \/\/ Start InviteActivity with code as an extra\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>Keep the router lean. It should parse, match, and delegate. Business logic belongs in the destination screens.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5: Handle Edge Cases<\/h2>\n\n\n\n<p>The happy path is straightforward. The edge cases are where most implementations break.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">App Not Installed<\/h3>\n\n\n\n<p>When iOS or Android cannot open your app (because it is not installed), the fallback is the web URL. This means your web server needs to handle every deep link path gracefully. At minimum, serve a page with an App Store or Play Store link. Better yet, use that web page to save the deep link destination and resume navigation after install. This is called deferred deep linking, and it requires a server-side component to work correctly. Our guide on <a href=\"https:\/\/tolinku.com\/blog\/building-deferred-deep-links\/\">building deferred deep links<\/a> covers the implementation in detail.<\/p>\n\n\n\n<p><a href=\"https:\/\/tolinku.com\/features\/deep-linking\">Tolinku<\/a> handles deferred deep linking automatically: the install destination is stored server-side and delivered to the app on first open, so users land exactly where they intended even after a fresh install.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Invalid or Expired Paths<\/h3>\n\n\n\n<p>Not every URL your router receives will be valid. Product IDs get deleted. Invite codes expire. Order IDs belong to other users. Handle these cases explicitly rather than crashing or showing a blank screen.<\/p>\n\n\n\n<p>In Swift:<\/p>\n\n\n\n<pre><code class=\"language-swift\">private func navigateToProduct(id: String) {\n    guard !id.isEmpty else {\n        navigateToHome()\n        return\n    }\n    \/\/ Proceed with navigation, handle 404 in the product screen itself\n}\n<\/code><\/pre>\n\n\n\n<p>Return the user to a sensible fallback screen rather than leaving them on a broken state. The product screen itself should handle the case where the API returns a 404.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">State Restoration Timing<\/h3>\n\n\n\n<p>On iOS, Universal Links delivered at cold launch arrive before your root view controller is fully set up. If you push a view controller immediately in <code>application(_:continue:restorationHandler:)<\/code>, you may push onto nothing.<\/p>\n\n\n\n<p>A clean pattern is to store the pending URL and process it after the UI is ready:<\/p>\n\n\n\n<pre><code class=\"language-swift\">class AppDelegate: UIResponder, UIApplicationDelegate {\n    var pendingDeepLink: URL?\n\n    func application(\n        _ application: UIApplication,\n        continue userActivity: NSUserActivity,\n        restorationHandler: @escaping ([UIUserActivityRestoring]?) -&gt; Void\n    ) -&gt; Bool {\n        guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,\n              let url = userActivity.webpageURL else { return false }\n        pendingDeepLink = url\n        return true\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>Then in your root view controller&#39;s <code>viewDidAppear<\/code>:<\/p>\n\n\n\n<pre><code class=\"language-swift\">override func viewDidAppear(_ animated: Bool) {\n    super.viewDidAppear(animated)\n    if let url = (UIApplication.shared.delegate as? AppDelegate)?.pendingDeepLink {\n        DeepLinkRouter.shared.handle(url: url)\n        (UIApplication.shared.delegate as? AppDelegate)?.pendingDeepLink = nil\n    }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 6: Test on Both Platforms<\/h2>\n\n\n\n<p>Testing deep links requires real devices or simulators, not just unit tests. For a comprehensive look at available tools and approaches, see our <a href=\"https:\/\/tolinku.com\/blog\/deep-link-testing-tools\/\">deep link testing tools<\/a> roundup.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Testing on iOS<\/h3>\n\n\n\n<p>From Terminal, use <code>xcrun simctl<\/code> to simulate a Universal Link opening in the simulator:<\/p>\n\n\n\n<pre><code class=\"language-bash\">xcrun simctl openurl booted &quot;https:\/\/yourapp.com\/products\/abc123&quot;\n<\/code><\/pre>\n\n\n\n<p>For a device, use the Notes app: type the URL, long-press it, and tap &quot;Open&quot;. Safari will route it through Universal Links.<\/p>\n\n\n\n<p>To test cold launch (app not running), terminate the app first, then use <code>openurl<\/code>. Watch the console output in Xcode for any routing errors.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Testing on Android<\/h3>\n\n\n\n<p>Use <code>adb<\/code> to send an intent to your app:<\/p>\n\n\n\n<pre><code class=\"language-bash\">adb shell am start \\\n  -W -a android.intent.action.VIEW \\\n  -d &quot;https:\/\/yourapp.com\/products\/abc123&quot; \\\n  com.yourcompany.yourapp\n<\/code><\/pre>\n\n\n\n<p>Add the <code>-n<\/code> flag to target a specific activity if needed:<\/p>\n\n\n\n<pre><code class=\"language-bash\">adb shell am start \\\n  -W -a android.intent.action.VIEW \\\n  -d &quot;https:\/\/yourapp.com\/products\/abc123&quot; \\\n  -n com.yourcompany.yourapp\/.MainActivity\n<\/code><\/pre>\n\n\n\n<p>Test with the app in the background (press home, then run the command) and with the app fully closed. Both scenarios exercise different code paths.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verifying App Links Verification<\/h3>\n\n\n\n<p>On Android, you can check whether domain verification succeeded:<\/p>\n\n\n\n<pre><code class=\"language-bash\">adb shell pm get-app-links com.yourcompany.yourapp\n<\/code><\/pre>\n\n\n\n<p>Look for <code>verified<\/code> in the output. If it shows <code>none<\/code> or <code>ask<\/code>, check that your <code>assetlinks.json<\/code> is reachable and correctly formatted.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Where to Go Next<\/h2>\n\n\n\n<p>This implementation covers the fundamentals: URL structure, platform configuration files, Swift and Kotlin handlers, routing logic, and common edge cases. From here, the natural extensions are deferred deep linking (handling installs mid-flow), analytics on which links are driving conversions, and smart banners that surface your app to web visitors without being intrusive.<\/p>\n\n\n\n<p>The <a href=\"https:\/\/tolinku.com\/docs\/developer\/quick-start\/\">Tolinku quick start guide<\/a> covers how to connect this foundation to a hosted routing and analytics layer so you get click data, attribution, and deferred linking without building server infrastructure yourself.<\/p>\n\n\n\n<p>For reference, the <a href=\"https:\/\/tolinku.com\/features\/deep-linking\">deep linking features overview<\/a> covers what is possible beyond basic URL routing.<\/p>\n\n\n\n<p>The implementation above is enough to get links working in a production app. The edge cases in Step 5 are what separate a working implementation from a reliable one. Handle those and your users will have a consistent experience regardless of whether they have the app installed or which screen the link is meant to reach.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Step-by-step tutorial for implementing deep links in your iOS and Android app. Set up Universal Links, App Links, and handle routing.<\/p>\n","protected":false},"author":2,"featured_media":441,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"How to Implement Deep Links from Scratch","rank_math_description":"Step-by-step tutorial for implementing deep links in your iOS and Android app. Set up Universal Links, App Links, and handle routing.","rank_math_focus_keyword":"implement 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-implement-deep-links-from-scratch.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-implement-deep-links-from-scratch.png","footnotes":""},"categories":[11],"tags":[23,20,34,31,72,22],"class_list":["post-442","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deep-linking","tag-app-links","tag-deep-linking","tag-kotlin","tag-swift","tag-tutorial","tag-universal-links"],"_links":{"self":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/442","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=442"}],"version-history":[{"count":2,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/442\/revisions"}],"predecessor-version":[{"id":2776,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/442\/revisions\/2776"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media\/441"}],"wp:attachment":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media?parent=442"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/categories?post=442"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/tags?post=442"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}