Un’API REST in JSON, token API personali e webhook firmati. La documentazione è pubblica; per provarla serve un account Floowa.
Un amministratore crea un token in Impostazioni → Accessi API, sceglie i diritti per funzione e una scadenza (30, 90 o 365 giorni oppure illimitata). Il token viene mostrato una sola volta.
Authorization: Bearer <token>
Accept: application/json
URL di base: https://www.floowa.de/api/v1
| Limite di richieste | 120 richieste al minuto per token; oltre, l’API risponde con HTTP 429. |
|---|---|
| Elenchi | Gli elenchi sono paginati; con per_page ottenete fino a 100 voci per pagina. |
| Ripetere in sicurezza | Con l’header Idempotency-Key una richiesta ripetuta restituisce per 24 ore la stessa risposta invece di creare un doppione. |
| Revisione dell’API | Ogni risposta contiene l’header Floowa-Api-Revision con la data dell’ultima modifica dell’API. |
Ogni consegna è un POST in JSON al vostro indirizzo HTTPS, con gli header X-Floowa-Event, X-Floowa-Delivery e X-Floowa-Signature.
La firma ha la forma t=<timestamp>,v1=<firma>. v1 è un HMAC-SHA256 su «<timestamp>.<corpo grezzo>» con la vostra chiave di firma. Confrontate in tempo costante e scartate i timestamp vecchi.
Se il vostro server non risponde con uno stato 2xx, Floowa riprova dopo 1, 5 e 30 minuti e dopo 2 ore. Dopo 20 tentativi falliti di fila il webhook viene disattivato.
{
"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;
}
| Evento | Quando | Nome tecnico |
|---|---|---|
| Dipendente creato | Viene creato un dipendente – a mano, tramite importazione o via API. | employee.created |
| Dipendente modificato | Cambiano i dati anagrafici di un dipendente. | employee.updated |
| Dipendente eliminato | Un dipendente viene eliminato. | employee.deleted |
| Assenza richiesta | Qualcuno richiede ferie o un’altra assenza. | absence.requested |
| Assenza approvata | Una richiesta viene approvata o un’assenza inserita direttamente. | absence.approved |
| Assenza rifiutata | Una richiesta viene rifiutata. | absence.rejected |
| Assenza annullata | Una richiesta o un’assenza viene ritirata. | absence.cancelled |
| Orario registrato | Nasce una registrazione oraria – timbrando l’entrata, inserendola dopo o al terminale. | time_entry.created |
| Orario modificato | Una registrazione oraria cambia, ad esempio timbrando l’uscita. | time_entry.updated |
| Orario eliminato | Una registrazione oraria viene eliminata. | time_entry.deleted |
| Mese chiuso | Un mese viene chiuso nella preparazione paghe. | payroll.closed |
| Mese riaperto | Un mese chiuso viene riaperto per correzioni. | payroll.reopened |
| Turno pubblicato | Un turno viene pubblicato con il piano turni. | shift.published |
| Turno modificato | Un turno pubblicato cambia. | shift.changed |
| Turno cancellato | Un turno pubblicato viene eliminato. | shift.deleted |
Tutte le modifiche all’API con data e indicazione delle modifiche non retrocompatibili. Leggibile da macchina con 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