Aller au contenu

API publique

L’API publique permet à vos propres logiciels de dialoguer avec Service Suite : un logiciel comptable qui récupère les factures, un portail client qui crée une intervention, un tableau de bord qui suit l’état de vos équipements.

C’est une interface produit : vous travaillez avec des clients, des sites, des équipements, des ordres de service, des contrats, du stock et des factures. Vous n’avez jamais besoin de savoir comment Service Suite est construit en interne.

Clés API L’écran des clés API. Une clé agit toujours au nom d’un utilisateur choisi.

  • Garder clients et sites alignés avec votre système de gestion existant.
  • Laisser un autre système créer des ordres de service — un outil de supervision, un formulaire web, un portail client.
  • Lire les factures et les niveaux de stock à des fins de reporting.
  • Prévenir un système externe dès qu’une intervention est terminée.
RôleCe qu’il fait
AdministrateurCrée les clés, attribue les droits et révoque les clés
Votre développeur ou prestataireUtilise la clé pour l’intégration

Prérequis : un accès administrateur à Service Suite, et quelqu’un capable de construire l’intégration. Aucune licence ni module supplémentaire n’est nécessaire.

Adresse de basehttps://<votre-adresse-service>/api/v1/
Spécification/api/v1/openapi.json — OpenAPI 3.1
Page de documentation/api/docs
Fenêtre de terminal
curl https://<votre-adresse-service>/api/v1/me \
-H "Authorization: Bearer <API_KEY>"

/me est le contrôle de santé : il prouve que la clé fonctionne et montre exactement ce qu’elle peut faire.

{
"data": {
"credential": {
"name": "Comptabilité — synchronisation nocturne",
"prefix": "a1b2c3d4",
"scopes": ["customers:read", "invoices:read"],
"expires_at": null
},
"acting_as": { "id": 42, "name": "Intégration comptabilité" },
"api_version": "v1"
}
}
  1. Allez dans Paramètres → API publique → Nouvelle clé API.

  2. Donnez à la clé un nom qui indique à quoi elle sert. Ce nom apparaît dans le journal d’accès.

  3. Choisissez au nom de quel utilisateur la clé agit. C’est la véritable limite de droits — voir ci-dessous.

  4. Cochez les droits (scopes) dont l’intégration a besoin, et pas davantage.

  5. Définissez éventuellement une date d’expiration et des plages IP autorisées.

  6. Enregistrez. Le secret est affiché une seule fois. Copiez-le immédiatement dans votre coffre-fort de mots de passe.

Chaque requête s’exécute au nom de l’utilisateur choisi, avec ses droits et son périmètre de visibilité. Une clé rattachée à un technicien qui ne voit que ses propres ordres voit exactement la même chose via l’API — pas davantage.

Les droits de la clé ne peuvent donc que restreindre, jamais élargir. Créez un utilisateur dédié aux intégrations, avec exactement les droits nécessaires.

ScopeCe qu’il ouvre
customers:read / customers:writeClients
locations:read / locations:writeSites & emplacements
assets:read / assets:writeÉquipements & matériel
service_orders:read / service_orders:writeOrdres de service
contracts:readContrats d’entretien
stock:readStock
invoices:readFactures
reports:readDonnées de reporting
webhooks:manageGestion des webhooks

Le stock et les factures sont en lecture seule en v1. Les écritures comptables et les mouvements de stock ont lieu dans Service Suite même, pas via l’API.

RessourceLireCréerModifierArchiver
customers✅✅✅✅
locations✅—✅—
assets✅✅✅✅
service-orders✅✅✅—
contracts✅———
stock✅———
invoices✅———
GET /api/v1/<ressource> liste
GET /api/v1/<ressource>/<id> un enregistrement
POST /api/v1/<ressource> créer
PATCH /api/v1/<ressource>/<id> modifier
DELETE /api/v1/<ressource>/<id> archiver (jamais une suppression définitive)

DELETE archive. Rien n’est jamais supprimé définitivement via l’API.

Fenêtre de terminal
curl "https://<votre-adresse-service>/api/v1/assets?customer_id=57&page=2&page_size=100&sort=-write_date" \
-H "Authorization: Bearer <API_KEY>"
ParamètrePar défautMaximum
page1—
page_size50200

Si vous demandez plus de 200, vous en obtenez 200 — pas une erreur.

Trier avec sort, plusieurs champs séparés par des virgules, - devant pour un tri décroissant. Filtrer avec les noms de filtres de la ressource ; updated_since existe sur chaque ressource et c’est ce qu’il vous faut pour une synchronisation incrémentale.

