Formatter
/api/v1

Documentación de la API

Una sola petición POST formatea un archivo. Sin clave, sin cuenta, sin firma: la dirección y un cuerpo son todo el contrato.

Inicio rápido

Minifica una hoja de estilos e imprime el resultado:

curl
curl --data-urlencode 'input=.card { padding: 8px; margin: 0 auto; }' \
  https://formatter.nextwell.top/api/v1/minify/css/raw
# .card{padding:8px;margin:0 auto}

Cambia {css} por {js} o {html}, y {minify} por {beautify}. Todas las combinaciones funcionan.

Endpoints

La dirección base es {base}. Todo lo que sigue es un POST salvo que se indique lo contrario.

Método Ruta Propósito
POST/api/v1/minify/{lang}Minificar, respuesta JSON
POST/api/v1/minify/{lang}/rawMinificar, respuesta en texto plano
POST/api/v1/beautify/{lang}Embellecer, respuesta JSON
POST/api/v1/beautify/{lang}/rawEmbellecer, respuesta en texto plano
GET/api/v1/limitsLo que le queda a esta IP, sin gastar una petición
GET/api/v1/healthComprobación de disponibilidad, nunca limitada

{lang} es css, js o html.

Cómo enviar el código

Cada endpoint acepta tres formatos de cuerpo: usa el que te resulte más cómodo con tu cliente.

Codificado como formulario

Un campo {input}, {type}. Es el formato que las API de minificación aceptan por convención, así que un script existente solo cambia de dirección.

curl
curl --data-urlencode 'input=body{margin:0;padding:0}' \
  https://formatter.nextwell.top/api/v1/beautify/css

JSON

{type} con una cadena {input}.

curl
curl -H 'Content-Type: application/json' \
  -d '{"input":"const a=1;const b=a+1;console.log(b)"}' \
  https://formatter.nextwell.top/api/v1/beautify/js

Cuerpo en crudo

Cualquier otro tipo de contenido: el cuerpo es el código. Cómodo para {example}.

curl
curl --data-binary @style.css \
  -H 'Content-Type: text/css' \
  https://formatter.nextwell.top/api/v1/minify/css

Tamaño

2 MB por petición. Cualquier cosa mayor vuelve como 413 sin llegar a leerse.

Parámetros de consulta

Nombre Valores Significado
indent 2 4 tab Solo al embellecer: qué es un nivel de sangría.
curl
curl --data-urlencode 'input=.a{color:red}' \
  'https://formatter.nextwell.top/api/v1/beautify/css?indent=tab'

La respuesta

Una llamada correcta devuelve JSON:

JSON
{
  "ok": true,
  "action": "minify",
  "language": "css",
  "input_bytes": 1024,
  "output_bytes": 640,
  "saved_bytes": 384,
  "saved_percent": 37.5,
  "duration_ms": 42,
  "output": "p{color:red}"
}
Campo Tipo Significado
okbooleanSiempre true cuando la llamada tiene éxito.
actionstringminify o beautify: lo que se pidió.
languagestringcss, js o html.
input_bytesnumberTamaño de lo enviado, en bytes.
output_bytesnumberTamaño del resultado, en bytes.
saved_bytesnumberLa diferencia; negativa al embellecer.
saved_percentnumberLa misma diferencia en porcentaje, con un decimal.
duration_msnumberLo que tardó el trabajo, en milisegundos.
outputstringEl código ya formateado.

Respuestas en texto plano

Añade {raw} a cualquier endpoint de formato y el cuerpo será el resultado y nada más, como {type}. Las cabeceras son las mismas. Útil cuando quien llama es un shell:

curl
curl -s --data-binary @app.js \
  -H 'Content-Type: text/javascript' \
  https://formatter.nextwell.top/api/v1/minify/js/raw > app.min.js

Cabeceras de respuesta

Cabecera Significado
X-Formatter-DurationTiempo de proceso en milisegundos.
X-RateLimit-Remaining-Second … -MonthLo que le queda a esta IP en cada ventana.
Retry-AfterEn un 429: segundos hasta que se reabra la ventana agotada más estricta.
curl
curl -s -D - -o /dev/null --data-urlencode 'input=.a{color:red}' \
  https://formatter.nextwell.top/api/v1/minify/css

Errores

Todos los errores son JSON con el mismo formato:

JSON
{
  "errors": [
    { "status": 429, "title": "Too many requests", "detail": "…" }
  ]
}
Estado Título Cuándo
400Missing input Bad requestSin cuerpo, o con el campo input vacío.
404Not foundEsa ruta no existe.
405Method not allowedSe llamó a un endpoint de formato con algo distinto de POST.
413Payload too largeEl cuerpo supera los 2 MB.
415Unsupported languageEl lenguaje de la ruta no es css, js ni html.
422Malformed inputEl formateador rechazó el código fuente (normalmente un error de sintaxis) o tardó demasiado en procesarlo.
429Too many requestsUna de las ventanas de límite está agotada. Consulta Retry-After.
500Internal errorCualquier otra cosa.

Límites de peticiones

Por dirección IP, cinco ventanas deslizantes, todas aplicadas a la vez. Una petición tiene que caber en las cinco.

Ventana Límite
Por segundo{n} peticiones
Por minuto{n} peticiones
Por hora{n} peticiones
Por día{n} peticiones
Por mes{n} peticiones

Cuando una ventana se agota, la respuesta es 429 con una cabecera Retry-After que indica los segundos hasta que se reabra la más estricta. No se encola nada.

Los contadores viven en una pequeña base de datos en disco, así que reiniciar el servicio no le regala a nadie un día nuevo.

{endpoint} informa del estado actual de las cinco ventanas sin gastar ninguna.

curl
curl https://formatter.nextwell.top/api/v1/limits

Qué se guarda

Nada. El código se envía a nuestro servidor, se mantiene en memoria mientras dura la petición y se descarta. No se escribe en disco y nunca aparece en un registro. Lo que sí guardan los registros: un hash truncado de la IP, el lenguaje, la acción, el número de bytes y la duración.

Preguntas

¿Hace falta una clave?

No. El servicio es abierto y se limita por dirección IP.

¿Mi código se envía a alguna parte?

Solo a nuestro propio servidor. Todo se procesa allí, en memoria; el código ni se almacena ni se registra.

¿Puedo usarlo en un script de compilación?

Sí, para eso están los endpoints raw. Respeta los límites.

¿Por qué mi JavaScript minificado tiene otros nombres?

El minificador acorta los nombres de las variables locales; es seguro y de ahí sale la mayor parte del ahorro. Embellecer no devuelve los nombres originales: nada puede.

¿Cuál es el archivo más grande que puedo enviar?

2 MB en una petición. Los archivos mayores se rechazan con 413 en lugar de truncarse.