Dokumentacja API
Z dodatkiem TMS inny Twój system (narzędzie BI, program księgowy, platforma do śledzenia przesyłek) może czytać przez API TMS zlecenia, kontrahentów, pojazdy i faktury Twojej organizacji, a Twój własny system telematyki może wysyłać pozycje pojazdów. Słowami aplikacji: „Klucz pozwala innemu systemowi czytać dane TMS, na przykład zlecenia do raportów, albo wysyłać pozycje pojazdów z jego telematyki. Poza tymi pozycjami nic nie zmienia.”
Z całej reszty Quanty korzystasz przez aplikację pod adresem app.quanty.ai. Wewnętrzne API aplikacji nie jest udostępniane do integracji: wymaga zalogowanej sesji i zmienia się bez zapowiedzi.
Zanim zaczniesz
- Organizacja ma dodatek TMS i opłacony plan. Bez dodatku każde zapytanie jest odrzucane kodem
addon_required, a gdy plan nie jest opłacony, kodempayment_required. - Klucze API tworzy i unieważnia tylko administrator organizacji, w Ustawieniach TMS, API i webhooki.
- System, który woła API, potrzebuje klucza, adresu Twojego API Quanty (jest w przykładzie w oknie klucza) i tej strony.
Klucze API
- Otwórz Ustawienia TMS, API i webhooki i kliknij Utwórz klucz w części Klucze API.
- Wypełnij okno i kliknij Utwórz klucz.
- Klucz widać tylko raz, z Kopiuj i Przykład: pierwsze 50 zleceń (Kopiuj przykład): „Ten klucz pokazujemy tylko raz. Na liście zostaje tylko jego początek; jeśli zginie, unieważnij go i utwórz nowy.”
- Wklej klucz w systemie, który będzie go używał, i kliknij Gotowe.
| Pole | Co oznacza | Przykład |
|---|---|---|
| Nazwa | „Po nazwie rozpoznasz klucz na liście.” Najwyżej 120 znaków. | Raporty BI |
| Co może czytać lub wysyłać | Zlecenia, Kontrahenci, Pojazdy i Faktury (domyślnie zaznaczone) oraz Telematyka: wysyłanie dla systemu, który wysyła pozycje (nigdy nie jest zaznaczone domyślnie, a klucze utworzone wcześniej go nie mają). Zaznacz co najmniej jedno. | Zlecenia, Faktury |
Lista kluczy pokazuje Nazwa, Dostęp, Utworzony, Ostatnio użyty („jeszcze nie” do pierwszego zapytania) i Stan: Aktywny albo Unieważniony (z tym, kto go unieważnił). Unieważnij w menu klucza zatrzymuje go od razu: „Systemy, które go używają, od razu stracą dostęp. Tego nie da się cofnąć.”
| Zasada | Wartość |
|---|---|
| Aktywne klucze w organizacji | najwyżej 20 („Unieważnij nieużywany klucz, żeby utworzyć nowy.”) |
| Jak wygląda klucz | zaczyna się od qk_; lista pokazuje tylko jego początek |
| Zgubiony klucz | nie da się go pokazać ponownie: unieważnij go i utwórz nowy |
| Ostatnio użyty | aktualizowane najwyżej co 5 minut |
| Czat | kluczy nigdy nie tworzy się, nie pokazuje ani nie unieważnia przez czat |
Trzymaj klucz w tajemnicy
Każdy, kto ma klucz, może czytać to, na co klucz pozwala. Zapisz go jako sekret w systemie, który go używa, i unieważnij, gdy ten system już go nie potrzebuje.
Odczyt danych
Użyj adresu z przykładu w oknie klucza i wyślij klucz jako token typu Bearer:
GET /api/v1/ext/tms/orders?limit=50
Authorization: Bearer qk_…| Ścieżka | Klucz potrzebuje |
|---|---|
GET /api/v1/ext/tms/orders | Zlecenia |
GET /api/v1/ext/tms/contractors | Kontrahenci |
GET /api/v1/ext/tms/vehicles | Pojazdy |
GET /api/v1/ext/tms/invoices | Faktury |
Parametry zapytania
| Parametr | Co oznacza | Przykład |
|---|---|---|
limit | Wierszy na stronę, od 1 do 200. Domyślnie 50. | 200 |
cursor | next_cursor z poprzedniej strony. | MjAyNi0xMS0wMlQw… |
updated_since | Tylko wiersze zmienione w tej chwili albo później: moment ISO albo sama data, która oznacza jej północ czasu polskiego. | 2026-10-21T08:00:00Z |
Strony i odpytywanie
Odpowiedź to jedna strona, od najstarszej zmiany:
{
"items": [ { "id": "…", "number": "…", "updated_at": "…" } ],
"next_cursor": "…"
}- Przeczytaj pierwszą stronę, z
updated_since, jeśli chcesz tylko ostatnich zmian. - Dopóki
next_cursornie jestnull, czytaj dalej zcursorustawionym na tę wartość (z tym samymupdated_since). - Żeby później sprawdzić zmiany, zacznij następny odczyt z
updated_sincekilka minut przed czasem ostatniego odczytu.
Wiersze zmienione w ostatnich 10 sekundach nie są jeszcze podawane; przyjdą przy następnym odczycie i dlatego odpytywanie cofa się o kilka minut. Wiersze z tym samym updated_at nigdy nie są pomijane ani powtarzane między stronami. Usuniętych wierszy nie ma; anulowane zachowują swój status. Odpowiedzi nigdy nie są zapisywane w pamięci podręcznej.
Pola
Każdy wiersz ma id, created_at i updated_at oraz pola odpowiedniej tabeli w TMS dane (zobacz Tabele w Quanty). Kwoty i inne liczby dziesiętne przychodzą jako tekst ("1234.50"), liczby całkowite jako liczby, daty jako YYYY-MM-DD (dzień w czasie polskim), momenty w UTC, a wybory jako kody. Wartość nieustawiona to null.
orders (zlecenia)
| Pole | Co zawiera |
|---|---|
number, client_reference | Numer zlecenia i numer klienta. |
status | draft, confirmed, planned, in_progress, delivered, documents (czeka na dokumenty), invoiced, settled albo cancelled. |
client, route | Skrócona nazwa klienta i trasa. |
loading_date, unloading_date | Pierwszy załadunek i ostatni rozładunek. |
execution | own (własny tabor) albo carrier (przewoźnik). |
vehicle_plate, trailer_plate, driver | Przy własnym taborze pojazd, naczepa i kierowcy z TMS; przy przewoźniku numer i kierowca wpisane w zleceniu. |
carrier | Przewoźnik, przy zleceniu dla przewoźnika. |
freight_amount, currency, freight_pln | Fracht w walucie zlecenia i w PLN. |
carrier_cost_pln, margin_pln | Koszt przewoźnika i marża, przy zleceniu dla przewoźnika. |
documents_status | missing, partial, complete albo not_required. |
owner, branch, tags | Opiekun, oddział i tagi (po przecinku). |
is_adr, km, co2_kg | ADR (true albo false), kilometry i CO2 w kg. |
contractors (kontrahenci)
| Pole | Co zawiera |
|---|---|
name, short_name, nip, city, country | Firma i kod jej kraju. |
roles | Lista: client, carrier albo obie. |
verification | positive, negative, neutral albo unverified. |
credit_limit, exposure_pln | Limit kredytowy i, dla klienta, ile jest teraz winien w PLN. |
blocked_as_client, blocked_as_carrier | true albo false. |
payment_days, owner, last_order_on, archived | Termin płatności, opiekun, dzień ostatniego zlecenia i czy jest zarchiwizowany. |
vehicles (pojazdy)
| Pole | Co zawiera |
|---|---|
plate, kind, make_model, vin | kind to tractor, trailer, truck, van albo car. |
status | active, service, inactive albo sold. |
current_trailer, current_driver | Zestaw, w którym pojazd jest teraz. |
insurance_until, inspection_until, tachograph_until, next_expiry | Terminy i najbliższy z nich. Data tachografu naczepy nie jest terminem: next_expiry jej nie uwzględnia (tak samo tabela Pojazdy w Tabelach w Quanty). |
odometer_km | Przebieg. |
invoices (faktury)
| Pole | Co zawiera |
|---|---|
number, series | Numer (szkic go nie ma) i seria numeracji. |
status | draft, issued, sent, partially_paid, paid albo cancelled. |
buyer, issue_date, due_date | Nabywca jak na fakturze i daty. |
gross, currency, paid, outstanding, net_pln | Kwoty. outstanding pojawia się po wystawieniu faktury. |
days_overdue | Dni po terminie, dopóki zostało coś do zapłaty, inaczej 0. |
ksef_status | queued, sent, accepted, rejected albo null, gdy faktura nie trafiła do KSeF. |
orders | Numery zleceń na fakturze (po przecinku). |
API nie podaje uwag wewnętrznych, plików, identyfikatorów osób ani współrzędnych. Rekordy z Marcos TMS są w odpowiedzi jak wszystkie inne.
Błędy
Odmowa ma kod i zdanie (error_code, message), nigdy nic z klucza.
| Status | Kod | Znaczenie |
|---|---|---|
| 401 | invalid_api_key | Brak klucza, zły albo unieważniony klucz. |
| 402 | addon_required | Organizacja nie ma dodatku TMS. |
| 402 | payment_required | Subskrypcja organizacji nie jest opłacona. |
| 403 | scope_missing | Klucz nie może czytać tego rodzaju danych. |
| 422 | invalid_cursor | Kursor nie pochodzi z tego API. |
| 422 | invalid_updated_since | Nie da się odczytać momentu. |
| 429 | Za dużo zapytań. Odczekaj i spróbuj ponownie. |
Limity
| Limit | Wartość |
|---|---|
| Odczyt, na klucz | 120 zapytań na minutę i 5 000 na godzinę |
| Wierszy na stronę | najwyżej 200 |
| Zapytania ze złym kluczem, na adres | 30 na minutę; potem zły klucz dostaje przez chwilę 429 |
| Wysyłanie pozycji, na klucz | 60 zapytań na minutę i 2 000 na godzinę |
| Pozycji w jednym wywołaniu | najwyżej 500 i najwyżej 1 MB |
Cudze złe klucze nigdy nie spowalniają poprawnego klucza.
Wysyłanie pozycji pojazdów
Dla telematyki, której Quanty nie czyta samo, Twój własny system może wysyłać pozycje. Cała instrukcja, z każdym polem, dopasowaniem pojazdów i wszystkimi odpowiedziami, jest na stronie Własny system (API). W skrócie:
- Administrator łączy Własny system (API) w Telematyce: „Nic tu nie trzeba wpisywać.” Połączenie pokazuje Odbiór danych: Przez API, Ostatnie dane oraz Jak wysyłać dane z adresem, potrzebnym kluczem i przykładowym wywołaniem.
- Utwórz klucz API z Telematyka: wysyłanie.
- Twój system wysyła pozycje:
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" }
}
]
}vehiclewskazuje pojazd jegoidw Quanty, numeremvinalbo numerem rejestracyjnymplate. Pojazd bez telematyki zostaje połączony przy pierwszej pozycji; pojazd, który bierze pozycje z innego połączenia telematyki, jest dla tej pozycji odrzucany.atto moment ISO (bez strefy czytany jako UTC) albo sekundy Unix; czas o więcej niż 15 minut przed zegarem Quanty jest odrzucany, więc sprawdź zegar nadawcy.latilngsą wymagane, reszta jest opcjonalna. Imię i nazwisko kierowcy to dane osobowe, jak przy każdej telematyce.- Pole, którego pozycja nie ma, zostawia ostatnią wartość pojazdu (paliwo, kierowca), a
nullje czyści. Przebieg w pojeździe tylko rośnie, więc wysyłaj prawdziwy odczyt. Opcjonalna wartość, która nie jest odczytem (prędkość -1, przebieg 0, paliwo "n/a"), jest pomijana i wymieniona wignored; pozycja i tak się liczy.
Odpowiedź to 200, gdy zapisano co najmniej jedną pozycję:
{
"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" } ]
}Każda pozycja ma własną odpowiedź: odrzucona trafia do rejected ze swoim numerem, a pozostałe są zapisywane. To samo wywołanie wysłane dwa razy zapisuje się raz, a odczyt starszy niż najnowszy odczyt pojazdu trafia do jego śladu, nie cofając pojazdu.
Całe wywołanie jest odrzucane:
| Status | Kod | Znaczenie |
|---|---|---|
| 401, 402 | jak wyżej | Klucz, dodatek albo plan. |
| 403 | scope_missing | Klucz nie ma Telematyka: wysyłanie. |
| 409 | push_not_connected, push_paused | Brak połączenia Własny system (API) albo jest wstrzymane. |
| 413 | body_too_large | Więcej niż 1 MB. Podziel pozycje. |
| 422 | invalid_json, items_required, too_many_items | To nie JSON, brak items albo więcej niż 500. |
| 429 | push_busy | Zapisuje się właśnie inne wywołanie Twojej organizacji: odczekaj sekundy z Retry-After i wyślij ponownie. Także wtedy, gdy klucz wysyła za dużo zapytań. |
Inne sposoby przenoszenia danych
- Arkusze Google: importuj wiersze z arkusza Google według harmonogramu, z kolumną klucza przeciw duplikatom, albo eksportuj tabelę w drugą stronę.
- Eksport: każdą tabelę wyeksportujesz do CSV, Excela albo PDF z Więcej działań w arkuszu (zobacz Projekty, tabele i widoki), a listy i raporty TMS mają własny eksport.
- Automatyzacje (beta): zamieniaj e-maile, wiadomości WhatsApp i faktury z KSeF w rekordy tabeli i reaguj na nowe i zmienione rekordy.
- Linki do udostępniania: pulpity i prezentacje można udostępniać tylko do odczytu za pomocą linku (zobacz Pulpity i Prezentacje).
Pytania o API: support@quanty.ai.