Zum Inhalt springen

Entwickler

Bauen Sie auf Ihren Kalibrierdaten auf.

Die öffentliche API von Axiospec ist eine REST-Schnittstelle zu Ihren Messmitteln und Kalibrierdatensätzen. Lesen und erstellen Sie Messmittel, schreiben Sie Kalibrierungen in das manipulationserkennbare Journal und holen Sie Ihre Standorte und Normen in eigene Systeme. Authentifizieren Sie sich mit einem API-Schlüssel des Arbeitsbereichs und los geht es.

Erste Schritte

Alles, was Sie vor dem ersten Aufruf brauchen

Lesen Sie das einmal, dann öffnen Sie die vollständige interaktive Referenz für die genaue Form von Anfrage und Antwort jedes Endpunkts.

Was die API kann

Die öffentliche API von Axiospec ist eine REST-Schnittstelle zu Ihrem Kalibrierprogramm. Lesen und erstellen Sie Messmittel, schreiben Sie Kalibrierungen in das manipulationserkennbare Journal und lesen Sie die Standorte Ihres Arbeitsbereichs sowie die von Ihnen gewählten Normen.

Sie ist ein kuratierter, stabiler Vertrag, getrennt von den internen Endpunkten der Web- und Mobil-Apps. So funktioniert Ihre Integration weiter, während sich das Produkt entwickelt. Jede Antwort ist JSON.

Basis-URL

Alle Endpunkte liegen unter einer einzigen Basis-URL. Jeder Pfad in der Referenz unten ist relativ dazu.

https://axiospec.com/api/public/v1

Authentifizierung

Authentifizieren Sie jede Anfrage mit einem API-Schlüssel je Arbeitsbereich. Eine Administration des Arbeitsbereichs legt ihn in der App unter Einstellungen und dann API-Schlüssel an. Schlüssel werden nur einmal bei der Erstellung angezeigt und beginnen mit ctk_. Speichern Sie den Schlüssel als Geheimnis und liefern Sie ihn nie in Code aus, der im Browser läuft.

Senden Sie den Schlüssel bei jeder Anfrage als Bearer-Token:

Authorization: Bearer ctk_your_api_key

Ein übliches Kopffeld X-API-Key wird ebenfalls akzeptiert, wenn Sie das bevorzugen: X-API-Key: ctk_your_api_key. Eine Anfrage ohne Schlüssel liefert 401.

Voraussetzung beim Tarif

Die API steht ab dem Tarif Professional zur Verfügung. Ein Schlüssel aus einem Arbeitsbereich im Free- oder Starter-Tarif erhält 403 mit dem Code API_ACCESS_TIER_REQUIRED. Wechseln Sie den Tarif des Arbeitsbereichs, um sie freizuschalten.

Berechtigungsbereiche

Jeder Schlüssel wird mit einem Berechtigungsbereich ausgegeben. Ein Lese-Schlüssel kann auflisten und abrufen. Ein Schreib-Schlüssel kann zusätzlich Messmittel anlegen, ändern und Kalibrierungen schreiben. Schreiben schließt Lesen immer ein.

Ein reiner Lese-Schlüssel, der zu schreiben versucht, erhält 403 mit dem Code INSUFFICIENT_SCOPE und der Angabe des nötigen Bereichs. Geben Sie für Auswertungsintegrationen reine Lese-Schlüssel aus, damit sie nie einen Datensatz ändern können.

Ratenbegrenzung und ihre Kopffelder

Anfragen sind auf 120 pro Minute begrenzt, gezählt je API-Schlüssel statt je IP-Adresse. So kann eine Integration keine andere aushungern, und viele Schlüssel hinter einem Büronetz werden nicht gemeinsam gedrosselt.

Jede Antwort der API trägt das aktuelle Zeitfenster als Kopffelder, damit Sie sich ohne Raten einteilen können. X-RateLimit-Limit ist die Obergrenze (120), X-RateLimit-Remaining sagt, wie viele Anfragen im aktuellen Fenster übrig sind, und X-RateLimit-Reset nennt die Sekunden, bis das Fenster zurückgesetzt wird und Remaining wieder auf der vollen Grenze steht.

