Nombre
Listar enlaces cortos
Tus enlaces paginados, con búsqueda, filtros, orden y sus contadores de visitas.
Método HTTP y ruta
/ api/ v6/ urlshortener/ linkshttps:
Qué pasa al ejecutarlo
- Solo consulta: no cambia datos de tu organización.
- La llamada no se cobra.
Qué hace
Lista los enlaces de tu organización (nunca los eliminados) con sus contadores ya consolidados. Por defecto, del más nuevo al más viejo. Todos los filtros son opcionales y se combinan entre sí.
Para recorrer muchos enlaces, pagina con cursor. Cada respuesta trae nextCursor mientras haya más: pásalo en la siguiente petición, con los mismos filtros, sort y order, y la página empieza justo después del último enlace de la anterior. page sigue funcionando como siempre, pero solo hasta el enlace 10.000 (con perPage=, hasta la página 100); más allá responde 400 y hay que seguir con cursor, que no tiene tope.
total es exacto hasta 10.000. Si los enlaces que cumplen los filtros son más, total llega en 10000 y totalIsExact en false: «más de 10.000». hasMore dice siempre, sin error, si hay otra página.
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.
Autenticación y permisos
- Envía tu API key en la cabecera
Authorizationcon el esquema Bearer.
Quién puede llamarlo: Una API key con el servicio urlshortener habilitado.
Límites y consideraciones operativas
Límite de uso: 30 solicitudes por minuto.
- Hasta 100 ítems por página; un valor mayor se recorta a 100.
totales exacto hasta 10.000; por encima,totalIsExactesfalse.- Con
pagese llega hasta el enlace 10.000; para seguir,cursor. - Una búsqueda o un orden demasiado costosos para una organización muy grande se detienen a los pocos segundos con
504.
Parámetros de ruta
Este endpoint no tiene parámetros de ruta.
Parámetros de consulta
| Nombre | Tipo | Descripción y reglas |
|---|---|---|
pageOpcional | integer | Número de página (empieza en 1). Llega hasta el enlace 10.000: la página tiene que empezar, como mucho, en el enlace 10.000. Con Valor por omisión: |
perPageOpcional | integer | Ítems por página (máximo 100). Valor por omisión: |
cursorOpcional | string | El |
searchOpcional | string | Busca en el código y en la URL de destino, por fragmento y sin distinguir mayúsculas ni tildes (mínimo 2 caracteres; con menos se ignora). Si pegas una URL corta completa ( Largo mínimo: |
domainOpcional | string | Solo los enlaces de este dominio. Los de un dominio que ya no es de tu organización ( |
stateOpcional | string | Estado tal como lo vive quien visita: Valores permitidos: |
statusOpcional | string | Estado guardado. Valores permitidos: |
kindOpcional | string | Enlaces con alias elegido, o con código generado. Valores permitidos: |
trafficOpcional | string |
Valores permitidos: |
createdFromOpcional | string | Creados desde este día ( Formato: |
createdToOpcional | string | Creados hasta este día ( Formato: |
sortOpcional | string | Orden: por fecha de creación, por visitas de toda la vida, por última visita o por vencimiento. Con Valores permitidos: |
orderOpcional | string | Sentido del orden. Valores permitidos: |
Encabezados HTTP
| Nombre | Tipo | Descripción y reglas |
|---|---|---|
AuthorizationObligatorio | string | Tu API key con el esquema Bearer. Ejemplo: |
Cuerpo de la petición
Este endpoint no recibe cuerpo en la petición.
Respuestas satisfactorias
200
Página de enlaces.
{
"success": true,
"data": {
"items": [
{
"domain": "h0b.co",
"code": "a1b2c3d",
"shortUrl": "https://h0b.co/a1b2c3d",
"longUrl": "https://example.com/landing",
"isAlias": false,
"status": "active",
"domainStatus": "active",
"expiresAt": null,
"createdAt": "2026-09-20T15:04:05Z",
"clicks": 128,
"uniqueClicks": 96,
"firstClickAt": "2026-09-20T15:31:40Z",
"lastClickAt": "2026-09-23T18:22:10Z"
}
],
"page": 1,
"perPage": 20,
"total": 1,
"totalIsExact": true,
"hasMore": false,
"nextCursor": 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
| Nombre | Tipo | Descripción y reglas |
|---|---|---|
successSiempre presente | boolean | |
dataSiempre presente | object | |
data.Siempre presente | array<object> | |
data.Siempre presente | string | Dominio del enlace, en minúsculas. Si el dominio ya no es de tu organización ( |
data.Siempre presente | string | Código del enlace, en minúsculas: 7 caracteres |
data.Siempre presente | string | La URL corta completa: siempre Formato: |
data.Siempre presente | string | URL de destino. Formato: |
data.Siempre presente | boolean |
|
data.Siempre presente | string |
Valores permitidos: |
data. | string | Si el dominio deja abrir el enlace, aparte de su propio Valores permitidos: |
data.Siempre presente | string | Vencimiento en UTC, o Puede llegar en Formato: |
data.Siempre presente | string | Fecha de creación, en UTC. Formato: |
data.Siempre presente | integer | 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.Siempre presente | integer | 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.Siempre presente | string | Primera visita, en UTC. Puede llegar en Formato: |
data.Siempre presente | string | Última visita, en UTC. Puede llegar en Formato: |
data.Siempre presente | integer | La página pedida, o |
data.Siempre presente | integer | |
data.Siempre presente | integer | Enlaces que cumplen los filtros, exacto hasta 10.000. Si son más, llega en |
data.Siempre presente | boolean |
|
data.Siempre presente | boolean |
|
data.Siempre presente | string | Para pedir la página siguiente con Puede llegar en |
metaSiempre presente | object | Metadatos de la respuesta. |
meta.Siempre presente | string | Identificador único de la solicitud (16 caracteres hexadecimales). Es el mismo de la cabecera Ejemplo: |
meta.Siempre presente | string | IP con la que la API vio tu solicitud. Útil si tu API key solo admite ciertas redes. Ejemplo: |
meta.Siempre presente | string | Fecha y hora en que se construyó la respuesta (ISO 8601 con offset). Formato: |
meta.Siempre presente | number | Tiempo (ms) que tomó procesar la solicitud en el servidor. Ejemplo: |
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
| Nombre | Tipo | Descripción y reglas |
|---|---|---|
successSiempre presente | boolean | Valor fijo: |
metaSiempre presente | object | Metadatos de la respuesta. |
meta.Siempre presente | string | Identificador único de la solicitud (16 caracteres hexadecimales). Es el mismo de la cabecera Ejemplo: |
meta.Siempre presente | string | IP con la que la API vio tu solicitud. Útil si tu API key solo admite ciertas redes. Ejemplo: |
meta.Siempre presente | string | Fecha y hora en que se construyó la respuesta (ISO 8601 con offset). Formato: |
meta.Siempre presente | number | Tiempo (ms) que tomó procesar la solicitud en el servidor. Ejemplo: |
errorSiempre presente | object | |
error.Siempre presente | string | Identificador estable en UPPER_SNAKE_CASE. Los clientes ramifican sobre este valor. Ejemplo: |
error. | integer | Código numérico legacy v5, solo cuando hay puente. Se omite en los códigos nacidos en v6. Ejemplo: |
error.Siempre presente | string | URL a la documentación del error. Formato: |
error.Siempre presente | string | Texto legible en inglés. Es para el log del desarrollador, no para el usuario final: no lo parsees. |
error.Siempre presente | array<object> | Contexto estructurado (validaciones, recurso afectado). Arreglo vacío cuando no hay contexto extra. |
Validación
- 400Un filtro trae un valor que no existe (el mensaje dice cuál y qué valores acepta), una fecha que no es
AAAA-MM-DD, unapagemás allá del enlace 10.000 o uncursorque no vale.
400VALIDATION_INVALID_PARAMETER
Un parámetro o un campo del cuerpo no es válido.
Autenticación
- 401Credenciales inválidas o faltantes.
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>`.
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.
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.
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.
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.
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
Este endpoint no declara respuestas de este tipo.
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.
Una consulta interna tardó demasiado y se cortó.
Otras respuestas
Este endpoint no declara respuestas de este tipo.
Consideraciones especiales
status conserva su significado de siempre: active incluye los vencidos, porque vencer no cambia el estado guardado. Para separar los vigentes de los vencidos usa state.