GuVault API Documentation

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

🎯 Обзор

GuVault — это современный API для безопасного хранения и обмена файлами и сообщениями с временными ссылками доступа.

📁

Загрузка файлов

Любого типа до 100MB с настройками безопасности

💬

Временные сообщения

Создание защищенных сообщений с ограничениями

🔐

Защита паролем

Argon2 хеширование с настраиваемыми попытками

Автоочистка

Автоматическое удаление истекших файлов

⚡ Быстрый старт

Base URL

https://api.guvault.com

Пример загрузки файла

curl -X POST https://api.guvault.com/upload/file \
  -F "file=@document.pdf" \
  -F "expires_in_hours=24" \
  -F "password=secret123"

Пример загрузки сообщения

curl -X POST https://api.guvault.com/upload/message \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Секретное сообщение!",
    "expires_in_hours": 48,
    "password": "mypassword"
  }'

❤️ Health Check

GET /health

GET

Проверка состояния API сервера.

Ответ

HTTP/1.1 200 OK
Content-Type: text/plain

OK

Пример

curl https://api.guvault.com/health

📁 Загрузка файлов

POST /upload/file

POST

Загрузка файла с возможностью настройки параметров безопасности.

Параметры

Параметр Тип Обязательный Описание
file File Файл для загрузки (до 100MB)
expires_in_hours Integer Срок действия в часах
max_downloads Integer Максимальное количество скачиваний
password String Пароль для доступа (до 100 символов)
alias String Пользовательский алиас (3-64 символа)

Пример запроса

curl -X POST https://api.guvault.com/upload/file \
  -F "file=@document.pdf" \
  -F "expires_in_hours=24" \
  -F "max_downloads=5" \
  -F "password=secret123" \
  -F "alias=my-document"

Ответ

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "access_code": "file_my-document",
  "download_url": "/download/file_my-document",
  "expires_at": "2025-09-30T20:18:18Z",
  "max_downloads": 5
}

💬 Загрузка сообщений

POST /upload/message

POST

Создание временного сообщения с настройками безопасности.

Тело запроса

{
  "content": "Текст сообщения",
  "expires_in_hours": 24,
  "max_downloads": 10,
  "password": "secret123",
  "alias": "my-message"
}

Пример запроса

curl -X POST https://api.guvault.com/upload/message \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Это секретное сообщение!",
    "expires_in_hours": 48,
    "max_downloads": 3,
    "password": "mypassword",
    "alias": "secret-note"
  }'

Ответ

{
  "id": "550e8400-e29b-41d4-a716-446655440001",
  "access_code": "msg_secret-note",
  "download_url": "/download/msg_secret-note",
  "expires_at": "2025-10-01T20:18:18Z",
  "max_downloads": 3
}

⬇️ Скачивание

GET /download/{access_code}

GET

Получение файла или сообщения по коду доступа.

Параметры URL

  • access_code — код доступа (например: file_abc123 или msg_my-message)

Для защищенного контента (POST)

{
  "password": "secret123"
}

Примеры

# Скачивание файла
curl https://api.guvault.com/download/file_my-document

# Скачивание с паролем
curl -X POST https://api.guvault.com/download/file_my-document \
  -H "Content-Type: application/json" \
  -d '{"password": "secret123"}'

# Скачивание сообщения
curl https://api.guvault.com/download/msg_secret-note

🔍 Проверка алиаса

POST /alias/check

POST

Проверка доступности пользовательского алиаса.

Тело запроса

{
  "type": "file",
  "alias": "my-alias"
}

Ответ

{
  "available": false,
  "suggestions": ["my-alias1", "my-alias2", "my-alias3"]
}

Пример

curl -X POST https://api.guvault.com/alias/check \
  -H "Content-Type: application/json" \
  -d '{
    "type": "file",
    "alias": "my-document"
  }'

⚠️ Коды ошибок

Код Описание Причина
200 ✅ Успех Операция выполнена успешно
400 ❌ Неверный запрос Некорректные параметры
401 🔒 Неавторизован Неверный пароль
404 🔍 Не найдено Файл/сообщение не существует
409 ⚡ Конфликт Алиас уже занят
410 ⏰ Истек срок Файл/сообщение удален
413 📏 Слишком большой Файл превышает 100MB
500 💥 Ошибка сервера Внутренняя ошибка

📝 Примеры использования

🌐 JavaScript (Fetch API)

// Загрузка файла
async function uploadFile(file, options = {}) {
  const formData = new FormData();
  formData.append('file', file);
  
  if (options.expiresInHours) {
    formData.append('expires_in_hours', options.expiresInHours);
  }
  if (options.password) {
    formData.append('password', options.password);
  }

  const response = await fetch('https://api.guvault.com/upload/file', {
    method: 'POST',
    body: formData
  });

  return await response.json();
}

// Загрузка сообщения
async function uploadMessage(content, options = {}) {
  const response = await fetch('https://api.guvault.com/upload/message', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ content, ...options })
  });

  return await response.json();
}

🐍 Python (requests)

import requests
import json

class GuVaultAPI:
    def __init__(self, base_url="https://api.guvault.com"):
        self.base_url = base_url
    
    def upload_file(self, file_path, **options):
        """Загрузка файла"""
        with open(file_path, 'rb') as f:
            files = {'file': f}
            data = {k: v for k, v in options.items() if v is not None}
            
            response = requests.post(
                f"{self.base_url}/upload/file",
                files=files,
                data=data
            )
            return response.json()
    
    def upload_message(self, content, **options):
        """Загрузка сообщения"""
        data = {'content': content, **options}
        
        response = requests.post(
            f"{self.base_url}/upload/message",
            json=data
        )
        return response.json()

# Пример использования
api = GuVaultAPI()

# Загрузка файла
result = api.upload_file(
    'document.pdf',
    expires_in_hours=24,
    max_downloads=5,
    password='secret123',
    alias='my-document'
)
print(f"Файл загружен: {result['download_url']}")

🛠️ SDK и библиотеки

React Hook

import { useState, useCallback } from 'react';

interface UploadOptions {
  expiresInHours?: number;
  maxDownloads?: number;
  password?: string;
  alias?: string;
}

export function useGuVault() {
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState<string | null>(null);

  const uploadFile = useCallback(async (file: File, options: UploadOptions = {}) => {
    setLoading(true);
    setError(null);
    
    try {
      const formData = new FormData();
      formData.append('file', file);
      
      Object.entries(options).forEach(([key, value]) => {
        if (value !== undefined) {
          formData.append(key, String(value));
        }
      });

      const response = await fetch('https://api.guvault.com/upload/file', {
        method: 'POST',
        body: formData
      });

      if (!response.ok) {
        throw new Error(`HTTP ${response.status}`);
      }

      return await response.json();
    } catch (err) {
      setError(err instanceof Error ? err.message : 'Unknown error');
      throw err;
    } finally {
      setLoading(false);
    }
  }, []);

  return { uploadFile, loading, error };
}