API i integracja z ERP

Cennik z Twojego ERP, zapytania z powrotem do niego.Bez przepisywania.

MetronQ ma API dla systemu, który już prowadzi Twój zakład: ERP, CRM, arkusza albo narzędzia automatyzacji. Ceny materiałów, maszyny, narzędzia i pliki detali przychodzą z niego, a wyceny, odczyt detalu i zamówienia wracają. Każda zmiana cennika przechodzi przez podgląd, zanim cokolwiek zostanie zapisane.

  • REST i JSON
  • 7 zakresów uprawnień
  • Podgląd przed zapisem
  • Limity w każdej odpowiedzi
Twój ERPERP · CRM · arkusz · automatyzacja
  1. Ceny materiałówPOST /config/import
  2. NarzędziowniaPUT /machines/{key}/tools
  3. Pliki do wycenyPOST /quotes
  4. Nowe zapytaniaGET /quotes?since=
  5. Odczyt detaluGET /quotes/{id}/metrics
  6. Status zleceniaPATCH /orders/{id}
cennik · wyceny · zamówienia

01Zalety

Co przestaje być ręczne

Sześć rzeczy, które dziś ktoś w zakładzie przepisuje z jednego systemu do drugiego. Z API robi to system, a człowiek patrzy na różnicę.

Ceny materiałów

DziśKtoś przepisuje ceny z faktury hurtowni do ERP, a potem drugi raz do systemu wycen. Gdy zapomni, wyceny idą ze starej ceny.
Z APIERP wysyła nowe ceny za kilogram. MetronQ pokazuje różnicę pole po polu, a zapis wchodzi dopiero po podglądzie.

Narzędziownia i park maszyn

DziśLista frezów i wierteł żyje w arkuszu, a system wycen zakłada narzędzia ogólne.
Z APISystem narzędziowni wysyła bibliotekę narzędzi maszyny. Najmniejszy frez od razu wyznacza najmniejszy promień naroża, jaki ta maszyna wyceni.

Nowe zapytania

DziśZapytanie z widgetu ktoś ręcznie zakłada w ERP jako ofertę.
Z APIERP co minutę pyta o zapytania nowsze niż ostatnie, które zna, i zakłada je u siebie z plikiem, materiałem, ilością i ceną.

Pliki do wyceny

DziśKlient przysyła model albo rysunek mailem, a ktoś pobiera załącznik i ręcznie zakłada wycenę w panelu.
Z APISystem, w którym plik już jest (PDM, skrzynka pocztowa, portal klienta), sam wysyła go do wyceny i odbiera cenę, rozbicie kosztów i PDF oferty.

Przygotowanie produkcji

DziśTechnolog otwiera model jeszcze raz, żeby policzyć otwory i gwinty do marszruty.
Z APIOdczyt detalu - gabaryt, otwory, kieszenie, gwinty, najcieńsza ścianka - trafia do Twojego systemu jako dane, a nie jako obrazek.

Statusy zamówień

DziśStatus zlecenia żyje w dwóch miejscach, a klient pyta mailem, co z jego częściami.
Z APIERP przesuwa status zamówienia w MetronQ. Potwierdzenie i wysyłka idą do klienta tym samym mailem, który wysyła panel.

02Trasy danych

Cztery trasy, które buduje się najczęściej

Wybierz trasę, żeby zobaczyć jej przystanki i najważniejsze wywołanie - z prawdziwym zapytaniem i odpowiedzią.

Ceny i katalogi płyną z Twojego systemu do MetronQ. Nic nie zostaje zapisane, zanim podgląd nie pokaże różnicy.

  1. Eksport z ERP

    Arkusz CSV albo jeden dokument JSON z materiałami, maszynami i obróbkami.

    CSV · JSON
  2. Podgląd

    Co zostałoby dodane i zmienione, pole po polu, oraz wiersze i kolumny, których system nie rozumie.

    POST /config/import/preview
  3. Zatwierdzenie

    System odsyła base_hash z podglądu. Jeśli ktoś w międzyczasie zapisał cennik, dostaje 409 i liczy podgląd od nowa.

    POST /config/import
  4. Historia

    Import trafia do historii ustawień pole po polu, z nazwą klucza, który go wykonał.

    historia ustawień
Zapytanie: podgląd arkusza materiałów
curl -X POST "https://app.metronq.com/api/v1/integration/config/import/preview" \
  -H "Authorization: Bearer mq_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "catalog": "materials", "csv_base64": "a2V5O25hbWU7cHJpY2VfcGVyX2tnCmFsdV82MDYxOy..." }'
Odpowiedź: co by się zmieniło200 OK
{
  "ok": true,
  "added": [],
  "updated": ["alu_6061", "steel_c45"],
  "errors": [],
  "ignored_columns": [],
  "changes": [
    {
      "section": "materials",
      "path": "price_per_kg",
      "kind": "edited",
      "default": 6.4,
      "current": 6.9,
      "entity_key": "alu_6061",
      "entity_name": "Aluminium 6061",
      "unit": "field"
    }
  ],
  "changes_total": 2,
  "base_hash": "9c1e4b0f2a7d",
  "config": { "materials": [ "..." ], "machines": [ "..." ], "...": "..." }
}

03Kontrola

Klucz należy do zakładu, nie do integratora

Zakładasz klucz w ustawieniach, nadajesz mu uprawnienia i widzisz, co i kiedy się z nim działo.

Klucz jest pokazywany raz, przy tworzeniu, i nie przechowujemy go w postaci, którą dałoby się odczytać. Zgubiony klucz cofasz i wystawiasz nowy. Należy do zakładu, a nie do osoby, więc działa dalej, gdy jego twórca jest na urlopie.

Uprawnienia są wąskie z założenia. Klucz, który czyta katalog, nie przeczyta zapytań, a klucz, który czyta zapytania, nie zobaczy ani danych osobowych klienta, ani wgranych przez niego plików bez osobnych zakresów. Klucz, który wysyła pliki, nie jest kluczem, który czyta wyceny. Żaden klucz nie wystawi ani nie cofnie innego klucza.

