Saltar al contenido

Endpoints

Endpoints

Nombre

Restaurar un enlace eliminado

Devuelve a la vida un enlace tuyo que eliminaste, con el mismo código y sin nuevo cobro.

Método HTTP y ruta

POST/api/v6/urlshortener/links/{domain}/{code}/restore

https://developers.hablame.co/api/v6/urlshortener/links/{domain}/{code}/restore

Qué pasa al ejecutarlo

  • Cambia datos de tu organización.
  • La llamada no se cobra.
  • Si el enlace estaba activo cuando lo eliminaste, vuelve activo y cada visita de una persona se vuelve a cobrar (las de robots y las vistas previas no).

Qué hace

El código de un enlace eliminado no se libera nunca, así que no lo puedes volver a crear (crear con ese alias responde 409 ALIAS_RETIRED). Con este endpoint lo restauras: vuelve con su destino, su vencimiento y el estado que tenía al eliminarlo (si estaba desactivado, vuelve desactivado), y sus visitas de antes siguen contando. Restaurarlo no se cobra; si vuelve activo, sus visitas siguientes sí se cobran, como las de cualquier enlace activo. Se puede durante 90 días desde que lo eliminaste: después el enlace se archiva y restaurarlo responde 404 LINK_NOT_FOUND.

  • Restaurar un enlace que no está eliminado lo devuelve tal cual: puedes reintentar sin miedo.
  • Un enlace bloqueado por Hablame no se puede restaurar (409 LINK_BLOCKED).
  • Queda registrado quién lo restauró. Comparte el límite de uso de la edición.

Disponibilidad y requisitos previos

  • Publicado y disponible en la API v6 de producción.
  • Todas las rutas parten de https://developers.hablame.co.
  • Necesitas una API key de Hablame para llamarlo.

Crea tu clave de API

Autenticación y permisos

  • Envía tu API key en la cabecera Authorization con el esquema Bearer.

Quién puede llamarlo: Una API key con el servicio urlshortener habilitado.

Límites y consideraciones operativas

Límite de uso: 35 solicitudes por segundo.

Parámetros de ruta

NombreTipoDescripción y reglas
domainObligatoriostring

Dominio del enlace, tal como lo devuelve la API en domain. Se compara en minúsculas. Nombra al enlace que hoy responde en esa URL corta; para uno de un dominio que ya no es de tu organización (domainStatus: released), añade domainStatus=released.

Ejemplo:h0b.co

codeObligatoriostring

Código o alias del enlace. Se compara en minúsculas.

Ejemplo:a1b2c3d

Parámetros de consulta

NombreTipoDescripción y reglas
domainStatusOpcionalstring

Con released, el enlace es el de un dominio que ya no es de tu organización (el que la lista devuelve con domainStatus: released), aunque ese nombre sea hoy el de otro dominio con el mismo código. Sin él, domain nombra al dominio que hoy se llama así. Otro valor responde 400 VALIDATION_INVALID_PARAMETER.

Valores permitidos:released

Encabezados HTTP

NombreTipoDescripción y reglas
AuthorizationObligatoriostring

Tu API key con el esquema Bearer.

Ejemplo:Bearer hk_TU_API_KEY

Cuerpo de la petición

Este endpoint no recibe cuerpo en la petición.

Respuestas satisfactorias

200

El enlace, ya restaurado.

Ejemplo de respuesta
{
  "success": true,
  "data": {
    "domain": "h0b.co",
    "code": "a1b2c3d",
    "shortUrl": "https://h0b.co/a1b2c3d",
    "longUrl": "https://example.com/landing?utm_source=sms",
    "isAlias": false,
    "status": "active",
    "domainStatus": "active",
    "expiresAt": null,
    "createdAt": "2026-09-23T15:04:05Z",
    "clicks": 0,
    "uniqueClicks": 0,
    "firstClickAt": null,
    "lastClickAt": null
  },
  "meta": {
    "requestId": "8f0c0e2a4b1d4c8f",
    "clientIp": "203.0.113.45",
    "timestamp": "2026-09-23T18:30:00+00:00",
    "responseTimeMs": 7.2
  }
}

Los valores del ejemplo son ilustrativos.

Campos de la respuesta

NombreTipoDescripción y reglas
successSiempre presenteboolean

