Développeurs
Bâtissez sur vos données d'étalonnage.
L'API publique d'Axiospec est une interface REST vers vos instruments et vos enregistrements d'étalonnage. Lisez et créez des instruments, inscrivez des étalonnages au registre à détection d'altération, et tirez vos sites et vos normes vers vos propres systèmes. Authentifiez-vous avec une clé API d'espace de travail et c'est parti.
Pour commencer
Tout ce qu'il faut savoir avant votre premier appel
Lisez ceci une fois, puis ouvrez la référence interactive complète pour la forme exacte de la requête et de la réponse de chaque point de terminaison.
Ce que fait l'API
L'API publique d'Axiospec est une interface REST vers votre programme d'étalonnage. Lisez et créez des instruments, inscrivez des étalonnages au registre à détection d'altération, et lisez les sites de votre espace de travail ainsi que les normes de conformité que vous avez sélectionnées.
C'est un contrat choisi et stable, distinct des points de terminaison internes qu'utilisent les applications web et mobiles, pour que votre intégration continue de fonctionner à mesure que le produit évolue. Chaque réponse est en JSON.
URL de base
Tous les points de terminaison se trouvent sous une seule URL de base. Chaque chemin de la référence ci-dessous est relatif à celle-ci.
https://axiospec.com/api/public/v1
Authentification
Authentifiez chaque requête avec une clé API propre à l'espace de travail. Un administrateur de l'espace de travail en crée une dans l'application, sous Paramètres puis Clés API. Les clés ne sont affichées qu'une fois, à la création, et portent le préfixe ctk_. Conservez la clé comme un secret et ne la publiez jamais dans du code côté client.
Envoyez la clé à chaque requête comme jeton porteur :
Authorization: Bearer ctk_your_api_key
Un en-tête X-API-Key standard est aussi accepté si vous le préférez : X-API-Key: ctk_your_api_key. Une requête sans clé retourne 401.
Forfait requis
L'API est offerte à partir du forfait Professional. Une clé qui appartient à un espace de travail sur le forfait gratuit ou Starter reçoit un 403 avec le code API_ACCESS_TIER_REQUIRED. Montez l'espace de travail de forfait pour l'activer.
Portées
Chaque clé est émise avec une portée. Une clé de lecture peut lister et consulter. Une clé d'écriture peut en plus créer des instruments, les modifier et inscrire des étalonnages (l'écriture implique toujours la lecture).
Une clé en lecture seule qui tente une écriture reçoit un 403 avec le code INSUFFICIENT_SCOPE, qui nomme la portée requise. Émettez des clés en lecture seule pour les intégrations de rapports, pour qu'elles ne puissent jamais modifier un enregistrement.
Limites de débit et leurs en-têtes
Les requêtes sont limitées à 120 par minute, comptées par clé API plutôt que par adresse IP. Une intégration ne peut donc pas affamer les autres, et plusieurs clés derrière un même réseau de bureau ne sont pas bridées ensemble.
Chaque réponse de l'API porte la fenêtre courante dans ses en-têtes, pour que vous puissiez régler votre rythme sans deviner. X-RateLimit-Limit est le plafond (120), X-RateLimit-Remaining est le nombre de requêtes qu'il reste dans la fenêtre courante, et X-RateLimit-Reset est le nombre de secondes avant la réinitialisation de la fenêtre, quand Remaining revient au plafond.
Dépasser la limite retourne un 429 avec le code RATE_LIMITED. Sur le 429, un en-tête Retry-After (en secondes) vous dit exactement combien de temps attendre. Respectez-le, puis réessayez. Lire ces en-têtes plutôt que de coder un délai en dur vous garde rapide quand il y a de la marge et poli quand il n'y en a pas.
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 118
X-RateLimit-Reset: 41
Retry-After: 41 (present only on a 429)
Synchronisation incrémentielle
Pour garder un système externe à jour sans tout relire, ne tirez que ce qui a changé depuis votre dernière exécution. Chaque collection accepte un paramètre updated_since (un horodatage ISO-8601 en UTC) qui ne retourne que les enregistrements modifiés à cet instant ou après, plus un paramètre sort pour les parcourir du plus ancien au plus récent et avancer un repère au fur et à mesure.
Le flux d'étalonnages de tout le compte, GET /calibrations, est fait exactement pour ça : il retourne tous les étalonnages de tous vos instruments dans un seul flux paginé, alors vous n'avez pas à boucler instrument par instrument. Triez en ordre croissant par updated_at, parcourez les pages et retenez le created_at du dernier enregistrement vu. Le registre est en ajout seulement, alors un enregistrement d'étalonnage ne change jamais après son écriture et son created_at est son heure de dernière modification. sort=updated_at pointe vers cet instant.
À l'exécution suivante, passez cette valeur enregistrée comme updated_since. Chevauchez la frontière d'une seconde ou deux et dédoublonnez sur l'identifiant de l'enregistrement, par prudence contre les écarts d'horloge. N'enregistrez le repère qu'une fois la page traitée de façon durable.
Les instruments acceptent les mêmes paramètres updated_since et sort (GET /instruments), filtrés sur l'heure de dernière modification de l'instrument. Les lignes de la liste ne contiennent pas de champ d'horodatage. Pour les instruments, utilisez donc l'heure murale que vous avez notée juste avant la requête comme prochain updated_since. Le GET /instruments/{id} d'un seul instrument retourne created_at et updated_at si vous en avez besoin.
# First run: no watermark, oldest-first, page through.
GET /api/public/v1/calibrations?sort=updated_at&limit=100
# Save the created_at of the LAST record you processed, e.g.
# watermark = "2026-07-09T15:30:00Z"
# Next run: only what is new since the watermark.
GET /api/public/v1/calibrations?updated_since=2026-07-09T15:30:00Z&sort=updated_at&limit=100
Filtrer les instruments
GET /instruments accepte des filtres pour aller chercher une tranche précise plutôt que de parcourir tout le parc. asset_tag et serial_number cherchent une valeur exacte, ce qui est pratique pour rapprocher un seul instrument d'un enregistrement ERP. status filtre selon l'état du cycle de vie, par exemple active ou retired. site_id limite à un seul site.
Deux filtres découlent de l'état d'étalonnage. compliance_status filtre selon le jeton calculé, parmi COMPLIANT, WARNING, NON_COMPLIANT ou NOT_CALIBRATED. next_due_before prend une date (YYYY-MM-DD) et retourne les instruments dont le prochain étalonnage est dû avant cette date, soit la requête derrière une liste de travail des échéances proches ou en retard. Les filtres se combinent, alors vous pouvez demander les instruments actifs et non conformes d'un seul site en un seul appel.
# Everything overdue or due before a date, oldest instruments first:
GET /api/public/v1/instruments?compliance_status=NON_COMPLIANT&next_due_before=2026-08-01
# Reconcile one instrument by its asset tag:
GET /api/public/v1/instruments?asset_tag=MM-0042
Idempotence
Inscrire un étalonnage est la seule écriture qui ne doit jamais être dupliquée : le registre est en ajout seulement, alors il n'y a aucun moyen d'annuler un double envoi. C'est pourquoi POST /instruments/{id}/calibrations exige un en-tête Idempotency-Key (n'importe quelle chaîne unique que vous générez, par exemple un UUID). Il est requis, pas facultatif.
Si une requête est interrompue et que vous la réessayez avec la même clé, l'API retourne l'enregistrement déjà écrit au lieu d'en écrire un deuxième. Une clé absente retourne un 400 avec le code IDEMPOTENCY_KEY_REQUIRED. Générez une nouvelle clé pour chaque étalonnage que vous comptez enregistrer.
La création d'un instrument (POST /instruments) accepte aussi une Idempotency-Key, mais elle est facultative ici. Envoyez-en une et une reprise avec la même clé retourne l'instrument créé au premier appel plutôt qu'un doublon, exactement comme pour l'inscription d'un étalonnage. La seule différence, c'est que la clé n'est pas exigée. Si vous préférez ne pas gérer de clés pour les créations, dédoublonnez de votre côté avec l'asset_tag ou le serial_number de l'instrument, qui sont uniques dans un espace de travail, avant le POST.
Idempotency-Key: 6f9619ff-8b86-d011-b42d-00cf4fc964ff
Certificats
Chaque étalonnage approuvé a un certificat PDF à votre image. Allez le chercher avec GET /calibrations/{calibration_id}/certificate. La réponse est le PDF lui-même (Content-Type application/pdf) en pièce jointe, identique octet pour octet au certificat que produit l'application, pour que vous puissiez l'archiver ou le joindre à un bon de travail.
Un certificat n'existe que pour un étalonnage approuvé et courant. Si l'enregistrement est annulé, remplacé par une entrée plus récente ou autrement non certifiable, la requête retourne un 404 avec le code CERTIFICATE_UNAVAILABLE. Un identifiant d'étalonnage qui n'est pas le vôtre, ou qui n'existe pas, retourne un simple 404 qui ne révèle rien.
curl "https://axiospec.com/api/public/v1/calibrations/CALIBRATION_ID/certificate" \
-H "Authorization: Bearer ctk_your_api_key" \
-o certificate.pdf
Mettre un instrument hors service
Quand un instrument quitte le service, mettez-le hors service avec POST /instruments/{id}/retire (un appel en portée d'écriture). C'est une mise hors service sans suppression : le statut de l'instrument devient retired et il sort de la liste active par défaut, mais rien n'est supprimé et son historique d'étalonnage reste intact au registre pour l'audit. Il n'y a pas de suppression définitive dans l'API.
L'appel retourne l'instrument mis à jour. Il est idempotent : mettre hors service un instrument déjà hors service ne fait rien et retourne le même enregistrement, alors une reprise est toujours sûre. La mise hors service exige une clé de responsable ou d'administrateur. Une clé en lecture seule ou de technicien reçoit un 403.
curl -X POST "https://axiospec.com/api/public/v1/instruments/INSTRUMENT_ID/retire" \
-H "Authorization: Bearer ctk_your_api_key"
Pagination
Les points de terminaison de liste retournent une enveloppe uniforme. Parcourez les résultats avec les paramètres de requête limit et offset. total est le compte complet et has_more vous dit s'il existe une autre page.
{
"data": [ /* ... */ ],
"pagination": { "limit": 25, "offset": 0, "total": 142, "has_more": true }
}
Horodatages et fuseaux horaires
Chaque horodatage que retourne l'API est en ISO-8601 UTC, terminé par Z, par exemple 2026-07-09T15:30:00Z. Envoyez les horodatages de la même façon. Il n'y a aucune réponse en décalage ou en heure locale à normaliser.
Un champ est une date simple et non un horodatage : la date d'échéance d'étalonnage d'un instrument. Les dates d'échéance sont calculées dans le fuseau horaire configuré de votre espace de travail, alors une date d'échéance est le jour civil où elle tombe là-bas, et le filtre next_due_before prend une date (YYYY-MM-DD) plutôt qu'un horodatage. Si vos systèmes tournent dans un autre fuseau, comparez sur la date, pas sur un instant à minuit UTC.
L'enveloppe d'erreur
Chaque erreur, sur chaque point de terminaison, a la même forme JSON : un code lisible par la machine, un message lisible par une personne et, pour certaines erreurs, un objet details avec les précisions. Branchez sur code, jamais sur le texte du message, qui peut être reformulé. Le statut HTTP garde son sens (401 contre 403 contre 404), alors servez-vous-en aussi.
L'inscription d'un étalonnage applique aussi les champs exigés par les normes que votre espace de travail a sélectionnées. Si un champ requis est vide, la requête retourne un 422 avec le code FIELD_REQUIREMENTS_UNMET et un tableau missing_fields, où chaque entrée nomme le champ et la norme qui l'exige, pour que vous puissiez demander exactement ce qui manque.
{
"code": "FIELD_REQUIREMENTS_UNMET",
"message": "This calibration is missing fields your workspace's selected standard(s) require: measurement_uncertainty, decision_rule.",
"details": {
"missing_fields": [
{ "field": "measurement_uncertainty", "required_by": ["ISO/IEC 17025"] },
{ "field": "decision_rule", "required_by": ["ISO/IEC 17025"] }
]
}
}
Webhooks
Plutôt que d'interroger l'API à intervalle régulier pour découvrir ce qui a changé, abonnez une adresse de webhook une seule fois et Axiospec livre chaque événement à votre URL au moment où il se produit. Vous obtenez une latence plus faible et beaucoup moins de trafic gaspillé qu'en relisant des collections déjà vues, et vous ne manquez jamais un changement entre deux interrogations.
Abonnez-vous avec POST /webhooks, en passant une url et une liste facultative de types d'événements à recevoir. Omettez le champ events pour recevoir tous les événements (le catalogue complet est plus bas). La réponse retourne le secret de signature de l'adresse une seule fois et jamais plus, alors copiez-le directement dans votre coffre à secrets. La gestion des webhooks exige une clé d'écriture d'administrateur ou de responsable, parce que l'adresse reçoit les données d'étalonnage et d'instruments de votre espace de travail.
curl -X POST "https://axiospec.com/api/public/v1/webhooks" \
-H "Authorization: Bearer ctk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/hooks/axiospec",
"events": ["calibration.approved", "calibration.overdue"],
"description": "Sync approvals into our QMS"
}'
Chaque événement est livré par un POST HTTP dont le corps JSON est une enveloppe fixe : { "id", "type", "created_at", "data" }. Le id est l'identifiant stable de l'événement, envoyé aussi dans l'en-tête Axiospec-Event-Id, à côté de Axiospec-Event-Type, Axiospec-Webhook-Id et Axiospec-Delivery-Attempt. La livraison est au moins une fois, alors le même événement peut arriver plus d'une fois (après une reprise, par exemple). Dédoublonnez sur l'identifiant de l'enveloppe.
Une livraison est en échec pour toute réponse qui n'est pas un 2xx, et cela comprend une redirection 3xx : une redirection pourrait pointer vers une adresse interne, alors elle n'est jamais suivie. Les erreurs de transport et les dépassements de délai comptent aussi comme des échecs. Les livraisons en échec sont reprises selon un délai exponentiel qui s'étale sur environ trois jours, après quoi la livraison est marquée épuisée. Une adresse dont toutes les livraisons récentes s'épuisent est désactivée automatiquement, pour qu'une URL morte ou hostile cesse de consommer de la capacité. Les adresses doivent être en HTTPS, et une URL qui se résout vers une adresse privée ou interne est refusée à l'abonnement.
Examinez ce qui a été envoyé avec GET /webhooks/{id}/deliveries, qui pagine le journal de livraison d'une adresse et accepte un filtre status (pending, failed, succeeded, exhausted). Pour rejouer une livraison, POST /webhooks/{id}/deliveries/{delivery_id}/retry : la livraison repasse à pending et devient due immédiatement, alors le prochain envoi la renvoie, avec un nouvel horizon de reprise. Changez le secret d'une adresse avec POST /webhooks/{id}/rotate-secret (l'ancien secret cesse de valider aussitôt), et arrêtez les livraisons avec DELETE /webhooks/{id}.
Catalogue des événements de webhook
Voici les types d'événements auxquels un webhook peut s'abonner. Nommez ceux que vous voulez au moment de l'abonnement, ou omettez le champ events pour tous les recevoir. Le même catalogue est offert à GET /webhooks/events pour une découverte par programme.
calibration.created
calibration.approved
calibration.rejected
calibration.corrected
calibration.voided
calibration.due_soon
calibration.overdue
instrument.created
instrument.updated
instrument.retired
instrument.status_changed
Vérifier les signatures de webhook
Chaque livraison porte un en-tête Axiospec-Signature de la forme t=<unix-seconds>,v1=<hex>. Vérifiez-le avant de faire confiance à un contenu : une signature valide prouve que la requête vient d'Axiospec et que le corps n'a pas été modifié en chemin.
Lisez l'en-tête Axiospec-Signature et séparez-le à la virgule en sa partie t= (un horodatage Unix en secondes) et sa partie v1= (un HMAC en hexadécimal minuscule). Recalculez un HMAC-SHA256, avec le secret de signature de votre adresse comme clé, sur la chaîne formée de l'horodatage, d'un point littéral et du corps brut exact de la requête, soit f"{t}.{raw_body}". Comparez votre empreinte hexadécimale à la valeur v1 avec une comparaison à temps constant, jamais avec une égalité ordinaire.
Signez les octets bruts exactement tels que reçus, avant toute analyse JSON ou re-sérialisation, pour que votre entrée corresponde à ce qui a été signé. Rejetez la livraison si les empreintes ne correspondent pas, ou si t a plus de cinq minutes environ, ce qui borne la durée pendant laquelle une requête capturée pourrait être rejouée contre vous.
# Axiospec-Signature: t=1720625400,v1=3f6a9c...e1
t, v1 = split the header on "," then read the "t=" and "v1=" values
signed = t + "." + raw_request_body # the exact bytes received
expected = hex(hmac_sha256(secret, signed)) # lowercase hex digest
if not constant_time_equals(expected, v1):
reject # signature mismatch, do not trust the payload
if now_unix_seconds() - int(t) > 300:
reject # older than ~5 minutes, treat as a possible replay
accept # then dedupe on the envelope id (Axiospec-Event-Id)
Essayez : deux exemples
Remplacez ctk_your_api_key par votre clé et INSTRUMENT_ID par l'identifiant d'un instrument tiré de l'appel de liste.
1. Lister les instruments
curl "https://axiospec.com/api/public/v1/instruments?status=active&limit=25" \
-H "Authorization: Bearer ctk_your_api_key"
2. Inscrire un étalonnage
Notez l'en-tête Idempotency-Key obligatoire. Une reprise avec la même clé retourne l'enregistrement déjà écrit au lieu d'inscrire un doublon.
curl -X POST "https://axiospec.com/api/public/v1/instruments/INSTRUMENT_ID/calibrations" \
-H "Authorization: Bearer ctk_your_api_key" \
-H "Idempotency-Key: 6f9619ff-8b86-d011-b42d-00cf4fc964ff" \
-H "Content-Type: application/json" \
-d '{
"result": "PASS",
"performed_at": "2026-07-09T15:30:00Z",
"nominal_value": "10.00 V",
"tolerance": "±0.1%",
"as_found_reading": "10.01 V",
"as_left_reading": "10.00 V",
"certificate_number": "CERT-2026-0142"
}'
Codes d'erreur
Chaque code que retourne l'API, son statut HTTP et ce qu'il veut dire. Branchez sur le code.
| Code | HTTP | Signification |
|---|---|---|
| UNAUTHORIZED | 401 | Aucune clé API, ou la clé est invalide, révoquée ou expirée. |
| API_ACCESS_TIER_REQUIRED | 403 | L'espace de travail est sur le forfait gratuit ou Starter. L'API exige Professional ou plus. |
| INSUFFICIENT_SCOPE | 403 | Une clé en lecture seule a tenté une écriture. Émettez une clé en portée d'écriture. |
| ACCESS_ENDED | 403 | La clé appartient à un auditeur dont la date de fin d'accès est passée. Un administrateur de l'espace de travail peut modifier ou supprimer la date de fin. |
| FORBIDDEN | 403 | La clé est valide, mais l'action n'est pas permise pour son rôle, par exemple une clé sans rôle de responsable qui met un instrument hors service. |
| INSUFFICIENT_ROLE | 403 | L'action exige un rôle d'administrateur ou de responsable et le rôle de la clé est inférieur, par exemple une clé de technicien qui gère un webhook. |
| NOT_FOUND | 404 | La ressource n'existe pas, ou elle est hors de la portée de client ou de site de cette clé. Retournée de façon identique dans les deux cas, pour que rien ne fuite. |
| CERTIFICATE_UNAVAILABLE | 404 | L'étalonnage existe, mais il n'est pas certifiable (non approuvé, annulé ou remplacé). |
| IDEMPOTENCY_KEY_REQUIRED | 400 | Une inscription d'étalonnage a été envoyée sans l'en-tête Idempotency-Key obligatoire. |
| INVALID_REQUEST | 400 ou 422 | Une requête mal formée ou qui a échoué à une validation codée, par exemple un jeton de requête invalide, une clé de document inutilisable ou un champ de webhook invalide. La validation des documents et des webhooks retourne 422. Une requête invalide générique retourne 400. Branchez sur le code, le statut est secondaire. |
| VALIDATION_ERROR | 422 | Un ou plusieurs champs ont échoué à la validation. details.errors liste chaque champ et la raison. |
| FIELD_REQUIREMENTS_UNMET | 422 | Un étalonnage n'avait pas un champ exigé par la ou les normes que vous avez sélectionnées. details.missing_fields les liste. |
| INVALID_WEBHOOK_URL | 422 | L'url du webhook est inutilisable : elle doit être en HTTPS, et une URL qui se résout vers une adresse privée ou interne est refusée. |
| CONFLICT | 409 | La requête entre en conflit avec l'état actuel de la ressource. |
| WEBHOOK_LIMIT_REACHED | 409 | L'espace de travail a déjà le nombre maximal d'adresses de webhook. Supprimez-en une avant d'en ajouter une autre. |
| DELIVERY_CONFLICT | 409 | Une livraison de webhook ne peut pas être reprise dans son état actuel, par exemple rejouer une livraison qui n'est pas encore résolue. |
| OBJECT_NOT_UPLOADED | 409 | Un document a été enregistré pour une clé dont le fichier n'a jamais été téléversé. Téléversez d'abord le fichier vers l'URL présignée, puis enregistrez-le. |
| METHOD_NOT_ALLOWED | 405 | Cette méthode HTTP n'est pas prise en charge sur ce chemin. |
| RATE_LIMITED | 429 | La limite de 120 par minute a été dépassée. Attendez les secondes indiquées par Retry-After, puis réessayez. |
| INTERNAL_ERROR | 500 | Une erreur serveur inattendue. Une lecture peut être reprise sans risque. Reprenez une inscription d'étalonnage avec la même Idempotency-Key. |
Versions et stabilité
C'est la v1, reflétée dans le chemin de base /api/public/v1. C'est un contrat choisi et stable, tenu délibérément à l'écart des points de terminaison internes qu'utilisent les applications.
Les ajouts ne cassent rien, et nous les faisons sans changer de version : nouveaux points de terminaison, nouveaux champs facultatifs de requête, nouveaux champs dans une réponse et nouvelles valeurs dans un champ énuméré (par exemple un nouveau jeton compliance_status). Écrivez votre client pour les tolérer. Ignorez les champs de réponse que vous ne reconnaissez pas plutôt que d'échouer, et traitez une valeur d'énumération inconnue comme une chaîne à laisser passer plutôt que comme une erreur bloquante.
Les changements cassants, que nous évitons, seraient de retirer ou de renommer un champ, de changer le type d'un champ ou de changer le sens d'un point de terminaison. S'il nous fallait un jour en faire un, il arriverait sous un nouveau chemin de version (/api/public/v2), l'ancienne version continuerait de fonctionner pendant une période de retrait clairement annoncée, et nous l'annoncerions dans le journal des modifications ci-dessous avant de retirer quoi que ce soit.
Rotation et conservation des clés
Une clé n'est affichée en entier qu'une seule fois, au moment où vous la créez. Nous ne conservons qu'une empreinte salée (SHA-256), jamais la clé elle-même, alors elle ne peut pas être récupérée ni vous être envoyée plus tard. Copiez-la dans votre coffre à secrets à ce moment-là. L'application peut vous montrer ensuite un préfixe non secret (ctk_AbC1…) pour vous aider à distinguer vos clés, mais jamais la clé complète.
Pour changer une clé, créez-en une nouvelle, déployez-la, puis révoquez l'ancienne. La révocation est immédiate et définitive : la clé est désactivée (jamais supprimée définitivement, pour que votre historique d'audit reste intact) et chaque requête ultérieure avec celle-ci retourne 401 UNAUTHORIZED. Émettez une clé distincte par intégration et des clés en lecture seule pour tout ce qui ne fait que produire des rapports, pour pouvoir en changer ou en révoquer une sans déranger les autres.
Journal des modifications
v1.1 2026-07-10
- Webhooks : abonnez-vous aux événements (étalonnage inscrit ou approuvé, instrument bientôt dû ou en retard, et plus) avec une livraison signée par HMAC et reprise en cas d'échec.
- Champs exigés : GET /standards/field-requirements publie les champs d'étalonnage qu'exigent les normes que vous avez sélectionnées, pour que vous puissiez bâtir un contenu d'étalonnage valide avant le POST.
- Liste de travail des échéances : GET /due retourne les instruments dus ou en retard à l'intérieur d'un horizon, chacun avec son état de conformité faisant autorité, pour la planification et les tableaux de bord.
- Marqueurs de suppression : passez include=retired (instruments) ou include=voided (étalonnages) sur les flux incrémentiels pour qu'un enregistrement mis hors service ou annulé apparaisse dans le delta au lieu de disparaître en silence. Désactivé par défaut. Les synchronisations existantes ne changent pas.
- Pièces jointes : demandez une URL de téléversement présignée, joignez un document à un instrument (ou à un étalonnage précis), listez les documents d'un enregistrement et obtenez une URL de téléchargement à courte durée.
v1 2026-07-09
- Synchronisation incrémentielle : updated_since et sort sur les instruments et les étalonnages, plus un flux GET /calibrations pour tout le compte.
- Filtres d'instruments : asset_tag, serial_number, compliance_status et next_due_before.
- Récupération de certificat : GET /calibrations/{id}/certificate retourne le PDF de l'étalonnage.
- Mise hors service d'instrument : POST /instruments/{id}/retire met un instrument hors service sans rien supprimer, en laissant le registre intact.
- En-têtes de limite de débit (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, et Retry-After sur un 429) sur chaque réponse.
- Une enveloppe d'erreur uniforme ({ code, message, details? }) sur chaque point de terminaison.
v1 Version initiale
- Lire et créer des instruments, inscrire des étalonnages au registre à détection d'altération, et lire les sites et les normes sélectionnées.
- Authentification Bearer ou X-API-Key, portées de lecture et d'écriture, accès à partir de Professional, limite de 120 par minute et enveloppe de liste paginée.
Référence
La référence REST complète
Chaque point de terminaison, paramètre, corps de requête et réponse, généré à partir de la spécification OpenAPI de l'API et rendu comme une référence plein écran avec recherche.
La référence s'ouvre dans un nouvel onglet, avec un navigateur de recherche, les schémas de requête et de réponse, et des exemples à copier-coller pour chaque opération. Vous préférez générer un client? La spécification OpenAPI ci-dessus alimente les générateurs de code dans tous les grands langages.