▼
English
Plattdüütsch
Lëtzebuergesch
Nederlands
Dansk
Svenska
Bokmål
Nynorsk
Íslenska
Føroyskt
Español
Català
Galego
Português
Français
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
Alles, was die Formulare dieser Seite tun, für Skripte. Jede Antwort ist JSON, auch Fehler, damit du nie raten musst, ob ein Rumpf ein Ergebnis oder eine Erklärung ist.
Sende POST an den Endpunkt, entweder mit Formularparametern oder mit einem JSON-Rumpf. Beides ist gleichwertig; nimm, was dein Werkzeug leichter macht. Der Parameter action wählt die Aktion. Nutze --data-urlencode für alles, was jemand eingetippt hat — Paste-Text, eine URL, eine Übersetzung — denn -d sendet den Wert roh und er wird beim ersten & abgeschnitten. Einfaches -d genügt für feste Werte wie action selbst. wget kennt gar kein --data-urlencode; mit wget musst du solche Werte also selbst prozentkodieren oder einen JSON-Rumpf senden, der keine Kodierung braucht.
curl -X POST https://0wx.org/api.cgi \
-d action=paste --data-urlencode 'content=hello & world'
curl -X POST https://0wx.org/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.org/api.cgi
In einem Formularrumpf trennt & Parameter, und curl -d kodiert nicht, was du übergibst. Eine URL mit Query-String wird deshalb beim ersten & abgeschnitten, der Rest kommt als eigene Parameter an. Nimm --data-urlencode oder sende JSON. Überzählige Parameter werden abgelehnt statt ignoriert, das schlägt also laut fehl, statt einen halben Link zu speichern.
# wrong -- the value is cut at the &
curl -X POST https://0wx.org/api.cgi \
-d action=tinyurl -d 'url=https://example.com/?a=1&b=2'
# right
curl -X POST https://0wx.org/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.org/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.org/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.org/api.cgi
Optional. Ohne Schlüssel ist eine Anfrage anonym und verhält sich genau wie ein anonymer Besuch — das Ergebnis ist so oder so öffentlich, der Unterschied ist nur, ob es in deiner Dateiliste landet. Erzeuge einen Schlüssel auf deiner Kontoseite und sende ihn als Bearer-Token; als Parameter apikey geht auch, aber ein Schlüssel in der Adresse landet in Serverprotokollen und im Browserverlauf.
curl -X POST https://0wx.org/api.cgi \
-H 'Authorization: Bearer YOUR_KEY' \
-d action=whoami
wget -qO- --header='Authorization: Bearer YOUR_KEY' \
--post-data 'action=whoami' https://0wx.org/api.cgi
| action | Parameter | Beschreibung |
|---|---|---|
whoami | — | Prüft, ob ein Schlüssel funktioniert, und nennt die aktuellen Grenzen. Kostet nichts; ruf das zuerst auf. |
ip | — | Meldet deine Adresse, ihren PTR, Land, Region und Stadt, zu denen sie geolokalisiert wird, die Koordinaten und den User-Agent, den du gesendet hast. Braucht keinen Schlüssel und antwortet mit oder ohne gleich. Bewusst schmaler als die Webseite: kein WHOIS, keine DNS-Zone, keine Sperrlisten-Abfragen, ein Aufruf kostet den Server also nur einen lokalen Datenbankzugriff. |
upload | file (wiederholbar), resize, lifetime, gallery oder g * | Lädt eine oder mehrere Dateien hoch. Muss multipart/form-data sein. |
tinyurl | url, lifetime | Kürzt eine URL. |
hugeurl | url, lifetime | Verlängert eine URL, absurd, mit Absicht. |
paste | content, lifetime | Speichert einen Textblock und gibt einen Link darauf zurück. |
translate | content, to, from | Übersetzt Text. to und from sind Codes aus der Aktion langs — das sind nicht immer Ländercodes: Dänisch ist da, nicht dk. from darf fehlen oder auto sein, dann erkennt das Backend die Sprache; die Angabe liefert bei kurzem Text ein besseres Ergebnis. |
langs | Listet die Sprachen, die translate akzeptiert, als supported_langs: ein Objekt pro Sprache, Code zu Name, in der Reihenfolge, in der die Seite sie anbietet. Braucht keinen API-Schlüssel. | |
dyndns | key, ip, format | Aktualisiert einen dynamischen DNS-Namen. Die einzige Aktion ohne API-Schlüssel: sie wird von einem Router aufgerufen, der ein Feld für eine URL hat und keinen Weg, einen Header zu senden. key ist der in deinem Konto angezeigte Aktualisierungsschlüssel des jeweiligen Namens, nicht dein API-Schlüssel. Lässt du ip weg, wird die Adresse verwendet, von der du aufrufst. Die Antwort ist das De-facto-dyndns2-Wort — good, nochg, badauth, abuse oder dnserr — als reiner Text, denn das ist, was Router auswerten; hänge format=json an für das übliche JSON. |
listfiles * | page, g | Listet deine Dateien mit allem, was das Info-Feld zeigt, plus Vorschaubild und Direktlink. g beschränkt auf eine Galerie, none auf Dateien ohne Galerie. |
listpastes * | page | Listet deine Pastes, jeweils mit einer Vorschau von 200 Zeichen statt des ganzen Inhalts. |
listurls * | page | Listet deine kurzen und riesigen URLs mit der Adresse, auf die jede zeigt. |
otl * | share | Erzeugt einen Einmal-Link zu einer deiner Dateien. Jeder Aufruf prägt einen neuen, dieselbe Datei an zwei Personen zu geben ergibt also zwei Links. |
listotl * | page | Listet deine aktiven Einmal-Links, die Datei, auf die jeder zeigt, und ob diese Datei inzwischen abgelaufen ist. |
listgalleries * | — | Listet deine Galerien mit IDs, Namen, Dateianzahl und Veröffentlichungsstatus. |
gallery * | g, publish | Meldet den Veröffentlichungsstatus einer Galerie und ändert ihn, wenn publish angegeben wird. |
move * | share (wiederholbar), gallery oder g | Verschiebt Dateien in eine Galerie, per Name (wird bei Bedarf angelegt) oder per ID. Fehlen beide, wandern sie zurück in die Hauptliste. |
delete * | share (wiederholbar), g, otl, withfiles | Löscht Dateien, Pastes, Kurz-URLs, Galerien, Einmal-Links oder eine beliebige Mischung. Ein Share wird zuerst mit deinen Dateien, dann mit deinen Pastes und Links abgeglichen, der Aufrufer muss sie also nicht nach Typ sortieren. Einmal-Links gehören getrennt in otl: das Entfernen eines Links darf nicht mit dem Löschen der Datei verwechselbar sein, auf die er zeigt. |
* Diese Aktionen brauchen einen API-Schlüssel. Sie lesen oder ändern die Daten eines Kontos, eine anonyme Form gibt es daher nicht.
share und g akzeptieren ein wiederholtes Feld, ein JSON-Array oder eine kommagetrennte Liste — was dein Werkzeug am leichtesten macht. Duplikate werden ignoriert.
curl -X POST https://0wx.org/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.org/api.cgi -H 'Authorization: Bearer YOUR_KEY' \
-d action=delete -d 'share=Ab3xK9pQ,Zz7yT2mN'
curl -X POST https://0wx.org/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.org/api.cgi
Wo immer eine Galerie angegeben wird — bei upload oder bei move — geschieht das auf dieselben zwei Arten: g für eine bestehende ID oder gallery für einen Namen, der angelegt wird, wenn er neu ist. Werden beide gesendet, gewinnt g. Die Antwort enthält die Galerie-ID. Beachte, dass das Löschen einer Galerie nur die Galerie entfernt und ihre Dateien in der Hauptliste belässt — anders als das Webformular, das sie nach Rückfrage mitlöscht. Übergib withfiles=true, um sie ebenfalls zu löschen: ein Skript, das seine Gruppierungen aufräumt, sollte nicht versehentlich die Uploads verlieren.
curl -X POST https://0wx.org/api.cgi -H 'Authorization: Bearer YOUR_KEY' \
-F action=upload -F file=@photo.jpg --form-string 'gallery=Holiday 2026'
curl -X POST https://0wx.org/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.org/api.cgi
Uploads können den JSON-Rumpf nicht nutzen, weil eine Datei als multipart gesendet werden muss. Wiederhole den Teil file, um mehrere auf einmal zu senden. Jede Datei wird einzeln gemeldet: die Antwort enthält eine Liste files mit den angenommenen und eine Liste rejected mit den abgelehnten, ein Teilerfolg bleibt also ein Erfolg.
curl -X POST https://0wx.org/api.cgi \
-H 'Authorization: Bearer YOUR_KEY' \
-F action=upload \
-F file=@photo.jpg \
-F file=@notes.txt \
-F lifetime=7d
Hierfür gibt es keine wget-Form. wget kann keinen multipart/form-data-Rumpf bauen — es hat kein Gegenstück zu curls -F — und Uploads müssen multipart sein. Nimm curl, oder setze Rumpf und Boundary selbst zusammen und sende sie mit --post-file.
Optional bei jeder Aktion, die etwas speichert. Akzeptiert reine Sekunden oder eine Zahl gefolgt von m, h oder d — dieselben Formen wie die Webformulare. Lass es weg oder gib 0 an, um den Eintrag unbegrenzt zu behalten.
Jede Antwort ist ein JSON-Objekt mit einem Feld ok. Bei Erfolg trägt es das Ergebnis, bei Fehlschlag einen festen Code error und eine lesbare message. Verzweige über den Code, protokolliere die Meldung.
{"ok":true,"type":"paste","share":"Ab3xK9pQ",
"url":"https://0wx.org/p/Ab3xK9pQ","bytes":11}
{"ok":false,"error":"url_too_long",
"message":"URL exceeds the maximum length."}
Wo eine Datei sie trägt, ergänzt listfiles ihren Eintrag um file_tags: Interpret, Titel und Album, beim Hochladen aus ID3, Vorbis-Kommentaren oder MP4-Atomen gelesen. Der Schlüssel fehlt, statt null zu sein, wenn es nichts zu melden gibt, was bei den meisten Dateien der Fall ist; prüfe ihn also, bevor du ihn liest. Auch einzelne Felder können fehlen — eine Datei kann einen Titel und kein Album haben. Nichts anderes aus den Metadaten der Datei wird offengelegt: ein iTunes-Kauf enthält Name und Apple-ID des Käufers, und die werden absichtlich nie gelesen.
{"ok":true,"type":"files","total":2,"page":1,"pages":1,"files":[
{"share":"Ab3xK9pQ","name":"autobahn.mp3","mime":"audio/mpeg",
"bytes":8123456,"url":"https://0wx.org/i/Ab3xK9pQ",
"file_tags":{"artist":"Kraftwerk","title":"Autobahn","album":"Autobahn"}},
{"share":"Zz7yT2mN","name":"photo.jpg","mime":"image/jpeg",
"bytes":204800,"url":"https://0wx.org/i/Zz7yT2mN"}
]}
| error | HTTP | Beschreibung |
|---|---|---|
unknown_action | 400 | Diese Aktion gibt es nicht. |
bad_json | 400 | Der Rumpf war kein gültiges JSON, oder ein Feld enthielt eine verschachtelte Struktur. |
unexpected_parameter | 400 | Es kam ein Parameter an, den diese Aktion nicht kennt — meist ein unkodiertes & in einem Wert. Die Meldung nennt die Parameter. |
bad_key | 401 | Der Schlüssel wurde nicht erkannt. Ein falscher Schlüssel wird abgelehnt und nicht stillschweigend als anonym behandelt. |
bad_url | 400 | Die URL ist fehlerhaft oder nutzt ein anderes Schema als http(s), ftp oder gopher. |
bad_lifetime | 400 | Die Speicherdauer war keine Zahl und keine Zahl gefolgt von m, h oder d. |
no_content | 400 | Es wurde nichts zum Speichern gesendet. |
url_too_long | 413 | Die URL ist länger als erlaubt. |
paste_too_long | 413 | Der Text ist größer als das Paste-Limit. Grenzen zählen Bytes in UTF-8, nicht-lateinischer Text zählt also mehr, als die Zeichenzahl vermuten lässt. |
too_many_files | 413 | Mehr Dateien, als ein Aufruf annimmt. |
no_usable_files | 415 | Alle Dateien wurden abgelehnt. Der Grund steht in der Liste rejected. |
backend_unavailable | 502 | Der Übersetzungsdienst hat nicht geantwortet. |
internal | 500 | Etwas ist unerwartet fehlgeschlagen. Es wurde protokolliert. |
Ruf whoami auf, statt die Werte fest einzubauen — sie werden vom Betreiber gesetzt und können sich ändern. Größen sind Bytes in UTF-8.
0wx.sh kapselt alles oben. Es ist reine POSIX-Shell, braucht nichts außer curl und ist kurz genug, um es vor dem Ausführen zu lesen — das Richtige bei einem Skript, das deinen API-Schlüssel halten wird. Lege den Schlüssel in OWX_KEY statt --key zu übergeben, dann bleibt er aus deinem Shell-Verlauf.
wget https://0wx.org/clients/0wx.sh chmod +x 0wx.sh export OWX_KEY=YOUR_KEY ./0wx.sh help ./0wx.sh paste --content 'hello & world'
0wx.py tut dasselbe wie der Shell-Client, wertet aber die Antwort aus und gibt aus, was die Felder bedeuten, statt dir rohes JSON zu reichen — hänge --json an, wenn du die Rohform zurückwillst. Nur Standardbibliothek: kein requests, nichts zu installieren. Wenn du einen eigenen Client schreibst, sind seine Funktionen send() und report() die lesenswerten Teile: zusammen zeigen sie, wie die Anfrage gebaut wird, wie man die Meldung aus einer gescheiterten holt und was die Antworten enthalten.
wget https://0wx.org/clients/0wx.py chmod +x 0wx.py export OWX_KEY=YOUR_KEY ./0wx.py listfiles ./0wx.py listfiles --json | jq '.files[].url'
0wx.pl tut dasselbe wie der Python-Client und gibt dasselbe aus. Nur Core-Module — HTTP::Tiny und JSON::PP liegen Perl seit 5.14 bei, es gibt also nichts zu installieren. Lesenswert neben dem Python-Client, wenn du einen eigenen schreibst: die beiden Sprachen scheitern bei einer kaputten Anfrage unterschiedlich, und beide Skripte sagen, wo.
wget https://0wx.org/clients/0wx.pl chmod +x 0wx.pl export OWX_KEY=YOUR_KEY ./0wx.pl listfiles
0wx.ps1 ist das Gegenstück zum Python-Client für Windows: dieselben Befehle, dieselbe Ausgabe, und es wertet die Antwort aus, statt dir rohes JSON zu reichen — hänge dafür --json an. Es ist für die Windows PowerShell geschrieben, die schon auf dem Rechner ist, es gibt also nichts zu installieren, und es läuft unverändert unter PowerShell 7. Eventuell brauchst du Set-ExecutionPolicy -Scope Process Bypass in dem Fenster, aus dem du es startest; das ist Windows, das fragt, ob du wirklich ein heruntergeladenes Skript ausführen willst — eine berechtigte Frage, und die Datei ist kurz genug, um sie vorher zu lesen.
$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 ist derselbe Satz Reiter wie der Desktop-Client, als drei Dateien — eine Seite, ein Stylesheet und ein Skript — ohne Installation, ohne Framework und ohne dass irgendetwas von woanders als dieser Seite geladen wird. Drei statt einer, weil die Content-Security-Policy der Seite Inline-Skript und -Stil verbietet, was es beizubehalten lohnt. Dateien können darauf abgelegt werden. Es muss von hier geöffnet werden, nicht gespeichert und von deiner Platte: die API sendet keine Cross-Origin-Header, eine lokale Kopie bekäme also jede Anfrage von deinem Browser abgewiesen, bevor sie rausgeht. Der Schlüssel bleibt im Speicher, außer du hakst an, dass er gemerkt werden soll.
https://0wx.org/clients/0wx.html
0wx-gui.ps1 ist derselbe Satz Reiter wie der Desktop-Client, gezeichnet mit WinForms — also überhaupt nichts zu installieren, denn das ist bereits Teil von Windows. Lege es in denselben Ordner wie 0wx.ps1: das Fenster leiht sich die Anfrageverarbeitung dieser Datei, statt eine zweite Kopie mitzuschleppen, es braucht also beide. Windows fragt, bevor es ein Skript ausführt, das es nicht selbst geschrieben hat, was eine berechtigte Frage ist; beide Dateien sind kurz genug, um sie vor der Antwort zu lesen.
powershell -ExecutionPolicy Bypass -File .\0wx-gui.ps1
0wx-gtk.pl ist ein kleines GTK-Fenster mit Reitern zum Hochladen, Einfügen, Kürzen und Durchstöbern deiner Dateien — als Liste oder als Galerie von Vorschaubildern, nach Galerie gefiltert. Es ist der einzige Client hier, der etwas Installiertes braucht — die GTK3-Anbindung von Perl — was neben dem Windows-Fenster oben erwähnenswert ist, denn das braucht gar nichts. Alles andere, was es nutzt, liegt Perl bei. Der Schlüssel wird nur im Speicher gehalten: das Schließen des Fensters vergisst ihn, und OWX_KEY füllt ihn beim Start vor. Was immer es dir zeigt, die rohe Antwort des Servers ist unter “Server reply” einen Klick entfernt.
apt install libgtk3-perl # or: dnf install perl-Gtk3 wget https://0wx.org/clients/0wx-gtk.pl chmod +x 0wx-gtk.pl OWX_KEY=YOUR_KEY ./0wx-gtk.pl
0wx-android.apk tut, was die anderen Clients tun, vom Telefon aus: hochladen, einfügen, kürzen, übersetzen und deine Dateien als Liste oder Galerie durchstöbern. Eine Datei aus einer anderen App damit zu teilen lädt sie hoch, Text zu teilen speichert ihn als Paste. Sie ist in keinem App-Store, dein Gerät wird also fragen, ob du die Installation erlaubst — eine Frage, die man generell ernst nehmen sollte, und der Grund, warum der komplette Quelltext ebenfalls hier liegt: öffne ihn in Android Studio und baue selbst, statt der Datei zu vertrauen. Zum Bauen ist JDK 21 nötig; BUILDING.md darin sagt, warum.
https://0wx.org/clients/0wx-android.apk # install it https://0wx.org/clients/0wx-android.zip # build it yourself
Es gibt bewusst keine Aktion zum Abholen entfernter Dateien. Sie würde den Server eine URL nach Wahl des Aufrufers holen lassen, was eine Angriffsfläche für Request Forgery ist, und ein Skript kann das weit härter treiben als ein Formular. Lade die Datei stattdessen selbst hoch.