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. 1

    Acorta tu primer enlace, sin registro

    Terminal
    curl -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. 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 tokenCon token
Crear enlacesSí, quedan en tu cuenta
Listar, editar, eliminar y ver estadísticasNoSí, de tus enlaces
Límite10 enlaces / min por IP60 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.

Cabeceras
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 401 al 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-LimitPeticiones permitidas por minuto.
X-RateLimit-RemainingPeticiones que te quedan en el minuto actual.
Retry-AfterSolo con 429: segundos que debes esperar antes de reintentar.
Respuesta · 429 Too Many Requests
{
  "message": "Too Many Attempts."
}

Errores

Los errores usan códigos HTTP estándar y siempre traen un campo message.

CódigoSignificadoCuá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:

Respuesta · 422 Unprocessable Content
{
  "message": "Ese alias ya está en uso.",
  "errors": {
    "alias": ["Ese alias ya está en uso."]
  }
}

Usuario actual

GET /api/v1/me
Requiere token

Devuelve el usuario dueño del token. Sirve para comprobar que el token funciona.

Petición
curl https://cut.conorld.com/api/v1/me \
  -H "Authorization: Bearer $CUT_TOKEN"
Respuesta · 200 OK
{
  "data": {
    "id": 1,
    "name": "Tienda web",
    "email": "tienda@conorld.com"
  }
}

Crear enlace

POST /api/v1/links
Uso libre · token opcional

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.
Petición
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"
  }'
Respuesta · 201 Created
{
  "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"
  }
}

Estadísticas

GET /api/v1/links/{code}/stats
Requiere token

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.
Petición
curl https://cut.conorld.com/api/v1/links/lanzamiento/stats \
  -H "Authorization: Bearer $CUT_TOKEN"
Respuesta · 200 OK
{
  "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}:

302El enlace existe y está activo: redirige al destino y registra el clic.
404El código no existe o fue eliminado.
410El enlace está desactivado o ya expiró.
  • Se usa 302 y no 301: 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.

PHP · Laravel
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');
PHP · sin framework (cURL)
$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'];
JavaScript · Node.js 18+
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);
Python · requests
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.