Les noms de tri et de filtre sont fixes par ressource. Un nom qui n’existe pas est refusé plutôt qu’ignoré en silence — vous repérez ainsi une faute de frappe immédiatement, au lieu de découvrir des mois plus tard que votre filtre n’a jamais fonctionné.

Envoyez votre propre Idempotency-Key avec chaque POST :

Fenêtre de terminal
curl -X POST https://<votre-adresse-service>/api/v1/service-orders \
-H "Authorization: Bearer <API_KEY>" \
-H "Idempotency-Key: <VALEUR_UNIQUE_PAR_REQUETE>" \
-H "Content-Type: application/json" \
-d '{"customer_id": 57, "location_id": 112, "description": "Entretien annuel"}'

Si vous perdez la connexion et réessayez avec la même valeur de clé, vous récupérez le résultat d’origine au lieu d’un deuxième ordre de service. Sans cet en-tête, une requête répétée est une véritable deuxième requête.

Chaque requête renvoie également un X-Request-Id. Mentionnez-le lors d’un signalement — c’est ainsi que votre requête est retrouvée dans le journal.

TypePar minute
Lecture600
Écriture120
Gestion des webhooks60
Authentifications échouées20

Le compteur s’applique par clé : une intégration active ne consomme donc pas le budget d’une autre. En cas de dépassement, vous recevez 429 avec un en-tête Retry-After. Respectez-le et réessayez avec un délai croissant.

CodeSignificationCe que vous faites
400Paramètre ou champ invalideCorrigez la requête ; la réponse nomme le champ
401Clé absente, erronée, expirée ou révoquéeVérifiez la clé
403La clé n’a pas le scope, ou l’utilisateur n’a pas le droitAttribuez le scope, ou ajustez les droits de l’utilisateur
404N’existe pas, ou hors du périmètre de l’utilisateurVérifiez l’id et les droits
409Conflit — par exemple une Idempotency-Key réutilisée avec un contenu différentUtilisez une nouvelle valeur
429Trop de requêtesAttendez et réessayez

Un 403 dû à un scope manquant et un 403 dû aux droits de l’utilisateur appellent des corrections différentes. La réponse indique lequel des deux s’applique.

Plutôt que d’interroger en boucle, laissez Service Suite vous prévenir.

ÉvénementQuand
service_order.createdUn ordre de service a été créé
service_order.updatedUn ordre de service a été modifié
service_order.status_changedLe statut a changé
service_order.completedL’intervention est terminée
asset.created / asset.updatedUn équipement a été créé ou modifié
contract.createdUn contrat d’entretien a été créé
invoice.postedUne facture a été comptabilisée

Chaque livraison porte une signature HMAC-SHA256. Vérifiez-la avant d’utiliser le contenu — c’est ainsi que vous savez que la notification provient réellement de votre environnement. Les livraisons se font en arrière-plan et sont réessayées avec un délai croissant en cas d’échec.

Votre adresse de réception doit être accessible publiquement. Les adresses sur un réseau privé sont refusées.

Chaque client travaille dans son propre environnement cloisonné. L’API détermine cet environnement à partir de l’adresse par laquelle vous l’appelez ; aucun paramètre ne permet de changer d’environnement, et une telle tentative est refusée. De plus, chaque clé est liée à l’environnement qui l’a émise : une copie d’un environnement ne peut donc jamais être atteinte avec les clés de l’original.

Chaque requête est enregistrée : horodatage, clé, méthode, ressource, code de réponse, durée et une indication d’origine. Le contenu des requêtes, les clés et les en-têtes ne sont jamais enregistrés. Le journal reste ainsi utile pour analyser un problème sans devenir lui-même une seconde copie de vos données.

Mentionnées plutôt que passées sous silence.

  • Le stock et les factures sont en lecture seule en v1. Aucune création ni modification n’est possible via l’API.
  • Les techniciens, équipes, projets et heures n’ont pas de ressource propre en v1.
  • L’API ne connaît qu’une version, v1. Les changements susceptibles de casser des intégrations existantes iront dans une version suivante.
  • Une clé par intégration, jamais une clé partagée. Vous pouvez ainsi en révoquer une sans casser les autres.
  • N’attribuez que les scopes utilisés par l’intégration. Commencez en lecture seule.
  • Utilisez toujours Idempotency-Key lors de la création.
  • Synchronisez de façon incrémentale avec updated_since plutôt que de tout récupérer à chaque fois.
  • Conservez le secret dans un coffre-fort, jamais dans le code source ni dans un fichier de configuration versionné.
  • Définissez une date d’expiration pour les clés détenues par des tiers.