PIXSAFE REST API v1

Официальная документация API фотохостинга PIXSAFE. Данный интерфейс предназначен для программной загрузки медиафайлов и может быть интегрирован в ваши веб-приложения, боты, форумы или CRM-системы.

API обрабатывает входящие файлы и сохраняет их в облачное хранилище. В результате успешного запроса вы получаете либо готовую короткую ссылку на альбом, либо массив прямых ссылок (Direct URL) на каждый исходный файл.

Базовый URL (Endpoint)

POST https://pixsafe.online/api/v1/upload.php
Пакетная обработка (Batch Processing): API поддерживает передачу массива до 100 файлов в рамках одного POST-запроса. Для предотвращения таймаутов на стороне клиента, сервер обрабатывает полученную партию единым потоком без строгих ограничений по времени исполнения скрипта.

Авторизация

Для выполнения любых запросов к API требуется аутентификация с помощью уникального Bearer-токена. Управлять токенами можно в панели управления API.

Безопасность токена: API-токен является секретным ключом. Никогда не публикуйте его на стороне клиента (например, в публичном JavaScript-коде фронтенда). Для безопасной работы проксируйте все запросы через собственный бэкенд, чтобы избежать компрометации ключа и исчерпания ваших лимитов.

Передача токена

Стандартный и рекомендуемый метод — передача токена в HTTP-заголовке Authorization. Если ваша архитектура или библиотека не поддерживает отправку пользовательских заголовков, допускается передача ключа в теле POST-запроса (параметр token).

Authorization: Bearer ВАШ_API_ТОКЕН

Коды ошибок авторизации

HTTP КодОписание
401 UnauthorizedТокен отсутствует, передан в неверном формате или был отозван пользователем.
403 ForbiddenТокен действителен, но истек срок действия пробного периода (Trial), либо предпринята попытка дозагрузки в альбом, не принадлежащий данному токену.
405 Method Not AllowedЗапрос отправлен неверным методом. Поддерживается исключительно POST.

Система лимитов и квоты

Платформа использует гибкую систему тарификации. Каждый API-токен имеет индивидуальные настройки, которые вы самостоятельно конфигурируете в панели управления.

Настройки токена

  • Максимум файлов за запрос: Физический предел файлов, отправляемых за один вызов API (от 5 до 100). Для загрузки объемов, превышающих данный лимит (например, 500 файлов), необходимо разделить их отправку на несколько последовательных запросов.
  • Срок хранения: Максимальное время жизни загруженных файлов (от 3 дней до бесконечности). При отправке запроса вы можете программно указать меньший срок хранения, если файлы требуются временно.
  • Месячная квота: Лимит успешных загрузок файлов, доступный вам в течение календарного месяца.
Обновление квоты: Счетчик месячных загрузок обнуляется автоматически 1-го числа каждого календарного месяца в 00:00 по серверному времени.

Защита от злоупотреблений (Rate Limits)

Для обеспечения стабильности серверов действуют следующие системные ограничения:

Тип защитыУсловия срабатывания
Ограничение частоты (Rate Limit)Разрешается выполнять не более 1 запроса в 2 секунды для одного активного токена. При превышении возвращается код 429 Too Many Requests.
Блокировка IP (Brute-force)В случае фиксации 10 последовательных запросов с неверным или отсутствующим токеном с одного IP-адреса, данный IP-адрес временно блокируется на 60 секунд.

Вызов API: Загрузка файлов

Единый метод для загрузки медиафайлов. Позволяет загружать файлы массивами, автоматически формируя новые альбомы или выполняя безопасную дозагрузку в существующие альбомы вашего токена.

POST https://pixsafe.online/api/v1/upload.php

Параметры тела запроса (multipart/form-data)

ПараметрТип данныхОписание
files[] file array Массив передаваемых файлов (поддерживаемые форматы: jpg, png, webp, mp4, mov). Количество ограничено лимитом токена. Обязательный параметр.
return_type string Формат ожидаемого ответа:
• album (по умолчанию) — возвращает только ID и публичную ссылку на альбом.
• direct — возвращает расширенный массив со всеми прямыми ссылками на хранилище для каждого успешно загруженного файла.
retention_days integer Опционально. Требуемый срок хранения файлов в днях (например: 14).
Если переданное значение превышает максимальный лимит вашего токена, API автоматически скорректирует его до допустимого максимума.
album_id string Опционально. Уникальный идентификатор (5 символов) существу альбома для выполнения дозагрузки (например: aB3x9).
Дозагрузка возможна исключительно в те альбомы, которые были созданы посредством текущего API-токена.

Структура ответа (return_type = "album")