Wird die Grenze überschritten, kommt 429 mit dem Code RATE_LIMITED. Bei der 429 nennt ein Kopffeld Retry-After (in Sekunden) genau die Wartezeit. Halten Sie sich daran und wiederholen Sie dann. Diese Kopffelder zu lesen statt eine feste Wartezeit einzubauen, hält Sie schnell, wenn Luft ist, und höflich, wenn nicht.

X-RateLimit-Limit: 120
X-RateLimit-Remaining: 118
X-RateLimit-Reset: 41
Retry-After: 41   (present only on a 429)

Inkrementeller Abgleich

Damit ein externes System im Takt bleibt, ohne alles neu zu lesen, holen Sie nur das, was sich seit dem letzten Lauf geändert hat. Jede Sammlung nimmt einen Parameter updated_since (ein ISO-8601-Zeitstempel in UTC) und liefert nur Datensätze, die zu diesem Zeitpunkt oder danach geändert wurden. Dazu gibt es einen Parameter sort, mit dem Sie sie von alt nach neu durchgehen und dabei eine Marke vorrücken.

Der arbeitsbereichsweite Kalibrierstrom GET /calibrations ist genau dafür gebaut. Er liefert alle Kalibrierungen über alle Messmittel in einem seitenweisen Strom, Sie müssen also nicht Messmittel für Messmittel schleifen. Sortieren Sie aufsteigend nach updated_at, blättern Sie durch und merken Sie sich created_at des zuletzt gesehenen Datensatzes. Das Journal wird nur angehängt, ein Kalibrierdatensatz ändert sich nach dem Schreiben also nie und sein created_at ist zugleich seine letzte Änderung. sort=updated_at zeigt auf denselben Zeitpunkt.

Übergeben Sie diesen gespeicherten Wert im nächsten Lauf als updated_since. Überlappen Sie die Grenze um ein oder zwei Sekunden und entdoppeln Sie über die Datensatz-ID, damit eine abweichende Uhr nichts kostet. Speichern Sie die Marke erst, wenn Sie die Seite dauerhaft verarbeitet haben.

Messmittel unterstützen dieselben Parameter updated_since und sort (GET /instruments) und filtern über die letzte Änderung des Messmittels. Die Listenzeilen enthalten kein Zeitstempelfeld. Nehmen Sie für Messmittel deshalb die Uhrzeit, die Sie unmittelbar vor der Anfrage festgehalten haben, als nächstes updated_since. Das einzelne GET /instruments/{id} liefert created_at und updated_at, falls Sie sie brauchen.

# 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

Messmittel filtern

GET /instruments nimmt Filter, damit Sie einen genauen Ausschnitt holen statt die ganze Liste zu blättern. asset_tag und serial_number treffen einen exakten Wert, praktisch für den Abgleich eines einzelnen Messmittels gegen einen ERP-Datensatz. status filtert nach dem Zustand im Lebenszyklus, zum Beispiel active oder retired. site_id grenzt auf einen Standort ein.

Zwei Filter leiten sich aus dem Kalibrierzustand ab. compliance_status filtert nach dem berechneten Kennwert, einem von COMPLIANT, WARNING, NON_COMPLIANT oder NOT_CALIBRATED. next_due_before nimmt ein Datum (YYYY-MM-DD) und liefert Messmittel, deren nächste Kalibrierung davor fällig ist. Das ist die Abfrage hinter einer Liste für bald fällige oder überfällige Arbeit. Filter lassen sich kombinieren, Sie können also aktive, nicht konforme Messmittel an einem Standort in einem einzigen Aufruf abfragen.

# 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

Idempotenz

Eine Kalibrierung zu schreiben ist der eine Schreibvorgang, der sich nie verdoppeln darf. Das Journal wird nur angehängt, eine doppelte Buchung lässt sich also nicht rückgängig machen. Deshalb verlangt POST /instruments/{id}/calibrations ein Kopffeld Idempotency-Key (eine beliebige eindeutige Zeichenkette, die Sie erzeugen, zum Beispiel eine UUID). Es ist Pflicht, nicht optional.

