/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 --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 las API de minificación aceptan por convención, 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 |
|---|---|---|
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'
La respuesta
Una llamada correcta devuelve 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 |
|---|---|---|
ok | boolean | Siempre true cuando la llamada tiene éxito. |
action | string | minify o beautify: lo que se pidió. |
language | string | css, js o html. |
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-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:
{
"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) o tardó demasiado en procesarlo. |
| 429 | Too many requests | Una de las ventanas de límite está agotada. Consulta Retry-After. |
| 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
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.