▼
English
Deutsch
Plattdüütsch
Lëtzebuergesch
Nederlands
Dansk
Svenska
Bokmål
Nynorsk
Íslenska
Føroyskt
Español
Català
Galego
Português
Italiano
Latina
Română
Rumantsch
Gaeilge
Suomi
Magyar
Euskara
Esperanto
日本語
简体中文
繁體中文(台灣)
繁體中文(香港)
粵語
한국어
Tiếng Việt
ไทย
Bahasa Indonesia
Bahasa Melayu
हिन्दी
Ελληνικά
Polski
Čeština
Українська
Русский
Türkçe
العربية
עברית
Kiswahili
ʻŌlelo Hawaiʻi
tlhIngan Hol
Quenya
Tout ce que font les formulaires de ce site, pour les scripts. Chaque réponse est du JSON, erreurs comprises, tu n'as donc jamais à deviner si un corps est un résultat ou une explication.
Fais un POST vers le point de terminaison avec des paramètres de formulaire ou un corps JSON. Les deux sont équivalents ; prends ce que tes outils rendent le plus simple. Le paramètre action choisit quoi faire. Utilise --data-urlencode pour tout ce qu'une personne a tapé — texte d'un paste, URL, traduction — car -d envoie la valeur brute et elle sera coupée au premier &. Un simple -d suffit pour les valeurs fixes comme action lui-même. wget n'a pas de --data-urlencode du tout, donc avec wget, encode ces valeurs en pourcentage toi-même ou envoie un corps JSON, qui n'a besoin d'aucun encodage.
curl -X POST https://0wx.eu/api.cgi \
-d action=paste --data-urlencode 'content=hello & world'
curl -X POST https://0wx.eu/api.cgi \
-H 'Content-Type: application/json' \
-d '{"action":"paste","content":"hello & world"}'
wget -qO- --header='Content-Type: application/json' \
--post-data '{"action":"paste","content":"hello & world"}' https://0wx.eu/api.cgi
Dans un corps de formulaire, & sépare les paramètres, et curl -d n'encode pas ce que tu lui donnes. Une URL avec chaîne de requête est donc coupée à son premier &, et le reste arrive en paramètres séparés. Utilise --data-urlencode, ou envoie du JSON. Les paramètres parasites sont refusés plutôt qu'ignorés, cela échoue donc bruyamment au lieu de stocker un demi-lien.
# wrong -- the value is cut at the &
curl -X POST https://0wx.eu/api.cgi \
-d action=tinyurl -d 'url=https://example.com/?a=1&b=2'
# right
curl -X POST https://0wx.eu/api.cgi \
-d action=tinyurl --data-urlencode 'url=https://example.com/?a=1&b=2'
# also right -- JSON needs no escaping
curl -X POST https://0wx.eu/api.cgi -H 'Content-Type: application/json' \
-d '{"action":"tinyurl","url":"https://example.com/?a=1&b=2"}'
# wget has no --data-urlencode, so percent-encode it yourself...
wget -qO- --post-data 'action=tinyurl&url=https%3A%2F%2Fexample.com%2F%3Fa%3D1%26b%3D2' https://0wx.eu/api.cgi
# ...or send JSON, which needs no encoding at all
wget -qO- --header='Content-Type: application/json' \
--post-data '{"action":"tinyurl","url":"https://example.com/?a=1&b=2"}' https://0wx.eu/api.cgi
Facultatif. Sans clé, une requête est anonyme et se comporte exactement comme un visiteur anonyme — le résultat est public de toute façon, la seule différence est de savoir s'il atterrit dans ta liste de fichiers. Génère une clé sur la page de ton compte et envoie-la comme jeton bearer ; la passer en paramètre apikey fonctionne aussi, mais une clé dans une chaîne de requête finit dans les journaux du serveur et l'historique du navigateur.
curl -X POST https://0wx.eu/api.cgi \
-H 'Authorization: Bearer YOUR_KEY' \
-d action=whoami
wget -qO- --header='Authorization: Bearer YOUR_KEY' \
--post-data 'action=whoami' https://0wx.eu/api.cgi
| action | Paramètres | Description |
|---|---|---|
whoami | — | Confirme qu'une clé fonctionne et indique les limites en vigueur. Ne coûte rien ; appelle-la en premier. |
ip | — | Indique ton adresse, son PTR, le pays, la région et la ville où elle est géolocalisée, les coordonnées et le user agent que tu as envoyé. Ne nécessite pas de clé et répond la même chose avec ou sans. Délibérément plus étroit que la page web : pas de WHOIS, pas de zone DNS et pas de consultation de listes de blocage, l'appeler ne coûte donc au serveur qu'une lecture de base de données locale. |
upload | file (répétable), resize, lifetime, gallery ou g * | Envoie un ou plusieurs fichiers. Doit être en multipart/form-data. Nommer une galerie les y place directement et renvoie son id. |
tinyurl | url, lifetime | Raccourcit une URL. |
hugeurl | url, lifetime | Allonge une URL, absurdement, exprès. |
paste | content, lifetime | Stocke un bloc de texte et renvoie un lien vers lui. |
translate | content, to, from | Traduit du texte. to et from sont des codes issus de l'action langs — note que ce ne sont pas toujours des codes pays : le danois est da, pas dk. from peut être omis ou valoir auto, ce qui demande au backend de détecter la langue ; l'indiquer donne un meilleur résultat sur un texte court. |
langs | Liste les langues que translate accepte, dans supported_langs : un objet par langue, code vers nom, dans l'ordre où le site les propose. Ne nécessite pas de clé d'API. | |
dyndns | key, ip, format | Met à jour un nom DNS dynamique. La seule action qui ne nécessite pas de clé d'API : elle est appelée par un routeur, qui a un champ pour une URL et aucun moyen d'envoyer un en-tête. key est la clé de mise à jour propre au nom, affichée dans ton compte, pas ta clé d'API. Omets ip et l'adresse depuis laquelle tu appelles est utilisée. La réponse est le mot dyndns2 de facto — good, nochg, badauth, abuse ou dnserr — en texte brut, car c'est ce que les routeurs analysent ; ajoute format=json pour le JSON habituel. |
listfiles * | page, g | Liste tes fichiers avec tout ce que montre le panneau d'infos, plus la miniature et le lien direct. g limite à une galerie, ou none aux fichiers sans galerie. |
listpastes * | page | Liste tes pastes, avec un aperçu de 200 caractères de chacun plutôt que le corps entier. |
listurls * | page | Liste tes URL courtes et énormes, avec l'adresse vers laquelle chacune pointe. |
otl * | share | Crée un lien à usage unique vers l'un de tes fichiers. Chaque appel en frappe un nouveau, donner le même fichier à deux personnes donne donc deux liens. |
listotl * | page | Liste tes liens à usage unique actifs, le fichier que chacun désigne, et si ce fichier a expiré depuis. |
listgalleries * | — | Liste tes galeries avec leurs id, noms, nombres de fichiers et états de publication. |
gallery * | g, publish | Indique l'état de publication d'une galerie, et le change quand publish est fourni. |
move * | share (répétable), gallery ou g | Déplace des fichiers dans une galerie, par nom (créée si nouvelle) ou par id. Si les deux sont omis, ils reviennent dans la liste principale. |
delete * | share (répétable), g, otl, withfiles | Supprime des fichiers, des pastes, des URL courtes, des galeries, des liens à usage unique, ou un mélange. Un share est comparé d'abord à tes fichiers puis à tes pastes et liens, l'appelant n'a donc pas à les trier par type. Les liens à usage unique vont à part dans otl : retirer un lien ne doit pas pouvoir se confondre avec la suppression du fichier qu'il désigne. |
* Ces actions nécessitent une clé d'API. Elles lisent ou modifient les données propres à un compte, elles n'ont donc pas de forme anonyme.
share et g acceptent un champ répété, un tableau JSON ou une liste séparée par des virgules — ce que tes outils rendent le plus simple. Les doublons sont ignorés.
curl -X POST https://0wx.eu/api.cgi -H 'Authorization: Bearer YOUR_KEY' \
-d action=move -d share=Ab3xK9pQ -d share=Zz7yT2mN --data-urlencode 'gallery=Holiday 2026'
curl -X POST https://0wx.eu/api.cgi -H 'Authorization: Bearer YOUR_KEY' \
-d action=delete -d 'share=Ab3xK9pQ,Zz7yT2mN'
curl -X POST https://0wx.eu/api.cgi -H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_KEY' \
-d '{"action":"move","share":["Ab3xK9pQ","Zz7yT2mN"],"g":7}'
wget -qO- --header='Authorization: Bearer YOUR_KEY' \
--post-data 'action=delete&share=Ab3xK9pQ,Zz7yT2mN' https://0wx.eu/api.cgi
Partout où une galerie est nommée — sur upload ou sur move — elle se donne des deux mêmes façons : g pour un id existant, ou gallery pour un nom, créé s'il est nouveau. Si les deux sont envoyés, g l'emporte. La réponse porte l'id de la galerie. Note que supprimer une galerie ne retire que la galerie et laisse ses fichiers dans la liste principale — contrairement au formulaire web, qui les supprime après confirmation. Passe withfiles=true pour les supprimer aussi : un script qui range ses regroupements ne devrait pas perdre les envois par accident.
curl -X POST https://0wx.eu/api.cgi -H 'Authorization: Bearer YOUR_KEY' \
-F action=upload -F file=@photo.jpg --form-string 'gallery=Holiday 2026'
curl -X POST https://0wx.eu/api.cgi -H 'Authorization: Bearer YOUR_KEY' \
-d action=gallery -d g=7 -d publish=true
wget -qO- --header='Authorization: Bearer YOUR_KEY' \
--post-data 'action=gallery&g=7&publish=true' https://0wx.eu/api.cgi
Les envois ne peuvent pas utiliser le corps JSON, car un fichier doit être envoyé en multipart. Répète la partie file pour en envoyer plusieurs à la fois. Chaque fichier est signalé séparément : la réponse porte une liste files des acceptés et une liste rejected des refusés, un succès partiel reste donc un succès.
curl -X POST https://0wx.eu/api.cgi \
-H 'Authorization: Bearer YOUR_KEY' \
-F action=upload \
-F file=@photo.jpg \
-F file=@notes.txt \
-F lifetime=7d
Il n'y a pas de forme wget pour celle-ci. wget ne sait pas construire un corps multipart/form-data — il n'a pas d'équivalent au -F de curl — et les envois doivent être en multipart. Utilise curl, ou assemble toi-même le corps et le boundary et envoie-les avec --post-file.
Facultatif sur toute action qui stocke quelque chose. Accepte des secondes brutes, ou un nombre suivi de m, h ou d — les mêmes formes que les formulaires web. Omets-le ou passe 0 pour conserver l'élément indéfiniment.
Chaque réponse est un objet JSON avec un champ ok. En cas de succès il porte le résultat ; en cas d'échec il porte un code error stable et un message lisible. Branche sur le code, journalise le message.
{"ok":true,"type":"paste","share":"Ab3xK9pQ",
"url":"https://0wx.eu/p/Ab3xK9pQ","bytes":11}
{"ok":false,"error":"url_too_long",
"message":"URL exceeds the maximum length."}
Quand un fichier en porte, listfiles ajoute file_tags à son entrée : artiste, titre et album, lus depuis ID3, les commentaires Vorbis ou les atomes MP4 à l'envoi du fichier. La clé est absente plutôt que null quand il n'y a rien à signaler, ce qui est le cas de la plupart des fichiers ; teste-la donc avant de la lire. Des champs individuels peuvent aussi manquer — un fichier peut avoir un titre et pas d'album. Rien d'autre des métadonnées du fichier n'est exposé : un achat iTunes enregistre le nom et l'identifiant Apple de l'acheteur, et ceux-là ne sont délibérément jamais lus.
{"ok":true,"type":"files","total":2,"page":1,"pages":1,"files":[
{"share":"Ab3xK9pQ","name":"autobahn.mp3","mime":"audio/mpeg",
"bytes":8123456,"url":"https://0wx.eu/i/Ab3xK9pQ",
"file_tags":{"artist":"Kraftwerk","title":"Autobahn","album":"Autobahn"}},
{"share":"Zz7yT2mN","name":"photo.jpg","mime":"image/jpeg",
"bytes":204800,"url":"https://0wx.eu/i/Zz7yT2mN"}
]}
| error | HTTP | Description |
|---|---|---|
unknown_action | 400 | Cette action n'existe pas. |
bad_json | 400 | Le corps n'était pas du JSON valide, ou un champ contenait une structure imbriquée. |
unexpected_parameter | 400 | Un paramètre que cette action ne prend pas est arrivé — en général un & non encodé dans une valeur. Le message nomme les paramètres. |
bad_key | 401 | La clé n'a pas été reconnue. Une clé erronée est refusée plutôt que traitée silencieusement comme anonyme. |
bad_url | 400 | L'URL est malformée, ou utilise un schéma autre que http(s), ftp ou gopher. |
bad_lifetime | 400 | La durée de vie n'était ni un nombre ni un nombre suivi de m, h ou d. |
no_content | 400 | Rien n'a été envoyé à stocker. |
url_too_long | 413 | L'URL dépasse la limite de longueur. |
paste_too_long | 413 | Le texte dépasse la limite des pastes. Les limites se mesurent en octets UTF-8, un texte non latin compte donc plus que son nombre de caractères ne le laisse penser. |
too_many_files | 413 | Plus de fichiers qu'un seul appel n'en accepte. |
no_usable_files | 415 | Tous les fichiers ont été refusés. Regarde la liste rejected pour savoir pourquoi. |
backend_unavailable | 502 | Le backend de traduction n'a pas répondu. |
internal | 500 | Quelque chose a échoué de façon inattendue. C'est consigné. |
Appelle whoami pour lire les valeurs en vigueur plutôt que de les coder en dur — elles sont fixées par l'exploitant du serveur et peuvent changer. Les tailles sont en octets UTF-8.
0wx.sh enveloppe tout ce qui précède. C'est du shell POSIX pur qui ne nécessite rien d'autre que curl, et il est assez court pour être lu avant d'être exécuté — ce qu'il convient de faire avec un script qui détiendra ta clé d'API. Mets la clé dans OWX_KEY plutôt que de passer --key, et elle restera hors de l'historique de ton shell.
wget https://0wx.eu/clients/0wx.sh chmod +x 0wx.sh export OWX_KEY=YOUR_KEY ./0wx.sh help ./0wx.sh paste --content 'hello & world'
0wx.py fait la même chose que le client shell, mais analyse la réponse et affiche ce que signifient les champs au lieu de te livrer du JSON brut — ajoute --json quand tu veux la forme brute. Bibliothèque standard uniquement : pas de requests, rien à installer. Si tu écris ton propre client, ses fonctions send() et report() sont les parties qui valent la lecture : à elles deux, elles montrent comment construire la requête, comment extraire le message d'une requête échouée et ce que contiennent les réponses.
wget https://0wx.eu/clients/0wx.py chmod +x 0wx.py export OWX_KEY=YOUR_KEY ./0wx.py listfiles ./0wx.py listfiles --json | jq '.files[].url'
0wx.pl fait la même chose que celui en Python et affiche la même sortie. Modules du cœur uniquement — HTTP::Tiny et JSON::PP sont livrés avec Perl depuis la 5.14, il n'y a donc rien à installer. À lire à côté du client Python si tu écris le tien : les deux langages échouent différemment sur une requête cassée, et les deux scripts disent où.
wget https://0wx.eu/clients/0wx.pl chmod +x 0wx.pl export OWX_KEY=YOUR_KEY ./0wx.pl listfiles
0wx.ps1 est le pendant du client Python pour Windows : mêmes commandes, même sortie, et il analyse la réponse au lieu de te livrer du JSON brut — ajoute --json pour cela. Il est écrit pour le Windows PowerShell déjà présent sur la machine, il n'y a donc rien à installer, et il tourne sans changement sous PowerShell 7. Tu auras peut-être besoin de Set-ExecutionPolicy -Scope Process Bypass dans la fenêtre d'où tu le lances, c'est Windows qui demande si tu voulais vraiment exécuter un script téléchargé — une question légitime, et le fichier est assez court pour être lu d'abord.
$env:OWX_KEY = 'YOUR_KEY' .\0wx.ps1 listfiles .\0wx.ps1 paste --content 'hello & world' .\0wx.ps1 upload --file .\holiday.jpg --gallery 'Holiday 2026'
0wx.html est le même jeu d'onglets que le client de bureau, en trois fichiers — une page, une feuille de style et un script — sans installation, sans framework, et sans rien charger d'ailleurs que de ce site. Trois plutôt qu'un parce que la Content-Security-Policy du site interdit les scripts et styles en ligne, ce qui vaut d'être conservé. On peut y déposer des fichiers. Il doit être ouvert d'ici plutôt qu'enregistré et ouvert depuis ton disque : l'API n'envoie pas d'en-têtes cross-origin, une copie locale verrait donc chaque requête refusée par ton navigateur avant même de partir. La clé est gardée en mémoire sauf si tu coches la case pour la retenir.
https://0wx.eu/clients/0wx.html
0wx-gui.ps1 est le même jeu d'onglets que le client de bureau, dessiné avec WinForms — ce qui veut dire rien du tout à installer, puisque cela fait déjà partie de Windows. Mets-le dans le même dossier que 0wx.ps1 : la fenêtre emprunte la gestion des requêtes de ce fichier plutôt que d'en porter une seconde copie, les deux sont donc nécessaires. Windows demandera avant d'exécuter un script qu'il n'a pas écrit, ce qui est légitime ; les deux fichiers sont assez courts pour être lus avant de répondre.
powershell -ExecutionPolicy Bypass -File .\0wx-gui.ps1
0wx-gtk.pl est une petite fenêtre GTK avec des onglets pour envoyer, coller, raccourcir et parcourir tes fichiers — en liste ou en galerie de miniatures, filtrée par galerie. C'est le seul client ici qui nécessite d'installer quelque chose — les liaisons GTK3 de Perl — ce qui vaut d'être su à côté de la fenêtre Windows ci-dessus, qui ne demande rien du tout. Tout le reste de ce qu'il utilise est livré avec Perl. La clé n'est gardée qu'en mémoire : fermer la fenêtre l'oublie, et définir OWX_KEY la remplit au démarrage. Quoi qu'il te montre, la réponse brute du serveur est à un clic sous “Server reply”.
apt install libgtk3-perl # or: dnf install perl-Gtk3 wget https://0wx.eu/clients/0wx-gtk.pl chmod +x 0wx-gtk.pl OWX_KEY=YOUR_KEY ./0wx-gtk.pl
0wx-android.apk fait ce que font les autres clients, depuis un téléphone : envoyer, coller, raccourcir, traduire et parcourir tes fichiers en liste ou en galerie. Lui partager un fichier depuis n'importe quelle autre appli l'envoie, et partager du texte le stocke comme paste. Il n'est sur aucune boutique d'applications, ton appareil te demandera donc d'autoriser son installation — une question qui mérite d'être prise au sérieux en général, et la raison pour laquelle la source complète est aussi ici : ouvre-la dans Android Studio et compile-la toi-même plutôt que de faire confiance au fichier. La compilation nécessite JDK 21 ; le BUILDING.md inclus explique pourquoi.
https://0wx.eu/clients/0wx-android.apk # install it https://0wx.eu/clients/0wx-android.zip # build it yourself
Il n'y a délibérément pas d'action de récupération à distance. Elle ferait aller chercher au serveur une URL choisie par l'appelant, ce qui est une surface de falsification de requête, et un script peut l'exploiter bien plus fort qu'un formulaire. Envoie le fichier toi-même.