Formatter

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 --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 aceptan los propios minificadores de Toptal, así que un script existente solo cambia de dirección.

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

JSON

{type} con una cadena {input}.

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 --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
engine auto upstream local Qué motor atiende esta petición. {auto}, el valor por defecto, envía la minificación de CSS y JS al servicio externo mientras dure el presupuesto y recurre al motor local cuando se agota. {upstream} devuelve un error en lugar de recurrir al local. {local} no sale nunca del servidor.
indent 2 4 tab Solo al embellecer: qué es un nivel de sangría.
curl --data-urlencode 'input=.a{color:red}' \
  'https://formatter.nextwell.top/api/v1/beautify/css?indent=tab&engine=local'

La respuesta

Una llamada correcta devuelve JSON:

{
  "ok": true,
  "action": "minify",
  "language": "css",
  "engine": "upstream",
  "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.
enginestringupstream si lo resolvió Toptal, local si lo hizo este servidor.
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 -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-EngineQué motor produjo el resultado.
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 -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 que usan los minificadores de Toptal, así que un cliente que ya gestiona los suyos gestiona los nuestros:

{
  "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.
429Too many requestsUna de las ventanas de límite está agotada. Consulta Retry-After.
502Upstream failedSolo con engine=upstream: Toptal no respondió. Sin ese ajuste, la petición habría recurrido al motor local.
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 https://formatter.nextwell.top/api/v1/limits

Toptal permite 30 peticiones por minuto para todo el servicio, no por visitante. Un cubo compartido lleva esa cuenta: cuando está vacío, la minificación de CSS y JS la atiende el motor local en lugar de esperar o fallar. Puede que veas cambiar el campo engine bajo carga; el resultado sigue siendo válido en cualquier caso.

Qué motor hace el trabajo

Dos caminos, un mismo contrato.

Toptal — minificación de CSS y JS

Sus minificadores son rápidos y conservadores: quitan los espacios que se pueden quitar y conservan los que no, de modo que cosas como {calc} sobreviven intactas. Este servicio se limita a pasar el código y no añade nada propio.

Local — todo lo demás

La minificación de HTML, los tres embellecedores y la minificación de CSS/JS cuando el presupuesto compartido del servicio externo se ha agotado o el servicio está configurado para no salir a la red. Construido sobre {tools}, que se cargan solo cuando una petición los necesita, para que un proceso inactivo siga siendo pequeño.

Usa {param} para fijar una petición a uno de los dos caminos.

Qué se guarda

Nada. El código se mantiene en memoria mientras dura la petición y luego se descarta. No se escribe en disco ni aparece nunca 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, el motor 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?

La minificación de CSS y JavaScript se redirige a los minificadores de Toptal, así que ese código llega a sus servidores. El embellecido y todo el trabajo con HTML se hacen en este servidor. Usa engine=local para que nada salga de aquí.

¿Puedo usarlo en un script de compilación?

Sí, para eso están los endpoints raw. Respeta los límites y ten en cuenta que el motor puede recurrir al local bajo carga.

¿Por qué mi JavaScript minificado tiene otros nombres?

El minificador externo 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.