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}/raw | Minificar, respuesta en texto plano |
POST | /api/v1/beautify/{lang} | Embellecer, respuesta JSON |
POST | /api/v1/beautify/{lang}/raw | Embellecer, respuesta en texto plano |
GET | /api/v1/limits | Lo que le queda a esta IP, sin gastar una petición |
GET | /api/v1/health | Comprobació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 |
|---|---|---|
ok | boolean | Siempre true cuando la llamada tiene éxito. |
action | string | minify o beautify: lo que se pidió. |
language | string | css, js o html. |
engine | string | upstream si lo resolvió Toptal, local si lo hizo este servidor. |
input_bytes | number | Tamaño de lo enviado, en bytes. |
output_bytes | number | Tamaño del resultado, en bytes. |
saved_bytes | number | La diferencia; negativa al embellecer. |
saved_percent | number | La misma diferencia en porcentaje, con un decimal. |
duration_ms | number | Lo que tardó el trabajo, en milisegundos. |
output | string | El 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-Engine | Qué motor produjo el resultado. |
X-Formatter-Duration | Tiempo de proceso en milisegundos. |
X-RateLimit-Remaining-Second … -Month | Lo que le queda a esta IP en cada ventana. |
Retry-After | En 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 |
|---|---|---|
400 | Missing input Bad request | Sin cuerpo, o con el campo input vacío. |
404 | Not found | Esa ruta no existe. |
405 | Method not allowed | Se llamó a un endpoint de formato con algo distinto de POST. |
413 | Payload too large | El cuerpo supera los 2 MB. |
415 | Unsupported language | El lenguaje de la ruta no es css, js ni html. |
422 | Malformed input | El formateador rechazó el código fuente: normalmente un error de sintaxis. |
429 | Too many requests | Una de las ventanas de límite está agotada. Consulta Retry-After. |
502 | Upstream failed | Solo con engine=upstream: Toptal no respondió. Sin ese ajuste, la petición habría recurrido al motor local. |
500 | Internal error | Cualquier 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.