Siedem zakresów uprawnień

config:read
Czytanie katalogu i zasad wyceny.
config:write
Zmiany w katalogu i zasadach, przez ten sam podgląd i zatwierdzenie co w panelu.
quotes:read
Zapytania i zamówienia: detal, materiał, ilość, cena i odczyt.
customers:read
Dane kontaktowe klienta. Bez tego zakresu te pola wracają puste.
quotes:write
Twój numer i status zamówienia. Nie wycenia i nie zatwierdza niczego.
quotes:create
Wysyłanie plików detali do wyceny i zmiana parametrów wyceny. Cenę liczy silnik; klucz nie zatwierdzi wyceny ani nie da rabatu.
files:read
Pliki wgrane przez klientów i podglądy 3D, razem z quotes:read. Celowo osobny zakres: plik to czyjś projekt.
  • Klucz wygasa 365 dni po utworzeniu
  • Cofnięcie działa od następnego zapytania
  • Dziennik dostępu przechowywany przez dwa lata
  • Prefiks mq_live_ dla skanerów sekretów w repozytorium
app.metronq.com/settings/integrations
Ustawienia
Znajdź parametr, np. marża, setup+ Nowa wycenaPL
FirmaPowiadomieniaDokument wycenyZespółIntegracje
Klucze API

Klucz pozwala Waszemu ERP, CRM albo narzędziu automatyzacji pracować z tym kontem bez logowania się przez człowieka: czytać i aktualizować katalog i reguły cenowe, czytać wyceny i zamówienia, wysyłać pliki detali do wyceny i pobierać pliki - zawsze tylko w zakresie uprawnień, które mu nadacie.

+ Nowy klucz

Limit: 120 zapytań na minutę i 20 000 na dobę, liczone od godziny 00:00 UTC. Dziś wykorzystano: 212.

NazwaUprawnieniaOstatnio użytyWygasaLimit dzienny
Synchronizacja ERPa1b2c3d4...config:read, quotes:read, quotes:writedziś 09:1416.09.2027limit kontaCofnij
Import cennikae5f6a7b8...config:read, config:writewczoraj 06:0002.10.2027limit kontaCofnij
Dziennik dostępu

Kiedy coś zyskało lub straciło możliwość czytania tego konta. Przechowywany dwa lata.

  • Zaimportowano katalogImport cennika · e5f6a7b818.09.2026 06:00
  • Utworzono kluczSynchronizacja ERP · a1b2c3d416.09.2026 10:12
  • Utworzono kluczImport cennika · e5f6a7b802.10.2026 08:30

Ustawienia, zakładka Integracje - dane przykładowe

04Limity

Każda odpowiedź mówi, ile zostało

Integracja wie, na czym stoi, zanim trafi na limit, a nie dopiero po nim.

Dostęp do API i jego limity uzgadniamy z każdym zakładem. Domyślnie zakład dostaje 120 zapytań na minutę i 20 000 na dobę liczoną od 00:00 UTC; liczby uzgodnione dla konta mogą być inne. Synchronizacja katalogu co godzinę i odpytywanie o nowe zapytania co minutę mieszczą się w domyślnych limitach z dużym zapasem.

Nagłówki w każdej odpowiedzi

HTTP
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 118
X-RateLimit-Reset: 41
X-RateLimit-Quota: 20000
X-RateLimit-Quota-Remaining: 19863
X-RateLimit-Quota-Reset: 51240
Klucz testowy

Na czas budowania integracji zakład może dostać klucz z budżetem na cały test. Budżet się nie odnawia i jest widoczny w panelu, w whoami i w nagłówkach. Wystarcza, żeby zbudować połączenie, i celowo nie wystarcza, żeby na nim pracować.

Co znaczy odmowa

StatusKodCo zrobić
429rate_limitedMinuta jest pełna. To samo zapytanie przejdzie za chwilę; Retry-After mówi, za ile sekund.
429daily_quota_exceededDoba jest wykorzystana. Retry-After odlicza do 00:00 UTC.
429total_quota_exceededBudżet klucza testowego się skończył. Bez Retry-After, bo czekanie nic nie zmieni.
401invalid_api_keyNieznany, cofnięty albo wygasły klucz albo konto, któremu zamknięto dostęp do API lub którego okres próbny, plan albo licencja się skończyły. Celowo jedna odpowiedź dla wszystkich tych przypadków.
403missing_scopeKlucz jest ważny, ale nie ma uprawnienia do tego wywołania. Pomoże klucz z właściwym zakresem.
404not_foundNie ma takiego zapytania ani zamówienia na tym koncie. Nieistniejący katalog albo maszyna mają własne kody: unknown_catalog, unknown_machine.
404unknown_toolMaszyna nie ma narzędzia o tym kluczu. Nic nie usunięto, więc synchronizacja odróżni usunięcie od literówki we własnym mapowaniu.
404file_not_foundNie udało się odczytać zapisanego pliku ani podglądu. Wycena istnieje, ale jej plików nie dało się pobrać.
400invalid_base64Pole csv_base64 w podglądzie importu nie jest poprawnym base64. Nic nie odczytano ani nie zapisano.
409config_changedKtoś zapisał cennik między podglądem a zatwierdzeniem. Pobierz, podejrzyj i zatwierdź od nowa.
409not_analysedZapytanie nie ma jeszcze odczytu: plik jest wciąż analizowany albo analiza się nie powiodła (status analysis_failed).
403quoting_blocked:...Zakład nie może teraz otwierać nowych wycen. Powód jest podany po dwukropku: trial_limit (wyceny okresu próbnego są wykorzystane), plan_limit (wyceny planu na ten miesiąc) albo daily_limit (własny limit dzienny zakładu).
429analysis_backlogPięć plików, które zakład wysłał przez API, już czeka na analizę albo jest analizowanych (wyceny z widgetu i panelu się nie liczą). Retry-After: 30 sekund.
409file_not_uploadedPlik nie dotarł do magazynu. Wyślij go ponownie, dopóki adres jest ważny (15 minut), a potem potwierdź; później otwórz nową wycenę.
409upload_expiredPotwierdzenie przyszło za późno: po 45 minutach od otwarcia wyceny (15 minut ważności adresu i 30 minut zapasu) wgrywanie uznaje się za porzucone. Otwórz nową wycenę.
409quote_closedCzłowiek zatwierdził lub odrzucił wycenę albo klient ją zamówił. Jej parametrów nie da się już zmienić.
409quote_in_reviewTechnolog zaczął już decydować i wpisał cenę wyceny albo jednej z jej części. Ponowne przeliczenie skasowałoby tę pracę, więc jest odrzucane.
409not_a_drawingTa wycena nie jest rysunkiem, więc nie ma czego uzupełniać ani przekazywać człowiekowi.
409quote_already_analyzedRysunek nie czeka już na dane: został odtworzony i wyceniony, już trafił do zakładu albo jest ponownie analizowany.
422unknown_material, ...Wywołanie odrzucono i nic nie zapisano. Znany problem to jeden krótki kod: unknown_material, unknown_treatment, unknown_tolerance_class, unknown_hole_fit, file_too_large, unsupported_file_type, implausible_scale i podobne.
422detail: [...]Treść nie pasuje do schematu: nieznane pole, wartość spoza zakresu, znak sterujący w nazwie pliku. Wraca lista FastAPI w polu detail, każdy wpis z type, loc i msg. Nic nie zapisano.