Wird eine Anfrage unterbrochen und Sie wiederholen sie mit demselben Schlüssel, liefert die API den bereits geschriebenen Datensatz zurück, statt einen zweiten zu schreiben. Ein fehlender Schlüssel liefert 400 mit dem Code IDEMPOTENCY_KEY_REQUIRED. Erzeugen Sie je Kalibrierung, die Sie erfassen wollen, einen frischen Schlüssel.

Auch das Anlegen eines Messmittels (POST /instruments) beachtet einen Idempotency-Key, hier ist er aber optional. Senden Sie einen, dann liefert eine Wiederholung mit demselben Schlüssel das Messmittel aus dem ersten Aufruf statt eines Duplikats, genau wie beim Schreiben einer Kalibrierung. Der einzige Unterschied ist, dass der Schlüssel nicht verlangt wird. Wenn Sie beim Anlegen lieber keine Schlüssel verwalten, entdoppeln Sie vor dem POST auf Ihrer Seite über asset_tag oder serial_number des Messmittels, die innerhalb eines Arbeitsbereichs eindeutig sind.

Idempotency-Key: 6f9619ff-8b86-d011-b42d-00cf4fc964ff

Kalibrierscheine

Zu jeder freigegebenen Kalibrierung gehört ein gestalteter PDF-Kalibrierschein. Holen Sie ihn mit GET /calibrations/{calibration_id}/certificate. Die Antwort ist das PDF selbst (Content-Type application/pdf) als Anhang, Byte für Byte identisch mit dem Schein aus der App. So können Sie ihn archivieren oder an einen Auftrag hängen.

Ein Kalibrierschein besteht nur zu einer freigegebenen, aktuellen Kalibrierung. Ist der Datensatz für ungültig erklärt, durch einen späteren Eintrag ersetzt oder sonst nicht bescheinigungsfähig, liefert die Anfrage 404 mit dem Code CERTIFICATE_UNAVAILABLE. Eine Kalibrier-ID, die nicht Ihnen gehört oder nicht existiert, liefert eine schlichte 404, die nichts darüber verrät.

curl "https://axiospec.com/api/public/v1/calibrations/CALIBRATION_ID/certificate" \
  -H "Authorization: Bearer ctk_your_api_key" \
  -o certificate.pdf

Ein Messmittel ausmustern

Verlässt ein Messmittel den Betrieb, mustern Sie es mit POST /instruments/{id}/retire aus, ein Aufruf mit Schreibrecht. Das ist eine weiche Außerbetriebnahme: Der Status des Messmittels wird retired und es fällt aus der Standardliste der aktiven Messmittel. Gelöscht wird nichts, und seine Kalibrierhistorie im Journal bleibt für das Audit vollständig erhalten. Ein hartes Löschen gibt es in der API nicht.

Der Aufruf liefert das aktualisierte Messmittel zurück. Er ist idempotent: Ein bereits ausgemustertes Messmittel auszumustern bleibt folgenlos und liefert denselben ausgemusterten Datensatz, eine Wiederholung ist also immer sicher. Ausmustern verlangt einen Schlüssel mit Manager- oder Administratorrolle. Ein reiner Lese-Schlüssel oder ein Technikerschlüssel erhält 403.

curl -X POST "https://axiospec.com/api/public/v1/instruments/INSTRUMENT_ID/retire" \
  -H "Authorization: Bearer ctk_your_api_key"

Zeitstempel und Zeitzonen

Jeder Zeitstempel, den die API liefert, ist ISO-8601 in UTC und endet auf Z, zum Beispiel 2026-07-09T15:30:00Z. Senden Sie Zeitstempel genauso. Es gibt keine Antworten mit Zeitverschiebung oder Ortszeit, die Sie normalisieren müssten.

Ein Feld ist ein reines Datum, kein Zeitstempel: das Fälligkeitsdatum der Kalibrierung eines Messmittels. Fälligkeiten werden in der eingestellten Zeitzone Ihres Arbeitsbereichs berechnet, ein Fälligkeitsdatum ist also der dortige Kalendertag, und der Filter next_due_before nimmt ein Datum (YYYY-MM-DD) statt eines Zeitstempels. Laufen Ihre Systeme in einer anderen Zone, vergleichen Sie auf das Datum, nicht auf einen Zeitpunkt um Mitternacht UTC.

