REST API. Розмиття облич та номерних знаків на фото
Watermarkly Blur API автоматично виявляє та розмиває обличчя й номерні знаки на зображеннях. API повністю працює на інфраструктурі AWS і дбає про конфіденційність — ваші файли ніколи не використовуються для навчання моделей ШІ. Ми використовуємо AWS Lambda для паралельної обробки тисяч запитів, що забезпечує надійну продуктивність і доступність у кількох регіонах світу.
Ми продаємо API через AWS Marketplace. Вартість: $0.01 / запит. Доступний безкоштовний 7-денний пробний період.
Основні можливості
✓ Автоматично виявляє та розмиває номерні знаки й обличчя на зображеннях
✓ За бажанням замінює номерні знаки на логотип вашого проєкту або компанії.
✓ Може змінювати розмір, обрізати або конвертувати оброблені зображення.
✓ Підтримує до 500 запитів на секунду.
✓ Обробляє зображення паралельно для швидшої роботи.
✓ Максимальний підтримуваний розмір зображення: 6000 × 6000 пікселів.
✓ API-запити потребують автентифікації через API-ключ.
Якщо вам потрібна швидша обробка, підтримка більших зображень або вища швидкість запитів, зв’яжіться з нами за адресою api-support@watermarkly.com.
Приклади результатів
Обличчя жінки та номерний знак розмито.

Номерний знак замінено на логотип компанії, а обличчя жінки розмито.

