GET https://o.pizdec.lol/api/v1/challenge
{
"token": "eyJ….AbC…",
"nonce": "9f2c…",
"bits": 18,
"image": "",
"expires_at": "…"
}
Перебирай числа с нуля, пока sha256(nonce + ":" + N) не
начнётся с bits нулевых битов. Найденное N —
это и есть solution.
Если в image пришёл PNG (это бывает после нескольких
отказов подряд), цифры с него идут в captcha_answer.
POST https://o.pizdec.lol/api/v1/shorten
Content-Type: application/json
{
"url": "https://example.com/очень/длинный/путь",
"alias": "", // свой хвостик, необязательно
"ttl": "168h", // срок жизни, необязательно
"captcha_token": "…", // token из шага 1
"captcha_solution": "…", // найденное N
"captcha_answer": "" // цифры с картинки, если она была
}
{
"success": true,
"code": "kTx9mQ",
"short_url": "https://o.pizdec.lol/kTx9mQ",
"url": "https://example.com/очень/длинный/путь",
"manage_token": "…", // выдаётся один раз, им удаляют ссылку
"expires_at": null
}
DELETE https://o.pizdec.lol/api/v1/links/kTx9mQ
X-Manage-Token: …
GET /api/v1/links/{code} — данные о ссылке;GET /s/{code} или /{code}+ — статистика;GET /qr/{code}.png — QR-код;GET /healthz — живость.{"success": false, "error": "rate_limited", "message": "слишком часто, подождите немного"}
На 429 и 503 приходит Retry-After —
сколько секунд ждать.
http и https;