Подключение к любому сайту через один HTTP-запрос — без установки и настройки.
Для работы нужен API-ключ
Получите его в личном кабинете — раздел API Keys. Ключ передаётся в каждом запросе как параметр api.
Оберните любую ссылку на изображение в нашу прокси-ссылку — и оно будет автоматически обработано.
Когда подходит этот способ:
<img src="...">Если у вас веб-приложение, CRM или каталог — используйте Сценарий 2 ниже.
https://your-site.com/uploads/photo.jpg
https://kodoai.ru/img?u=https://your-site.com/uploads/photo.jpg&api=YOUR_TOKEN
Подходит если вы внедряете обработку изображений в полноценное приложение — CRM, интернет-магазин, каталог, маркетплейс, личный кабинет и любые системы, где изображения хранятся в базе данных и отображаются регулярно.
📐 Обязательные правила реализации
POST → сохранить задачу со статусом pending → ответить пользователю немедленноpending → обновлять статус и url_done в БДkodo_image() автоматически отдаёт нужную ссылку — прокси или готовое изображение❌ Не делайте так — любой вид ожидания на стороне клиента или сервера
Вариант 1 — polling из браузера (JS):
// ❌ fetch в цикле, пока статус не станет done
while (true) {
const { status } = await fetch('/api/task/status').then(r => r.json());
if (status === 'done') break;
await new Promise(r => setTimeout(r, 3000));
}
Вариант 2 — синхронное ожидание в запросе (PHP):
// ❌ sleep в цикле — блокирует поток, упадёт по таймауту
kodo_image_create($url);
do { sleep(5); $task = KodoTask::where('url_src', $url)->first(); }
while ($task->status !== 'done');
kodo_tasksSchema::create('kodo_tasks', function ($table) {
$table->id();
$table->string('hash', 64)->unique(); // sha256(url + mode) — защита от дублей
$table->text('url_src'); // исходная ссылка на изображение
$table->text('url_done')->nullable(); // ссылка на обработанное изображение
$table->string('status')->default('pending'); // pending | done | queued
$table->string('mode')->default('default');
$table->timestamps();
});
Уникальный индекс на hash гарантирует, что одно изображение в одном режиме будет обработано только один раз, без лишних списаний.
kodo_helpers.php с двумя функциями/**
* Зарегистрировать изображение на обработку (платный вызов).
* Если задача с таким hash уже существует — вернёт прокси-ссылку без нового списания.
*/
function kodo_image_create($url, $mode = 'default'): string
{
$token = config('kodo.token');
$proxy = 'https://kodoai.ru/img';
$hash = hash('sha256', $url . $mode);
// Если уже есть — вернуть прокси-ссылку без нового запроса к API
if (KodoTask::where('hash', $hash)->exists()) {
return $proxy . '?u=' . urlencode($url) . '&api=' . $token . '&mode=' . $mode;
}
// Новая задача — запрос к API (списание баланса)
KodoTask::create(['hash' => $hash, 'url_src' => $url, 'status' => 'pending', 'mode' => $mode]);
Http::get($proxy, ['u' => $url, 'api' => $token, 'mode' => $mode]);
return $proxy . '?u=' . urlencode($url) . '&api=' . $token . '&mode=' . $mode;
}
/**
* Получить актуальную ссылку для отображения изображения.
* done → url_done из базы (обработанное изображение)
* pending → прокси-ссылка (редиректит на оригинал, пока идёт обработка)
* нет в таблице → оригинальная ссылка без изменений
*/
function kodo_image($url, $mode = 'default'): string
{
$token = config('kodo.token');
$hash = hash('sha256', $url . $mode);
$task = KodoTask::where('hash', $hash)->first();
if (!$task) return $url;
if ($task->status === 'done') return $task->url_done;
return 'https://kodoai.ru/img?u=' . urlencode($url) . '&api=' . $token . '&mode=' . $mode;
}
Прокси-ссылка при pending безопасна для пользователя — он получит оригинальное изображение через редирект, а когда обработка завершится — автоматически начнёт получать обработанное.
Вариант A — при загрузке файла (upload):
// Файл загружен → зарегистрировать задачу и сразу вернуть ответ
kodo_image_create($product->image_url); // не ждём — задача создана, cron сам обновит
return response()->json(['status' => 'pending']); // отвечаем пользователю немедленно
Вариант B — пользователь нажал кнопку (ручной триггер):
// Кнопка "Обработать" → то же самое: создать задачу и вернуть pending
function handleProcessButton($imageUrl) {
kodo_image_create($imageUrl); // регистрируем задачу
return ['status' => 'pending', 'message' => 'Изображение поставлено в очередь'];
// ✅ кнопка сразу разблокирована, пользователь не ждёт
}
В шаблоне — просто обернуть ссылку через хелпер:
// pending → отдаёт прокси-ссылку (пользователь видит оригинал)
// done → отдаёт готовое обработанное изображение
<img src="{{ kodo_image($product->image_url) }}">
pending, а пользователи будут видеть только оригинальные изображения.
Cron раз в минуту проходит по всем записям со статусом pending,
делает запрос к прокси без следования по редиректам и читает заголовок X-Image-Status.
Как только статус стал done — сохраняет готовую ссылку из X-Image-Url в поле url_done и меняет статус записи.
С этого момента kodo_image() начнёт отдавать уже обработанное изображение.
В зависимости от платформы это может быть: Cron Job, Scheduled Command, Background Worker, Task Scheduler — любой механизм периодического запуска кода.
Пример реализации на PHP / Laravel — фоновая команда синхронизации:
// Получить все задачи в ожидании
$pendingTasks = getPendingTasks(); // SELECT * FROM kodo_tasks WHERE status = 'pending'
foreach ($pendingTasks as $task) {
// Сформировать прокси-ссылку и запросить заголовки (без редиректа)
$proxyUrl = 'https://kodoai.ru/img?u=' . urlencode($task['url_src']) . '&api=TOKEN&mode=' . $task['mode'];
$headers = getHeadersWithoutRedirect($proxyUrl); // HEAD / GET без следования редиректу
if ($headers['X-Image-Status'] === 'done') {
// Обработка завершена — сохранить готовую ссылку и обновить статус
updateTask($task['id'], [
'status' => 'done',
'url_done' => $headers['X-Image-Url'],
]);
}
// pending / queued — пропустить, вернёмся на следующей итерации
}
Запустить этот код раз в минуту через cron сервера:
# crontab -e — универсальный способ для любого языка
* * * * * /path/to/your/sync-script >> /dev/null 2>&1
kodo_image_create + kodo_image — единственные точки интеграции.
Один раз создать задачу, везде читать через хелпер. Дубликаты и лишние списания исключены на уровне хеша.
GET https://kodoai.ru/img?u={url}&api={token}&mode={mode}
| Параметр | Обязательный | Описание |
|---|---|---|
u | да | URL исходного изображения. Передавать через urlencode(). |
api | да | Ваш API-токен. |
mode | нет | Режим обработки. По умолчанию default. |
| Заголовок | Значение | Когда присутствует |
|---|---|---|
X-Image-Status |
done / pending / queued |
Всегда |
X-Image-Url |
Прямая ссылка на обработанное изображение на CDN | Только при done |
| Статус | Что значит | Что делать |
|---|---|---|
done |
Обработка завершена | Взять ссылку из X-Image-Url и сохранить |
pending |
Идёт обработка | Повторить запрос через 5–10 секунд |
queued |
В очереди — недостаточно баланса | Повторить позже или пополнить баланс |