05Dokumentacja w pigułce

Wszystkie wywołania, każde z przykładem

Adres bazowy, klucz w nagłówku i JSON w obie strony. Wybierz język, w którym piszesz integrację - wszystkie przykłady przełączą się razem.

Adres bazowyhttps://app.metronq.com/api/v1/integrationwyłącznie HTTPS
UwierzytelnienieAuthorization: Bearer mq_live_...klucz z ustawień zakładu
FormatJSONpoza tym CSV (.csv), PDF (/pdf), pliki klientów (/file) i podglądy 3D (.glb)

Start

GET/whoamiUprawnienie: bez uprawnień

Kim jest ten klucz

Do jakiego zakładu należy klucz, co może i ile mu zostało. Pierwsze wywołanie, które warto napisać: jeśli działa, reszta to już tylko ścieżki.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/whoami" \
  -H "Authorization: Bearer mq_live_YOUR_KEY"
Odpowiedź200 OK
{
  "tenant": { "name": "Precision Works Ltd", "slug": "precision-works", "currency": "EUR" },
  "key": {
    "name": "ERP sync",
    "prefix": "a1b2c3d4",
    "scopes": ["config:read", "quotes:read"],
    "expires_at": "2027-09-16T10:12:00+00:00"
  },
  "rate_limit": {
    "requests_per_minute": 120,
    "requests_per_day": 20000,
    "requests_total": null,
    "requests_total_used": null,
    "requests_total_remaining": null,
    "day_resets": "00:00 UTC"
  }
}

Katalog

GET/configUprawnienie: config:read

Cały cennik

Cały dokument wyceny: trzy katalogi, wszystkie parametry, bramki, strategie doboru maszyny i półfabrykatu oraz waluta. Ten sam dokument przyjmuje import.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/config" \
  -H "Authorization: Bearer mq_live_YOUR_KEY"
Odpowiedź200 OK
{
  "materials": [ { "key": "alu_6061", "price_per_kg": 6.4, "...": "..." } ],
  "machines": [ { "key": "dmu50", "hourly_rate": 95.0, "...": "..." } ],
  "treatments": [ { "key": "anodising", "...": "..." } ],
  "params": { "margin_pct": 22.0, "...": "..." },
  "gates": { "mode": "review_all", "...": "..." },
  "machine_selection": "cheapest",
  "stock_selection": "cheapest",
  "currency": "EUR"
}
GET/catalog/materialsUprawnienie: config:read

Jeden katalog

Materiały, maszyny albo obróbki jako JSON, bez przechodzenia przez cały cennik. Maszyny niosą bibliotekę narzędzi i blok danych identyfikacyjnych.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/catalog/materials" \
  -H "Authorization: Bearer mq_live_YOUR_KEY"
Odpowiedź200 OK
{
  "catalog": "materials",
  "count": 12,
  "items": [
    {
      "key": "alu_6061",
      "name": "Aluminium 6061",
      "kind": "metal",
      "en_number": "EN AW-6061",
      "din_number": "3.3211",
      "density_g_cm3": 2.7,
      "price_per_kg": 6.4,
      "mrr_rough_cm3_min": 50.0,
      "mrr_turning_cm3_min": 60.0,
      "finishing_rate_cm2_min": 90.0,
      "stock_allowance_mm": 3.0,
      "cutting_speed_m_min": 250.0
    }
  ]
}
GET/catalog/machines.csvUprawnienie: config:read

Katalog jako arkusz

Ten sam katalog jako CSV, który daje przycisk Eksport w panelu: z BOM dla Excela i separatorem ustawionym dla zakładu.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/catalog/machines.csv" \
  -H "Authorization: Bearer mq_live_YOUR_KEY"
Odpowiedź200 OK
key;name;technology;hourly_rate;min_quantity;envelope_mm.1;envelope_mm.2;...
dmu50;DMU 50;milling;95,00;1;650,0;520,0;...
nlx2500;NLX 2500;turning;78,00;1;366,0;705,0;...
GET/cutting-dataUprawnienie: config:read

Dane skrawania

Dla materiału prędkość skrawania i wydajności, z których liczona jest cena; dla maszyny wrzeciono, które je skaluje. To nie jest tabela posuwów na ząb i jej nie udaje.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/cutting-data" \
  -H "Authorization: Bearer mq_live_YOUR_KEY"
