CMS Sitebill предоставляет RESTful API для взаимодействия с системой. API позволяет выполнять операции CRUD (Create, Read, Update, Delete) с различными типами данных.
http://yourdomain.com/api/v1/
API использует версионирование через URL:
/api/v1/- Версия 1.x (текущая)/api/v2/- Версия 2.x (планируется)
- Request: JSON, Form Data, Query Parameters
- Response: JSON
UTF-8
Получение токена:
POST /api/v1/auth/token
Content-Type: application/json
{
"username": "user@example.com",
"password": "your_password"
}Ответ:
{
"success": true,
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expires_in": 3600
}Использование токена:
GET /api/v1/data
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...Использование существующей сессии пользователя:
GET /api/v1/data
Cookie: PHPSESSID=abc123def456GET /api/v1/data
Authorization: Basic dXNlcjpwYXNzd29yZA==GET /api/v1/dataQuery параметры:
| Параметр | Тип | Описание |
|---|---|---|
| page | integer | Номер страницы (по умолчанию: 1) |
| per_page | integer | Элементов на странице (по умолчанию: 20, макс: 100) |
| status | string | Фильтр по статусу (active, inactive, pending) |
| type_id | integer | Фильтр по типу |
| region_id | integer | Фильтр по региону |
| search | string | Поиск по названию |
| sort | string | Сортировка (id, title, date_create) |
| order | string | Направление (asc, desc) |
Пример запроса:
GET /api/v1/data?page=1&per_page=10&status=active&sort=date_create&order=descОтвет:
{
"success": true,
"data": [
{
"id": 1,
"title": "Example Title",
"description": "Example description",
"status": "active",
"type_id": 1,
"region_id": 5,
"user_id": 10,
"price": 1000000,
"date_create": "2025-01-15 10:30:00",
"images": [
{
"id": 1,
"filename": "image1.jpg",
"url": "http://yourdomain.com/img/data/image1.jpg"
}
]
}
],
"pagination": {
"current_page": 1,
"per_page": 10,
"total": 150,
"total_pages": 15,
"next_page": 2,
"prev_page": null
}
}GET /api/v1/data/{id}Пример:
GET /api/v1/data/123Ответ:
{
"success": true,
"data": {
"id": 123,
"title": "Example Title",
"description": "Full description here",
"content": "Detailed content...",
"status": "active",
"type_id": 1,
"region_id": 5,
"user_id": 10,
"price": 1000000,
"area": 85.5,
"rooms": 3,
"floor": 5,
"floors_total": 9,
"address": "123 Example Street",
"lat": 55.751244,
"lng": 37.618423,
"date_create": "2025-01-15 10:30:00",
"date_update": "2025-01-20 14:20:00",
"images": [
{
"id": 1,
"filename": "image1.jpg",
"url": "http://yourdomain.com/img/data/image1.jpg",
"thumbnail": "http://yourdomain.com/img/data/thumb_image1.jpg"
}
],
"user": {
"id": 10,
"name": "John Doe",
"email": "john@example.com",
"phone": "+1234567890"
}
}
}POST /api/v1/data
Content-Type: application/json
Authorization: Bearer {token}
{
"title": "New Property",
"description": "Property description",
"type_id": 1,
"region_id": 5,
"price": 1500000,
"area": 95.0,
"rooms": 3,
"floor": 7,
"floors_total": 12,
"address": "456 New Street",
"lat": 55.755814,
"lng": 37.617635,
"status": "active"
}Ответ:
{
"success": true,
"message": "Object created successfully",
"data": {
"id": 456,
"title": "New Property",
"date_create": "2025-01-23 11:45:00"
}
}PUT /api/v1/data/{id}
Content-Type: application/json
Authorization: Bearer {token}
{
"title": "Updated Title",
"price": 1600000,
"status": "active"
}Ответ:
{
"success": true,
"message": "Object updated successfully",
"data": {
"id": 456,
"date_update": "2025-01-23 12:00:00"
}
}DELETE /api/v1/data/{id}
Authorization: Bearer {token}Ответ:
{
"success": true,
"message": "Object deleted successfully"
}GET /api/v1/clients
Authorization: Bearer {token}Query параметры:
| Параметр | Тип | Описание |
|---|---|---|
| page | integer | Номер страницы |
| per_page | integer | Элементов на странице |
| active | boolean | Только активные (true/false) |
| search | string | Поиск по имени/email |
Ответ:
{
"success": true,
"data": [
{
"id": 1,
"name": "John Doe",
"email": "john@example.com",
"phone": "+1234567890",
"company": "Example Corp",
"active": true,
"date_create": "2025-01-01 09:00:00"
}
],
"pagination": {
"current_page": 1,
"per_page": 20,
"total": 50,
"total_pages": 3
}
}POST /api/v1/clients
Content-Type: application/json
Authorization: Bearer {token}
{
"name": "Jane Smith",
"email": "jane@example.com",
"phone": "+0987654321",
"company": "Smith Inc",
"active": true
}POST /api/v1/images
Content-Type: multipart/form-data
Authorization: Bearer {token}
--boundary
Content-Disposition: form-data; name="image"; filename="photo.jpg"
Content-Type: image/jpeg
{binary data}
--boundary
Content-Disposition: form-data; name="data_id"
123
--boundary--Ответ:
{
"success": true,
"message": "Image uploaded successfully",
"data": {
"id": 789,
"filename": "photo_123456.jpg",
"url": "http://yourdomain.com/img/data/photo_123456.jpg",
"thumbnail": "http://yourdomain.com/img/data/thumb_photo_123456.jpg",
"size": 245678,
"mime_type": "image/jpeg"
}
}DELETE /api/v1/images/{id}
Authorization: Bearer {token}GET /api/v1/users/me
Authorization: Bearer {token}Ответ:
{
"success": true,
"data": {
"id": 10,
"name": "John Doe",
"email": "john@example.com",
"phone": "+1234567890",
"role": "agent",
"active": true,
"date_create": "2024-06-15 10:00:00"
}
}PUT /api/v1/users/me
Content-Type: application/json
Authorization: Bearer {token}
{
"name": "John Smith",
"phone": "+1234567891"
}GET /api/v1/dictionaries/typesОтвет:
{
"success": true,
"data": [
{
"id": 1,
"name": "Квартира",
"name_en": "Apartment"
},
{
"id": 2,
"name": "Дом",
"name_en": "House"
}
]
}GET /api/v1/dictionaries/regionsОтвет:
{
"success": true,
"data": [
{
"id": 1,
"name": "Москва",
"name_en": "Moscow",
"parent_id": null
},
{
"id": 2,
"name": "Центральный округ",
"name_en": "Central District",
"parent_id": 1
}
]
}| Код | Описание |
|---|---|
| 200 | OK - Запрос выполнен успешно |
| 201 | Created - Объект создан |
| 204 | No Content - Объект удален |
| 400 | Bad Request - Некорректный запрос |
| 401 | Unauthorized - Требуется аутентификация |
| 403 | Forbidden - Недостаточно прав |
| 404 | Not Found - Объект не найден |
| 422 | Unprocessable Entity - Ошибка валидации |
| 429 | Too Many Requests - Превышен лимит запросов |
| 500 | Internal Server Error - Внутренняя ошибка сервера |
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Validation failed",
"details": [
{
"field": "email",
"message": "Email is required"
},
{
"field": "price",
"message": "Price must be a positive number"
}
]
}
}| Код | Описание |
|---|---|
| VALIDATION_ERROR | Ошибка валидации данных |
| AUTHENTICATION_FAILED | Ошибка аутентификации |
| PERMISSION_DENIED | Недостаточно прав |
| NOT_FOUND | Объект не найден |
| DUPLICATE_ENTRY | Дубликат записи |
| RATE_LIMIT_EXCEEDED | Превышен лимит запросов |
| INTERNAL_ERROR | Внутренняя ошибка |
- Аутентифицированные пользователи: 1000 запросов/час
- Неаутентифицированные: 100 запросов/час
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 999
X-RateLimit-Reset: 1642867200{
"success": false,
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Try again in 3600 seconds",
"retry_after": 3600
}
}page- номер страницы (начиная с 1)per_page- количество элементов (по умолчанию 20, макс 100)
{
"data": [...],
"pagination": {
"current_page": 2,
"per_page": 20,
"total": 150,
"total_pages": 8,
"next_page": 3,
"prev_page": 1,
"first_page_url": "/api/v1/data?page=1",
"last_page_url": "/api/v1/data?page=8",
"next_page_url": "/api/v1/data?page=3",
"prev_page_url": "/api/v1/data?page=1"
}
}Примеры использования:
# Фильтр по одному значению
GET /api/v1/data?status=active
# Фильтр по нескольким значениям
GET /api/v1/data?type_id=1,2,3
# Диапазон значений
GET /api/v1/data?price_min=1000000&price_max=2000000
# Поиск
GET /api/v1/data?search=квартира+москва# Сортировка по возрастанию
GET /api/v1/data?sort=price&order=asc
# Сортировка по убыванию
GET /api/v1/data?sort=date_create&order=desc
# Множественная сортировка
GET /api/v1/data?sort=region_id,price&order=asc,descPOST /api/v1/webhooks
Content-Type: application/json
Authorization: Bearer {token}
{
"url": "https://yoursite.com/webhook",
"events": ["data.created", "data.updated", "data.deleted"],
"secret": "your_webhook_secret"
}data.created- Создан новый объектdata.updated- Объект обновленdata.deleted- Объект удаленclient.created- Создан новый клиентuser.registered- Зарегистрирован новый пользователь
POST https://yoursite.com/webhook
Content-Type: application/json
X-Webhook-Signature: sha256=abc123...
{
"event": "data.created",
"timestamp": 1642867200,
"data": {
"id": 123,
"title": "New Property",
"status": "active"
}
}$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'];
$expected = 'sha256=' . hash_hmac('sha256', $payload, $webhook_secret);
if (hash_equals($expected, $signature)) {
// Подпись валидна
}<?php
// Получение токена
$ch = curl_init('http://yourdomain.com/api/v1/auth/token');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'username' => 'user@example.com',
'password' => 'password'
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$response = curl_exec($ch);
$data = json_decode($response, true);
$token = $data['token'];
// Получение списка объектов
$ch = curl_init('http://yourdomain.com/api/v1/data?page=1&per_page=10');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $token
]);
$response = curl_exec($ch);
$objects = json_decode($response, true);
print_r($objects);// Получение токена
async function getToken() {
const response = await fetch('http://yourdomain.com/api/v1/auth/token', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
username: 'user@example.com',
password: 'password'
})
});
const data = await response.json();
return data.token;
}
// Получение списка объектов
async function getData() {
const token = await getToken();
const response = await fetch('http://yourdomain.com/api/v1/data?page=1&per_page=10', {
headers: {
'Authorization': `Bearer ${token}`
}
});
const data = await response.json();
console.log(data);
}
getData();import requests
# Получение токена
auth_response = requests.post('http://yourdomain.com/api/v1/auth/token', json={
'username': 'user@example.com',
'password': 'password'
})
token = auth_response.json()['token']
# Получение списка объектов
headers = {
'Authorization': f'Bearer {token}'
}
response = requests.get('http://yourdomain.com/api/v1/data',
params={'page': 1, 'per_page': 10},
headers=headers)
data = response.json()
print(data)- Официальная документация: https://www.sitebill.ru/docs/api/
- GitHub репозиторий: https://github.com/rumantic/cms
- Email: kondin@etown.ru
- Официальный сайт: https://www.sitebill.ru/
- v1.0.0 (2025-01-01) - Первый релиз API
- Актуальный changelog: https://www.sitebill.ru/docs/api/changelog