API REST · v1
Documentación de la API
Crea enlaces cortos de cut.conorld.com desde cualquier proyecto, gratis y sin registro.
Contenido
Introducción
La API sigue las convenciones REST: recibe JSON o datos de formulario y siempre responde JSON, incluso los errores. Todas las fechas usan ISO 8601 en UTC.
Es de uso libre: puedes acortar enlaces sin registrarte ni enviar token, con una sola petición.
URL base
https://cut.conorld.com/api/v1
Autenticación
Opcional al crear
Límite
10/min sin token · 60/min con token
Inicio rápido
-
1
Acorta tu primer enlace, sin registro
Terminalcurl -X POST https://cut.conorld.com/api/v1/links \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"url": "https://conorld.com/una/ruta/muy/larga"}' -
2
Usa la URL corta
La respuesta incluye
short_url, lista para compartir. Guárdala en tu sistema: los enlaces creados sin token no se pueden consultar después.Respuesta · 201 Created{ "data": { "code": "k7m2xqp", "short_url": "https://cut.conorld.com/k7m2xqp", "original_url": "https://conorld.com/una/ruta/muy/larga", "title": null, "is_active": true, "expires_at": null, "clicks": 0, "last_clicked_at": null, "created_at": "2026-09-15T15:04:05+00:00", "updated_at": "2026-09-15T15:04:05+00:00" } }
Autenticación
La API es de uso libre: crear enlaces no requiere cuenta ni token. Los endpoints de gestión (listar, editar, eliminar y estadísticas) están reservados a las cuentas de administración de Conorld.
| Sin token | Con token | |
|---|---|---|
| Crear enlaces | Sí | Sí, quedan en tu cuenta |
| Listar, editar, eliminar y ver estadísticas | No | Sí, de tus enlaces |
| Límite | 10 enlaces / min por IP | 60 peticiones / min por cuenta |
Los enlaces creados sin token no tienen dueño: no se pueden modificar ni consultar después, así que guarda la short_url de la respuesta.
Si tienes un token de administración, envíalo en la cabecera Authorization.
Authorization: Bearer 1|AbCdEfGhIjKlMnOpQrStUvWxYz0123456789
Accept: application/json
- Un token actúa en nombre del usuario que lo creó y solo accede a sus enlaces.
- Crea un token por proyecto. Así puedes revocar uno sin afectar a los demás.
- Si revocas un token, las peticiones que lo usen empiezan a recibir
401al instante.
El token es una credencial. Úsalo solo desde tu backend y guárdalo en variables de entorno. Nunca lo pongas en código que corre en el navegador ni lo subas al repositorio.
Límites de uso
Sin token se pueden crear hasta 10 enlaces por minuto por IP. Con token, cada cuenta puede hacer hasta 60 peticiones por minuto. Cada respuesta indica cuánto te queda:
| X-RateLimit-Limit | Peticiones permitidas por minuto. |
| X-RateLimit-Remaining | Peticiones que te quedan en el minuto actual. |
| Retry-After | Solo con 429: segundos que debes esperar antes de reintentar. |
{
"message": "Too Many Attempts."
}
Errores
Los errores usan códigos HTTP estándar y siempre traen un campo message.
| Código | Significado | Cuándo ocurre |
|---|---|---|
| 401 | Unauthorized | Falta el token en un endpoint que lo requiere, o el token enviado es inválido o fue revocado. |
| 404 | Not Found | El enlace no existe o pertenece a otro usuario. |
| 422 | Unprocessable Content | Algún campo no pasó la validación. El detalle viene en errors. |
| 429 | Too Many Requests | Superaste el límite de peticiones. Espera los segundos de Retry-After. |
| 500 | Server Error | Error inesperado. Reintenta más tarde con espera progresiva. |
En los errores de validación (422), errors lista los mensajes de cada campo:
{
"message": "Ese alias ya está en uso.",
"errors": {
"alias": ["Ese alias ya está en uso."]
}
}
Referencia
El objeto link
Todos los endpoints de enlaces devuelven este objeto dentro de data.
Campos
| Campo | Tipo | Descripción |
|---|---|---|
| code | string | Código del enlace, siempre en minúsculas. Lo identifica en todos los endpoints. |
| short_url | string | URL corta lista para compartir. |
| original_url | string | URL de destino. |
| title | string | null | Título interno opcional. |
| is_active | boolean | Si es false, la URL corta responde 410. |
| expires_at | string | null | Fecha de expiración (ISO 8601, UTC). |
| clicks | integer | Total de clics registrados. |
| last_clicked_at | string | null | Fecha del último clic. |
| created_at | string | Fecha de creación. |
| updated_at | string | Fecha de la última edición. |
Usuario actual
Devuelve el usuario dueño del token. Sirve para comprobar que el token funciona.
curl https://cut.conorld.com/api/v1/me \
-H "Authorization: Bearer $CUT_TOKEN"
{
"data": {
"id": 1,
"name": "Tienda web",
"email": "tienda@conorld.com"
}
}
Crear enlace
Crea un enlace corto. Envía los campos como JSON o como formulario.
El token es opcional. Sin token el enlace es anónimo (no podrás editarlo ni ver sus estadísticas); con token queda en tu cuenta. Si envías un token inválido, la API responde 401 en lugar de crear un enlace anónimo.
Cuerpo de la petición
| Campo | Tipo | Descripción |
|---|---|---|
| url obligatorio | string | URL de destino con http o https. Máximo 2048 caracteres. No puede apuntar a cut.conorld.com. |
| alias | string | Código personalizado de 3 a 32 caracteres: letras, números, - y _. Se guarda en minúsculas. Si se omite, se genera uno de 7 caracteres. |
| title | string | Título interno. Máximo 255 caracteres. |
| expires_at | string | Fecha futura en ISO 8601, por ejemplo 2026-12-31T23:59:00Z. Al pasar la fecha, el enlace responde 410. |
curl -X POST https://cut.conorld.com/api/v1/links \
-H "Authorization: Bearer $CUT_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"url": "https://conorld.com/campanas/2026/lanzamiento?utm_source=email",
"alias": "lanzamiento",
"title": "Campaña de lanzamiento",
"expires_at": "2026-12-31T23:59:00Z"
}'
{
"data": {
"code": "lanzamiento",
"short_url": "https://cut.conorld.com/lanzamiento",
"original_url": "https://conorld.com/campanas/2026/lanzamiento?utm_source=email",
"title": "Campaña de lanzamiento",
"is_active": true,
"expires_at": "2026-12-31T23:59:00+00:00",
"clicks": 0,
"last_clicked_at": null,
"created_at": "2026-09-15T15:04:05+00:00",
"updated_at": "2026-09-15T15:04:05+00:00"
}
}
Listar enlaces
Devuelve tus enlaces paginados, del más reciente al más antiguo.
Parámetros de consulta
| Campo | Tipo | Descripción |
|---|---|---|
| page | integer | Página a consultar. Por defecto 1. |
| per_page | integer | Resultados por página, de 1 a 100. Por defecto 20. |
curl "https://cut.conorld.com/api/v1/links?per_page=50&page=1" \
-H "Authorization: Bearer $CUT_TOKEN"
{
"data": [
{ "code": "lanzamiento", "short_url": "https://cut.conorld.com/lanzamiento", "clicks": 1284 },
{ "code": "k7m2xqp", "short_url": "https://cut.conorld.com/k7m2xqp", "clicks": 37 }
],
"links": {
"first": "https://cut.conorld.com/api/v1/links?page=1",
"last": "https://cut.conorld.com/api/v1/links?page=3",
"prev": null,
"next": "https://cut.conorld.com/api/v1/links?page=2"
},
"meta": {
"current_page": 1,
"last_page": 3,
"per_page": 50,
"total": 128
}
}
Ejemplo abreviado: cada elemento de data es un objeto link completo.
Obtener enlace
Devuelve un enlace por su código.
Parámetros de ruta
| Campo | Tipo | Descripción |
|---|---|---|
| code obligatorio | string | Código del enlace. No distingue mayúsculas: PROMO y promo son el mismo. |
curl https://cut.conorld.com/api/v1/links/lanzamiento \
-H "Authorization: Bearer $CUT_TOKEN"
Actualizar enlace
Modifica solo los campos que envíes. El código no se puede cambiar, así que la URL corta ya compartida sigue funcionando.
Parámetros de ruta
| Campo | Tipo | Descripción |
|---|---|---|
| code obligatorio | string | Código del enlace. No distingue mayúsculas: PROMO y promo son el mismo. |
Cuerpo de la petición
| Campo | Tipo | Descripción |
|---|---|---|
| url | string | Nuevo destino. Mismas reglas que al crear. |
| title | string | null | Nuevo título, o null para quitarlo. |
| is_active | boolean | Activa o desactiva el enlace. |
| expires_at | string | null | Nueva fecha de expiración, o null para quitarla. |
curl -X PATCH https://cut.conorld.com/api/v1/links/lanzamiento \
-H "Authorization: Bearer $CUT_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"url": "https://conorld.com/campanas/2026/lanzamiento-v2", "is_active": true}'
Responde 200 OK con el objeto link actualizado.
Eliminar enlace
Elimina el enlace. Responde 204 No Content sin cuerpo.
Parámetros de ruta
| Campo | Tipo | Descripción |
|---|---|---|
| code obligatorio | string | Código del enlace. No distingue mayúsculas: PROMO y promo son el mismo. |
curl -X DELETE https://cut.conorld.com/api/v1/links/lanzamiento \
-H "Authorization: Bearer $CUT_TOKEN"
Un código eliminado nunca se reutiliza: la URL corta deja de funcionar y no puede terminar apuntando a otro destino. Si solo quieres pausarlo, usa is_active: false.
Estadísticas
Devuelve los clics de los últimos 30 días y los principales sitios de origen.
Parámetros de ruta
| Campo | Tipo | Descripción |
|---|---|---|
| code obligatorio | string | Código del enlace. No distingue mayúsculas: PROMO y promo son el mismo. |
Campos de la respuesta
| Campo | Tipo | Descripción |
|---|---|---|
| total_clicks | integer | Total de clics desde la creación. |
| last_clicked_at | string | null | Fecha del último clic. |
| clicks_per_day | array | Siempre 30 elementos date / clicks, del más antiguo al más reciente, incluidos los días sin clics. |
| top_referers | array | Hasta 10 elementos host / clicks, ordenados por clics. No incluye visitas directas. |
curl https://cut.conorld.com/api/v1/links/lanzamiento/stats \
-H "Authorization: Bearer $CUT_TOKEN"
{
"data": {
"total_clicks": 1284,
"last_clicked_at": "2026-09-15T14:02:11+00:00",
"clicks_per_day": [
{ "date": "2026-08-17", "clicks": 12 },
{ "date": "2026-08-18", "clicks": 0 },
{ "date": "2026-09-15", "clicks": 96 }
],
"top_referers": [
{ "host": "www.facebook.com", "clicks": 512 },
{ "host": "www.google.com", "clicks": 230 }
]
}
}
Guías
Redirecciones
Cuando alguien abre https://cut.conorld.com/{code}:
| 302 | El enlace existe y está activo: redirige al destino y registra el clic. |
| 404 | El código no existe o fue eliminado. |
| 410 | El enlace está desactivado o ya expiró. |
- Se usa
302y no301: los navegadores no guardan la redirección en caché, así que puedes cambiar el destino o desactivar el enlace cuando quieras y cada visita se cuenta. - Los códigos no distinguen mayúsculas.
- De cada clic se guarda la fecha, el sitio de origen y el navegador. La IP del visitante nunca se almacena.
Ejemplos de integración
Crear un enlace desde distintos lenguajes, sin token.
use Illuminate\Support\Facades\Http;
$shortUrl = Http::acceptJson()
->timeout(10)
->post('https://cut.conorld.com/api/v1/links', ['url' => $urlLarga])
->throw()
->json('data.short_url');
$ch = curl_init('https://cut.conorld.com/api/v1/links');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => [
'Accept: application/json',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode(['url' => $urlLarga]),
]);
$body = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status !== 201) {
throw new RuntimeException($body['message'] ?? 'No se pudo acortar el enlace');
}
echo $body['data']['short_url'];
const res = await fetch('https://cut.conorld.com/api/v1/links', {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({ url: urlLarga }),
});
const body = await res.json();
if (!res.ok) throw new Error(body.message);
console.log(body.data.short_url);
import requests
response = requests.post(
"https://cut.conorld.com/api/v1/links",
headers={
"Accept": "application/json",
},
json={"url": url_larga},
timeout=10,
)
response.raise_for_status()
print(response.json()["data"]["short_url"])
Buenas prácticas
Guarda la URL corta
Los enlaces creados sin token no se pueden consultar después: guarda short_url en tu sistema.
Reutiliza en vez de duplicar
Si compartes la misma URL muchas veces, usa la misma short_url en lugar de crear un enlace nuevo cada vez.
Reintenta con espera
Ante 429 respeta Retry-After. Ante errores 5xx reintenta con espera progresiva.
Campañas temporales
Envía expires_at al crear el enlace y dejará de funcionar solo en esa fecha.
Alias para lo humano
Usa alias en enlaces impresos o que se dicen en voz alta, y códigos generados para lo automático.
Nada de datos sensibles
No acortes URLs con contraseñas, tokens o datos personales: cualquiera con el enlace corto llega al destino.