czytofejk.pl
Для розробників

Документація API

Перевіряйте контент програмно: зображення (AI/дипфейки), тексти (фейкові новини, маніпуляції) та відео із соцмереж (з автоматичною транскрипцією). Аналізи використовують кредити з вашого акаунта — ті самі, що й на сайті. Ключ згенеруєте в акаунті, вкладка API.

Base URL: https://czytofejk.pl/api/public/v1

Авторизація

Кожен запит потребує заголовка Authorization із ключем у форматі czf_…:

Authorization: Bearer czf_TWOJ_KLUCZ
Безпека ключа: ключ показуємо лише раз під час створення (зберігаємо тільки його хеш). Використовуйте його виключно на боці сервера — ніколи в коді браузера чи в публічному репозиторії. Витік? Відкличте ключ в акаунті (діє одразу) і створіть новий.

Вартість у кредитах

АналізВартість
Текст (до 1000 знаків — надлишок обрізаємо)10–150 кредитів
Зображення за посиланням (AI / дипфейк)10–60 кредитів
Відео за посиланням (TikTok, YouTube…) — транскрипція + аналіз10–600 кредитів
Дублікат (контент, який будь-хто вже аналізував раніше)0 кредитів

На старті ми блокуємо заставу (верхня межа діапазону), а після аналізу повертаємо різницю — ви платите точно реальну вартість операції. Якщо аналіз завершиться помилкою з нашого боку, повертається вся сума. API розраховується лише кредитами (поповнення та підписки: ціни).

Ліміти запитів

60 запитів/хв на ключ (план Redakcja: 300/хв) для POST /checks; читання статусу та балансу: 300/хв. Після перевищення: 429 із заголовком Retry-After.

POST /checks — запуск аналізу

JSON-тіло з рівно одним із полів: text (текст для перевірки або посилання на відео із соцмереж) чи image_url (пряме посилання на зображення). Опційно "wait": true — синхронний режим (нижче).

Необов'язкове поле language (pl — типово, en, uk) задає мову тексту вердикту (підсумок, обґрунтування, сигнали). Значення enum (PRAWDA | MANIPULACJA | FAŁSZ) залишаються незмінними незалежно від мови. Увага: дедуплікація працює за контентом — повторна перевірка того самого контенту повертає наявний вердикт мовою, якою його згенеровано.

Синхронний режим — результат в одній відповіді

З "wait": true тримаємо запит відкритим до завершення аналізу (макс. ~90 с) і повертаємо 200 з готовим result — без полінгу. Якщо аналіз триває довше (зазвичай відео з транскрипцією), отримаєте звичайний 202 running і забираєте результат GET-запитом — найкраще теж із ?wait=true (long-poll). Зображення й тексти майже завжди вкладаються в бюджет.

curl — синхронно (найпростіше)

curl -X POST https://czytofejk.pl/api/public/v1/checks \
  -H "Authorization: Bearer czf_TWOJ_KLUCZ" \
  -H "Content-Type: application/json" \
  -d '{"text": "Rząd potwierdził, że od sierpnia ceny prądu wzrosną o 45%.", "wait": true}'

# → 200 { "id": "…", "status": "done", "result": { "verdict": "FAŁSZ", … } }

curl — асинхронно

curl -X POST https://czytofejk.pl/api/public/v1/checks \
  -H "Authorization: Bearer czf_TWOJ_KLUCZ" \
  -H "Content-Type: application/json" \
  -d '{"text": "Rząd potwierdził, że od sierpnia ceny prądu wzrosną o 45%."}'

# → 202 { "id": "a1b2c3d4e5", "status": "running", … }
# potem (long-poll do wyniku):
curl "https://czytofejk.pl/api/public/v1/checks/a1b2c3d4e5?wait=true" \
  -H "Authorization: Bearer czf_TWOJ_KLUCZ"

JavaScript (Node) — синхронно

const res = await fetch("https://czytofejk.pl/api/public/v1/checks", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.CZYTOFEJK_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    image_url: "https://example.com/zdjecie.jpg",
    wait: true,
  }),
});
const check = await res.json();
if (check.status === "done") console.log(check.result); // gotowy werdykt

Python — асинхронно з long-poll (напр. відео)

import os, requests

API = "https://czytofejk.pl/api/public/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['CZYTOFEJK_API_KEY']}"}

check = requests.post(f"{API}/checks", headers=HEADERS, json={
    "text": "https://www.tiktok.com/@uzytkownik/video/724..."  # film → transkrypcja
}).json()

# long-poll: każde wywołanie czeka do wyniku albo ~90 s
while check.get("status") == "running":
    check = requests.get(
        f"{API}/checks/{check['id']}", params={"wait": "true"},
        headers=HEADERS, timeout=120,
    ).json()

print(check["result"]["verdict"])

Відповідь 202 (аналіз запущено)

{
  "id": "a1b2c3d4e5",
  "status": "running",
  "cost_tokens": 1,
  "result_url": "https://czytofejk.pl/w/a1b2c3d4e5"
}

Дублікат повертає 200 з "deduped": true і "cost_tokens": 0 (статус може бути одразу done).

GET /checks/{id}статус і результат

З ?wait=true (рекомендовано) запит чекає на результат — макс. ~90 с на виклик; повторюйте до статусу done. Без wait повертає стан одразу (тоді опитуйте кожні ~2 с). Час аналізу: зображення 5–20 с, тексти 10–30 с, відео з транскрипцією — до кількох хвилин. Статус error = кредити повернуто автоматично.

{
  "id": "a1b2c3d4e5",
  "status": "done",
  "result_url": "https://czytofejk.pl/w/a1b2c3d4e5",
  "result": {
    "kind": "tresc",                 // albo "plik" (obraz)
    "verdict": "MANIPULACJA",        // PRAWDA | MANIPULACJA | FAŁSZ
    "verdictSub": "…",               // 1–2 zdania oceny
    "summary": "…",                  // uzasadnienie
    "signals": [{ "strong": true, "text": "…" }],
    "sources": [{ "domain": "…", "title": "…", "url": "…" }]
    // dla kind="plik": "percent" 0–100 (prawdopodobieństwo AI/fałszerstwa),
    // "verdict" np. "AI" / "AUTENTYCZNE" oraz lista sygnałów technicznych
  }
}

GET /balance — баланс кредитів

{
  "plan": "pro",
  "tokens": { "subscription": 184, "topup": 40, "total": 224 }
}

Коди помилок

СтатусerrorЗначення
401invalid_api_keyВідсутній/невірний/відкликаний ключ
402insufficient_tokensЗамало кредитів (поля required, balance)
400invalid_inputВкажіть рівно одне поле: text або image_url
422text_too_short / not_an_imageКонтент не придатний для аналізу
429rate_limitedЛіміт запитів на хвилину — зачекайте Retry-After
404not_foundНемає перевірки з таким id
500analysis_failedПомилка з нашого боку — спробуйте ще раз

Добрі практики

  • Тримайте ключ у змінній середовища на боці сервера; для кожної інтеграції — окремий ключ (простіші ротація та аудит — колонка «останнє використання» в акаунті).
  • Результат має сталий публічний пермалінк result_url — можете давати його читачам як доказ.
  • Надсилаєте той самий контент кілька разів? Нічого не втрачаєте — дедуплікація відповість миттєво й безкоштовно.
  • Вердикт — це оцінка ймовірності на основі доказів, а не вирок — для редакційних рішень загляньте в signals і sources.

Питання, вищі ліміти, вебхуки? Напишіть нам. Версіонуємо під /v1 — зламні зміни підуть під новий шлях.