Der Fehlerumschlag

Jeder Fehler hat an jedem Endpunkt dieselbe JSON-Form: einen maschinenlesbaren code, eine menschenlesbare message und bei manchen Fehlern ein Objekt details mit den Einzelheiten. Verzweigen Sie auf code, nie auf den Text der message, der umformuliert werden kann. Der HTTP-Status trägt weiterhin Bedeutung (401 gegenüber 403 gegenüber 404), nutzen Sie ihn also ebenfalls.

Beim Schreiben einer Kalibrierung werden auch die Feldanforderungen der von Ihrem Arbeitsbereich gewählten Normen durchgesetzt. Fehlt ein Pflichtfeld, liefert die Anfrage 422 mit dem Code FIELD_REQUIREMENTS_UNMET und einem Feld missing_fields, in dem jeder Eintrag das Feld und die fordernde Norm nennt. So können Sie genau danach fragen, was fehlt.

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

Statt die API im Takt abzufragen, um Änderungen zu finden, melden Sie einmal einen Webhook-Endpunkt an. Axiospec liefert dann jedes Ereignis an Ihre URL, sobald es passiert. Das ist schneller und spart viel unnötigen Verkehr gegenüber dem erneuten Lesen von Sammlungen, die Sie schon kennen. Und keine Änderung geht zwischen zwei Abfragen verloren.

Melden Sie sich mit POST /webhooks an und übergeben Sie eine url sowie optional eine Liste der gewünschten Ereignistypen. Lassen Sie das Feld events weg, um jedes Ereignis zu erhalten. Der vollständige Katalog steht unten. Die Antwort liefert das Signaturgeheimnis des Endpunkts genau einmal und nie wieder, kopieren Sie es also direkt in Ihren Geheimnisspeicher. Die Verwaltung von Webhooks braucht einen Schreib-Schlüssel mit Administrator- oder Managerrolle, denn der Endpunkt empfängt die Kalibrier- und Messmitteldaten Ihres Arbeitsbereichs.

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

Jedes Ereignis wird als HTTP-POST geliefert, dessen JSON-Rumpf ein fester Umschlag ist: { "id", "type", "created_at", "data" }. Die id ist die stabile Ereignis-ID und wird zusätzlich als Kopffeld Axiospec-Event-Id gesendet, neben Axiospec-Event-Type, Axiospec-Webhook-Id und Axiospec-Delivery-Attempt. Zugestellt wird mindestens einmal, dasselbe Ereignis kann also mehrfach ankommen, etwa nach einer Wiederholung. Entdoppeln Sie über die id im Umschlag.

Eine Zustellung gilt bei jeder Antwort als fehlgeschlagen, die keine 2xx ist, und dazu zählt eine 3xx-Weiterleitung: Eine Weiterleitung könnte auf eine interne Adresse zeigen, deshalb wird ihr nie gefolgt. Transportfehler und Zeitüberschreitungen zählen ebenfalls als Fehlschlag. Fehlgeschlagene Zustellungen werden mit wachsendem Abstand über etwa drei Tage wiederholt, danach gilt die Zustellung als erschöpft. Ein Endpunkt, dessen jüngste Zustellungen alle erschöpfen, wird automatisch abgeschaltet, damit eine tote oder feindliche URL keine Kapazität mehr verbraucht. Endpunkte müssen HTTPS sein, und eine URL, die auf eine private oder interne Adresse auflöst, wird bei der Anmeldung abgelehnt.

Sehen Sie mit GET /webhooks/{id}/deliveries nach, was gesendet wurde. Der Aufruf blättert durch das Zustellprotokoll eines Endpunkts und nimmt einen Filter status (pending, failed, succeeded, exhausted). Um eine Zustellung zu wiederholen, rufen Sie POST /webhooks/{id}/deliveries/{delivery_id}/retry auf: Damit steht sie wieder auf pending und ist sofort fällig, der nächste Versand schickt sie also erneut, mit frischem Wiederholungszeitraum. Tauschen Sie das Geheimnis eines Endpunkts mit POST /webhooks/{id}/rotate-secret, das alte Geheimnis verifiziert sofort nicht mehr. Zustellungen stoppen Sie mit DELETE /webhooks/{id}.