dataSiempre presenteobject

data.domainSiempre presentestring

Dominio del enlace, en minúsculas. Si el dominio ya no es de tu organización (domainStatus: released), es el nombre que tenía.

data.codeSiempre presentestring

Código del enlace, en minúsculas: 7 caracteres 0-9a-z cuando lo genera el servicio, o el alias que se eligió al crearlo. Único por dominio.

data.shortUrlSiempre presentestring

La URL corta completa: siempre https://{domain}/{code}.

Formato:uri

data.longUrlSiempre presentestring

URL de destino.

Formato:uri

data.isAliasSiempre presenteboolean

true cuando el código lo eligió quien creó el enlace (campo code al crearlo); false cuando lo generó el servicio.

data.statusSiempre presentestring

active, disabled o blocked (y deleted, solo en el caso de abajo). Vencido no es un estado: un enlace active con expiresAt en el pasado ya no redirige, pero conserva active. blocked es un enlace que Hablame bloqueó por seguridad: no redirige y no se puede editar, eliminar ni reactivar desde la API; si crees que es un error, escríbenos. Los enlaces eliminados no aparecen en las respuestas, salvo en la repetición de un alta con Idempotency-Key cuyo enlace se eliminó después: llega tal como está, con deleted.

Valores permitidos:active disabled blocked deleted

data.domainStatusstring

Si el dominio deja abrir el enlace, aparte de su propio status. active: lo deja. suspended: el dominio está suspendido; released: el dominio ya no es de tu organización; pending: es un dominio propio que todavía no está verificado. Con esos tres el enlace no redirige (el visitante recibe 404) aunque su status sea active. Llega en la lista, en la consulta de un enlace y al crearlo, editarlo o restaurarlo; si no llega, trátalo como antes de que existiera. Pueden aparecer valores nuevos: uno que no conozcas no significa que el enlace no abra.

Valores permitidos:active pending suspended released

data.expiresAtSiempre presentestring

Vencimiento en UTC, o null si no vence.

Puede llegar en null.

Formato:date-time

data.createdAtSiempre presentestring

Fecha de creación, en UTC.

Formato:date-time

data.clicksSiempre presenteinteger

Visitas de toda la vida del enlace. Las consolida un proceso en segundo plano: una visita puede tardar de segundos a pocos minutos en reflejarse. No cuenta bots ni las vistas previas que generan las redes sociales y los chats.

data.uniqueClicksSiempre presenteinteger

Suma de las visitas únicas de cada día: la primera visita del día desde cada navegador. No son personas distintas en toda la vida del enlace.

data.firstClickAtSiempre presentestring

Primera visita, en UTC. null si nunca ha recibido una.

Puede llegar en null.

Formato:date-time

data.lastClickAtSiempre presentestring

Última visita, en UTC. null si nunca ha recibido una.

Puede llegar en null.

Formato:date-time

metaSiempre presenteobject

Metadatos de la respuesta.

meta.requestIdSiempre presentestring

Identificador único de la solicitud (16 caracteres hexadecimales). Es el mismo de la cabecera X-Request-Id. Cítalo al contactar soporte.

Ejemplo:b9b1704baffab211

meta.clientIpSiempre presentestring

IP con la que la API vio tu solicitud. Útil si tu API key solo admite ciertas redes.

Ejemplo:203.0.113.45

meta.timestampSiempre presentestring

Fecha y hora en que se construyó la respuesta (ISO 8601 con offset).

Formato:date-timeEjemplo:2026-06-04T19:43:59+00:00

meta.responseTimeMsSiempre presentenumber

Tiempo (ms) que tomó procesar la solicitud en el servidor.

Ejemplo:4.24

Códigos de error

Todas las respuestas de error tienen la misma forma: success en false y un objeto error cuyo code dice qué pasó. Aquí están agrupadas por tipo, con los códigos que este endpoint puede devolver.

Forma de una respuesta de error
NombreTipoDescripción y reglas
successSiempre presenteboolean

Valor fijo:false

metaSiempre presenteobject

Metadatos de la respuesta.

meta.requestIdSiempre presentestring

Identificador único de la solicitud (16 caracteres hexadecimales). Es el mismo de la cabecera X-Request-Id. Cítalo al contactar soporte.

Ejemplo:b9b1704baffab211

