Temps travaillé

Ce qui a été enregistré sur chaque journée de travail — minutes travaillées contre minutes prévues. C'est ce que consomme une intégration de paie, et c'est la lecture où un null est le plus souvent pris pour un zéro. La section Non déclaré n'est pas zéro, plus bas, est celle à lire avant toutes les autres.

Le grain est la journée, pas le pointage

Une entrée, c'est ce qui a été enregistré pour une date et un contrat. Les événements individuels d'entrée et de sortie sont une donnée d'une autre nature, et cette API ne les sert pas : vous recevez les totaux sur lesquels une journée a été arrêtée, jamais la séquence qui les a produits.

C'est délibéré. Un calcul de paie consomme des journées ; une séquence de pointages décrit les déplacements de quelqu'un dans sa journée, ce qui est un relevé nettement plus intrusif que ce dont une intégration a réellement besoin.

Lister les journées

GET /api/v1/client/time-entries (scopes : time-entries:read)

{
  "items": [
    {
      "id": "WV5RJ7",
      "employmentId": "ePloqJ",
      "employeeId": "GNnBNO",
      "companyId": "1VaKPa",
      "date": "2026-01-12",
      "realMinutes": 495,
      "theoreticMinutes": 420,
      "isDeclared": true,
      "submittedOn": "<generated>",
      "hasExcessiveWorkload": true
    },
    {
      "id": "mNw9JY",
      "employmentId": "ePloqJ",
      "employeeId": "GNnBNO",
      "companyId": "1VaKPa",
      "date": "2026-01-13",
      "realMinutes": null,
      "theoreticMinutes": null,
      "isDeclared": false,
      "submittedOn": null,
      "hasExcessiveWorkload": false
    }
  ],
  "nextCursor": "pgyk3FWzA"
}
Paramètre Ce qu'il fait
from, to Dates ISO bornant la journée. L'un ou l'autre peut être omis.
establishmentId Restreint la page à UN établissement de votre périmètre. Omis, elle les lit tous.
cursor, limit Pagination. Renvoyez nextCursor ; n'arrêtez que lorsqu'il vaut null.

Les journées sortent de la plus ancienne à la plus récente.

La fenêtre filtre par inclusion, pas par recouvrement. Une journée est une date et appartient à exactement une fenêtre — contrairement à une absence, qui en couvre plusieurs et peut chevaucher une frontière de mois. Demander janvier rend les journées de janvier, rien de plus. Cela diffère de Congés et soldes à dessein : les deux lectures répondent à des questions de formes différentes, et les filtrer de la même manière serait faux pour l'une des deux.

Une date illisible laisse ce côté de la fenêtre ouvert plutôt que de faire échouer l'appel. Vous pouvez recevoir plus que ce que vous avez demandé, jamais moins.

establishmentId restreint, il n'élargit jamais. Nommer un établissement hors de votre périmètre ne renvoie rien plutôt que de l'atteindre, et il en va de même d'une valeur qui n'est pas un identifiant émis par cette API : un signet périmé vous donne une page vide, pas une erreur et pas le périmètre entier.

Il n'y a pas de filtre modifiedSince. Aucune colonne maintenue et indexée ne le porte, donc l'accepter reviendrait à l'ignorer en silence. Interrogez sur la fenêtre à la place — c'est ce qu'est réellement une période de paie.

Non déclaré n'est pas zéro

Champ Ce qu'il vous dit
realMinutes Minutes réellement travaillées. null tant que la journée n'est pas déclarée.
theoreticMinutes Minutes prévues par le planning. null aux mêmes conditions.
isDeclared Si la journée est déclarée : vrai uniquement quand les deux totaux ET submittedOn sont renseignés.
submittedOn Quand la période portant cette journée a été soumise. null tant qu'elle ne l'a pas été.

realMinutes: null signifie que la journée n'a PAS été déclarée. Cela ne signifie pas que zéro minute a été travaillée.

Le lire comme 0 ne paie rien pour une journée simplement pas encore soumise, et rien dans la réponse ne signale l'erreur : vous obtenez un nombre là où il y avait une absence de nombre. Branchez sur isDeclared, jamais sur realMinutes.

Et la règle ne fonctionne que dans un sens. isDeclared vaut vrai quand les deux totaux et submittedOn sont tous les trois renseignés — une journée peut donc porter realMinutes: 420 et se lire malgré tout isDeclared: false, parce qu'elle n'a pas été soumise. C'est le cas ordinaire, pas un cas limite : les totaux sont là dès que la journée est saisie, submittedOn seulement une fois la période réellement soumise. Un lecteur qui déduit la déclaration d'un realMinutes non nul traite donc des journées non déclarées comme déclarées — l'erreur symétrique de celle qui lit null comme zéro, et la plus fréquente des deux.

Les totaux repassent par ailleurs à null si la période est rouverte ou refusée. Une journée lue comme déclarée la semaine dernière peut donc légitimement se lire comme non déclarée aujourd'hui. Ce n'est ni une perte de données ni une correction : c'est la période qui est repartie pour un tour.

hasExcessiveWorkload est un indicateur enregistré, pas un indicateur dérivé des totaux. N'essayez pas de le reproduire en comparant realMinutes à theoreticMinutes : il est posé sur la journée par les règles propres de Staff & Go, qui tiennent compte de plus de choses que les deux nombres visibles ici.

Un salarié, plusieurs contrats

Un salarié peut détenir plusieurs contrats, chacun avec ses propres journées. C'est employmentId qui les sépare.

Deux entrées à la même date pour un même employeeId ne sont pas un doublon — ce sont deux contrats travaillés le même jour. Dédoublonner sur (employeeId, date) en écarte une en silence, et celle que vous écartez est du travail rémunéré. Clavez plutôt sur (employmentId, date).

Une journée qui disparaît est absente, pas supprimée

Il n'y a ni flux de delta ni pierre tombale. Une journée qui cesse d'être rendue entre deux lectures cesse simplement d'être rendue — rien ne l'annonce. Relisez la fenêtre plutôt que d'attendre un événement de suppression.

Quand la page est plus courte

Une liste couvre tout votre périmètre, mais un établissement qui n'a pas souscrit au module de gestion des temps est absent de cette lecture sans être nommé. La réponse dit qu'elle est incomplète, par le bloc partial — voir Quand une liste est plus courte que votre mandat dans Découvrir ce que vous pouvez appeler.

Ce point compte davantage ici qu'ailleurs : un périmètre mêlant des établissements qui utilisent Staff & Go pour la gestion des temps et des établissements qui ne l'utilisent pas est une situation ordinaire, pas une anomalie.