Katalog der Webhook-Ereignisse

Das sind die Ereignistypen, die ein Webhook abonnieren kann. Nennen Sie bei der Anmeldung die gewünschten, oder lassen Sie das Feld events weg, um alle zu erhalten. Derselbe Katalog steht unter GET /webhooks/events für den programmatischen Abruf bereit.

calibration.created
calibration.approved
calibration.rejected
calibration.corrected
calibration.voided
calibration.due_soon
calibration.overdue
instrument.created
instrument.updated
instrument.retired
instrument.status_changed

Webhook-Signaturen prüfen

Jede Zustellung trägt ein Kopffeld Axiospec-Signature in der Form t=<unix-seconds>,v1=<hex>. Prüfen Sie es, bevor Sie einer Nutzlast vertrauen. Eine gültige Signatur belegt, dass die Anfrage von Axiospec stammt und der Rumpf unterwegs nicht verändert wurde.

Lesen Sie das Kopffeld Axiospec-Signature und trennen Sie es am Komma in den Teil t= (ein Unix-Zeitstempel in Sekunden) und den Teil v1= (ein HMAC in Kleinbuchstaben-Hex). Berechnen Sie HMAC-SHA256 neu, mit dem Signaturgeheimnis Ihres Endpunkts als Schlüssel, über die Zeichenkette aus Zeitstempel, einem Punkt und dem exakten rohen Anfragerumpf, also f"{t}.{raw_body}". Vergleichen Sie Ihren Hex-Wert mit dem Wert aus v1 in konstanter Zeit, nie mit einem gewöhnlichen Gleichheitstest.

Signieren Sie die rohen Bytes genau so, wie sie ankommen, vor jedem Auswerten oder erneuten Serialisieren von JSON, damit Ihre Eingabe dem entspricht, was signiert wurde. Weisen Sie die Zustellung zurück, wenn die Werte nicht übereinstimmen oder wenn t älter als etwa fünf Minuten ist. Das begrenzt, wie lange eine abgefangene Anfrage gegen Sie wiedereingespielt werden könnte.

# 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)

Ausprobieren: zwei Beispiele

Ersetzen Sie ctk_your_api_key durch Ihren Schlüssel und INSTRUMENT_ID durch eine Messmittel-ID aus dem Listenaufruf.

1. Messmittel auflisten

curl "https://axiospec.com/api/public/v1/instruments?status=active&limit=25" \
  -H "Authorization: Bearer ctk_your_api_key"

2. Eine Kalibrierung erfassen

Beachten Sie das erforderliche Kopffeld Idempotency-Key. Eine Wiederholung mit demselben Schlüssel liefert den bereits geschriebenen Datensatz zurück, statt ein Duplikat zu erfassen.

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

Fehlercodes

Jeder Code, den die API liefert, sein HTTP-Status und seine Bedeutung. Verzweigen Sie auf den Code.