Компактный ответ, оптимизированный для случаев, когда требуется предоставить пользователю общую ссылку на галерею.

{
  "success": true,
  "album_id": "zX9k1",
  "album_url": "https://pixsafe.online/i/zX9k1",
  "uploaded_count": 5,
  "limits_applied": {
    "max_files_allowed": 50,
    "max_storage_days": 30,
    "applied_storage_days": 14,
    "monthly_quota_used": "125 / 5000"
  }
}

Структура ответа (return_type = "direct")

Развернутый ответ. Содержит массив files с прямыми ссылками и массив failed_files, в который помещаются файлы, отклоненные сервером (например, из-за неверного расширения или нулевого размера).

{
  "success": true,
  "album_id": "zX9k1",
  "album_url": "https://pixsafe.online/i/zX9k1",
  "uploaded_count": 2,
  "limits_applied": {
    "max_files_allowed": 50,
    "max_storage_days": "forever",
    "applied_storage_days": "forever",
    "monthly_quota_used": "unlimited"
  },
  "files": [
    {
      "original_name": "screen.png",
      "file_name": "screen_A1b2c.png",
      "direct_url": "https://cdn.pixsafe.online/albums/zX9k1/screen_A1b2c.png",
      "type": "image"
    },
    {
      "original_name": "video.mp4",
      "file_name": "video_F9d8a.mp4",
      "direct_url": "https://cdn.pixsafe.online/albums/zX9k1/video_F9d8a.mp4",
      "type": "video"
    }
  ],
  "failed_files": [
    {
      "name": "document.pdf",
      "reason": "Extension not allowed"
    }
  ]
}

Примеры реализации (Code Snippets)

curl --location 'https://pixsafe.online/api/v1/upload.php' \
--header 'Authorization: Bearer ВАШ_API_ТОКЕН' \
--form 'files[]=@"/path/to/image1.jpg"' \
--form 'files[]=@"/path/to/image2.png"' \
--form 'return_type="direct"' \
--form 'retention_days="7"'
import requests

url = "https://pixsafe.online/api/v1/upload.php"
headers = {"Authorization": "Bearer ВАШ_API_ТОКЕН"}
data = {
    "return_type": "direct",
    "retention_days": 7
}
files = [
    ("files[]", ("image1.jpg", open("image1.jpg", "rb"), "image/jpeg")),
    ("files[]", ("image2.png", open("image2.png", "rb"), "image/png"))
]

response = requests.post(url, headers=headers, data=data, files=files)
print(response.json())
const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');

let data = new FormData();
data.append('files[]', fs.createReadStream('/path/to/image1.jpg'));
data.append('files[]', fs.createReadStream('/path/to/image2.png'));
data.append('return_type', 'direct');
data.append('retention_days', 7);

axios.post('https://pixsafe.online/api/v1/upload.php', data, {
  headers: {
    'Authorization': 'Bearer ВАШ_API_ТОКЕН',
    ...data.getHeaders()
  }
}).then(response => {
  console.log(response.data);
}).catch(error => {
  console.log(error.response.data);
});
$curl = curl_init();
curl_setopt_array($curl, [
  CURLOPT_URL => 'https://pixsafe.online/api/v1/upload.php',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => [
    'files[0]' => new CURLFile('/path/to/image1.jpg'),
    'files[1]' => new CURLFile('/path/to/image2.png'),
    'return_type' => 'direct',
    'retention_days' => 7
  ],
  CURLOPT_HTTPHEADER => [
    'Authorization: Bearer ВАШ_API_ТОКЕН'
  ],
]);

$response = curl_exec($curl);
echo $response;
package main

import (
  "bytes"
  "fmt"
  "io"
  "mime/multipart"
  "net/http"
  "os"
  "path/filepath"
)

func main() {
  url := "https://pixsafe.online/api/v1/upload.php"
  
  payload := &bytes.Buffer{}
  writer := multipart.NewWriter(payload)
  
  // Добавление файла
  file, _ := os.Open("/path/to/image.jpg")
  defer file.Close()
  part, _ := writer.CreateFormFile("files[]", filepath.Base(file.Name()))
  io.Copy(part, file)
  
  // Добавление параметров
  writer.WriteField("return_type", "direct")
  writer.WriteField("retention_days", "7")
  writer.Close()

  req, _ := http.NewRequest("POST", url, payload)
  req.Header.Add("Authorization", "Bearer ВАШ_API_ТОКЕН")
  req.Header.Set("Content-Type", writer.FormDataContentType())

  res, _ := http.DefaultClient.Do(req)
  defer res.Body.Close()
  body, _ := io.ReadAll(res.Body)
  
  fmt.Println(string(body))
}