Odpowiedź200 OK
{
  "reference": { "spindle_power_kw": 15.0, "cutting_speed_m_min": 250.0 },
  "materials": [
    {
      "key": "steel_c45",
      "name": "Steel C45",
      "cutting_speed_m_min": null,
      "cutting_speed_effective_m_min": 156.2,
      "machinability_factor": 1.6,
      "mrr_rough_cm3_min": 19.5,
      "mrr_turning_effective_cm3_min": 19.5,
      "...": "..."
    }
  ],
  "machines": [
    {
      "key": "dmu50",
      "name": "DMU 50",
      "spindle_power_kw": 13.0,
      "spindle_power_factor": 0.867,
      "min_tool_radius_mm": 1.0,
      "tool_radius_effective_mm": 6.0,
      "tool_count": 3,
      "...": "..."
    }
  ]
}

Narzędzia

GET/tools?machine=dmu50Uprawnienie: config:read

Narzędzia zakładu

Wszystkie narzędzia jako płaska lista, każde z maszyną, w której jest, i promieniem naroża, jaki zostawia. Parametr machine zawęża listę do jednej maszyny.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/tools?machine=dmu50" \
  -H "Authorization: Bearer mq_live_YOUR_KEY"
Odpowiedź200 OK
{
  "count": 3,
  "items": [
    {
      "key": "e12",
      "kind": "endmill",
      "name": "12 mm carbide, 4 flutes",
      "diameter_mm": 12.0,
      "nose_radius_mm": null,
      "flute_length_mm": 45.0,
      "designation": "",
      "machine_key": "dmu50",
      "machine_name": "DMU 50",
      "cut_radius_mm": 6.0
    },
    { "key": "d6.8", "kind": "drill", "diameter_mm": 6.8, "cut_radius_mm": 3.4, "...": "..." },
    { "key": "m8", "kind": "tap", "diameter_mm": 8.0, "designation": "M8", "cut_radius_mm": 4.0, "...": "..." }
  ]
}
GET/machines/dmu50/toolsUprawnienie: config:read

Narzędzia jednej maszyny

Magazyn narzędzi jednej maszyny i promień naroża, który z niego wynika.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/machines/dmu50/tools" \
  -H "Authorization: Bearer mq_live_YOUR_KEY"
Odpowiedź200 OK
{
  "machine_key": "dmu50",
  "machine_name": "DMU 50",
  "count": 3,
  "min_tool_radius_mm": 1.0,
  "tool_radius_effective_mm": 6.0,
  "items": [ { "key": "e12", "...": "..." }, { "key": "d6.8", "...": "..." }, { "key": "m8", "...": "..." } ]
}
PUT/machines/dmu50/toolsUprawnienie: config:write

Zastąp bibliotekę narzędzi

Idempotentne: system wysyła listę, którą ma, bez sprawdzania, co było wcześniej. Pusta lista przywraca maszynie ręcznie wpisany promień.

Zapytanie
curl -X PUT "https://app.metronq.com/api/v1/integration/machines/dmu50/tools" \
  -H "Authorization: Bearer mq_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "tools": [ { "key": "e12", "kind": "endmill", "name": "12 mm carbide", "diameter_mm": 12.0, "flute_length_mm": 45.0 }, { "key": "d6.8", "kind": "drill", "diameter_mm": 6.8 }, { "key": "m8", "kind": "tap", "diameter_mm": 8.0, "designation": "M8" } ] }'
Odpowiedź200 OK
{
  "machine_key": "dmu50",
  "machine_name": "DMU 50",
  "count": 3,
  "min_tool_radius_mm": 1.0,
  "tool_radius_effective_mm": 6.0,
  "items": [ "..." ]
}
POST/machines/dmu50/toolsUprawnienie: config:write

Dodaj jedno narzędzie

Dodaje narzędzie albo zastępuje to pod tym samym kluczem - dla systemu, który zgłasza pojedynczą zmianę.

Zapytanie
curl -X POST "https://app.metronq.com/api/v1/integration/machines/dmu50/tools" \
  -H "Authorization: Bearer mq_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "key": "r8h7", "kind": "reamer", "diameter_mm": 8.0 }'
Odpowiedź200 OK
{
  "machine_key": "dmu50",
  "machine_name": "DMU 50",
  "count": 4,
  "min_tool_radius_mm": 1.0,
  "tool_radius_effective_mm": 6.0,
  "items": [ "..." ]
}
DELETE/machines/dmu50/tools/r8h7Uprawnienie: config:write

Usuń narzędzie

Usuwa jedno narzędzie. Nieznany klucz daje 404, żeby synchronizacja odróżniła usunięcie od literówki we własnym mapowaniu.

Zapytanie
curl -X DELETE "https://app.metronq.com/api/v1/integration/machines/dmu50/tools/r8h7" \
  -H "Authorization: Bearer mq_live_YOUR_KEY"
Odpowiedź200 OK
{
  "machine_key": "dmu50",
  "machine_name": "DMU 50",
  "count": 3,
  "min_tool_radius_mm": 1.0,
  "tool_radius_effective_mm": 6.0,
  "items": [ "..." ]
}

Import

POST/config/import/previewUprawnienie: config:write

Podgląd importu arkusza

Co zrobiłby ten arkusz. Niczego nie zapisuje: zwraca dodane i zmienione wpisy, różnice pole po polu, błędne wiersze, nieznane kolumny i base_hash.

Zapytanie
curl -X POST "https://app.metronq.com/api/v1/integration/config/import/preview" \
  -H "Authorization: Bearer mq_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "catalog": "materials", "csv_base64": "a2V5O25hbWU7cHJpY2VfcGVyX2tnCmFsdV82MDYxOy..." }'
