REST API на JSON, личные API-токены и подписанные вебхуки. Справочник открыт для всех; чтобы попробовать, нужен аккаунт Floowa.
Администратор создаёт токен в разделе Настройки → Доступ к API, выбирает права по функциям и срок действия (30, 90 или 365 дней либо бессрочно). Токен показывается только один раз.
Authorization: Bearer <token>
Accept: application/json
Базовый URL: https://www.floowa.de/api/v1
| Лимит запросов | 120 запросов в минуту на токен; сверх этого API отвечает HTTP 429. |
|---|---|
| Списки | Списки выдаются постранично; через per_page можно получить до 100 записей на страницу. |
| Безопасный повтор | С заголовком Idempotency-Key повторный запрос в течение 24 часов возвращает тот же ответ, а не создаёт дубликат. |
| Версия API | Каждый ответ содержит заголовок Floowa-Api-Revision с датой последнего изменения API. |
Каждая доставка – это POST с JSON на ваш HTTPS-адрес с заголовками X-Floowa-Event, X-Floowa-Delivery и X-Floowa-Signature.
Подпись имеет вид t=<метка времени>,v1=<подпись>. v1 – это HMAC-SHA256 от «<метка времени>.<исходное тело>» с вашим ключом подписи. Сравнивайте за постоянное время и отбрасывайте старые метки времени.
Если ваш сервер не отвечает статусом 2xx, Floowa повторяет попытку через 1, 5 и 30 минут и через 2 часа. После 20 неудачных попыток подряд вебхук отключается.
{
"id": "8f2c3a1e-5b7d-4c1a-9e2f-0a1b2c3d4e5f",
"event": "absence.requested",
"created_at": "2026-10-28T09:15:00+01:00",
"data": {
"id": "01a1…",
"employee_id": "01a0…",
"absence_type_id": "01a0…",
"start_date": "2026-11-02",
"end_date": "2026-11-06",
"half_day_start": false,
"half_day_end": false,
"days": 5,
"status": "pending"
}
}
$header = $_SERVER["HTTP_X_FLOOWA_SIGNATURE"] ?? "";
parse_str(str_replace(",", "&", $header), $parts);
$body = file_get_contents("php://input");
$expected = hash_hmac("sha256", $parts["t"] . "." . $body, $secret);
if (! hash_equals($expected, $parts["v1"] ?? "") || abs(time() - (int) $parts["t"]) > 300) {
http_response_code(400);
exit;
}
| Событие | Когда | Техническое имя |
|---|---|---|
| Сотрудник создан | Сотрудник создаётся – вручную, импортом или через API. | employee.created |
| Сотрудник изменён | Меняются учётные данные сотрудника. | employee.updated |
| Сотрудник удалён | Сотрудник удаляется. | employee.deleted |
| Отсутствие запрошено | Кто-то подаёт заявку на отпуск или другое отсутствие. | absence.requested |
| Отсутствие одобрено | Заявка одобряется или отсутствие вносится напрямую. | absence.approved |
| Отсутствие отклонено | Заявка отклоняется. | absence.rejected |
| Отсутствие отменено | Заявка или отсутствие отзывается. | absence.cancelled |
| Время записано | Появляется запись времени – при отметке прихода, при внесении задним числом или на терминале. | time_entry.created |
| Время изменено | Запись времени меняется, например при отметке ухода. | time_entry.updated |
| Время удалено | Запись времени удаляется. | time_entry.deleted |
| Месяц закрыт | Месяц закрывается в подготовке зарплаты. | payroll.closed |
| Месяц открыт снова | Закрытый месяц снова открывается для исправлений. | payroll.reopened |
| Смена опубликована | Смена публикуется вместе с графиком. | shift.published |
| Смена изменена | Опубликованная смена меняется. | shift.changed |
| Смена отменена | Опубликованная смена удаляется. | shift.deleted |
Все изменения API с датой и пометкой о несовместимых изменениях. В машиночитаемом виде – GET /api/v1/changelog.
GET /employeesGET /employees/{id}POST /employeesPUT /employees/{id}
GET /qualificationsGET /employees/{id}/qualificationsGET /inventory-items/{id}
POST /absences/{id}/cancelGET /absences
POST /time-projectsPUT /time-projects/{id}
POST /time-entriesPUT /time-entries/{id}GET /time-allocations
GET /org-unitsPOST /org-unitsPUT /org-units/{id}
PUT /employees/{id}/time-allocations/{date}
GET /time-allocationsPUT /employees/{id}/time-allocations/{date}
GET /payroll/{month}
GET /payroll/{month}
GET /absencesGET /reports/payroll
GET /changelog