Ми продаємо API через AWS Marketplace. Вартість: $0.01 / запит. Доступний безкоштовний 7-денний пробний період.
Деталі обробки
- Оброблені зображення не зберігаються на наших серверах.
- Сервіс приймає зображення у форматах JPEG, PNG, WEBP, AVIF, HEIC/HEIF.
- Зображення AVIF та HEIF будуть конвертовані у JPEG, якщо не вказано інший формат.
- Максимальний розмір вхідного зображення:
- GET-запити: 20 МБ або 6000x6000 пікселів.
- POST-запити: 6 МБ або 6000x6000 пікселів.
- Обмеження швидкості API:
- 500 паралельних запитів
- 500 запитів на секунду
- 100 000 запитів на день
Кінцеві точки API
Регіони
Наразі ми надаємо API у двох регіонах:
- Європа: https://blur-api-eu1.watermarkly.com/ (eu-north-1)
- Сполучені Штати: https://blur-api-us1.watermarkly.com/ (us-east-2)
Ви можете використовувати будь-яку кінцеву точку на свій розсуд. Другу кінцеву точку можна використовувати як резервну на випадок недоступності одного регіону AWS. Якщо вам потрібен API в іншому регіоні, повідомте нас.
Методи запитів
Ви можете надсилати зображення для обробки за допомогою GET або POST запитів. Якщо ваші зображення загальнодоступні, рекомендуємо використовувати GET-запити, оскільки вони дещо швидші за POST-запити.
Розмиття зображення за допомогою GET-запиту (рекомендовано)
GET https://blur-api-eu1.watermarkly.com/blur/?url={image_url}
або
GET https://blur-api-us1.watermarkly.com/blur/?url={image_url}
Сервіс завантажує зображення з image_url та обробляє його.
Запит
- Метод: GET
- Заголовки:
x-api-key: Ваш API-ключ
- Параметри URL-запиту:
url(Обов’язковий): Повна URL-адреса зображення для обробки.blur_intensity(Необов’язковий): Число з плаваючою комою від 0.0 до 20.0, що регулює інтенсивність розмиття. За замовчуванням: 1.0. Значення 0.0 вимикає розмиття.file_size(Необов’язковий): Вказує бажаний розмір вихідного файлу в байтах. Сервіс намагається повернути зображення, яке не перевищує цей розмір.width(Необов’язковий): Вказує бажану ширину вихідного зображення.height(Необов’язковий): Вказує бажану висоту вихідного зображення.format(Необов’язковий): Вказує бажаний формат вихідного зображення. Можливі значення: JPEG, PNG, WEBP.logo_url(Необов’язковий): URL-адреса файлу логотипу для розміщення на номерних знаках. Може бути HTTP URL або data URL. Переконайтеся, що URL правильно екранований перед передачею як параметр запиту.logo_size(Необов’язковий): Вказує розмір логотипу як число від 0.1 до 1.0.plate_screws(Необов’язковий): Додає гвинти на номерні знаки. Працює лише разом з параметром logo_url.
Відповідь
Успішна відповідь: (HTTP-статус: 200) Сервіс повертає оброблене зображення в одному з форматів: JPEG, PNG, WEBP.
Відповідь з помилкою: (HTTP-статус: 500, 403)
{
"message": "Error message"
}
Розмиття зображення за допомогою POST-запиту
POST https://blur-api-eu1.watermarkly.com/blur/
або
POST https://blur-api-us1.watermarkly.com/blur/
Надсилає зображення для обробки.
Запит
- Метод:
POST - Content-Type:
application/octet-stream - Заголовки:
x-api-key: Ваш API-ключ
- Параметри запиту:
blur_intensity(Необов’язковий): Число з плаваючою комою від 0.0 до 20.0, що регулює інтенсивність розмиття. За замовчуванням: 1.0. Значення 0.0 вимикає розмиття.file_size(Необов’язковий): Вказує бажаний розмір вихідного файлу в байтах. Сервіс намагається повернути зображення, яке не перевищує цей розмір.width(Необов’язковий): Вказує бажану ширину вихідного зображення.height(Необов’язковий): Вказує бажану висоту вихідного зображення.format(Необов’язковий): Вказує бажаний формат вихідного зображення. Можливі значення: JPEG, PNG, WEBP.logo_url(Необов’язковий): URL-адреса файлу логотипу для розміщення на номерних знаках. Може бути HTTP URL або data URL. Переконайтеся, що URL правильно екранований перед передачею як параметр запиту.logo_size(Необов’язковий): Вказує розмір логотипу як число від 0.1 до 1.0.plate_screws(Необов’язковий): Додає гвинти на номерні знаки. Працює лише разом з параметром logo_url.
Відповідь
Успішна відповідь: (HTTP-статус: 200) Сервіс повертає оброблене зображення в одному з форматів: JPEG, PNG, WEBP.
Відповідь з помилкою: (HTTP-статус: 500, 403)
{
"message": "Error message"
}
Приклади використання
Python
import requests
import urllib.parse
API_KEY = 'your_api_key'
API_URL = 'https://blur-api-eu1.watermarkly.com/blur/'
input_path = '' # Шлях до локального зображення
output_path = '' # Шлях для збереження результату
# Розмиття зображення за допомогою POST-запиту
with open(input_path, 'rb') as image_file:
response = requests.post(API_URL, headers={'x-api-key': API_KEY}, data=image_file)
if response.status_code == 429:
# Перевищено ліміт запитів API, зачекайте трохи
time.sleep(0.1)
response = requests.post(API_URL, headers={'x-api-key': API_KEY}, data=image_file)
# Збереження обробленого зображення локально
with open(output_path, 'wb') as f:
f.write(response.content)
# Розмиття зображення за допомогою GET-запиту
encoded_url = urllib.parse.quote("https://nikitin.io/eqe.jpg", safe='')
response = requests.get(API_URL + "?url=" + encoded_url, headers={'x-api-key': API_KEY})
# Збереження відповіді локально
with open(output_path, 'wb') as f:
f.write(response.content)
NodeJS
import { promises as fs } from "node:fs";
const API_KEY = 'your_api_key';
const API_URL = 'https://blur-api-eu1.watermarkly.com/blur/';
// Допоміжна функція для паузи виконання на задану кількість мілісекунд
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
(async () => {
// Розмиття зображення за допомогою POST-запиту
try {
const inputPath = 'input_path_here'; // Замініть на ваш реальний шлях до вхідного файлу
const outputPath = 'output_path_here'; // Замініть на ваш реальний шлях для збереження
// Асинхронне читання файлу зображення як бінарних даних
const imageData = await fs.readFile(inputPath);
let response = await fetch(API_URL, {
method: 'POST',
headers: {
'x-api-key': API_KEY,
'Content-Type': 'application/octet-stream'
},
body: imageData
});
if (response.status === 429) {
// Перевищено ліміт запитів API, зачекайте трохи
await sleep(100); // пауза на 0.1 секунди
response = await fetch(API_URL, {
method: 'POST',
headers: {
'x-api-key': API_KEY,
'Content-Type': 'application/octet-stream'
},
body: imageData
});
}
// Асинхронне збереження обробленого зображення локально
const arrayBuffer = await response.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
await fs.writeFile(outputPath, buffer);
} catch (error) {
console.error('Error during POST request:', error);
}
// Розмиття зображення за допомогою GET-запиту
try {
const outputPath = 'output_path_here'; // Замініть на ваш реальний шлях для збереження
const encodedUrl = encodeURIComponent("https://nikitin.io/eqe.jpg"); // Кодування URL
const response = await fetch(`${API_URL}?url=${encodedUrl}`, {
method: 'GET',
headers: {
'x-api-key': API_KEY
}
});
// Асинхронне збереження відповіді локально
const arrayBuffer = await response.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
await fs.writeFile(outputPath, buffer);
} catch (error) {
console.error('Error during GET request:', error);
}
})();