API & Інтеграція
Повний довідник та документація для роботи з API платформою Pixora.
Поточне середовище
Усі приклади запитів нижче автоматично використовують цей базовий URL.
https://pixora-ashy-iota.vercel.appТестування у Postman
Завантажте готову колекцію зі всіма налаштованими маршрутами платформи.
Завантажити JSON КолекціюПам'ятка для інтеграції:
- Єдиний API URL: Усі запити мають направлятись на
https://pixora-ashy-iota.vercel.appабо ваш локальний порт. - CORS політика: Браузер вимагає коректних origin заголовків. Для локальної розробки порт повинен бути дозволений у whitelist бекенду.
- Авторизаційні Cookies (credentials): Для всіх захищених
/api/admin/*роутів у клієнтськомуfetchобов'язково вказуйтеcredentials: 'include'. - Postman: Перед імпортом колекції вкажіть змінну середовища
{{baseUrl}}.
Authentication & Profile
/api/auth/registerРеєстрація нового фотографа
{
"email": "user@example.com",
"password": "securepassword",
"name": "Іван Коваленко"
}{
"id": "uuid",
"email": "user@example.com",
"name": "Іван Коваленко"
}/api/auth/loginВхід та встановлення сесійної куки
{
"email": "user@example.com",
"password": "securepassword"
}{
"id": "uuid",
"email": "user@example.com"
}/api/auth/logoutВихід та видалення сесійної куки
{ "success": true }/api/auth/meОтримання даних поточного користувача
{
"id": "uuid",
"email": "user@example.com",
"tier": "PRO"
}/api/admin/profileОтримати профіль фотографа (налаштування бренду, нікнейм, контакти)
{
"name": "Іван Коваленко",
"studioName": "Kovalenko Studio",
"handle": "kovalenko",
"bio": "Весільний фотограф",
"phone": "+380501234567",
"instagram": "@ivan_photo",
"telegram": "@ivan_photo",
"website": "https://kovalenko.com",
"customFooter": "© 2026 Kovalenko Studio",
"watermarkEnabled": true,
"avatarUrl": "https://pub-xxx.r2.dev/branding/avatar.webp",
"logoUrl": "https://pub-xxx.r2.dev/branding/logo.png",
"subscriptionTier": "PRO"
}/api/admin/profileОновлення профілю та брендингу (нікнейм handle вимагає тариф PRO/STUDIO)
{
"name": "Іван Коваленко",
"studioName": "Kovalenko Studio",
"handle": "kovalenko",
"phone": "+380501234567",
"instagram": "@ivan_photo",
"telegram": "@ivan_photo",
"website": "https://kovalenko.com",
"customFooter": "© 2026 Kovalenko Studio",
"watermarkEnabled": true
}{
"success": true,
"handle": "kovalenko"
}/api/admin/profile/check-handleМиттєва перевірка доступності персонального нікнейму (?handle=xxx)
{
"available": true,
"handle": "kovalenko"
}/api/admin/upload-brand-assetЗавантаження брендового ресурсу (аватар 512×512 WebP / логотип 800×400 PNG) з Magic Bytes валідацією та санітизацією Sharp
// Підтримує FormData або JSON Base64
const formData = new FormData();
formData.append("type", "avatar"); // або "logo"
formData.append("file", fileInput.files[0]);{
"success": true,
"publicUrl": "https://pub-xxx.r2.dev/branding/avatar-uuid.webp",
"key": "branding/avatar-uuid.webp",
"width": 512,
"height": 512,
"size": 42150,
"format": "webp"
}/api/admin/proxy-imageБезпечний серверний проксі для кадрування/редактора (обхід CORS, захист від Canvas Tainting, пряме S3-читання)
// Повертає чистий бінарний потік зображення з заголовками:
// Content-Type: image/webp
// Access-Control-Allow-Origin: *Admin Galleries
/api/admin/galleriesСписок усіх галерей фотографа
[
{
"id": "uuid",
"title": "Весілля Анни",
"status": "DRAFT",
"coverUrl": "..."
}
]/api/admin/galleriesСтворення нового альбому / галереї
{
"title": "Весілля Анни та Михайла",
"clientName": "Anna & Michael",
"date": "2024-08-15",
"location": "Київ",
"status": "DRAFT"
}{
"id": "new-uuid",
"title": "Весілля Анни та Михайла",
"status": "DRAFT"
}/api/admin/galleries/[id]Отримати всі деталі галереї (вкл. фото та налаштування)
{
"id": "uuid",
"title": "Весілля",
"photos": [...],
"settings": { "downloadEnabled": true }
}/api/admin/galleries/[id]Оновити налаштування галереї (публікація, зміна обкладинки)
{
"status": "PUBLISHED",
"coverUrl": "https://...",
"settings": { "downloadEnabled": false }
}{ "success": true }/api/admin/galleries/[id]Видалити галерею та всі її фотографії
{ "success": true }/api/admin/galleries/[id]/analyticsСтатистика переглядів та завантажень
{
"views": 142,
"downloads": 5,
"favorites": 12
}/api/admin/galleries/[id]/downloadЗавантажити повний архів усіх фото (генерація ZIP)
{
"downloadUrl": "https://s3.amazonaws.com/temp-zip-url.zip"
}/api/admin/galleries/[id]/sectionsКерування розділами (наприклад: "Ранок нареченої", "Церемонія")
{
"name": "Ранок нареченої"
}{
"id": "section-uuid",
"name": "Ранок нареченої"
}Photos Management
/api/admin/galleries/[id]/photosПряме завантаження фотографій у галерею
// Формат: multipart/form-data
// Поле "file": <Файл зображення (JPEG, PNG)>
// Поле "sectionId" (опціонально): <ID розділу>
const formData = new FormData();
formData.append("file", fileInput.files[0]);
formData.append("sectionId", "uuid");{
"id": "photo-uuid",
"url": "https://...",
"filename": "IMG_001.jpg"
}/api/admin/galleries/[id]/photos/upload-urlГенерація Presigned URL для прямого завантаження в S3 (для великих файлів)
{
"filename": "IMG_001.jpg",
"contentType": "image/jpeg",
"size": 5242880
}{
"uploadUrl": "https://s3...",
"photoId": "uuid"
}/api/admin/galleries/[id]/photos/[photoId]Видалити одне фото
{ "success": true }/api/admin/galleries/[id]/photos/batchМасове видалення фотографій
{
"photoIds": ["uuid-1", "uuid-2"]
}{ "success": true, "deletedCount": 2 }/api/admin/galleries/[id]/photos/processЗапуск фонової обробки (водяні знаки, ресайз)
{
"photoIds": ["uuid-1", "uuid-2"]
}{ "jobId": "job-uuid", "status": "processing" }Client Access & Selections
/api/client/portfolio/[handle]Публічна персональна сторінка-портфоліо фотографа (PRO / STUDIO)
{
"photographer": {
"name": "Іван Коваленко",
"studioName": "Kovalenko Studio",
"handle": "kovalenko",
"avatarUrl": "https://pub-xxx.r2.dev/branding/avatar.webp",
"subscriptionTier": "PRO"
},
"galleries": [
{
"id": "uuid",
"title": "Summer Wedding",
"slug": "summer-wedding",
"photoCount": 120,
"coverUrl": "https://..."
}
],
"totalGalleries": 1
}/api/client/galleries/by-slugОтримання клієнтської галереї за красивим персональним посиланням (?handle=xxx&slug=yyy)
{
"gallery": {
"id": "uuid",
"title": "Summer Wedding",
"clientName": "Anna & Michael",
"photos": [...]
}
}/api/client/g/[accessToken]Публічні дані галереї за технічним хеш-токеном (для клієнтів)
{
"id": "uuid",
"title": "Весілля",
"photographer": { "name": "Іван Коваленко" },
"photos": [...]
}/api/client/g/[accessToken]/lockБлокування або розблокування доступу клієнтом (пін-код або пароль)
{
"pin": "1234"
}/api/client/g/[accessToken]/photos/[photoId]Лайк / зняття лайка на фото (додавання до обраного)
{
"favorite": true
}/api/client/galleries/[id]Доступ до публічних даних за ID галереї
{
"title": "Весілля"
}/api/client/galleries/[id]/selectionsВідправка фінальної вибірки фото клієнтом фотографу
{
"clientName": "Анна",
"clientEmail": "anna@example.com",
"photoIds": ["uuid-1", "uuid-2"],
"comment": "Зробіть тепліші кольори"
}{ "success": true, "selectionId": "uuid" }/api/client/galleries/[id]/downloadЗавантаження архіву клієнтом (враховує налаштування скачування)
{ "downloadUrl": "https://..." }/api/client/galleries/[id]/download-tokenГенерація токена для безпечного скачування (Anti-hotlink)
{
"email": "anna@example.com"
}{ "token": "abc123xyz" }/api/client/galleries/[id]/photos/[photoId]/downloadЗавантаження окремого фото клієнтом
/api/admin/galleries/[id]/selectionsОтримання списку клієнтських вибірок (панель адміністратора)
[
{
"clientName": "Анна",
"photoCount": 42,
"status": "PENDING"
}
]/api/admin/galleries/[id]/selections/[selectionId]Видалення клієнтської вибірки
{ "success": true }/api/admin/galleries/[id]/selections/[selectionId]/exportЕкспорт відбору для Adobe Lightroom в 1 клік (?format=txt|csv|json, тариф PRO/STUDIO)
// format=txt: повертає список імен для пошуку в Lightroom
// format=json:
[
{ "id": "uuid", "originalName": "IMG_001.CR3", "fileSize": 25000000 }
]Billing & Subscription Tiers
/api/admin/billing/checkoutСтворити Stripe Checkout Session (Тарифи: PRO $19/mo, STUDIO $39/mo)
{
"tier": "PRO",
"interval": "month"
}{
"url": "https://checkout.stripe.com/..."
}/api/admin/billing/portalГенерація посилання на Stripe Portal для керування карткою та підпискою
{
"url": "https://billing.stripe.com/..."
}/api/admin/billing/statusПоточний статус підписки, ліміт сховища (5 ГБ / 250 ГБ / 1 ТБ) та активні галереї
{
"tier": "PRO",
"active": true,
"expiresAt": "2026-12-31T00:00:00Z",
"usedBytes": 42949672960,
"limitBytes": 268435456000,
"activeGalleriesCount": 12
}/api/admin/billing/sync-sessionСинхронізація сесії після успішного повернення зі Stripe
{ "success": true }/api/admin/billing/sync-storageПерерахунок та синхронізація використаного місця згідно тарифного ліміту
{
"usedBytes": 42949672960,
"limitBytes": 268435456000,
"percentage": 16.0
}/api/webhooks/stripeОбробник подій Stripe (checkout, invoice, customer.subscription.*)