Code HTTP Bedeutung
UNAUTHORIZED 401 Kein API-Schlüssel, oder der Schlüssel ist ungültig, widerrufen oder abgelaufen.
API_ACCESS_TIER_REQUIRED 403 Der Arbeitsbereich ist im Free- oder Starter-Tarif. Die API braucht Professional oder höher.
INSUFFICIENT_SCOPE 403 Ein reiner Lese-Schlüssel hat zu schreiben versucht. Geben Sie einen Schlüssel mit Schreibrecht aus.
ACCESS_ENDED 403 Der Schlüssel gehört einem Auditor, dessen Enddatum für den Zugriff überschritten ist. Ein Administrator des Arbeitsbereichs kann das Enddatum ändern oder entfernen.
FORBIDDEN 403 Der Schlüssel ist gültig, aber die Aktion ist für seine Rolle nicht erlaubt, zum Beispiel ein Schlüssel ohne Managerrolle, der ein Messmittel ausmustert.
INSUFFICIENT_ROLE 403 Die Aktion braucht die Rolle Administrator oder Manager und die Rolle des Schlüssels liegt darunter, zum Beispiel ein Technikerschlüssel, der einen Webhook verwaltet.
NOT_FOUND 404 Die Ressource existiert nicht oder liegt außerhalb des Mandanten- oder Standortbereichs dieses Schlüssels. In beiden Fällen identisch, damit nichts durchsickert.
CERTIFICATE_UNAVAILABLE 404 Die Kalibrierung existiert, ist aber nicht bescheinigungsfähig (nicht freigegeben, für ungültig erklärt oder ersetzt).
IDEMPOTENCY_KEY_REQUIRED 400 Eine Kalibrierung wurde ohne das erforderliche Kopffeld Idempotency-Key gesendet.
INVALID_REQUEST 400 oder 422 Eine Anfrage war fehlerhaft aufgebaut oder hat eine kodierte Prüfung nicht bestanden, zum Beispiel ein falsches Abfragekennwort, ein unbrauchbarer Dokumentschlüssel oder ein ungültiges Webhook-Feld. Dokument- und Webhook-Prüfung liefern 422, eine allgemeine Fehlanfrage liefert 400. Verzweigen Sie auf den Code, der Status ist zweitrangig.
VALIDATION_ERROR 422 Ein oder mehrere Felder haben die Prüfung nicht bestanden. details.errors nennt jedes Feld und den Grund.
FIELD_REQUIREMENTS_UNMET 422 Einer Kalibrierung fehlte ein Feld, das Ihre gewählten Normen verlangen. details.missing_fields listet sie auf.
INVALID_WEBHOOK_URL 422 Die url des Webhooks ist nicht nutzbar: Sie muss HTTPS sein, und eine URL, die auf eine private oder interne Adresse auflöst, wird abgelehnt.
CONFLICT 409 Die Anfrage steht im Widerspruch zum aktuellen Zustand der Ressource.
WEBHOOK_LIMIT_REACHED 409 Der Arbeitsbereich hat bereits die Höchstzahl an Webhook-Endpunkten. Löschen Sie einen, bevor Sie einen weiteren anlegen.
DELIVERY_CONFLICT 409 Eine Webhook-Zustellung lässt sich in ihrem aktuellen Zustand nicht wiederholen, zum Beispiel eine Zustellung, die noch nicht abgeschlossen ist.
OBJECT_NOT_UPLOADED 409 Ein Dokument wurde für einen Schlüssel registriert, dessen Datei nie hochgeladen wurde. Laden Sie die Datei zuerst auf die vorsignierte URL und registrieren Sie sie dann.
METHOD_NOT_ALLOWED 405 Diese HTTP-Methode wird auf diesem Pfad nicht unterstützt.
RATE_LIMITED 429 Die Grenze von 120 pro Minute wurde überschritten. Warten Sie die Sekunden aus Retry-After ab und wiederholen Sie dann.
INTERNAL_ERROR 500 Ein unerwarteter Serverfehler. Ein Lesevorgang kann gefahrlos wiederholt werden. Wiederholen Sie das Schreiben einer Kalibrierung mit demselben Idempotency-Key.

Versionierung und Stabilität

Dies ist v1, sichtbar im Basispfad /api/public/v1. Es ist ein kuratierter, stabiler Vertrag, bewusst getrennt von den internen Endpunkten der Apps.

Ergänzende Änderungen brechen nichts, und wir nehmen sie ohne Versionswechsel vor: neue Endpunkte, neue optionale Felder in Anfragen, neue Felder in einer Antwort und neue Werte in einem Aufzählungsfeld, zum Beispiel ein neuer Kennwert für compliance_status. Schreiben Sie Ihren Client so, dass er sie verträgt. Ignorieren Sie Antwortfelder, die Sie nicht kennen, statt zu scheitern, und behandeln Sie einen unbekannten Aufzählungswert als durchgereichte Zeichenkette statt als harten Fehler.

Brechende Änderungen, die wir vermeiden, wären das Entfernen oder Umbenennen eines Felds, das Ändern seines Typs oder das Ändern der Bedeutung eines Endpunkts. Müssten wir je eine vornehmen, käme sie unter einem neuen Versionspfad (/api/public/v2). Die alte Version liefe über eine klar angekündigte Auslauffrist weiter, und wir würden sie im Änderungsprotokoll unten ankündigen, bevor irgendetwas entfällt.

Schlüssel tauschen und aufbewahren

