Formatter
/api/v1

Documentation de l’API

Une seule requête POST formate un fichier. Pas de clé, pas de compte, pas de signature — l’adresse et un corps, c’est tout le contrat.

Démarrage rapide

Minifier une feuille de style et afficher le résultat :

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}

Remplacez {css} par {js} ou {html}, et {minify} par {beautify}. Toutes les combinaisons fonctionnent.

Points de terminaison

L’adresse de base est {base}. Tout ce qui suit est un POST, sauf mention contraire.

Méthode Chemin Rôle
POST/api/v1/minify/{lang}Minifier, réponse JSON
POST/api/v1/minify/{lang}/rawMinifier, réponse en texte brut
POST/api/v1/beautify/{lang}Formater, réponse JSON
POST/api/v1/beautify/{lang}/rawFormater, réponse en texte brut
GET/api/v1/limitsCe qu’il reste à cette IP, sans consommer de requête
GET/api/v1/healthTest de disponibilité, jamais limité

{lang} vaut css, js ou html.

Envoyer le code

Trois formes de corps sont acceptées sur chaque point de terminaison — prenez celle que votre client rend la plus simple.

Encodé en formulaire

Un champ {input}, {type}. C’est la forme qu’attendent habituellement les API de minification : un script existant n’a qu’à changer d’adresse.

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

JSON

{type} avec une chaîne {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

Corps brut

Tout autre type de contenu : le corps est le code. Pratique pour {example}.

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

Taille

2 Mo par requête. Tout ce qui dépasse revient en 413 sans être lu.

Paramètres de requête

Nom Valeurs Signification
indent 2 4 tab Formatage uniquement : ce que vaut un niveau d’indentation.
curl
curl --data-urlencode 'input=.a{color:red}' \
  'https://formatter.nextwell.top/api/v1/beautify/css?indent=tab'

La réponse

Un appel réussi renvoie du 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}"
}
Champ Type Signification
okbooleanToujours true en cas de succès.
actionstringminify ou beautify — ce qui a été demandé.
languagestringcss, js ou html.
input_bytesnumberTaille de ce qui a été envoyé, en octets.
output_bytesnumberTaille du résultat, en octets.
saved_bytesnumberLa différence ; négative lors d’un formatage.
saved_percentnumberLa même différence en pourcentage, une décimale.
duration_msnumberDurée du traitement, en millisecondes.
outputstringLe code formaté.

Réponses en texte brut

Ajoutez {raw} à n’importe quel point de terminaison de formatage et le corps est le résultat, rien d’autre, en {type}. Les en-têtes sont les mêmes. Utile quand l’appelant est 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

En-têtes de réponse

En-tête Signification
X-Formatter-DurationTemps de traitement en millisecondes.
X-RateLimit-Remaining-Second … -MonthCe qu’il reste à cette IP dans chaque fenêtre.
Retry-AfterSur un 429 : secondes avant la réouverture de la fenêtre épuisée la plus stricte.
curl
curl -s -D - -o /dev/null --data-urlencode 'input=.a{color:red}' \
  https://formatter.nextwell.top/api/v1/minify/css

Erreurs

Chaque erreur est du JSON, toujours de la même forme :

JSON
{
  "errors": [
    { "status": 429, "title": "Too many requests", "detail": "…" }
  ]
}
Statut Titre Quand
400Missing input Bad requestAucun corps, ou un champ input vide.
404Not foundCe chemin n’existe pas.
405Method not allowedUn point de terminaison de formatage appelé avec autre chose que POST.
413Payload too largeLe corps dépasse 2 Mo.
415Unsupported languageLe langage dans le chemin n’est ni css, ni js, ni html.
422Malformed inputLe formateur a refusé la source (en général une erreur de syntaxe) ou le traitement a pris trop de temps.
429Too many requestsUne des fenêtres de limitation est épuisée. Lisez Retry-After.
500Internal errorTout le reste.

Limites de débit

Par adresse IP, cinq fenêtres glissantes, toutes appliquées en même temps. Une requête doit tenir dans les cinq.

Fenêtre Limite
Par seconde{n} requêtes
Par minute{n} requêtes
Par heure{n} requêtes
Par jour{n} requêtes
Par mois{n} requêtes

Quand une fenêtre est épuisée, la réponse est un 429 avec un en-tête Retry-After donnant les secondes avant la réouverture de la plus stricte. Rien n’est mis en file d’attente.

Les compteurs vivent dans une petite base de données sur disque : redémarrer le service n’offre à personne une journée neuve.

{endpoint} rapporte l’état courant des cinq fenêtres sans en consommer une.

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

Ce qui est conservé

Rien. Le code est envoyé à notre serveur, conservé en mémoire le temps de la requête, puis abandonné. Il n’est pas écrit sur disque et n’apparaît jamais dans un journal. Les journaux ne contiennent que : un hachage tronqué de l’IP, le langage, l’action, le nombre d’octets et la durée.

Questions

Ai-je besoin d’une clé ?

Non. Le service est ouvert ; la limite porte sur l’adresse IP.

Mon code est-il envoyé quelque part ?

Uniquement vers notre propre serveur. Tout y est traité, en mémoire ; le code n’est ni conservé ni journalisé.

Puis-je l’utiliser dans un script de build ?

Oui, c’est à cela que servent les points de terminaison raw. Restez dans les limites.

Pourquoi mon JavaScript minifié est-il renommé ?

Le minificateur raccourcit les noms des variables locales, ce qui est sans risque et représente l’essentiel du gain. Le formatage ne ramènera pas les noms d’origine — rien ne le peut.

Quelle est la taille maximale d’un fichier ?

2 Mo en une requête. Les fichiers plus gros sont refusés avec un 413 plutôt que tronqués.