Une API REST en JSON, des jetons API personnels et des webhooks signés. La référence est publique ; pour l’essayer, il vous faut un compte Floowa.
Un administrateur crée un jeton sous Paramètres → Accès API, choisit les droits par fonction et une date d’expiration (30, 90 ou 365 jours ou illimitée). Le jeton n’est affiché qu’une seule fois.
Authorization: Bearer <token>
Accept: application/json
URL de base: https://www.floowa.de/api/v1
| Limite de débit | 120 requêtes par minute et par jeton ; au-delà, l’API répond par HTTP 429. |
|---|---|
| Listes | Les listes sont paginées ; avec per_page, vous obtenez jusqu’à 100 entrées par page. |
| Répéter sans risque | Avec l’en-tête Idempotency-Key, une requête répétée renvoie la même réponse pendant 24 heures au lieu de créer un doublon. |
| Révision de l’API | Chaque réponse porte l’en-tête Floowa-Api-Revision avec la date de la dernière modification de l’API. |
Chaque livraison est un POST en JSON vers votre adresse HTTPS, avec les en-têtes X-Floowa-Event, X-Floowa-Delivery et X-Floowa-Signature.
La signature a la forme t=<horodatage>,v1=<signature>. v1 est un HMAC-SHA256 sur « <horodatage>.<corps brut> » avec votre clé de signature. Comparez en temps constant et rejetez les horodatages anciens.
Si votre serveur ne répond pas avec un statut 2xx, Floowa réessaie après 1, 5 et 30 minutes puis après 2 heures. Après 20 échecs consécutifs, le webhook est désactivé.
{
"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;
}
| Événement | Quand | Nom technique |
|---|---|---|
| Collaborateur créé | Un collaborateur est créé – manuellement, par import ou via l’API. | employee.created |
| Collaborateur modifié | Les données de base d’un collaborateur changent. | employee.updated |
| Collaborateur supprimé | Un collaborateur est supprimé. | employee.deleted |
| Absence demandée | Quelqu’un demande un congé ou une autre absence. | absence.requested |
| Absence approuvée | Une demande est approuvée ou une absence saisie directement. | absence.approved |
| Absence refusée | Une demande est refusée. | absence.rejected |
| Absence annulée | Une demande ou une absence est retirée. | absence.cancelled |
| Temps enregistré | Une saisie de temps est créée – en pointant l’arrivée, en saisissant après coup ou à la pointeuse. | time_entry.created |
| Temps modifié | Une saisie de temps change, par exemple en pointant le départ. | time_entry.updated |
| Temps supprimé | Une saisie de temps est supprimée. | time_entry.deleted |
| Mois clôturé | Un mois est clôturé dans la préparation de la paie. | payroll.closed |
| Mois rouvert | Un mois clôturé est rouvert pour des corrections. | payroll.reopened |
| Créneau publié | Un créneau est publié avec le planning. | shift.published |
| Créneau modifié | Un créneau publié change. | shift.changed |
| Créneau supprimé | Un créneau publié est supprimé. | shift.deleted |
Toutes les modifications de l’API avec date et mention des changements non rétrocompatibles. Lisible par machine via 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