> ## Documentation Index
> Fetch the complete documentation index at: https://docs.utmkit.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Deep links

> One short link that sends iPhones to your iOS destination, Android phones to your Android destination, and everyone else to the web page.

A poster gets one URL. When you promote an app, that URL has to send an iPhone to the App
Store or your app, an Android phone to Play or your app, and everyone else to a web page. In
UTMKit that is one link with up to three destinations.

## From the console

A link always has a **web destination**. Beside it you can add an **iOS destination** and an
**Android destination**, each optional and independent.

* Creating a link in the [chat](https://app.utmkit.co/chat): tell the assistant the iOS or
  Android address along with the rest. See [Create a link](/en/links/create).
* An existing link: open [Links](https://app.utmkit.co/links), choose **Edit**, and fill in
  *iOS destination* or *Android destination*. Leave a field blank to remove it.

From then on an iPhone lands on the iOS destination, an Android phone on the Android
destination, and everyone else — a laptop, a bot that does not present itself as a phone, a
browser we cannot recognise, an iPad asking for desktop websites — on the web destination. A
platform you did not set falls back to the web destination, never to the other platform.

### What a platform destination can be

An `https://` address only: your app's own link, or its store page on `apps.apple.com` or
`play.google.com`. A custom app scheme such as `myapp://` is refused, for four reasons:

1. **We could not screen it.** Destinations are checked against abuse lists before they become
   links, and those lists hold web addresses. A scheme would pass as "clean" unchecked.
2. **We could not watch it.** The [daily destination check](/en/links/destination-health)
   dials the address to see that it still answers. A scheme names no server to dial.
3. **The phone decides which app opens.** If two apps claim the same scheme, the operating
   system picks one, not necessarily yours.
4. **A phone without the app shows an error.** A redirect to a scheme has no fallback.

A store address in its scheme form (`itms-apps://`, `market://`) is refused too, and the
console names the `https://` form, which opens the store on a phone and still works on a desktop.

### Governed like the web destination

A platform destination is screened with the same rules and refusals as the web destination,
the daily check watches it, and a change to it appears in the activity log. Your UTMs are
applied to all three destinations; on a Play store address they are also folded into the
store's `referrer` parameter, so your app learns on first launch which campaign brought the
install. The App Store has no equivalent.

### The counts

Open [the report](/en/analytics/the-report) and group by **destination**. Each row names where
visitors were sent — the App Store, Play, your app, or the web — with its count, under the
same filters and exclusions as every other grouping. The client report, the API and the MCP
offer it too.

<Warning>
  This is routing plus counting, not install attribution. We can say how many phones we sent to
  Play; we cannot say which of them installed, or that the person who installed is the one who
  clicked. That needs an SDK inside your app, which a short link cannot provide. Whether your
  app opens or the store page shows is between the address you chose and the visitor's phone.
</Warning>

Deep links are on every plan; a routed visit is one click, metered like any other.

## From the API and the MCP

The platform destinations are two fields, `ios_url` and `android_url`, on `POST /api/v1/links`
and `PATCH /api/v1/links/{id}`. Both accept an `https://` address only, with the refusals
above. On a `PATCH`, `null` (or a blank) clears that platform destination; a field left out is
left as it is. Both operations require the `links:write` permission.

The MCP tools `create_link` and `update_link` (also `links:write`) do not take the platform
fields today; set them through the API or the console.