Odpowiedź200 OK
{
  "ok": true,
  "added": [],
  "updated": ["alu_6061", "steel_c45"],
  "errors": [],
  "ignored_columns": [],
  "changes": [
    {
      "section": "materials",
      "path": "price_per_kg",
      "kind": "edited",
      "default": 6.4,
      "current": 6.9,
      "entity_key": "alu_6061",
      "entity_name": "Aluminium 6061",
      "unit": "field"
    }
  ],
  "changes_total": 2,
  "base_hash": "9c1e4b0f2a7d",
  "config": { "materials": [ "..." ], "machines": [ "..." ], "...": "..." }
}
POST/config/import/preview-jsonUprawnienie: config:write

Podgląd importu dokumentu

To samo dla całego dokumentu. Tryb merge zmienia tylko to, co dokument wymienia; replace pozwala mu wygrać w całości, łącznie z usunięciami.

Zapytanie
curl -X POST "https://app.metronq.com/api/v1/integration/config/import/preview-json" \
  -H "Authorization: Bearer mq_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "mode": "merge", "config": { "materials": [ "..." ], "machines": [ "..." ] } }'
Odpowiedź200 OK
{
  "ok": true,
  "added": ["pom_c"],
  "updated": [],
  "changes_total": 1,
  "base_hash": "9c1e4b0f2a7d",
  "...": "..."
}
POST/config/importUprawnienie: config:write

Zatwierdź import

Zapisuje to, co zwrócił podgląd, razem z jego base_hash. Gdy cennik zmienił się w międzyczasie, odpowiedź to 409 config_changed.

Zapytanie
curl -X POST "https://app.metronq.com/api/v1/integration/config/import" \
  -H "Authorization: Bearer mq_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "config": { "materials": [ "..." ], "...": "..." }, "base_hash": "9c1e4b0f2a7d" }'
Odpowiedź200 OK
{
  "materials": [ { "key": "alu_6061", "price_per_kg": 6.9, "...": "..." } ],
  "machines": [ "..." ],
  "params": { "margin_pct": 22.0, "...": "..." },
  "currency": "EUR"
}

Zapytania

GET/quotes?since=2026-09-16T00:00:00Z&limit=50Uprawnienie: quotes:read

Lista zapytań

Zapytania od najnowszych. Parametr since służy do odpytywania; status, external_ref, limit i offset robią resztę. Status to jeden z: created, uploaded, analyzing, analyzed, priced, approved, rejected, ordered, analysis_failed.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/quotes?since=2026-09-16T00:00:00Z&limit=50" \
  -H "Authorization: Bearer mq_live_YOUR_KEY"
Odpowiedź200 OK
{
  "items": [
    {
      "id": "6f1c0f5a-2a4d-4d7e-9f0b-2c9b8f0a1d33",
      "number": 1042,
      "ref": "WID-1042",
      "status": "priced",
      "created_at": "2026-09-16T08:41:12+00:00",
      "filename": "bracket.step",
      "material_key": "alu_6061",
      "quantity": 25,
      "unit_price": 41.5,
      "total_price": 1037.5,
      "discount_pct": null,
      "customer_unit_price": 41.5,
      "currency": "EUR",
      "customer_email": "purchasing@example.com",
      "customer_data_visible": true,
      "external_ref": "",
      "source": "widget"
    }
  ],
  "limit": 50,
  "offset": 0
}
GET/quotes/QUOTE_IDUprawnienie: quotes:read

Jedno zapytanie

Jedno zapytanie razem z zapisanym rozbiciem ceny - tym, czego potrzebuje system uzgadniający je we własnych księgach.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID" \
  -H "Authorization: Bearer mq_live_YOUR_KEY"
Odpowiedź200 OK
{
  "id": "6f1c0f5a-2a4d-4d7e-9f0b-2c9b8f0a1d33",
  "number": 1042,
  "status": "priced",
  "unit_price": 41.5,
  "total_price": 1037.5,
  "...": "...",
  "breakdown": {
    "machine_key": "dmu50",
    "machine_name": "DMU 50",
    "machine_hourly_rate": 95.0,
    "material_cost": 172.5,
    "machining_minutes": 11.2,
    "machining_cost": 443.3,
    "setup_cost_batch": 71.3,
    "programming_cost_batch": 47.5,
    "delivery_cost": 25.0,
    "lead_days": 10,
    "...": "..."
  }
}
GET/quotes/QUOTE_ID/metricsUprawnienie: quotes:read

Odczyt detalu

Co zmierzyła analiza: gabaryt, objętość, otwory, kieszenie, gwinty, najcieńsza ścianka i powody wstrzymania. 409 not_analysed znaczy, że plik jest jeszcze czytany.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/metrics" \
  -H "Authorization: Bearer mq_live_YOUR_KEY"
Odpowiedź200 OK
{
  "quote_id": "6f1c0f5a-2a4d-4d7e-9f0b-2c9b8f0a1d33",
  "status": "priced",
  "gate_status": "instant",
  "gate_reasons": [],
  "complexity": 34.2,
  "material_key": "alu_6061",
  "quantity": 25,
  "tolerance_class": "m",
  "surface_finish": "ra_3_2",
  "confirmed_threads": ["M8"],
  "geometry_metrics": {
    "bounding_box": { "x": 120.0, "y": 80.0, "z": 18.0 },
    "volume": 74210.5,
    "surface_area": 31890.2,
    "holes": [ { "diameter": 6.8, "depth": 18.0, "through": true } ],
    "pockets": [ { "depth": 6.0, "floor_area": 1840.0, "direction": [0, 0, 1], "corner_radius": 5.0, "open": false, "...": "..." } ],
    "min_wall_thickness": 3.1,
    "...": "..."
  },
  "parts": [],
  "...": "..."
}
GET/quotes/QUOTE_ID/detailUprawnienie: quotes:read

Cała wycena

