▼
English
Deutsch
Plattdüütsch
Lëtzebuergesch
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 wat de formulieren op deze site doen, voor scripts. Elk antwoord is JSON, fouten inbegrepen, dus je hoeft nooit te raden of een body een resultaat of een uitleg is.
POST naar het endpoint, met formulierparameters of met een JSON-body. Beide zijn gelijkwaardig; kies wat je gereedschap het makkelijkst maakt. De parameter action bepaalt wat er gebeurt. Gebruik --data-urlencode voor alles wat iemand heeft getypt — pastetekst, een URL, een vertaling — want -d stuurt de waarde rauw en die wordt bij de eerste & afgekapt. Gewoon -d volstaat voor vaste waarden zoals action zelf. wget heeft helemaal geen --data-urlencode, dus met wget moet je zulke waarden zelf procent-coderen of een JSON-body sturen, die geen codering nodig heeft.
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 een formulierbody scheidt & parameters, en curl -d codeert niet wat je het geeft. Een URL met querystring wordt daardoor bij de eerste & afgekapt, en de rest komt als losse parameters aan. Gebruik --data-urlencode, of stuur JSON. Zwervende parameters worden geweigerd in plaats van genegeerd, dus dit faalt luid in plaats van een halve link op te slaan.
# 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
Optioneel. Zonder sleutel is een verzoek anoniem en gedraagt het zich precies als een anonieme bezoeker — het resultaat is hoe dan ook openbaar, het enige verschil is of het in je bestandenlijst terechtkomt. Maak een sleutel aan op je accountpagina en stuur hem als bearer-token; als parameter apikey meegeven werkt ook, maar een sleutel in een querystring belandt in serverlogs en browsergeschiedenis.
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 | Parameters | Omschrijving |
|---|---|---|
whoami | — | Bevestigt dat een sleutel werkt en meldt de huidige limieten. Kost niets; roep dit als eerste aan. |
ip | — | Meldt je adres, de PTR ervan, het land, de regio en de stad waar het geolokaliseerd wordt, de coördinaten en de user agent die je stuurde. Heeft geen sleutel nodig en antwoordt met of zonder hetzelfde. Bewust smaller dan de webpagina: geen WHOIS, geen DNS-zone en geen blokkeerlijsten, dus een aanroep kost de server niets meer dan een lokale databaselezing. |
upload | file (herhaalbaar), resize, lifetime, gallery of g * | Uploadt een of meer bestanden. Moet multipart/form-data zijn. Een galerij noemen zet ze er meteen in en geeft het id ervan terug. |
tinyurl | url, lifetime | Verkort een URL. |
hugeurl | url, lifetime | Maakt een URL langer, absurd lang, met opzet. |
paste | content, lifetime | Slaat een blok tekst op en geeft er een link naar terug. |
translate | content, to, from | Vertaalt tekst. to en from zijn codes uit de actie langs — let op: dat zijn niet altijd landcodes: Deens is da, niet dk. from mag weggelaten worden of auto zijn, dan laat je de backend de taal herkennen; het opgeven levert bij korte tekst een beter resultaat. |
langs | Somt de talen op die translate accepteert, als supported_langs: één object per taal, code naar naam, in de volgorde waarin de site ze aanbiedt. Heeft geen API-sleutel nodig. | |
dyndns | key, ip, format | Werkt een dynamische DNS-naam bij. De enige actie zonder API-sleutel: hij wordt aangeroepen door een router, die één veld voor een URL heeft en geen manier om een header te sturen. key is de bijwerksleutel per naam die in je account staat, niet je API-sleutel. Laat ip weg en het adres waarvandaan je aanroept wordt gebruikt. Het antwoord is het de-facto dyndns2-woord — good, nochg, badauth, abuse of dnserr — als platte tekst, want dat is wat routers ontleden; voeg format=json toe voor de gebruikelijke JSON. |
listfiles * | page, g | Somt je bestanden op met alles wat het Info-paneel toont, plus de miniatuur en de directe link. g beperkt het tot één galerij, of none tot bestanden zonder galerij. |
listpastes * | page | Somt je teksten op, elk met een voorbeeld van 200 tekens in plaats van de hele inhoud. |
listurls * | page | Somt je korte en enorme URL's op, met het adres waar elk naar wijst. |
otl * | share | Maakt een eenmalige link naar een van je bestanden. Elke aanroep maakt een nieuwe, dus hetzelfde bestand aan twee mensen geven levert twee links op. |
listotl * | page | Somt je actieve eenmalige links op, het bestand waar elk naar wijst, en of dat bestand inmiddels is verlopen. |
listgalleries * | — | Somt je galerijen op met hun id's, namen, aantal bestanden en publicatiestatus. |
gallery * | g, publish | Meldt de publicatiestatus van een galerij, en wijzigt die als publish is meegegeven. |
move * | share (herhaalbaar), gallery of g | Verplaatst bestanden naar een galerij, op naam (aangemaakt als die nieuw is) of op id. Laat je beide weg, dan gaan ze terug naar de hoofdlijst. |
delete * | share (herhaalbaar), g, otl, withfiles | Verwijdert bestanden, teksten, korte URL's, galerijen, eenmalige links, of een mengsel. Een share wordt eerst met je bestanden vergeleken en dan met je teksten en links, dus de aanroeper hoeft ze niet op type te sorteren. Eenmalige links gaan apart in otl: een link verwijderen mag niet te verwarren zijn met het verwijderen van het bestand waarnaar hij wijst. |
* Deze acties hebben een API-sleutel nodig. Ze lezen of wijzigen de gegevens van één account, dus er is geen anonieme vorm van.
share en g accepteren een herhaald veld, een JSON-array of een kommagescheiden lijst — wat je gereedschap het makkelijkst maakt. Dubbele worden genegeerd.
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
Overal waar een galerij wordt genoemd — bij upload of bij move — gebeurt dat op dezelfde twee manieren: g voor een bestaand id, of gallery voor een naam, die wordt aangemaakt als hij nieuw is. Stuur je beide, dan wint g. Het antwoord bevat het galerij-id. Let op: een galerij verwijderen verwijdert alleen de galerij en laat de bestanden in de hoofdlijst staan — anders dan het webformulier, dat ze na een vraag mee verwijdert. Geef withfiles=true mee om ze ook te verwijderen: een script dat zijn groeperingen opruimt hoort niet per ongeluk de uploads kwijt te raken.
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 kunnen de JSON-body niet gebruiken, omdat een bestand als multipart verstuurd moet worden. Herhaal het onderdeel file om er meerdere tegelijk te sturen. Elk bestand wordt apart gemeld: het antwoord bevat een lijst files met de geaccepteerde en een lijst rejected met de geweigerde, dus een gedeeltelijk succes is nog steeds een succes.
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
Hier is geen wget-vorm van. wget kan geen multipart/form-data-body bouwen — het heeft geen tegenhanger van curls -F — en uploads moeten multipart zijn. Gebruik curl, of stel body en boundary zelf samen en stuur ze met --post-file.
Optioneel bij elke actie die iets opslaat. Accepteert kale seconden, of een getal gevolgd door m, h of d — dezelfde vormen als de webformulieren. Laat het weg of geef 0 om het item onbeperkt te bewaren.
Elk antwoord is een JSON-object met een veld ok. Bij succes bevat het het resultaat; bij mislukking een stabiele error-code en een leesbare message. Vertak op de code, log het bericht.
{"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."}
Waar een bestand ze heeft, voegt listfiles file_tags aan de vermelding toe: artiest, titel en album, bij het uploaden gelezen uit ID3, Vorbis-commentaren of MP4-atomen. De sleutel ontbreekt in plaats van null te zijn als er niets te melden valt, wat bij de meeste bestanden zo is; test er dus op voor je hem leest. Ook losse velden kunnen ontbreken — een bestand kan een titel hebben en geen album. Niets anders uit de metadata van het bestand wordt vrijgegeven: een iTunes-aankoop bevat de naam en Apple ID van de koper, en die worden bewust nooit gelezen.
{"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 | Omschrijving |
|---|---|---|
unknown_action | 400 | Die actie bestaat niet. |
bad_json | 400 | De body was geen geldige JSON, of een veld bevatte een geneste structuur. |
unexpected_parameter | 400 | Er kwam een parameter binnen die deze actie niet aanneemt — meestal een ongecodeerde & in een waarde. Het bericht noemt de parameters. |
bad_key | 401 | De sleutel is niet herkend. Een verkeerde sleutel wordt geweigerd in plaats van stilletjes als anoniem behandeld. |
bad_url | 400 | De URL is misvormd, of gebruikt een ander schema dan http(s), ftp of gopher. |
bad_lifetime | 400 | De levensduur was geen getal en ook geen getal gevolgd door m, h of d. |
no_content | 400 | Er is niets opgestuurd om op te slaan. |
url_too_long | 413 | De URL is langer dan de limiet. |
paste_too_long | 413 | De tekst is groter dan de pastelimiet. Limieten worden in UTF-8-bytes gemeten, dus niet-Latijnse tekst telt zwaarder dan het aantal tekens doet vermoeden. |
too_many_files | 413 | Meer bestanden dan één aanroep accepteert. |
no_usable_files | 415 | Alle bestanden zijn geweigerd. Kijk in de lijst rejected waarom. |
backend_unavailable | 502 | De vertaalbackend gaf geen antwoord. |
internal | 500 | Er ging onverwacht iets mis. Het is gelogd. |
Roep whoami aan om de huidige waarden te lezen in plaats van ze hard te coderen — ze worden door de serverbeheerder ingesteld en kunnen veranderen. Groottes zijn UTF-8-bytes.
0wx.sh verpakt alles hierboven. Het is pure POSIX-shell, heeft niets nodig behalve curl, en is kort genoeg om te lezen voor je het draait — wat verstandig is bij een script dat je API-sleutel gaat bewaren. Zet de sleutel in OWX_KEY in plaats van --key mee te geven, dan blijft hij uit je shellgeschiedenis.
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 doet hetzelfde als de shell-client, maar ontleedt het antwoord en drukt af wat de velden betekenen in plaats van je rauwe JSON te geven — voeg --json toe als je de rauwe vorm wilt. Alleen standaardbibliotheek: geen requests, niets te installeren. Schrijf je je eigen client, dan zijn de functies send() en report() de moeite van het lezen waard: samen laten ze zien hoe je het verzoek opbouwt, hoe je het bericht uit een mislukt verzoek haalt en wat de antwoorden bevatten.
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 doet hetzelfde als de Python-versie en drukt dezelfde uitvoer af. Alleen kernmodules — HTTP::Tiny en JSON::PP zitten sinds 5.14 bij Perl, dus er valt niets te installeren. Het lezen waard naast de Python-client als je je eigen client schrijft: de twee talen falen verschillend bij een kapot verzoek, en beide scripts vertellen waar.
wget https://0wx.org/clients/0wx.pl chmod +x 0wx.pl export OWX_KEY=YOUR_KEY ./0wx.pl listfiles
0wx.ps1 is de tegenhanger van de Python-client voor Windows: dezelfde commando's, dezelfde uitvoer, en het ontleedt het antwoord in plaats van je rauwe JSON te geven — voeg daarvoor --json toe. Het is geschreven voor de Windows PowerShell die al op de machine staat, dus er valt niets te installeren, en het draait ongewijzigd op PowerShell 7. Mogelijk heb je Set-ExecutionPolicy -Scope Process Bypass nodig in het venster waaruit je het start; dat is Windows dat vraagt of je echt een gedownload script wilt draaien — een terechte vraag, en het bestand is kort genoeg om eerst te lezen.
$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 is dezelfde set tabbladen als de desktopclient, als drie bestanden — een pagina, een stylesheet en een script — zonder installatie, zonder framework, en zonder dat er iets van elders dan deze site wordt geladen. Drie in plaats van één omdat de Content-Security-Policy van de site inline script en stijl verbiedt, wat het waard is te behouden. Je kunt er bestanden op slepen. Het moet vanaf hier geopend worden, niet opgeslagen en vanaf je schijf geopend: de API stuurt geen cross-origin-headers, dus van een lokale kopie zou je browser elk verzoek weigeren voor het vertrekt. De sleutel blijft in het geheugen tenzij je het vakje aanvinkt om hem te onthouden.
https://0wx.org/clients/0wx.html
0wx-gui.ps1 is dezelfde set tabbladen als de desktopclient, getekend met WinForms — wat betekent dat er helemaal niets te installeren valt, omdat dat al deel van Windows is. Zet het in dezelfde map als 0wx.ps1: het venster leent de verzoekafhandeling van dat bestand in plaats van een tweede kopie mee te dragen, dus beide zijn nodig. Windows zal vragen voordat het een script draait dat het niet zelf schreef, wat terecht is; beide bestanden zijn kort genoeg om te lezen voor je antwoordt.
powershell -ExecutionPolicy Bypass -File .\0wx-gui.ps1
0wx-gtk.pl is een klein GTK-venster met tabbladen voor uploaden, plakken, verkorten en door je bestanden bladeren — als lijst of als galerij van miniaturen, gefilterd op galerij. Het is de enige client hier die iets geïnstalleerd nodig heeft — de GTK3-bindings van Perl — wat goed is om te weten naast het Windows-venster hierboven, dat helemaal niets nodig heeft. Al het andere dat het gebruikt zit bij Perl. De sleutel blijft alleen in het geheugen: het venster sluiten vergeet hem, en OWX_KEY instellen vult hem bij het starten in. Wat het je ook toont, het rauwe antwoord van de server staat één klik verderop onder “Server reply”.
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 doet wat de andere clients doen, vanaf een telefoon: uploaden, plakken, verkorten, vertalen en door je bestanden bladeren als lijst of galerij. Een bestand ernaartoe delen vanuit een andere app uploadt het, en tekst delen slaat die op als tekst. Het staat in geen enkele app store, dus je toestel zal vragen of je de installatie toestaat — een vraag die je in het algemeen serieus moet nemen, en de reden dat de volledige broncode ook hier staat: open hem in Android Studio en bouw hem zelf in plaats van het bestand te vertrouwen. Bouwen vereist JDK 21; BUILDING.md erin legt uit waarom.
https://0wx.org/clients/0wx-android.apk # install it https://0wx.org/clients/0wx-android.zip # build it yourself
Er is met opzet geen actie om op afstand op te halen. Die zou de server een door de aanroeper gekozen URL laten ophalen, wat een aanvalsvlak voor request forgery is, en een script kan dat veel harder aanjagen dan een formulier. Upload het bestand liever zelf.