Crear URI deep link de app móvil
Monte un enlace profundo que abra su app en lugar del navegador: el esquema myapp, el host product y la ruta /item/42 dan myapp://product/item/42, con los pares de consulta codificados tras el signo de interrogación. Los caracteres no válidos del esquema se detienen. Gratis en su navegador.
- Gratis
- Funciona en su navegador
- Sin registro
- Sus datos no salen de su equipo
Ejecutar — gratis
Corre en su navegador. Gratis y sin límite: sus datos no salen de esta página.
Las aplicaciones móviles abren contenido mediante esquemas URL personalizados como myapp://product/item/42? ref=email. Los equipos de producto, crecimiento e ingeniería necesitan que esas URI de deep link estén bien formadas siempre: un token de esquema legal, un host y una ruta predecibles, y pares de consulta codificados en porcentaje que sobrevivan al copiar y pegar en cargas push, SMS, códigos QR y destinos publicitarios. Las cadenas armadas a mano se desvían—espacios en el esquema, ampersands sin escapar, barras omitidas—y rompen los flujos de apertura en la app en iOS y Android.
Qué es un deep link con esquema personalizado y cómo se ensambla la URI
Un deep link móvil con esquema personalizado es una URI que el sistema operativo enruta hacia su aplicación instalada en lugar del navegador. El esquema es el token antes de los dos puntos y la doble barra—myapp, com.example.app o my-app+v2—y debe seguir la gramática de esquemas URI: una letra primero, luego solo letras, dígitos, más, punto o guion.
Espacios, guiones bajos, dos puntos y barras dentro del esquema son ilegales y son los errores más habituales al copiar y pegar cuando se usa un nombre de producto como esquema sin sanitizar. Este constructor concatena esas piezas en un orden fijo: esquema, literal ://, host (puede estar vacío), una ruta que siempre gana una sola barra inicial cuando no está vacía, y una cadena de consulta solo cuando hay al menos un parámetro.
Las claves y valores de consulta se codifican en porcentaje con las mismas reglas que usan los navegadores para componentes estilo application/x-www-form-urlencoded, de modo que los espacios se convierten en escapes tipo %20 y los caracteres reservados no pueden partir la consulta.
Dónde un constructor de URI deep link aporta valor
Los pipelines de crecimiento y CRM generan enlaces personalizados de apertura en la app para cada campaña sin pedir a los ingenieros que reimplementen la codificación en porcentaje. Las herramientas de QR y empaquetado necesitan una cadena estable para imprimir; validar el esquema de antemano evita un recall de producción cuando alguien pega My App! como esquema.
Las apps white-label multi-tenant asignan a cada marca su propio token de esquema y siguen compartiendo un solo constructor para convenciones de ruta y consulta. La validación fallida no consume saldo. Mantenga esquemas en una lista blanca documentada de su lado, rechace aquí los caracteres ilegales y obtendrá deep links reproducibles para SMS, correo, anuncios y compartidos en la app sin montar un acortador de enlaces ni una pila de atribución solo para ensamblar URI.
Preguntas frecuentes
¿Qué caracteres de esquema están permitidos?
RFC 3986: una letra primero, luego solo letras, dígitos, más (+), punto (.) o guion (-).
¿Cómo queda el enlace si no hay host?
Con el host vacío y la ruta /promo, el enlace queda como myapp:///promo, con tres barras. Si el host y la ruta están vacíos, obtiene igualmente un enlace válido como myapp://, que solo abre la app.
¿Qué pasa con los espacios y los símbolos en la consulta?
Cada clave y cada valor se codifican con las mismas reglas que usan los navegadores para los formularios, así que un espacio se convierte en una secuencia de escape y un ampersand no puede partir la consulta en pares equivocados.
¿Cuántos pares de consulta admite un enlace?
Hasta 50. Cada clave debe conservar texto tras quitar los espacios de los extremos, y los valores pueden ser texto, números o verdadero y falso; todos pasan a texto antes de codificarse.
¿Por qué aparece una barra delante de la ruta?
Porque una ruta no vacía siempre lleva exactamente una barra inicial: item/42 y /item/42 producen el mismo enlace. Así el resultado es predecible aunque la ruta se escriba de las dos formas.
Herramientas relacionadas
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/web/deep-link-scheme-build \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"scheme":"myapp"}'const res = await fetch("https://api.kit.forhosting.com/web/deep-link-scheme-build", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"scheme": "myapp"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/deep-link-scheme-build",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"scheme": "myapp"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/deep-link-scheme-build", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"scheme":"myapp"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"scheme":"myapp"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/deep-link-scheme-build", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"scheme": "myapp"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.deep_link_scheme_build",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Límites
timeout_sec | 30 |
max_crawl_pages | 25 |
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |
Notas técnicas
Esta capacidad acepta un esquema personalizado, host opcional, ruta opcional y una lista opcional de pares clave/valor de consulta, valida el esquema frente a la producción RFC 3986, normaliza la ruta, codifica la consulta y devuelve la cadena deep_link terminada más campos de eco estructurados. Los caracteres de esquema inválidos fallan con invalid_input en lugar de emitir una URI rota en silencio.
Qué es un deep link con esquema personalizado y cómo se ensambla la URI
Tras scheme:// viene un host opcional (a veces llamado authority), como product, open o auth, luego una ruta opcional como /item/42, y después una cadena de consulta opcional de pares clave igual valor unidos por ampersands. Cuando el host está vacío y la ruta es /promo, el resultado se ve como myapp:///promo; cuando host y ruta están vacíos, aún obtiene un cascarón legal scheme:// útil como intención bare de abrir la app. La respuesta hace eco de scheme, host, path, query_params, query_string, deep_link y has_query para que los clientes puedan registrar partes estructuradas sin volver a analizar la URI. Como el algoritmo es puro y determinista, las mismas entradas producen siempre el mismo deep_link byte a byte en la ruta gratuita del navegador y en la ruta API de pago.
Contrato de entrada, reglas de validación y comportamiento de error
Se aceptan como máximo cincuenta pares. Envíe por POST un cuerpo JSON con scheme como único campo estrictamente obligatorio: una cadena no vacía tras el recorte que coincida con el patrón letra y luego letras, dígitos, más, punto o guion. Se aceptan los alias url_scheme, custom_scheme y protocol. host es opcional y por defecto es la cadena vacía; cuando se indica no debe contener espacios, barra, signo de interrogación ni almohadilla. path es opcional; cuando no está vacío no debe contener espacios, signo de interrogación ni almohadilla, y se inserta una barra inicial si la omite, de modo que item/42 se convierte en /item/42. query_params es un array opcional de objetos, cada uno con key obligatoria y value opcional (por defecto cadena vacía); los alias query, params y search_params funcionan igual. Cada key debe ser no vacía tras el recorte; los valores pueden ser cadenas, números o booleanos y se convierten a cadena antes de codificar. scheme ausente o vacío, scheme con caracteres inválidos, caracteres ilegales en host o path, query_params que no sea array o keys en blanco fallan con invalid_input y un mensaje claro que nombra el problema—esos fallos no se facturan. En caso de éxito recibe scheme, host y path normalizados; la lista query_params normalizada; query_string sin signo de interrogación inicial; deep_link como URI completa; y has_query como booleano. Ejemplo: scheme myapp, host product, path /item/42 y query_params ref igual a email más utm_source igual a newsletter produce myapp://product/item/42? ref=email&utm_source=newsletter. Combine deep_link con los dominios asociados o filtros de intent de su app en el cliente; este endpoint solo construye la cadena URI y no registra esquemas en el SO ni verifica que la app esté instalada.
Dónde un constructor de URI deep link aporta valor
Los backends de notificaciones push componen scheme, host de pantalla e id de entidad en un solo campo deep_link que el cliente móvil puede analizar en un arranque en frío. Como la implementación es parse puro de nivel A, cada llamada exitosa cuesta el precio base publicado $0.002 sin tokens de modelo y sin red saliente.
Casos de integración
Enlaces de campaña y CRM para abrir en la app
Construya deep links personalizados myapp://host/path?utm… para correo, SMS y anuncios a partir de un esquema validado y un mapa de consulta.
Destinos en la carga de notificaciones push
Componga scheme, host de pantalla y ruta de entidad en una sola cadena deep_link que el cliente móvil abre al tocar la notificación.
QR, empaquetado y goldens de QA
Genere URI deep link imprimibles y fije valores deep_link estables en tests para que los esquemas ilegales nunca lleguen a producción.
Preguntas técnicas
¿Cómo construyo una URI deep link de app móvil?
Envíe un esquema personalizado (obligatorio), host y path opcionales, y query_params opcionales como pares {key, value}. La API devuelve deep_link como scheme://host/path?query con parámetros codificados en porcentaje.
¿Qué ocurre si el esquema tiene caracteres inválidos?
La tarea falla con invalid_input y un mensaje que nombra el esquema inválido. No se devuelve deep_link y la llamada no se factura.
¿Son obligatorios host o path?
No. Ambos por defecto están vacíos. Puede emitir scheme:// solo, scheme://host, scheme:///path o la forma completa scheme://host/path?query.
¿Cuánto cuesta el constructor de URI deep link?
La herramienta en el navegador es gratuita. Las peticiones API usan saldo KIT prepago a $0.002 por llamada exitosa; la entrada inválida no se factura.