Wszystko, co pokazuje ekran wyceny: na jakim etapie jest cena i czy klient może ją zobaczyć, pozycje ceny i VAT, specyfikacja, wartości, które przyjmuje ponowne przeliczenie, rozłożone na pola powody odmowy, ocena technologa, odczyt detalu, części złożenia i to, gdzie są pliki.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/detail" \
  -H "Authorization: Bearer mq_live_YOUR_KEY"
Odpowiedź200 OK
{
  "id": "6f1c0f5a-2a4d-4d7e-9f0b-2c9b8f0a1d33",
  "ref": "API-1043",
  "status": "priced",
  "unit_price": 41.5,
  "source": "api",
  "...": "...",
  "release": { "state": "needs_review", "customer_may_see_price": false },
  "pricing": {
    "engine_unit_price": 41.5,
    "customer_total": 1037.5,
    "delivery_cost": 25.0,
    "order_total": 1062.5,
    "vat_rate_pct": 19.0,
    "order_gross": 1264.38,
    "lead_days": 10,
    "...": "..."
  },
  "material": { "key": "alu_6061", "name": "Aluminium 6061", "density_g_cm3": 2.7, "...": "..." },
  "part_mass_kg": 0.2004,
  "specification": { "tolerance_class": "m", "surface_finish": "ra_3_2", "treatments": [], "...": "..." },
  "choices": {
    "thread_candidates": [ { "designation": "M8", "count": 4, "total_depth_mm": 72.0, "hole_key": "6.8" } ],
    "hole_fit_options": [ { "key": "8.0", "diameter": 8.0, "count": 2 } ],
    "...": "..."
  },
  "outcome": {
    "gate_status": "pending_review",
    "gate_reasons": [
      {
        "raw": "part_exceeds_envelope:vf2:part_size_y:350:310",
        "code": "part_exceeds_envelope",
        "machine_key": "vf2",
        "machine_name": "Haas VF-2",
        "field": "part_size_y",
        "actual": 350.0,
        "limit": 310.0
      }
    ],
    "review": { "note": null, "reviewed_at": null, "reviewed_by": null },
    "...": "..."
  },
  "readout": { "geometry_metrics": { "...": "..." }, "...": "..." },
  "items": [],
  "files": {
    "original": { "available": true, "path": "/quotes/6f1c0f5a-2a4d-4d7e-9f0b-2c9b8f0a1d33/file" },
    "preview": { "available": true, "path": "/quotes/6f1c0f5a-2a4d-4d7e-9f0b-2c9b8f0a1d33/preview.glb" },
    "readable": true,
    "...": "..."
  },
  "created_by_key": { "name": "PDM", "prefix": "a1b2c3d4" },
  "...": "..."
}
GET/quotes/QUOTE_ID/similarUprawnienie: quotes:read

Podobne detale

Trzy sprawdzone już detale zakładu najbliższe temu, z zatwierdzoną ceną i tym, jak daleko był od niej silnik.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/similar" \
  -H "Authorization: Bearer mq_live_YOUR_KEY"
Odpowiedź200 OK
{
  "count": 1,
  "items": [
    {
      "id": "0d9e7c21-5b3a-4f10-8c6d-9a2e4b7f1c05",
      "ref": "WID-1017",
      "original_filename": "bracket-rev-a.step",
      "approved_unit_price": 39.0,
      "quantity": 20,
      "currency": "EUR",
      "auto_error_pct": 4.1,
      "date": "2026-08-30T14:02:11+00:00"
    }
  ]
}
GET/quotes/QUOTE_ID/machine-optionsUprawnienie: quotes:read

Cena na każdej maszynie

Ta wycena policzona na każdej maszynie parku: cena za sztukę albo powody, dla których maszyna nie przyjmie detalu, oraz to, którą maszynę wybiera silnik.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/machine-options" \
  -H "Authorization: Bearer mq_live_YOUR_KEY"
Odpowiedź200 OK
{
  "count": 2,
  "items": [
    { "key": "dmu50", "name": "DMU 50", "unit_price": 41.5, "feasible": true, "reasons": [], "auto": true, "...": "..." },
    {
      "key": "vf2",
      "name": "Haas VF-2",
      "unit_price": null,
      "feasible": false,
      "reasons": [ { "code": "part_exceeds_envelope", "field": "part_size_y", "actual": 350.0, "limit": 310.0, "...": "..." } ],
      "auto": false,
      "...": "..."
    }
  ]
}
GET/quotes/QUOTE_ID/partsUprawnienie: quotes:read

Części złożenia

Każda część złożenia z własnymi gwintami i pasowaniami do potwierdzenia, maszyną, materiałem i formatką wybranymi przez technologa oraz powodem, gdy część nie ma ceny.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/parts" \
  -H "Authorization: Bearer mq_live_YOUR_KEY"
Odpowiedź200 OK
{
  "count": 2,
  "items": [
    {
      "index": 1,
      "label": "Housing cover",
      "count": 1,
      "unpriced_reason": null,
      "price_overrides": { "machine_key": "dmu50" },
      "choices": {
        "thread_candidates": [ { "key": "1:M16", "designation": "M16", "...": "..." } ],
        "hole_fit_options": [ { "key": "1:80.0", "diameter": 80.0, "...": "..." } ],
        "...": "..."
      },
      "...": "..."
    },
    { "index": 2, "label": "Bearing 6208", "count": 2, "gate_status": "tbd", "unpriced_reason": "norm_part", "...": "..." }
  ]
}
PATCH/quotes/QUOTE_IDUprawnienie: quotes:write

Twój numer przy zapytaniu

Zapisuje numer z Twojego systemu i nic więcej. Cena i akceptacja należą do silnika i do technologa.

Zapytanie
curl -X PATCH "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID" \
  -H "Authorization: Bearer mq_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "external_ref": "RFQ-2026-0455" }'
Odpowiedź200 OK
{
  "id": "6f1c0f5a-2a4d-4d7e-9f0b-2c9b8f0a1d33",
  "number": 1042,
  "external_ref": "RFQ-2026-0455",
  "...": "..."
}

