Per sviluppatori

L’API di Floowa

Un’API REST in JSON, token API personali e webhook firmati. La documentazione è pubblica; per provarla serve un account Floowa.

Autenticazione

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

  • Ogni richiesta viene eseguita nell’azienda del titolare del token e non può mai superare ciò che consentono il token e i diritti del titolare.
  • L’API è inclusa in tutti i piani; gli endpoint dei moduli attivati sono disponibili non appena il modulo è attivo.
  • I messaggi di errore arrivano nella lingua dell’header Accept-Language (altrimenti in inglese).

Limiti e comportamento

Limiti e comportamento
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.

Webhook e firma

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.

Esempio di consegna

{
    "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"
    }
}

Verificare la firma (PHP)

$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;
}

Tutti gli eventi in parole semplici

Gli eventi che Floowa invia via webhook
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

Changelog

Tutte le modifiche all’API con data e indicazione delle modifiche non retrocompatibili. Leggibile da macchina con GET /api/v1/changelog.

2026-11-02 · 2 novembre 2026

  • Nuovo Impostazioni dell’orario obiettivo dei dipendenti: le risposte contengono effective_weekly_hours (ore settimanali proprie o standard aziendale; null senza orario obiettivo fisso), no_fixed_hours (nessun orario obiettivo fisso, ad es. direzione o orario di fiducia) e working_time_law_exempt (nessun controllo della legge sull’orario, ad es. amministratori di una GmbH o dirigenti). POST e PUT accettano no_fixed_hours e working_time_law_exempt come campi facoltativi; nuovo employment_type managing_director (direzione). weekly_hours resta invariato. GET /employeesGET /employees/{id}POST /employeesPUT /employees/{id}

2026-10-30 · 30 ottobre 2026

  • Nuovo Verifiche dell’inventario e qualifiche richieste dall’inventario: GET /qualifications restituisce required_inventory_category_ids e la nuova categoria check (senza documento); GET /employees/{id}/qualifications restituisce requirement_reasons (perché una qualifica è obbligatoria – unità o oggetto consegnato); GET /inventory-items/{id} contiene inspections con due_on, last_done_on e status (ok, due_soon, overdue). GET /qualificationsGET /employees/{id}/qualificationsGET /inventory-items/{id}
  • Nuovo Assenze: POST /absences/{id}/cancel accetta un motivo facoltativo (reason) e annulla anche le assenze approvate; le risposte contengono cancel_requested_at (richiesta di annullamento aperta di un dipendente) e cancel_reason. POST /absences/{id}/decision decide una richiesta di annullamento (approve = annullare, reject = mantenere l’assenza). POST /absences/{id}/cancelGET /absences
  • Modificato I nomi dei progetti devono essere unici solo per cliente; lo stesso nome è consentito per clienti diversi. I progetti senza cliente restano unici tra loro. POST /time-projectsPUT /time-projects/{id}

2026-10-29 · 29 ottobre 2026

  • Nuovo Tempo progetto per registrazione: le registrazioni accettano customer_id (cliente senza progetto) e parts (ripartizione su più progetti/clienti con minutes o start/end); GET /time-allocations restituisce customer_id, label, started_at/ended_at e kind part, filtro customer_id. POST /time-entriesPUT /time-entries/{id}GET /time-allocations
  • Nuovo Unità: clock_web e clock_app (true/false, null = come l’unità superiore) stabiliscono se i dipendenti dell’unità possono timbrare nel browser o nell’app. GET /org-unitsPOST /org-unitsPUT /org-units/{id}
  • Rimosso non retrocompatibile L’assegnazione libera per giorno PUT /employees/{id}/time-allocations/{date} è stata rimossa – invii la ripartizione come parts sulla registrazione. Le assegnazioni libere esistenti sono state collegate alla registrazione più lunga del giorno. PUT /employees/{id}/time-allocations/{date}

2026-10-28 · 28 ottobre 2026

  • Nuovo Tempo progetto separato dalla presenza: GET /time-allocations indica a quale progetto è assegnato il tempo di un giorno; PUT /employees/{id}/time-allocations/{date} imposta le assegnazioni libere di un giorno. time_project_id sulle registrazioni resta e crea automaticamente un’assegnazione collegata. GET /time-allocationsPUT /employees/{id}/time-allocations/{date}

2026-10-26 · 26 ottobre 2026

  • Nuovo Preparazione paghe: nuovo oggetto surcharges_3b per dipendente con i minuti di maggiorazione secondo il § 3b EStG (night_25, night_40, sunday_50, holiday_125, holiday_150). I campi night e holiday restano come totali. GET /payroll/{month}
  • Modificato non retrocompatibile Preparazione paghe: sunday non conta più i giorni festivi, ma include le ore 0–4 del lunedì dopo un turno iniziato di domenica. holiday include inoltre il 24 e il 31 dicembre dalle 14. Le pause vengono detratte in proporzione. GET /payroll/{month}
  • Privacy/sicurezza non retrocompatibile Assenze: chi ha solo diritti di lettura vede i tipi di assenza riservati (ad es. malattia) come assenza neutra – absence_type_id, type, note e decision_note sono null e il nuovo campo type_hidden è true. Il report paghe raggruppa questi giorni nella colonna type_hidden. GET /absencesGET /reports/payroll
  • Nuovo Nuovo endpoint GET /changelog e header Floowa-Api-Revision in ogni risposta. GET /changelog

2026-10-23 · 23 ottobre 2026

  • Nuovo Prima versione dell'API v1: organizzazione, personale, documenti, qualifiche, inventario, buste paga, rilevazione presenze con timbratura e approvazione, progetti e clienti, assenze, festività, report, preparazione paghe, Idempotency-Key e webhook.

Iniziamo. Benvenuto in Floowa.