← Volver a Recursos

Recursos Pablo Abreu

6 patrones no negociables al diseñar una API (con ejemplos reales en NestJS)

Hay decisiones de arquitectura que se pueden debatir durante horas. Estas seis no: son los patrones que aplicamos en cada API que construimos, del MVP de una startup a la plataforma con miles de usuarios.

Los 6 patrones

Cada uno con su porqué de negocio, implementado en NestJS.

  • Versionado desde el día uno: todas las rutas nacen con /v1 y los breaking changes van a /v2. Ponerlo cuesta cinco minutos; migrar clientes de una API sin versionar cuesta semanas y favores.
  • Idempotencia en operaciones críticas: pagos, pedidos y altas exigen un header Idempotency-Key, de modo que un reintento jamás duplica un cobro.
  • Paginación siempre: toda colección se devuelve paginada con un límite máximo; la lista que hoy son 50 registros mañana son 50.000 y tumba el servidor.
  • Errores consistentes (RFC 9457): un único formato de error en toda la API, con códigos HTTP correctos y sin detalles internos; un error bien diseñado se resuelve sin abrir ticket.
  • Rate limiting desde el principio: límites por cliente y respuesta 429 con Retry-After, antes del primer susto con un bot o un scraper.
  • Contrato documentado (OpenAPI): especificación generada desde el código, versionada y validada en CI; si no está documentado, no existe.

Dos ejemplos: el versionado por URI viene de serie y el rate limiting son diez líneas con @nestjs/throttler.

// main.ts
import { VersioningType } from '@nestjs/common';

const app = await NestFactory.create(AppModule);
app.enableVersioning({
  type: VersioningType.URI,
  defaultVersion: '1',
});
// app.module.ts
import { ThrottlerModule, ThrottlerGuard } from '@nestjs/throttler';

@Module({
  imports: [
    ThrottlerModule.forRoot([{ ttl: 60_000, limit: 100 }]), // 100 req/min
  ],
  providers: [{ provide: APP_GUARD, useClass: ThrottlerGuard }],
})
export class AppModule {}

Preguntas frecuentes

¿Por qué versionar una API desde el primer día?

Porque cuando llega el primer breaking change ya suele haber varios consumidores en producción; prefijar las rutas con /v1 evita migrar clientes bajo presión.

¿Qué diferencia hay entre idempotencia y rate limiting?

La idempotencia evita que un reintento duplique una operación crítica; el rate limiting evita que un cliente sature la API. Son complementarios.

Datos curiosos

  • REST se definió en la tesis doctoral de Roy Fielding en el año 2000; Fielding es también coautor de la especificación HTTP.
  • El código 429 Too Many Requests no existió hasta 2012; lo introdujo el RFC 6585.
  • El código 418 "I'm a teapot" nació como broma en el RFC 2324 de 1998 y muchos frameworks aún lo implementan.
  • NestJS lo creó Kamil Myśliwiec en 2017 inspirándose en la arquitectura modular de Angular, pese a ser un framework de backend.
  • "Idempotente" viene de las matemáticas: acuñó el término Benjamin Peirce en el siglo XIX.

¿Y si tu API ya está en producción?

Si tu sistema ya está funcionando y no cumple alguno de estos puntos, la buena noticia es que ninguno exige rehacer nada: todos se pueden incorporar de forma incremental. La menos buena es que cuanto más tarde, más caro.

En Pablo Abreu hacemos diagnósticos técnicos gratuitos: revisamos tu API o tu sistema, te decimos qué está bien, qué es urgente y qué puede esperar — con claridad y sin adornos.

Solicitar diagnóstico Desarrollo de software a medida Consultoría técnica