Wysyłanie detalu

POST/quotesUprawnienie: quotes:create

Otwórz wycenę dla pliku

Nazwa i rozmiar pliku oraz to, jak go wycenić. Odpowiedź niesie adres i nagłówki do wgrania; plik trafia do magazynu, a nie przez nas. Każdy plik liczy się jako wycena w planie.

Zapytanie
curl -X POST "https://app.metronq.com/api/v1/integration/quotes" \
  -H "Authorization: Bearer mq_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "filename": "bracket.step", "file_size_bytes": 482113, "quantity": 25, "material_key": "alu_6061", "tolerance_class": "f", "external_ref": "RFQ-2026-0455" }'
Odpowiedź201 Created
{
  "quote": {
    "id": "6f1c0f5a-2a4d-4d7e-9f0b-2c9b8f0a1d33",
    "number": 1043,
    "ref": "API-1043",
    "status": "created",
    "source": "api",
    "external_ref": "RFQ-2026-0455",
    "...": "..."
  },
  "release": { "state": "waiting", "customer_may_see_price": false },
  "upload": {
    "method": "PUT",
    "url": "https://OBJECT_STORAGE/...",
    "headers": {
      "x-amz-server-side-encryption-customer-algorithm": "AES256",
      "x-amz-server-side-encryption-customer-key": "...",
      "x-amz-server-side-encryption-customer-key-MD5": "..."
    },
    "content_length": 482113,
    "expires_at": "2026-09-25T10:15:00+00:00"
  }
}
POST/quotes/QUOTE_ID/confirm-uploadUprawnienie: quotes:create

Potwierdź wgranie

Plik dotarł: analiza trafia do kolejki, a detal jest wyceniany zaraz po niej. Podwójne potwierdzenie niczego nie psuje.

Zapytanie
curl -X POST "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/confirm-upload" \
  -H "Authorization: Bearer mq_live_YOUR_KEY"
Odpowiedź202 Accepted
{
  "quote": { "id": "6f1c0f5a-2a4d-4d7e-9f0b-2c9b8f0a1d33", "ref": "API-1043", "status": "uploaded", "...": "..." },
  "release": { "state": "waiting", "customer_may_see_price": false },
  "poll_after_seconds": 10
}
POST/quotes/QUOTE_ID/repriceUprawnienie: quotes:create

Zmień parametry

Ilość, materiał, tolerancje, gwinty, pasowania, obróbki albo termin - silnik wycenia od nowa. Dowolna wycena, dopóki nie zdecyduje człowiek.

Zapytanie
curl -X POST "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/reprice" \
  -H "Authorization: Bearer mq_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "quantity": 50, "confirmed_threads": ["M8"], "hole_fits": { "8.0": "H7" } }'
Odpowiedź200 OK
{
  "quote": { "id": "6f1c0f5a-2a4d-4d7e-9f0b-2c9b8f0a1d33", "status": "priced", "quantity": 50, "unit_price": 36.9, "...": "..." },
  "release": { "state": "instant", "customer_may_see_price": true }
}
POST/quotes/QUOTE_ID/drawing-inputsUprawnienie: quotes:create

Uzupełnij rysunek

Materiał, skala albo grubość dla rysunku, który wysłał Twój system, a którego silnik nie zdołał zamienić w model. Analiza rusza ponownie.

Zapytanie
curl -X POST "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/drawing-inputs" \
  -H "Authorization: Bearer mq_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "scale_ratio": 2.0, "material_key": "steel_c45" }'
Odpowiedź202 Accepted
{
  "quote": { "id": "6f1c0f5a-2a4d-4d7e-9f0b-2c9b8f0a1d33", "status": "uploaded", "...": "..." },
  "release": { "state": "waiting", "customer_may_see_price": false },
  "poll_after_seconds": 10
}
POST/quotes/QUOTE_ID/submit-drawingUprawnienie: quotes:create

Przekaż rysunek człowiekowi

Rysunek wysłany przez Twój system, którego silnik nie zdołał odtworzyć, trafia do technologa, który wycenia go ręcznie.

Zapytanie
curl -X POST "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/submit-drawing" \
  -H "Authorization: Bearer mq_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "quantity": 10 }'
Odpowiedź200 OK
{
  "quote": { "id": "6f1c0f5a-2a4d-4d7e-9f0b-2c9b8f0a1d33", "status": "priced", "unit_price": null, "...": "..." },
  "release": { "state": "manual", "customer_may_see_price": false }
}

Pliki i dokumenty

GET/quotes/QUOTE_ID/pdf?locale=enUprawnienie: quotes:read

Dokument wyceny

PDF, który tworzy przycisk Eksport w panelu, w każdym języku oferowanym przez zakład.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/pdf?locale=en" \
  -H "Authorization: Bearer mq_live_YOUR_KEY" \
  -o API-1043.pdf
Odpowiedź200 OK
Content-Type: application/pdf
Content-Disposition: attachment; filename="quote-API-1043.pdf"
GET/quotes/QUOTE_ID/fileUprawnienie: quotes:read + files:read

Wgrany plik

Plik klienta pod jego oryginalną nazwą, odszyfrowany przy wydaniu.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/file" \
  -H "Authorization: Bearer mq_live_YOUR_KEY" \
  -o bracket.step
Odpowiedź200 OK
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="bracket.step"
Content-Length: 482113
GET/quotes/QUOTE_ID/preview.glbUprawnienie: quotes:read + files:read

Podgląd 3D

Model, który rysuje przeglądarka 3D w panelu, jako binarny glTF. Jego powierzchnie są kluczami indywidualnych tolerancji powierzchni.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/preview.glb" \
  -H "Authorization: Bearer mq_live_YOUR_KEY" \
  -o bracket.glb
Odpowiedź200 OK
Content-Type: model/gltf-binary
Content-Length: 211904
GET/quotes/QUOTE_ID/items/2/preview.glbUprawnienie: quotes:read + files:read

