Saltar al contenido

Endpoints

Endpoints

Nombre

Estadísticas del enlace

Totales del rango, serie por día o por hora y desgloses por país, dispositivo, sistema, navegador u origen.

Método HTTP y ruta

GET/api/v6/urlshortener/links/{domain}/{code}/stats

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

Qué pasa al ejecutarlo

  • Solo consulta: no cambia datos de tu organización.
  • La llamada no se cobra.

Qué hace

Analítica de un enlace en una ventana de días: los totales del rango, una serie por día o por hora y los valores con más visitas de cada dimensión. Los días y las horas son de Colombia (America/Bogota).

  • totals.clicks y totals.uniqueClicks son los del rango; firstClickAt y lastClickAt, los de toda la vida del enlace.
  • La serie es dispersa: los días u horas sin visitas no vienen. Complétalos en cero si vas a graficar.
  • Cada dimensión trae los top valores con más visitas y, si queda resto, una fila __other. Una visita sin dato para una dimensión (sin país, o llegada sin origen) no aparece en ella: sus filas pueden sumar menos que el total.
  • referrer es solo el dominio de origen (www.facebook.com), sin la ruta. Las visitas directas no tienen fila: son totals.clicks menos la suma de referrer.
  • device es mobile, tablet o desktop; os, Android, iOS, Windows, macOS, Linux, ChromeOS u Other; browser, Chrome, Safari, Firefox, Edge, Opera, Samsung Internet, UC Browser u Other. country es el código ISO (CO).

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: 120 solicitudes por minuto.

  • Ventanas de hasta 366 días por día, y de hasta 31 días por hora.
  • Hasta 100 valores por dimensión.
  • Además, cada consulta gasta unidades de un cupo de 120 por minuto de tu organización, según su costo: 2 por la consulta y 3 por cada 31 días del rango. 30 días gastan 5; un año, 38. Sin unidades, 429 con Retry-After.

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

fromOpcionalstring

Primer día de la ventana, AAAA-MM-DD en hora de Colombia, incluido. Por defecto, 29 días antes de to (la ventana es de 30 días).

Formato:dateEjemplo:2026-09-01

toOpcionalstring

Último día de la ventana, AAAA-MM-DD en hora de Colombia, incluido. Por defecto, hoy.

Formato:dateEjemplo:2026-09-23

granularityOpcionalstring

Tamaño de cada punto de la serie. day admite ventanas de hasta 366 días; hour, de hasta 31.

Valores permitidos:day hourValor por omisión:day

dimensionsOpcionalstring

Dimensiones de desglose, separadas por coma: country, subdivision, city, device, os, browser, referrer. Por defecto country,device,os,browser,referrer. Los nombres que no existen se ignoran.

Ejemplo:country,device,referrer

topOpcionalinteger

Cuántos valores trae cada dimensión (y cada ranking). Máximo 100.

Valor por omisión:10Mínimo:1Máximo:100

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

Analítica del enlace.

Ejemplo de respuesta
{
  "success": true,
  "data": {
    "domain": "h0b.co",
    "code": "a1b2c3d",
    "shortUrl": "https://h0b.co/a1b2c3d",
    "range": { "from": "2026-08-25", "to": "2026-09-23", "granularity": "day", "timezone": "America/Bogota" },
    "totals": {
      "clicks": 128,
      "uniqueClicks": 96,
      "firstClickAt": "2026-09-20T15:31:40Z",
      "lastClickAt": "2026-09-23T18:22:10Z"
    },
    "series": [
      { "at": "2026-09-20", "clicks": 40, "uniqueClicks": 31 },
      { "at": "2026-09-23", "clicks": 88, "uniqueClicks": 65 }
    ],
    "dimensions": {
      "country": [{ "value": "CO", "clicks": 110 }, { "value": "__other", "clicks": 12 }],
      "device": [{ "value": "mobile", "clicks": 101 }, { "value": "desktop", "clicks": 27 }]
    }
  },
  "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

data.codeSiempre presentestring

data.shortUrlSiempre presentestring

Formato:uri

data.rangeSiempre presenteobject

La ventana que se consultó, ya resuelta.

data.range.fromSiempre presentestring

Formato:date

data.range.toSiempre presentestring

Formato:date

data.range.granularitySiempre presentestring

Valores permitidos:day hour

data.range.timezoneSiempre presentestring

Ejemplo:America/Bogota

data.totalsSiempre presenteobject

data.totals.clicksSiempre presenteinteger

Visitas del rango.

data.totals.uniqueClicksSiempre presenteinteger

Únicas del rango (suma diaria).

data.totals.firstClickAtSiempre presentestring

Puede llegar en null.

Formato:date-time

data.totals.lastClickAtSiempre presentestring

Puede llegar en null.

Formato:date-time

data.seriesSiempre presentearray<object>

data.series[].atSiempre presentestring

AAAA-MM-DD con granularidad day; AAAA-MM-DDTHH:00:00 (hora de Colombia, sin zona) con hour.

Ejemplo:2026-09-22

data.series[].clicksSiempre presenteinteger

data.series[].uniqueClicksSiempre presenteinteger

data.dimensionsSiempre presenteobject

Un arreglo por cada dimensión pedida.

data.dimensions.{cualquier clave}array<object>

data.dimensions.{cualquier clave}[].valueSiempre presentestring

El valor tal como se registró (CO, mobile, Chrome, www.facebook.com…), o __other para la suma de lo que quedó fuera del top.

data.dimensions.{cualquier clave}[].clicksSiempre presenteinteger

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

  • 400Una fecha que no es AAAA-MM-DD, from posterior a to, una ventana mayor a la permitida o una granularidad que no existe.
  • 400STATS_RANGE_INVALID

    El rango o la granularidad de estadísticas son inválidos.

    Mensaje que devuelve la API: The requested statistics range or granularity is invalid.

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 (o fue eliminado). Un enlace de otra organización también responde 404: no se revela que exista.
  • 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

  • 504La consulta tardó demasiado y la detuvimos. Pasa con consultas muy grandes para organizaciones con muchos enlaces: acótala (menos días, menos secciones, más filtros). Repetirla igual no ayuda.

Otras respuestas

Este endpoint no declara respuestas de este tipo.

Ver en el catálogo de errores

Consideraciones especiales

uniqueClicks cuenta la primera visita del día desde cada navegador. En un rango de varios días es la suma de cada día, no personas distintas. Las respuestas pueden tener hasta un minuto de antigüedad (cabecera X-Cache).

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.