API-Referenz
Mit dem TMS-Add-on kann ein anderes System von Ihnen (ein BI-Werkzeug, ein Buchhaltungsprogramm, eine Plattform zur Sendungsverfolgung) über die TMS-API die Aufträge, Geschäftspartner, Fahrzeuge und Rechnungen Ihrer Organisation lesen, und Ihr eigenes Telematiksystem kann Fahrzeugpositionen senden. In den Worten der App: „Ein Schlüssel lässt ein anderes System TMS-Daten lesen, zum Beispiel Aufträge für Berichte, oder Fahrzeugpositionen aus seiner Telematik senden. Außer diesen Positionen ändert er nichts.“
Alles andere in Quanty nutzen Sie über die App unter app.quanty.ai. Die interne API der App wird nicht für Integrationen angeboten: Sie braucht eine angemeldete Sitzung und ändert sich ohne Ankündigung.
Bevor Sie beginnen
- Die Organisation hat das TMS-Add-on und einen bezahlten Plan. Ohne das Add-on wird jede Anfrage mit
addon_requiredabgelehnt, solange der Plan nicht bezahlt ist mitpayment_required. - Nur ein Administrator der Organisation erstellt und widerruft API-Schlüssel, in den TMS-Einstellungen, API und Webhooks.
- Das System, das die API aufruft, braucht den Schlüssel, die Adresse Ihrer Quanty-API (sie steht im Beispiel im Schlüsseldialog) und diese Seite.
API-Schlüssel
- Öffnen Sie TMS-Einstellungen, API und Webhooks und klicken Sie unter API-Schlüssel auf Schlüssel erstellen.
- Füllen Sie den Dialog aus und klicken Sie auf Schlüssel erstellen.
- Der Schlüssel wird einmal gezeigt, mit Kopieren und Beispiel: die ersten 50 Aufträge (Beispiel kopieren): „Wir zeigen diesen Schlüssel nur einmal. In der Liste bleibt nur sein Anfang; geht er verloren, widerrufen Sie ihn und erstellen Sie einen neuen.“
- Fügen Sie den Schlüssel in dem System ein, das ihn benutzen soll, und klicken Sie auf Fertig.
| Feld | Was es bedeutet | Beispiel |
|---|---|---|
| Name | „Am Namen erkennen Sie den Schlüssel in der Liste.“ Höchstens 120 Zeichen. | BI-Berichte |
| Was er lesen oder senden darf | Aufträge, Geschäftspartner, Fahrzeuge und Rechnungen (standardmäßig angehakt) und Telematik: Senden für ein System, das Positionen sendet (nie standardmäßig angehakt; früher erstellte Schlüssel haben es nicht). Haken Sie mindestens eines an. | Aufträge, Rechnungen |
Die Liste der Schlüssel zeigt Name, Zugriff, Erstellt, Zuletzt benutzt („noch nicht“ bis zur ersten Anfrage) und Status: Aktiv oder Widerrufen (mit dem Namen der Person, die widerrufen hat). Widerrufen im Menü eines Schlüssels stoppt ihn sofort: „Systeme, die ihn benutzen, verlieren sofort den Zugriff. Das lässt sich nicht rückgängig machen.“
| Regel | Wert |
|---|---|
| Aktive Schlüssel je Organisation | höchstens 20 („Widerrufen Sie einen unbenutzten Schlüssel, um einen neuen zu erstellen.“) |
| Wie ein Schlüssel aussieht | beginnt mit qk_; die Liste zeigt nur seinen Anfang |
| Ein verlorener Schlüssel | kann nicht erneut gezeigt werden: widerrufen und neu erstellen |
| Zuletzt benutzt | höchstens alle 5 Minuten aktualisiert |
| Chat | Schlüssel werden nie über den Chat erstellt, gezeigt oder widerrufen |
Halten Sie den Schlüssel geheim
Wer den Schlüssel hat, kann lesen, was er erlaubt. Speichern Sie ihn als Geheimnis in dem System, das ihn benutzt, und widerrufen Sie ihn, wenn dieses System ihn nicht mehr braucht.
Daten lesen
Verwenden Sie die Adresse aus dem Beispiel im Schlüsseldialog und senden Sie den Schlüssel als Bearer-Token:
GET /api/v1/ext/tms/orders?limit=50
Authorization: Bearer qk_…| Pfad | Der Schlüssel braucht |
|---|---|
GET /api/v1/ext/tms/orders | Aufträge |
GET /api/v1/ext/tms/contractors | Geschäftspartner |
GET /api/v1/ext/tms/vehicles | Fahrzeuge |
GET /api/v1/ext/tms/invoices | Rechnungen |
Abfrageparameter
| Parameter | Was er bedeutet | Beispiel |
|---|---|---|
limit | Zeilen je Seite, 1 bis 200. Standard 50. | 200 |
cursor | Der next_cursor der vorigen Seite. | MjAyNi0xMS0wMlQw… |
updated_since | Nur Zeilen, die zu oder nach diesem Zeitpunkt geändert wurden: ein ISO-Zeitpunkt oder ein bloßes Datum, das Mitternacht polnischer Zeit bedeutet. | 2026-10-21T08:00:00Z |
Seiten und regelmäßiges Abfragen
Die Antwort ist eine Seite, älteste Änderung zuerst:
{
"items": [ { "id": "…", "number": "…", "updated_at": "…" } ],
"next_cursor": "…"
}- Lesen Sie die erste Seite, mit
updated_since, wenn Sie nur die letzten Änderungen wollen. - Solange
next_cursornichtnullist, lesen Sie weiter mitcursorauf diesem Wert (mit demselbenupdated_since). - Um später Änderungen abzufragen, starten Sie den nächsten Lauf mit
updated_sinceeinige Minuten vor der Zeit Ihres letzten Laufs.
Zeilen, die in den letzten 10 Sekunden geändert wurden, werden noch nicht ausgeliefert; sie kommen beim nächsten Lesen, deshalb geht eine Abfrage einige Minuten zurück. Zeilen mit demselben updated_at werden zwischen Seiten nie übersprungen oder wiederholt. Gelöschte Zeilen fehlen; stornierte behalten ihren Status. Antworten werden nie zwischengespeichert.
Felder
Jede Zeile hat id, created_at und updated_at sowie die Felder der passenden Tabelle in TMS Daten (siehe Tabellen in Quanty). Geldbeträge und andere Dezimalzahlen kommen als Text ("1234.50"), ganze Zahlen als Zahlen, Datumsangaben als YYYY-MM-DD (der Tag in polnischer Zeit), Zeitpunkte in UTC und Auswahlwerte als Codes. Ein nicht gesetzter Wert ist null.
orders (Aufträge)
| Feld | Was es enthält |
|---|---|
number, client_reference | Die Auftragsnummer und die Nummer des Kunden. |
status | draft, confirmed, planned, in_progress, delivered, documents (wartet auf Dokumente), invoiced, settled oder cancelled. |
client, route | Der Kurzname des Kunden und die Strecke. |
loading_date, unloading_date | Die erste Ladung und die letzte Entladung. |
execution | own (eigener Fuhrpark) oder carrier (Frachtführer). |
vehicle_plate, trailer_plate, driver | Beim eigenen Fuhrpark Fahrzeug, Auflieger und Fahrer aus dem TMS; beim Frachtführer Kennzeichen und Fahrer aus dem Auftrag. |
carrier | Der Frachtführer, bei einem Frachtführerauftrag. |
freight_amount, currency, freight_pln | Die Fracht in ihrer Währung und in PLN. |
carrier_cost_pln, margin_pln | Die Kosten des Frachtführers und die Marge, bei einem Frachtführerauftrag. |
documents_status | missing, partial, complete oder not_required. |
owner, branch, tags | Betreuer, Niederlassung und Tags (durch Komma getrennt). |
is_adr, km, co2_kg | ADR (true oder false), die Kilometer und das CO2 in kg. |
contractors (Geschäftspartner)
| Feld | Was es enthält |
|---|---|
name, short_name, nip, city, country | Die Firma und ihr Ländercode. |
roles | Eine Liste: client, carrier oder beides. |
verification | positive, negative, neutral oder unverified. |
credit_limit, exposure_pln | Das Kreditlimit und, für einen Kunden, was er jetzt in PLN schuldet. |
blocked_as_client, blocked_as_carrier | true oder false. |
payment_days, owner, last_order_on, archived | Zahlungsziel, Betreuer, Tag des letzten Auftrags und ob er archiviert ist. |
vehicles (Fahrzeuge)
| Feld | Was es enthält |
|---|---|
plate, kind, make_model, vin | kind ist tractor, trailer, truck, van oder car. |
status | active, service, inactive oder sold. |
current_trailer, current_driver | Der Zug, in dem das Fahrzeug gerade ist. |
insurance_until, inspection_until, tachograph_until, next_expiry | Die Fristen und die früheste davon. Das Tachographendatum eines Aufliegers ist keine Frist: next_expiry lässt es aus (ebenso die Tabelle Fahrzeuge in Tabellen in Quanty). |
odometer_km | Der Kilometerstand. |
invoices (Rechnungen)
| Feld | Was es enthält |
|---|---|
number, series | Die Nummer (ein Entwurf hat keine) und der Nummernkreis. |
status | draft, issued, sent, partially_paid, paid oder cancelled. |
buyer, issue_date, due_date | Der Käufer wie auf der Rechnung und die Daten. |
gross, currency, paid, outstanding, net_pln | Die Beträge. outstanding ist gesetzt, sobald die Rechnung ausgestellt ist. |
days_overdue | Tage nach Fälligkeit, solange etwas offen ist, sonst 0. |
ksef_status | queued, sent, accepted, rejected oder null, wenn die Rechnung nicht an KSeF ging. |
orders | Die Auftragsnummern auf der Rechnung (durch Komma getrennt). |
Interne Notizen, Dateien, IDs von Personen und Koordinaten werden nicht ausgeliefert. Datensätze aus Marcos TMS sind wie alle anderen enthalten.
Fehler
Eine Ablehnung hat einen Code und einen Satz (error_code, message), nie etwas vom Schlüssel.
| Status | Code | Bedeutung |
|---|---|---|
| 401 | invalid_api_key | Der Schlüssel fehlt, ist falsch oder widerrufen. |
| 402 | addon_required | Die Organisation hat das TMS-Add-on nicht. |
| 402 | payment_required | Das Abonnement der Organisation ist nicht bezahlt. |
| 403 | scope_missing | Der Schlüssel darf diese Art von Daten nicht lesen. |
| 422 | invalid_cursor | Der Cursor stammt nicht von dieser API. |
| 422 | invalid_updated_since | Der Zeitpunkt ist nicht lesbar. |
| 429 | Zu viele Anfragen. Warten Sie und versuchen Sie es erneut. |
Grenzen
| Grenze | Wert |
|---|---|
| Lesen, je Schlüssel | 120 Anfragen pro Minute und 5 000 pro Stunde |
| Zeilen je Seite | höchstens 200 |
| Anfragen mit falschem Schlüssel, je Adresse | 30 pro Minute; danach bekommt ein falscher Schlüssel eine Weile 429 |
| Positionen senden, je Schlüssel | 60 Anfragen pro Minute und 2 000 pro Stunde |
| Positionen je Anfrage | höchstens 500 und höchstens 1 MB |
Falsche Schlüssel anderer bremsen einen gültigen Schlüssel nie aus.
Fahrzeugpositionen senden
Für eine Telematik, die Quanty nicht selbst liest, kann Ihr eigenes System die Positionen senden. Die ganze Anleitung, mit jedem Feld, der Zuordnung der Fahrzeuge und allen Antworten, steht auf Eigenes System (API). Kurz:
- Ein Administrator verbindet Eigenes System (API) unter Telematik: „Hier ist nichts einzutragen.“ Die Verbindung zeigt Empfang: Über die API, Letzte Daten und So senden Sie Daten mit der Adresse, dem nötigen Schlüssel und einer Beispielanfrage.
- Erstellen Sie einen API-Schlüssel mit Telematik: Senden.
- Ihr System sendet die Positionen:
POST /api/v1/ext/tms/telematics/positions
Authorization: Bearer qk_…
Content-Type: application/json{
"items": [
{
"vehicle": { "plate": "PO 1AB12" },
"at": "2026-11-01T10:00:00Z",
"lat": 52.40,
"lng": 16.92,
"speed_kmh": 82,
"heading": 270,
"odometer_km": 423434.5,
"fuel_pct": 61,
"fuel_l": 410,
"driver": { "id": "D-17", "name": "Jan Kowalski" },
"trailer": { "plate": "PO 9TR" }
}
]
}vehiclenennt das Fahrzeug über seine Quanty-id, seine FIN (vin) oder sein Kennzeichen (plate). Ein Fahrzeug ohne Telematik wird bei der ersten Position verbunden; eines, das seine Positionen aus einer anderen Telematikverbindung bekommt, wird für diese Position abgelehnt.atist ein ISO-Zeitpunkt (ohne Zeitzone als UTC gelesen) oder Unix-Sekunden; eine Zeit mehr als 15 Minuten nach der Uhr von Quanty wird abgelehnt, prüfen Sie also die Uhr des Senders.latundlngsind Pflicht, der Rest ist optional. Der Name des Fahrers ist ein personenbezogenes Datum, wie bei jeder Telematik.- Ein Feld, das eine Position weglässt, behält den letzten Wert des Fahrzeugs (Kraftstoff, Fahrer), und
nulllöscht ihn. Der Kilometerstand des Fahrzeugs steigt nur, senden Sie also einen echten Wert. Ein optionaler Wert, der kein Messwert ist (eine Geschwindigkeit von -1, ein Kilometerstand von 0, ein Kraftstoff von "n/a"), wird weggelassen und unterignoredaufgeführt; die Position zählt trotzdem.
Die Antwort ist 200, wenn mindestens eine Position gespeichert wurde:
{
"accepted": 1,
"positions_added": 1,
"older_than_stored": 0,
"vehicles_linked": 0,
"rejected": [ { "index": 3, "status": 404, "error_code": "…", "message": "…" } ],
"ignored": [ { "index": 0, "field": "speed_kmh" } ]
}Jede Position wird für sich beantwortet: Eine abgelehnte steht unter rejected mit ihrem Index, die anderen werden gespeichert. Derselbe Inhalt zweimal gesendet wird einmal gespeichert, und eine Meldung, die älter ist als die neueste des Fahrzeugs, kommt in seine Spur, ohne das Fahrzeug zurückzusetzen.
Eine ganze Anfrage wird abgelehnt mit:
| Status | Code | Bedeutung |
|---|---|---|
| 401, 402 | wie oben | Schlüssel, Add-on oder Plan. |
| 403 | scope_missing | Der Schlüssel hat Telematik: Senden nicht. |
| 409 | push_not_connected, push_paused | Keine Verbindung Eigenes System (API), oder sie ist pausiert. |
| 413 | body_too_large | Mehr als 1 MB. Teilen Sie die Positionen auf. |
| 422 | invalid_json, items_required, too_many_items | Kein JSON, kein items oder mehr als 500. |
| 429 | push_busy | Eine andere Sendung Ihrer Organisation wird gerade gespeichert: Warten Sie die Sekunden aus Retry-After und senden Sie erneut. Auch wenn der Schlüssel zu viele Anfragen sendet. |
Andere Wege, Daten zu bewegen
- Google Sheets: Zeilen aus einer Google-Tabelle nach Zeitplan importieren, mit einer Schlüsselspalte gegen Duplikate, oder eine Tabelle in die andere Richtung exportieren.
- Export: Jede Tabelle lässt sich über Weitere Aktionen im Raster als CSV, Excel oder PDF exportieren (siehe Projekte, Tabellen und Ansichten), und die TMS-Listen und -Berichte haben ihren eigenen Export.
- Automatisierungen (Beta): E-Mails, WhatsApp-Nachrichten und KSeF-Rechnungen zu Datensätzen einer Tabelle machen und auf neue und geänderte Datensätze reagieren.
- Freigabelinks: Dashboards und Präsentationen lassen sich per Link schreibgeschützt teilen (siehe Dashboards und Präsentationen).
Fragen zur API: support@quanty.ai.