Jedna część złożenia

Podgląd pojedynczej części, wskazanej indeksem z listy części w pełnej wycenie.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/items/2/preview.glb" \
  -H "Authorization: Bearer mq_live_YOUR_KEY" \
  -o part-2.glb
Odpowiedź200 OK
Content-Type: model/gltf-binary
Content-Length: 48212

Zamówienia

GET/orders?since=2026-09-16T00:00:00ZUprawnienie: quotes:read

Lista zamówień

Zamówienia od najnowszych, z tymi samymi filtrami. Dane klienta wracają tylko z zakresem customers:read.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/orders?since=2026-09-16T00:00:00Z" \
  -H "Authorization: Bearer mq_live_YOUR_KEY"
Odpowiedź200 OK
{
  "items": [
    {
      "id": "1b7a44c0-9d2e-4e51-8a10-64d1f0a2e777",
      "quote_id": "6f1c0f5a-2a4d-4d7e-9f0b-2c9b8f0a1d33",
      "status": "confirmed",
      "payment_status": "unpaid",
      "created_at": "2026-09-16T09:12:40+00:00",
      "paid_at": null,
      "quantity": 25,
      "unit_price": 41.5,
      "total_price": 1062.5,
      "min_order_top_up": 0.0,
      "delivery_cost": 25.0,
      "currency": "EUR",
      "external_ref": "",
      "customer": { "name": "Alex Morgan", "company": "Example Engineering Ltd", "city": "Riverton", "...": "..." },
      "note": "",
      "customer_data_visible": true
    }
  ],
  "limit": 100,
  "offset": 0
}
GET/orders/ORDER_IDUprawnienie: quotes:read

Jedno zamówienie

Jedno zamówienie z klientem, któremu trzeba wystawić fakturę i wysłać części.

Zapytanie
curl "https://app.metronq.com/api/v1/integration/orders/ORDER_ID" \
  -H "Authorization: Bearer mq_live_YOUR_KEY"
Odpowiedź200 OK
{
  "id": "1b7a44c0-9d2e-4e51-8a10-64d1f0a2e777",
  "status": "confirmed",
  "payment_status": "unpaid",
  "customer": {
    "name": "Alex Morgan",
    "email": "purchasing@example.com",
    "company": "Example Engineering Ltd",
    "address": "12 Industrial Road",
    "postcode": "AB1 2CD",
    "city": "Riverton",
    "...": "..."
  },
  "note": "",
  "...": "..."
}
PATCH/orders/ORDER_IDUprawnienie: quotes:write

Status i numer zlecenia

Twój numer, status i znacznik płatności. Zmieniane są tylko pola z treści zapytania; potwierdzenie i wysyłka wysyłają klientowi maila.

Zapytanie
curl -X PATCH "https://app.metronq.com/api/v1/integration/orders/ORDER_ID" \
  -H "Authorization: Bearer mq_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "external_ref": "WO-2026-0912", "status": "in_production" }'
Odpowiedź200 OK
{
  "id": "1b7a44c0-9d2e-4e51-8a10-64d1f0a2e777",
  "status": "in_production",
  "payment_status": "unpaid",
  "external_ref": "WO-2026-0912",
  "quantity": 25,
  "total_price": 1062.5,
  "currency": "EUR",
  "...": "..."
}

06Pytania

Najczęstsze pytania o API

Jak dostać dostęp do API?

Dostęp uzgadniamy z każdym zakładem indywidualnie - wystarczy napisać, jakiego systemu używasz. Klucze zakłada potem właściciel konta w ustawieniach, w zakładce Integracje.

Czy mogę przetestować integrację przed decyzją?

Tak. Na czas budowania połączenia zakład może dostać klucz testowy z budżetem zapytań na cały test. Budżet jest widoczny w panelu i w każdej odpowiedzi API.

Czy API może samo zmienić ceny, które widzą klienci?

Tylko przez podgląd i zatwierdzenie, tak samo jak import w panelu, i tylko kluczem z zakresem config:write. Każda zmiana trafia do historii ustawień z nazwą klucza, który ją wykonał.

Czy klucz API może zatwierdzić albo zmienić cenę wyceny?

Nie. Klucz może wysłać plik i zmienić parametry, z jakimi jest wyceniany - cenę liczy wtedy silnik - zapisać Twój numer przy zapytaniu i przesunąć status zamówienia. Cena wpisana ręcznie, akceptacja i rabaty należą do człowieka.

Czy mój system może wysyłać pliki detali do wyceny?

Tak, kluczem z zakresem quotes:create. System otwiera wycenę, wgrywa plik prosto do zaszyfrowanego magazynu i potwierdza wgranie; silnik analizuje i wycenia detal, a z powrotem wraca cała wycena. Każdy plik liczy się jako wycena w planie zakładu, dokładnie tak samo jak plik z widgetu.

Czy MetronQ sam powiadamia mój system o nowych zapytaniach?

Jeszcze nie. Dziś Twój system odpytuje o nowe zapytania i zamówienia parametrem since, co przy domyślnym limicie 120 zapytań na minutę mieści się z dużym zapasem. Jeśli potrzebujesz powiadomień wysyłanych przez nas, napisz - od zgłoszeń zależy, co budujemy dalej.

Jakie dane klienta widzi integracja?

Tylko te, na które pozwala klucz. Bez zakresu customers:read zapytania i zamówienia wracają bez e-maila, danych kontaktowych i uwag klienta, a pole customer_data_visible mówi wprost, że je ukryto.

Czy mogę wymieniać dane przez Excela, bez programisty?

Tak. Eksport i import CSV działają w panelu, w zasadach wyceny: najpierw eksport, poprawki w arkuszu, potem import z podglądem zmian.

Połączmy MetronQ z systemem, który już masz

Napisz, jakiego ERP albo CRM używasz. Dobierzemy zakresy i limity, a na czas budowy połączenia dostaniesz klucz testowy.