Ein Schlüssel wird genau einmal vollständig angezeigt, im Moment der Erstellung. Wir speichern nur einen gesalzenen Hash (SHA-256), nie den Schlüssel selbst. Er lässt sich also später nicht wiederherstellen oder zusenden. Kopieren Sie ihn dann in Ihren Geheimnisspeicher. Die App kann Ihnen danach ein nicht geheimes Präfix zeigen (ctk_AbC1…), damit Sie Schlüssel auseinanderhalten, aber nie wieder den ganzen Schlüssel.

Zum Tauschen legen Sie einen neuen Schlüssel an, rollen ihn aus und widerrufen dann den alten. Der Widerruf wirkt sofort und dauerhaft. Der Schlüssel wird deaktiviert, nie hart gelöscht, damit Ihre Audithistorie vollständig bleibt, und jede spätere Anfrage mit ihm liefert 401 UNAUTHORIZED. Geben Sie je Integration eigene Schlüssel aus und reine Lese-Schlüssel für alles, was nur auswertet. So tauschen oder widerrufen Sie einen, ohne die anderen zu stören.

Änderungsprotokoll

v1.1 2026-07-10

  • Webhooks: Ereignisse abonnieren (Kalibrierung erfasst oder freigegeben, Messmittel bald fällig oder überfällig und weitere), mit HMAC-signierter, wiederholter Zustellung.
  • Feldanforderungen: GET /standards/field-requirements veröffentlicht die Kalibrierfelder, die Ihre gewählten Normen verlangen, damit Sie vor dem POST eine gültige Nutzlast bauen können.
  • Fälligkeitsliste: GET /due liefert Messmittel, die innerhalb eines Zeitraums fällig oder überfällig sind, jeweils mit dem maßgeblichen Konformitätsstatus, für Planung und Übersichten.
  • Löschmarken: Übergeben Sie include=retired (Messmittel) oder include=voided (Kalibrierungen) an den inkrementellen Strömen, damit ein ausgemusterter oder für ungültig erklärter Datensatz in der Differenz auftaucht, statt still zu verschwinden. Standardmäßig aus, bestehende Abgleiche bleiben unverändert.
  • Anhänge: eine vorsignierte Upload-URL anfordern, ein Dokument an ein Messmittel hängen (wahlweise an eine bestimmte Kalibrierung), die Dokumente eines Datensatzes auflisten und eine kurzlebige Download-URL holen.

v1 2026-07-09

  • Inkrementeller Abgleich: updated_since und sort bei Messmitteln und Kalibrierungen, dazu ein arbeitsbereichsweiter Strom GET /calibrations.
  • Messmittel filtern: asset_tag, serial_number, compliance_status und next_due_before.
  • Kalibrierschein abrufen: GET /calibrations/{id}/certificate liefert das PDF der Kalibrierung.
  • Messmittel ausmustern: POST /instruments/{id}/retire nimmt ein Messmittel weich außer Betrieb und lässt das Journal unberührt.
  • Kopffelder zur Ratenbegrenzung (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset und Retry-After bei einer 429) in jeder Antwort.
  • Ein einheitlicher Fehlerumschlag ({ code, message, details? }) an jedem Endpunkt.

v1 Erste Veröffentlichung

  • Messmittel lesen und anlegen, Kalibrierungen in das manipulationserkennbare Journal schreiben sowie Standorte und gewählte Normen lesen.
  • Authentifizierung per Bearer oder X-API-Key, Lese- und Schreibrechte, Zugang ab Professional, Ratenbegrenzung auf 120 pro Minute und der seitenweise Listenumschlag.

Referenz

Die vollständige REST-Referenz

Jeder Endpunkt, Parameter, Anfragerumpf und jede Antwort, erzeugt aus der OpenAPI-Spezifikation der API und als durchsuchbare Referenz im Vollbild dargestellt.

Die Referenz öffnet sich in einem neuen Tab, mit durchsuchbarer Navigation, Schemata für Anfrage und Antwort und Beispielen zum Kopieren für jede Operation. Lieber einen Client erzeugen? Die OpenAPI-Spezifikation oben treibt Codegeneratoren in allen großen Sprachen an.

---