▼
English
Deutsch
Plattdüütsch
Lëtzebuergesch
Nederlands
Dansk
Svenska
Bokmål
Nynorsk
Íslenska
Føroyskt
Español
Català
Galego
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
Tudo o que os formulários deste site fazem, para scripts. Cada resposta é JSON, erros incluídos, por isso nunca tens de adivinhar se um corpo é um resultado ou uma explicação.
Faz POST para o endpoint com parâmetros de formulário ou com um corpo JSON. Ambos são equivalentes; escolhe o que as tuas ferramentas tornarem mais fácil. O parâmetro action seleciona o que fazer. Usa --data-urlencode para tudo o que uma pessoa tenha escrito — texto de um paste, um URL, uma tradução — porque -d envia o valor em bruto e ele será cortado no primeiro &. Um -d simples chega para valores fixos como o próprio action. O wget não tem --data-urlencode de todo, por isso com o wget ou codificas tu próprio esses valores com percentagens ou envias um corpo JSON, que não precisa de codificação.
curl -X POST https://0wx.cat/api.cgi \
-d action=paste --data-urlencode 'content=hello & world'
curl -X POST https://0wx.cat/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.cat/api.cgi
Num corpo de formulário & separa parâmetros, e curl -d não codifica o que lhe dás. Um URL com query string é por isso cortado no seu primeiro &, e o resto chega como parâmetros separados. Usa --data-urlencode, ou envia JSON. Parâmetros perdidos são recusados em vez de ignorados, por isso isto falha de forma visível em vez de guardar meia ligação.
# wrong -- the value is cut at the &
curl -X POST https://0wx.cat/api.cgi \
-d action=tinyurl -d 'url=https://example.com/?a=1&b=2'
# right
curl -X POST https://0wx.cat/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.cat/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.cat/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.cat/api.cgi
Opcional. Sem chave, o pedido é anónimo e comporta-se exatamente como um visitante anónimo — o resultado é público de qualquer forma, a única diferença é se aparece na tua lista de ficheiros. Gera uma chave na página da tua conta e envia-a como token bearer; passá-la como parâmetro apikey também funciona, mas uma chave na query string acaba nos registos do servidor e no histórico do navegador.
curl -X POST https://0wx.cat/api.cgi \
-H 'Authorization: Bearer YOUR_KEY' \
-d action=whoami
wget -qO- --header='Authorization: Bearer YOUR_KEY' \
--post-data 'action=whoami' https://0wx.cat/api.cgi
| action | Parâmetros | Descrição |
|---|---|---|
whoami | — | Confirma que uma chave funciona e indica os limites atuais. Não custa nada; chama-a primeiro. |
ip | — | Indica o teu endereço, o seu PTR, o país, a região e a cidade em que é geolocalizado, as coordenadas e o user agent que enviaste. Não precisa de chave e responde da mesma forma com ou sem ela. Deliberadamente mais restrito do que a página web: sem WHOIS, sem zona DNS e sem consultas a listas de bloqueio, por isso chamá-lo só custa ao servidor uma leitura de base de dados local. |
upload | file (repetível), resize, lifetime, gallery ou g * | Envia um ou mais ficheiros. Tem de ser multipart/form-data. Nomear uma galeria coloca-os diretamente nela e devolve o seu id. |
tinyurl | url, lifetime | Encurta um URL. |
hugeurl | url, lifetime | Alonga um URL, de forma absurda, de propósito. |
paste | content, lifetime | Guarda um bloco de texto e devolve uma ligação para ele. |
translate | content, to, from | Traduz texto. to e from são códigos da ação langs — nota que nem sempre são códigos de país: o dinamarquês é da, não dk. from pode ser omitido ou dado como auto, que pede ao backend para detetar a língua; indicá-lo dá melhor resultado em texto curto. |
langs | Lista as línguas que translate aceita, como supported_langs: um objeto por língua, código para nome, pela ordem em que o site as oferece. Não precisa de chave de API. | |
dyndns | key, ip, format | Atualiza um nome de DNS dinâmico. A única ação que não precisa de chave de API: é chamada por um router, que tem um campo para um URL e nenhuma forma de enviar um cabeçalho. key é a chave de atualização de cada nome mostrada na tua conta, não a tua chave de API. Omite ip e é usado o endereço de onde chamas. A resposta é a palavra dyndns2 de facto — good, nochg, badauth, abuse ou dnserr — como texto simples, porque é isso que os routers interpretam; acrescenta format=json para o JSON habitual. |
listfiles * | page, g | Lista os teus ficheiros com tudo o que o painel de informação mostra, mais a miniatura e a ligação direta. g limita-o a uma galeria, ou none aos ficheiros sem galeria. |
listpastes * | page | Lista os teus pastes, com uma pré-visualização de 200 caracteres de cada um em vez do corpo inteiro. |
listurls * | page | Lista os teus URLs curtos e enormes, com o endereço para que cada um aponta. |
otl * | share | Cria uma ligação de utilização única para um dos teus ficheiros. Cada chamada gera uma nova, por isso dar o mesmo ficheiro a duas pessoas dá duas ligações. |
listotl * | page | Lista as tuas ligações de utilização única ativas, o ficheiro para que cada uma aponta, e se esse ficheiro entretanto expirou. |
listgalleries * | — | Lista as tuas galerias com os seus ids, nomes, número de ficheiros e estado de publicação. |
gallery * | g, publish | Indica o estado de publicação de uma galeria, e altera-o quando publish é dado. |
move * | share (repetível), gallery ou g | Move ficheiros para uma galeria, por nome (criada se for nova) ou por id. Se ambos forem omitidos, voltam para a lista principal. |
delete * | share (repetível), g, otl, withfiles | Apaga ficheiros, pastes, URLs curtos, galerias, ligações de utilização única, ou qualquer mistura. Um share é comparado primeiro com os teus ficheiros e depois com os teus pastes e ligações, por isso quem chama não tem de os ordenar por tipo. As ligações de utilização única vão à parte, em otl: remover uma ligação não pode confundir-se com apagar o ficheiro para que aponta. |
* Estas ações precisam de uma chave de API. Leem ou alteram os dados de uma conta, por isso não têm forma anónima.
share e g aceitam um campo repetido, um array JSON ou uma lista separada por vírgulas — o que as tuas ferramentas tornarem mais fácil. Duplicados são ignorados.
curl -X POST https://0wx.cat/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.cat/api.cgi -H 'Authorization: Bearer YOUR_KEY' \
-d action=delete -d 'share=Ab3xK9pQ,Zz7yT2mN'
curl -X POST https://0wx.cat/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.cat/api.cgi
Sempre que uma galeria é nomeada — em upload ou em move — é indicada das mesmas duas formas: g para um id existente, ou gallery para um nome, criado se for novo. Se ambos forem enviados, g ganha. A resposta traz o id da galeria. Nota que apagar uma galeria remove apenas a galeria, deixando os seus ficheiros na lista principal — ao contrário do formulário web, que os apaga depois de perguntar. Passa withfiles=true para os apagar também: um script que arruma os seus agrupamentos não deve perder os envios por acidente.
curl -X POST https://0wx.cat/api.cgi -H 'Authorization: Bearer YOUR_KEY' \
-F action=upload -F file=@photo.jpg --form-string 'gallery=Holiday 2026'
curl -X POST https://0wx.cat/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.cat/api.cgi
Os envios não podem usar o corpo JSON, porque um ficheiro tem de ser enviado como multipart. Repete a parte file para enviar vários de uma vez. Cada ficheiro é reportado em separado: a resposta traz uma lista files dos aceites e uma lista rejected dos recusados, por isso um sucesso parcial continua a ser um sucesso.
curl -X POST https://0wx.cat/api.cgi \
-H 'Authorization: Bearer YOUR_KEY' \
-F action=upload \
-F file=@photo.jpg \
-F file=@notes.txt \
-F lifetime=7d
Não há forma wget para isto. O wget não consegue construir um corpo multipart/form-data — não tem equivalente ao -F do curl — e os envios têm de ser multipart. Usa curl, ou monta tu próprio o corpo e o boundary e envia-o com --post-file.
Opcional em todas as ações que guardam algo. Aceita segundos simples, ou um número seguido de m, h ou d — as mesmas formas que os formulários web aceitam. Omite-o ou passa 0 para manter o item indefinidamente.
Cada resposta é um objeto JSON com um campo ok. Em caso de sucesso traz o resultado; em caso de falha traz um código error estável e uma message legível. Ramifica pelo código, regista a mensagem.
{"ok":true,"type":"paste","share":"Ab3xK9pQ",
"url":"https://0wx.cat/p/Ab3xK9pQ","bytes":11}
{"ok":false,"error":"url_too_long",
"message":"URL exceeds the maximum length."}
Quando um ficheiro as tem, listfiles acrescenta file_tags à sua entrada: artista, título e álbum, lidos de ID3, comentários Vorbis ou átomos MP4 quando o ficheiro foi enviado. A chave está ausente em vez de null quando não há nada a reportar, o que acontece com a maioria dos ficheiros, por isso testa-a antes de a leres. Campos individuais também podem faltar — um ficheiro pode ter título e não ter álbum. Nada mais dos metadados do ficheiro é exposto: uma compra iTunes regista o nome e o Apple ID do comprador, e esses nunca são lidos, de propósito.
{"ok":true,"type":"files","total":2,"page":1,"pages":1,"files":[
{"share":"Ab3xK9pQ","name":"autobahn.mp3","mime":"audio/mpeg",
"bytes":8123456,"url":"https://0wx.cat/i/Ab3xK9pQ",
"file_tags":{"artist":"Kraftwerk","title":"Autobahn","album":"Autobahn"}},
{"share":"Zz7yT2mN","name":"photo.jpg","mime":"image/jpeg",
"bytes":204800,"url":"https://0wx.cat/i/Zz7yT2mN"}
]}
| error | HTTP | Descrição |
|---|---|---|
unknown_action | 400 | Essa ação não existe. |
bad_json | 400 | O corpo não era JSON válido, ou um campo continha uma estrutura aninhada. |
unexpected_parameter | 400 | Chegou um parâmetro que esta ação não aceita — normalmente um & não codificado num valor. A mensagem indica os parâmetros. |
bad_key | 401 | A chave não foi reconhecida. Uma chave errada é recusada em vez de ser tratada silenciosamente como anónima. |
bad_url | 400 | O URL está malformado, ou usa um esquema que não é http(s), ftp nem gopher. |
bad_lifetime | 400 | O tempo de vida não era um número nem um número seguido de m, h ou d. |
no_content | 400 | Não foi enviado nada para guardar. |
url_too_long | 413 | O URL excede o limite de comprimento. |
paste_too_long | 413 | O texto excede o limite de paste. Os limites medem-se em bytes UTF-8, por isso texto não latino conta mais do que o número de caracteres sugere. |
too_many_files | 413 | Mais ficheiros do que uma chamada aceita. |
no_usable_files | 415 | Todos os ficheiros foram recusados. Consulta a lista rejected para saberes porquê. |
backend_unavailable | 502 | O backend de tradução não respondeu. |
internal | 500 | Algo falhou inesperadamente. Ficou registado. |
Chama whoami para ler os valores atuais em vez de os fixares no código — são definidos pelo operador do servidor e podem mudar. Os tamanhos são bytes UTF-8.
0wx.sh embrulha tudo o que está acima. É shell POSIX puro, não precisa de nada além de curl, e é curto o suficiente para o leres antes de o executares — que é o que se deve fazer com um script que vai guardar a tua chave de API. Põe a chave em OWX_KEY em vez de passares --key, e ela fica fora do histórico da tua shell.
wget https://0wx.cat/clients/0wx.sh chmod +x 0wx.sh export OWX_KEY=YOUR_KEY ./0wx.sh help ./0wx.sh paste --content 'hello & world'
0wx.py faz o mesmo que o cliente de shell, mas analisa a resposta e imprime o que os campos significam em vez de te entregar JSON em bruto — acrescenta --json quando quiseres a forma em bruto. Só biblioteca padrão: sem requests, nada para instalar. Se estiveres a escrever o teu próprio cliente, as funções send() e report() são as partes que vale a pena ler: entre as duas mostram como construir o pedido, como tirar a mensagem de um pedido falhado e o que as respostas contêm.
wget https://0wx.cat/clients/0wx.py chmod +x 0wx.py export OWX_KEY=YOUR_KEY ./0wx.py listfiles ./0wx.py listfiles --json | jq '.files[].url'
0wx.pl faz o mesmo que o de Python e imprime a mesma saída. Só módulos do núcleo — HTTP::Tiny e JSON::PP vêm com o Perl desde a 5.14, por isso não há nada para instalar. Vale a pena lê-lo ao lado do cliente de Python se estiveres a escrever o teu: as duas linguagens falham de forma diferente num pedido partido, e ambos os scripts dizem onde.
wget https://0wx.cat/clients/0wx.pl chmod +x 0wx.pl export OWX_KEY=YOUR_KEY ./0wx.pl listfiles
0wx.ps1 é o equivalente do cliente de Python para Windows: os mesmos comandos, a mesma saída, e analisa a resposta em vez de te entregar JSON em bruto — acrescenta --json para isso. Está escrito para a Windows PowerShell que já está na máquina, por isso não há nada para instalar, e corre sem alterações no PowerShell 7. Podes precisar de Set-ExecutionPolicy -Scope Process Bypass na janela de onde o executas, que é o Windows a perguntar se queres mesmo executar um script que descarregaste — uma pergunta justa, e o ficheiro é curto o suficiente para o leres primeiro.
$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 é o mesmo conjunto de separadores que o cliente de secretária, em três ficheiros — uma página, uma folha de estilos e um script — sem instalação, sem framework, e sem carregar nada de outro lado que não este site. Três em vez de um porque a Content-Security-Policy do site proíbe script e estilo inline, o que vale a pena manter. Podem largar-se ficheiros sobre ele. Tem de ser aberto a partir daqui e não guardado e aberto a partir do teu disco: a API não envia cabeçalhos cross-origin, por isso a uma cópia local o teu navegador recusaria todos os pedidos antes de saírem. A chave fica em memória a menos que marques a caixa para a lembrar.
https://0wx.cat/clients/0wx.html
0wx-gui.ps1 é o mesmo conjunto de separadores que o cliente de secretária, desenhado com WinForms — o que significa nada para instalar, já que faz parte do Windows. Põe-no na mesma pasta que 0wx.ps1: a janela pede emprestado o tratamento de pedidos desse ficheiro em vez de transportar uma segunda cópia, por isso são precisos os dois. O Windows vai perguntar antes de executar um script que não escreveu, o que é justo; ambos os ficheiros são curtos o suficiente para os leres antes de responderes.
powershell -ExecutionPolicy Bypass -File .\0wx-gui.ps1
0wx-gtk.pl é uma pequena janela GTK com separadores para enviar, colar, encurtar e navegar nos teus ficheiros — como lista ou como galeria de miniaturas, filtrada por galeria. É o único cliente aqui que precisa de algo instalado — os bindings GTK3 do Perl — o que vale a pena saber ao lado da janela Windows acima, que não precisa de nada. Tudo o resto que usa vem com o Perl. A chave é guardada apenas em memória: fechar a janela esquece-a, e definir OWX_KEY preenche-a no arranque. Mostre o que mostrar, a resposta em bruto do servidor está a um clique em “Server reply”.
apt install libgtk3-perl # or: dnf install perl-Gtk3 wget https://0wx.cat/clients/0wx-gtk.pl chmod +x 0wx-gtk.pl OWX_KEY=YOUR_KEY ./0wx-gtk.pl
0wx-android.apk faz o que os outros clientes fazem, a partir de um telemóvel: enviar, colar, encurtar, traduzir e navegar nos teus ficheiros como lista ou galeria. Partilhar um ficheiro com ela a partir de qualquer outra app envia-o, e partilhar texto guarda-o como paste. Não está em nenhuma loja de aplicações, por isso o teu dispositivo vai pedir-te para permitir a instalação — uma pergunta que vale a pena levar a sério em geral, e a razão pela qual o código-fonte completo está também aqui: abre-o no Android Studio e compila-o tu próprio em vez de confiares no ficheiro. Compilar precisa do JDK 21; o BUILDING.md lá dentro explica porquê.
https://0wx.cat/clients/0wx-android.apk # install it https://0wx.cat/clients/0wx-android.zip # build it yourself
Não há, de propósito, uma ação de obtenção remota. Faria o servidor ir buscar um URL à escolha de quem chama, o que é uma superfície de falsificação de pedidos, e um script consegue explorar isso muito mais do que um formulário. Envia tu próprio o ficheiro.