meta.clientIpSiempre presentestring

IP con la que la API vio tu solicitud. Útil si tu API key solo admite ciertas redes.

Ejemplo:203.0.113.45

meta.timestampSiempre presentestring

Fecha y hora en que se construyó la respuesta (ISO 8601 con offset).

Formato:date-timeEjemplo:2026-06-04T19:43:59+00:00

meta.responseTimeMsSiempre presentenumber

Tiempo (ms) que tomó procesar la solicitud en el servidor.

Ejemplo:4.24

errorSiempre presenteobject

error.codeSiempre presentestring

Identificador estable en UPPER_SNAKE_CASE. Los clientes ramifican sobre este valor.

Ejemplo:AUTH_REQUIRED

error.legacyCodeinteger

Código numérico legacy v5, solo cuando hay puente. Se omite en los códigos nacidos en v6.

Ejemplo:40002

error.typeSiempre presentestring

URL a la documentación del error.

Formato:uriEjemplo:https://developers.hablame.co/docs/v6/errors/auth-required

error.messageSiempre presentestring

Texto legible en inglés. Es para el log del desarrollador, no para el usuario final: no lo parsees.

error.detailsSiempre presentearray<object>

Contexto estructurado (validaciones, recurso afectado). Arreglo vacío cuando no hay contexto extra.

Validación

Este endpoint no declara respuestas de este tipo.

Autenticación

  • 401Credenciales inválidas o faltantes.
  • 401AUTH_REQUIRED

    No se envió un token Bearer y cada llamada lo requiere.

    Mensaje que devuelve la API: Authentication is required. Send your API key as `Authorization: Bearer <token>`.

  • 401AUTH_INVALID_KEY

    La clave de API no se reconoce: formato equivocado, revocada o vencida.

    Mensaje que devuelve la API: The provided API key is invalid or has expired. Please verify the value sent in the `Authorization: Bearer` header.

Permisos

  • 403La API key no tiene habilitado el acortador (o está apagado para tu organización), la key no se puede usar desde la red de la petición, o la organización no está activa.
  • 403AUTH_SERVICE_NOT_ALLOWED

    La clave no tiene permitido el servicio detrás de este endpoint.

    Mensaje que devuelve la API: This API key is not authorized to use the requested service.

  • 403AUTH_IP_NOT_ALLOWED

    La clave solo funciona desde ciertas redes y tu IP no está entre ellas.

    Mensaje que devuelve la API: This API key cannot be used from this IP address. The address we saw is in `meta.clientIp`: call from one of the networks allowed for the key, or use a key that allows this one.

  • 403ACCOUNT_NOT_ACTIVE

    Tu organización está suspendida o cerrada.

    Mensaje que devuelve la API: The organization associated with this API key is not active. Please contact support.

Límites de uso

  • 429Se excedió el límite de solicitudes.
  • 429RATE_TPS_EXCEEDED

    Excediste el cupo de tu organización para este endpoint.

    Mensaje que devuelve la API: You have exceeded the allowed request rate for this endpoint. Please wait before retrying.

Recurso inexistente

  • 404No existe un enlace de tu organización con ese dominio y código (eliminado o no).
  • 404LINK_NOT_FOUND

    No hay un enlace con ese dominio y código.

    Mensaje que devuelve la API: No short link was found for that domain and code.

Errores internos y disponibilidad

Este endpoint no declara respuestas de este tipo.

Otras respuestas

  • 409El enlace está bloqueado por Hablame.

Ver en el catálogo de errores

Consideraciones especiales

Una key con el acortador también crea y borra

El servicio urlshortener da todo el acortador: con él, la API key lista y consulta enlaces, y también los crea (cada alta se cobra), los edita, los borra y los restaura. No hay keys de solo lectura. Solo el propietario de tu organización crea las keys: si una no debe crear enlaces, no le des este servicio. Sin él, la key recibe 403 AUTH_SERVICE_NOT_ALLOWED.

Documentación relacionada

¿Necesitas ayuda?

¿Te sirvió esta página?

Ver todos los canales de soporte

Pide ayuda sobre esto: este endpoint

Armamos un mensaje con los datos que ayudan a revisar tu caso. Léelo, complétalo y envíalo tú: no se manda nada solo.

El mensaje nunca lleva tu clave de API ni contraseñas.