API Hasfy
L’API REST de Hasfy vous permet d’interagir avec votre organisation de manière programmatique : automatiser des tâches, intégrer Hasfy avec vos outils existants ou construire des workflows personnalisés.
Présentation
L’API Hasfy est une API REST qui répond en JSON, accessible exclusivement en HTTPS.
- Format des données : JSON
- Protocole : HTTPS exclusivement
- Base URL :
https://app.hasfy.fr/api/v1 - Versioning : le préfixe
/api/v1indique la version de l’API
Qui peut utiliser l’API ?
L’API est incluse dans l’abonnement Hasfy Pro, sans option supplémentaire, pour tout siège administrateur ou technicien.
Authentification
Clés API
L’accès à l’API se fait via des clés API. Une clé est toujours liée à un utilisateur : elle hérite de ses permissions et est en plus restreinte par les scopes qui lui sont attribués. Une clé ne peut donc jamais faire plus que ce que peut faire l’utilisateur qui l’a créée.
Créer une clé API
- Accédez à Paramètres > API > Clés API
- Cliquez sur « Créer une clé API »
- Donnez un nom descriptif à la clé (ex. « Script sync inventaire », « Intégration Zapier »)
- Sélectionnez un ou plusieurs scopes (voir tableau ci-dessous)
- Choisissez une expiration : Jamais, 30 jours, 90 jours, 6 mois ou 1 an
- Cliquez sur « Créer »
- La clé est affichée une seule fois : copiez-la et conservez-la en lieu sûr
Important : la clé API est affichée uniquement lors de la création. Si vous la perdez, vous devrez en créer une nouvelle.
Scopes disponibles
| Scope | Description |
|---|---|
equipment:read | Lire les données d’équipements |
equipment:write | Créer et mettre à jour des équipements |
tickets:read | Lire les tickets |
tickets:write | Créer et mettre à jour des tickets |
users:read | Lire les utilisateurs |
alerts:read | Lire les alertes |
alerts:write | Gérer les alertes |
dashboards:read | Lire les tableaux de bord |
automations:read | Lire les automations |
automations:write | Gérer les automations |
D’autres scopes au format
ressource:actionpeuvent être proposés selon les modules activés sur votre organisation.
Utiliser la clé API
Incluez la clé API dans l’en-tête Authorization de vos requêtes :
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://app.hasfy.fr/api/v1/whoami"Révoquer une clé API
- Accédez à Paramètres > API > Clés API
- Cliquez sur « Révoquer » à côté de la clé concernée
- La clé est immédiatement invalidée
Endpoints
L’API expose actuellement 7 endpoints. Tous les chemins ci-dessous sont relatifs à https://app.hasfy.fr/api/v1.
| Méthode | Endpoint | Description | Scope requis |
|---|---|---|---|
GET | /equipments | Liste l’équipement de l’organisation | equipment:read |
POST | /equipments/bulk-create | Crée jusqu’à 100 équipements et génère leurs jetons d’installation | equipment:write |
GET | /tickets | Liste les tickets | tickets:read |
POST | /tickets | Crée un ticket | tickets:write |
GET | /users | Liste les membres de l’organisation | users:read |
GET | /whoami | Identité associée à la clé | — |
GET | /health | Vérifie la validité de la clé | — |
GET /equipments
Liste l’équipement de l’organisation, paginé.
Paramètres de requête
| Paramètre | Description |
|---|---|
limit | Nombre de résultats (1-200, défaut 50) |
offset | Décalage pour la pagination (défaut 0) |
status | Filtre optionnel par statut |
Permission : equipment:read. Sans la permission de voir tout l’équipement de l’organisation, seul l’équipement assigné au propriétaire de la clé est retourné.
Réponse
{
"data": [...],
"pagination": { "total": 142, "limit": 50, "offset": 0 }
}POST /equipments/bulk-create
Crée jusqu’à 100 équipements en une fois et génère leurs jetons d’installation.
Corps de la requête
{
"items": [
{
"name": "PC-COMPTA-01",
"type": "workstation",
"platform": "windows",
"location": "Bureau 1er étage",
"unitId": "...",
"managedBy": "...",
"assignToUserId": "..."
}
],
"tokenKind": "bulk"
}Seuls name et type sont obligatoires pour chaque élément de items. tokenKind vaut bulk ou invitation (optionnel).
Permission : equipment:write (action « Gérer les équipements »).
Réponse
{
"requested": 1,
"created": 1,
"failed": 0,
"items": [
{ "name": "PC-COMPTA-01", "id": "...", "installUrl": "https://..." }
]
}GET /tickets
Liste les tickets, paginé.
Paramètres de requête
| Paramètre | Description |
|---|---|
limit | Nombre de résultats (1-200, défaut 50) |
offset | Décalage pour la pagination (défaut 0) |
status | Filtre optionnel par statut |
priority | Filtre optionnel par priorité |
Permission : tickets:read. Sans la permission de voir tous les tickets de l’organisation, seuls les tickets créés par le propriétaire de la clé sont retournés.
Réponse
{
"data": [...],
"pagination": { "total": 38, "limit": 50, "offset": 0 }
}POST /tickets
Crée un ticket pour le compte du propriétaire de la clé.
Corps de la requête
| Champ | Type | Obligatoire | Détail |
|---|---|---|---|
title | string | Oui | 5 à 200 caractères |
description | string | Oui | 10 à 5000 caractères |
priority | string | Non | low, medium, high ou critical (défaut medium) |
equipmentId | uuid | Non | Équipement concerné |
Permission : tickets:write
Réponse 201
{
"id": "...",
"title": "Imprimante hors service",
"status": "open",
"priority": "high",
"equipment_id": "...",
"created_by": "...",
"created_at": "2026-06-11T10:00:00Z"
}GET /users
Liste les membres de l’organisation, paginé.
Paramètres de requête : limit (1-200, défaut 50), offset (défaut 0)
Permission : users:read. Le champ email n’est inclus dans profile que si le propriétaire de la clé dispose de la permission de gestion des utilisateurs.
Réponse
{
"data": [
{ "userId": "...", "role": "technician", "profile": { ... } }
],
"pagination": { "total": 12, "limit": 50, "offset": 0 }
}GET /whoami
Retourne l’identité associée à la clé : organisation, utilisateur et rôle effectif, ainsi que les métadonnées de la clé (nom, scopes, expiration).
Aucun scope spécifique n’est requis : une clé valide suffit. Pratique pour déboguer une intégration.
Réponse
{
"organization": { "id": "...", "name": "..." },
"user": { "id": "...", "role": "admin" },
"apiKey": {
"name": "Script sync inventaire",
"scopes": ["equipment:read", "tickets:write"],
"expiresAt": "2026-12-01T00:00:00Z"
}
}GET /health
Vérifie que la clé est valide et que les quotas associés ne sont pas dépassés.
Réponse
{ "status": "ok" }Pagination & filtrage
Pagination
Les endpoints qui renvoient des listes (/equipments, /tickets, /users) sont paginés via deux paramètres de requête :
| Paramètre | Défaut | Plage | Description |
|---|---|---|---|
limit | 50 | 1-200 | Nombre d’éléments retournés |
offset | 0 | — | Nombre d’éléments à ignorer |
La réponse inclut les métadonnées de pagination :
{
"data": [...],
"pagination": { "total": 142, "limit": 50, "offset": 0 }
}Filtrage
| Endpoint | Paramètres de filtre |
|---|---|
/equipments | status |
/tickets | status, priority |
GET /api/v1/equipments?status=active&limit=20
GET /api/v1/tickets?status=open&priority=highAucun paramètre de tri (
sort) n’est disponible actuellement.
Limites de débit (rate limiting)
Deux mécanismes distincts s’appliquent à chaque requête.
1. Limite par minute (anti-abus)
| Limite | Valeur |
|---|---|
| Par adresse IP | 60 requêtes / minute |
| Par clé API | 600 requêtes / minute |
| Burst | 10 requêtes / seconde |
En-têtes de réponse :
X-RateLimit-LimitX-RateLimit-RemainingX-RateLimit-Reset
En cas de dépassement, l’API renvoie 429 avec un en-tête Retry-After (en secondes) :
{ "error": "Too many requests", "retryAfter": 12 }ou, si c’est la limite propre à la clé API qui est atteinte :
{ "error": "API key rate limit exceeded", "retryAfter": 12 }2. Quota journalier par plan
Chaque organisation dispose d’un quota de requêtes /api/v1 par jour (fenêtre glissante de 24h), dépendant de son plan. Ce quota peut être illimité selon le plan souscrit.
En-têtes de réponse :
X-Quota-LimitX-Quota-UsedX-Quota-Remaining
En cas de dépassement, l’API renvoie 429 avec Retry-After: 3600 :
{ "error": "API quota exceeded", "limit": 5000, "used": 5000, "window": "24h" }Gestion des erreurs
L’API utilise des codes HTTP standards. Les erreurs sont renvoyées dans un format simple et plat :
{ "error": "message décrivant l'erreur" }| Code | Signification |
|---|---|
200 | Succès |
201 | Ressource créée |
400 | Requête invalide. Pour les erreurs de validation, la réponse inclut aussi un champ details |
401 | Clé API manquante, invalide, expirée, ou propriétaire de la clé n’appartenant plus à l’organisation |
403 | Permissions insuffisantes (scope ou rôle) |
404 | Ressource non trouvée |
429 | Limite de débit ou quota journalier dépassé |
500 | Erreur serveur |
Exemple d’erreur de validation (400) :
{
"error": "Validation failed",
"details": [
{ "path": ["title"], "message": "String must contain at least 5 character(s)" }
]
}Exemples d’utilisation
Lister les équipements actifs
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://app.hasfy.fr/api/v1/equipments?status=active&limit=20"Créer un ticket
curl -X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Imprimante hors service",
"description": "Cette imprimante du 2e étage ne répond plus depuis ce matin.",
"priority": "high",
"equipmentId": "5b1f7e2a-6e3a-4b8b-9a90-2f6a6f0c7e10"
}' \
"https://app.hasfy.fr/api/v1/tickets"Créer plusieurs équipements en une fois
curl -X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"items": [
{ "name": "PC-COMPTA-01", "type": "workstation", "location": "1er étage" },
{ "name": "PC-COMPTA-02", "type": "workstation", "location": "1er étage" }
]
}' \
"https://app.hasfy.fr/api/v1/equipments/bulk-create"Vérifier l’identité de la clé
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://app.hasfy.fr/api/v1/whoami"Bonnes pratiques
| Pratique | Détail |
|---|---|
| Stocker les clés en sécurité | Variables d’environnement ou coffre-fort de secrets |
| Gérer les erreurs | Implémentez des retries avec backoff exponentiel pour les erreurs 429 et 5xx |
| Pagination | Paginez toujours les listes volumineuses au lieu de tout charger d’un coup |
| Cache | Mettez en cache les données qui changent peu (liste d’utilisateurs) |
| Monitoring | Surveillez les en-têtes X-Quota-* pour anticiper vos besoins |