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
- Ceny materiałów
POST /config/import - Narzędziownia
PUT /machines/{key}/tools - Pliki do wyceny
POST /quotes - Nowe zapytania
GET /quotes?since= - Odczyt detalu
GET /quotes/{id}/metrics - Status zlecenia
PATCH /orders/{id}
cennik · wyceny · zamówienia01Zalety
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ę.
Narzędziownia i park maszyn
Nowe zapytania
Pliki do wyceny
Przygotowanie produkcji
Statusy zamówień
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.
- Eksport z ERP
Arkusz CSV albo jeden dokument JSON z materiałami, maszynami i obróbkami.
- Podgląd
Co zostałoby dodane i zmienione, pole po polu, oraz wiersze i kolumny, których system nie rozumie.
- 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.
- Historia
Import trafia do historii ustawień pole po polu, z nazwą klucza, który go wykonał.
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..." }'{
"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
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.
Limit: 120 zapytań na minutę i 20 000 na dobę, liczone od godziny 00:00 UTC. Dziś wykorzystano: 212.
| Nazwa | Uprawnienia | Ostatnio użyty | Wygasa | Limit dzienny | |
|---|---|---|---|---|---|
| Synchronizacja ERPa1b2c3d4... | config:read, quotes:read, quotes:write | dziś 09:14 | 16.09.2027 | limit konta | Cofnij |
| Import cennikae5f6a7b8... | config:read, config:write | wczoraj 06:00 | 02.10.2027 | limit konta | Cofnij |
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
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
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
| Status | Kod | Co zrobić |
|---|---|---|
| 429 | rate_limited | Minuta jest pełna. To samo zapytanie przejdzie za chwilę; Retry-After mówi, za ile sekund. |
| 429 | daily_quota_exceeded | Doba jest wykorzystana. Retry-After odlicza do 00:00 UTC. |
| 429 | total_quota_exceeded | Budżet klucza testowego się skończył. Bez Retry-After, bo czekanie nic nie zmieni. |
| 401 | invalid_api_key | Nieznany, 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. |
| 403 | missing_scope | Klucz jest ważny, ale nie ma uprawnienia do tego wywołania. Pomoże klucz z właściwym zakresem. |
| 404 | not_found | Nie ma takiego zapytania ani zamówienia na tym koncie. Nieistniejący katalog albo maszyna mają własne kody: unknown_catalog, unknown_machine. |
| 404 | unknown_tool | Maszyna 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. |
| 404 | file_not_found | Nie udało się odczytać zapisanego pliku ani podglądu. Wycena istnieje, ale jej plików nie dało się pobrać. |
| 400 | invalid_base64 | Pole csv_base64 w podglądzie importu nie jest poprawnym base64. Nic nie odczytano ani nie zapisano. |
| 409 | config_changed | Ktoś zapisał cennik między podglądem a zatwierdzeniem. Pobierz, podejrzyj i zatwierdź od nowa. |
| 409 | not_analysed | Zapytanie nie ma jeszcze odczytu: plik jest wciąż analizowany albo analiza się nie powiodła (status analysis_failed). |
| 403 | quoting_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). |
| 429 | analysis_backlog | Pięć 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. |
| 409 | file_not_uploaded | Plik 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ę. |
| 409 | upload_expired | Potwierdzenie 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ę. |
| 409 | quote_closed | Człowiek zatwierdził lub odrzucił wycenę albo klient ją zamówił. Jej parametrów nie da się już zmienić. |
| 409 | quote_in_review | Technolog zaczął już decydować i wpisał cenę wyceny albo jednej z jej części. Ponowne przeliczenie skasowałoby tę pracę, więc jest odrzucane. |
| 409 | not_a_drawing | Ta wycena nie jest rysunkiem, więc nie ma czego uzupełniać ani przekazywać człowiekowi. |
| 409 | quote_already_analyzed | Rysunek nie czeka już na dane: został odtworzony i wyceniony, już trafił do zakładu albo jest ponownie analizowany. |
| 422 | unknown_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. |
| 422 | detail: [...] | 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.
https://app.metronq.com/api/v1/integrationwyłącznie HTTPSAuthorization: Bearer mq_live_...klucz z ustawień zakładuJSONpoza tym CSV (.csv), PDF (/pdf), pliki klientów (/file) i podglądy 3D (.glb)Start
/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.
curl "https://app.metronq.com/api/v1/integration/whoami" \
-H "Authorization: Bearer mq_live_YOUR_KEY"{
"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
/configUprawnienie: config:readCały cennik
Cały dokument wyceny: trzy katalogi, wszystkie parametry, bramki, strategie doboru maszyny i półfabrykatu oraz waluta. Ten sam dokument przyjmuje import.
curl "https://app.metronq.com/api/v1/integration/config" \
-H "Authorization: Bearer mq_live_YOUR_KEY"{
"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"
}/catalog/materialsUprawnienie: config:readJeden katalog
Materiały, maszyny albo obróbki jako JSON, bez przechodzenia przez cały cennik. Maszyny niosą bibliotekę narzędzi i blok danych identyfikacyjnych.
curl "https://app.metronq.com/api/v1/integration/catalog/materials" \
-H "Authorization: Bearer mq_live_YOUR_KEY"{
"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
}
]
}/catalog/machines.csvUprawnienie: config:readKatalog jako arkusz
Ten sam katalog jako CSV, który daje przycisk Eksport w panelu: z BOM dla Excela i separatorem ustawionym dla zakładu.
curl "https://app.metronq.com/api/v1/integration/catalog/machines.csv" \
-H "Authorization: Bearer mq_live_YOUR_KEY"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;.../cutting-dataUprawnienie: config:readDane 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.
curl "https://app.metronq.com/api/v1/integration/cutting-data" \
-H "Authorization: Bearer mq_live_YOUR_KEY"{
"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
/tools?machine=dmu50Uprawnienie: config:readNarzę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.
curl "https://app.metronq.com/api/v1/integration/tools?machine=dmu50" \
-H "Authorization: Bearer mq_live_YOUR_KEY"{
"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, "...": "..." }
]
}/machines/dmu50/toolsUprawnienie: config:readNarzędzia jednej maszyny
Magazyn narzędzi jednej maszyny i promień naroża, który z niego wynika.
curl "https://app.metronq.com/api/v1/integration/machines/dmu50/tools" \
-H "Authorization: Bearer mq_live_YOUR_KEY"{
"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", "...": "..." } ]
}/machines/dmu50/toolsUprawnienie: config:writeZastą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ń.
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" } ] }'{
"machine_key": "dmu50",
"machine_name": "DMU 50",
"count": 3,
"min_tool_radius_mm": 1.0,
"tool_radius_effective_mm": 6.0,
"items": [ "..." ]
}/machines/dmu50/toolsUprawnienie: config:writeDodaj jedno narzędzie
Dodaje narzędzie albo zastępuje to pod tym samym kluczem - dla systemu, który zgłasza pojedynczą zmianę.
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 }'{
"machine_key": "dmu50",
"machine_name": "DMU 50",
"count": 4,
"min_tool_radius_mm": 1.0,
"tool_radius_effective_mm": 6.0,
"items": [ "..." ]
}/machines/dmu50/tools/r8h7Uprawnienie: config:writeUsuń narzędzie
Usuwa jedno narzędzie. Nieznany klucz daje 404, żeby synchronizacja odróżniła usunięcie od literówki we własnym mapowaniu.
curl -X DELETE "https://app.metronq.com/api/v1/integration/machines/dmu50/tools/r8h7" \
-H "Authorization: Bearer mq_live_YOUR_KEY"{
"machine_key": "dmu50",
"machine_name": "DMU 50",
"count": 3,
"min_tool_radius_mm": 1.0,
"tool_radius_effective_mm": 6.0,
"items": [ "..." ]
}Import
/config/import/previewUprawnienie: config:writePodglą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.
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..." }'{
"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": [ "..." ], "...": "..." }
}/config/import/preview-jsonUprawnienie: config:writePodglą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.
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": [ "..." ] } }'{
"ok": true,
"added": ["pom_c"],
"updated": [],
"changes_total": 1,
"base_hash": "9c1e4b0f2a7d",
"...": "..."
}/config/importUprawnienie: config:writeZatwierdź 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.
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" }'{
"materials": [ { "key": "alu_6061", "price_per_kg": 6.9, "...": "..." } ],
"machines": [ "..." ],
"params": { "margin_pct": 22.0, "...": "..." },
"currency": "EUR"
}Zapytania
/quotes?since=2026-09-16T00:00:00Z&limit=50Uprawnienie: quotes:readLista 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.
curl "https://app.metronq.com/api/v1/integration/quotes?since=2026-09-16T00:00:00Z&limit=50" \
-H "Authorization: Bearer mq_live_YOUR_KEY"{
"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
}/quotes/QUOTE_IDUprawnienie: quotes:readJedno zapytanie
Jedno zapytanie razem z zapisanym rozbiciem ceny - tym, czego potrzebuje system uzgadniający je we własnych księgach.
curl "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID" \
-H "Authorization: Bearer mq_live_YOUR_KEY"{
"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,
"...": "..."
}
}/quotes/QUOTE_ID/metricsUprawnienie: quotes:readOdczyt 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.
curl "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/metrics" \
-H "Authorization: Bearer mq_live_YOUR_KEY"{
"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": [],
"...": "..."
}/quotes/QUOTE_ID/detailUprawnienie: quotes:readCał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.
curl "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/detail" \
-H "Authorization: Bearer mq_live_YOUR_KEY"{
"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" },
"...": "..."
}/quotes/QUOTE_ID/similarUprawnienie: quotes:readPodobne detale
Trzy sprawdzone już detale zakładu najbliższe temu, z zatwierdzoną ceną i tym, jak daleko był od niej silnik.
curl "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/similar" \
-H "Authorization: Bearer mq_live_YOUR_KEY"{
"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"
}
]
}/quotes/QUOTE_ID/machine-optionsUprawnienie: quotes:readCena 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.
curl "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/machine-options" \
-H "Authorization: Bearer mq_live_YOUR_KEY"{
"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,
"...": "..."
}
]
}/quotes/QUOTE_ID/partsUprawnienie: quotes:readCzęś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.
curl "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/parts" \
-H "Authorization: Bearer mq_live_YOUR_KEY"{
"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", "...": "..." }
]
}/quotes/QUOTE_IDUprawnienie: quotes:writeTwój numer przy zapytaniu
Zapisuje numer z Twojego systemu i nic więcej. Cena i akceptacja należą do silnika i do technologa.
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" }'{
"id": "6f1c0f5a-2a4d-4d7e-9f0b-2c9b8f0a1d33",
"number": 1042,
"external_ref": "RFQ-2026-0455",
"...": "..."
}Wysyłanie detalu
/quotesUprawnienie: quotes:createOtwó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.
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" }'{
"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"
}
}/quotes/QUOTE_ID/confirm-uploadUprawnienie: quotes:createPotwierdź wgranie
Plik dotarł: analiza trafia do kolejki, a detal jest wyceniany zaraz po niej. Podwójne potwierdzenie niczego nie psuje.
curl -X POST "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/confirm-upload" \
-H "Authorization: Bearer mq_live_YOUR_KEY"{
"quote": { "id": "6f1c0f5a-2a4d-4d7e-9f0b-2c9b8f0a1d33", "ref": "API-1043", "status": "uploaded", "...": "..." },
"release": { "state": "waiting", "customer_may_see_price": false },
"poll_after_seconds": 10
}/quotes/QUOTE_ID/repriceUprawnienie: quotes:createZmień parametry
Ilość, materiał, tolerancje, gwinty, pasowania, obróbki albo termin - silnik wycenia od nowa. Dowolna wycena, dopóki nie zdecyduje człowiek.
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" } }'{
"quote": { "id": "6f1c0f5a-2a4d-4d7e-9f0b-2c9b8f0a1d33", "status": "priced", "quantity": 50, "unit_price": 36.9, "...": "..." },
"release": { "state": "instant", "customer_may_see_price": true }
}/quotes/QUOTE_ID/drawing-inputsUprawnienie: quotes:createUzupeł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.
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" }'{
"quote": { "id": "6f1c0f5a-2a4d-4d7e-9f0b-2c9b8f0a1d33", "status": "uploaded", "...": "..." },
"release": { "state": "waiting", "customer_may_see_price": false },
"poll_after_seconds": 10
}/quotes/QUOTE_ID/submit-drawingUprawnienie: quotes:createPrzekaż 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.
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 }'{
"quote": { "id": "6f1c0f5a-2a4d-4d7e-9f0b-2c9b8f0a1d33", "status": "priced", "unit_price": null, "...": "..." },
"release": { "state": "manual", "customer_may_see_price": false }
}Pliki i dokumenty
/quotes/QUOTE_ID/pdf?locale=enUprawnienie: quotes:readDokument wyceny
PDF, który tworzy przycisk Eksport w panelu, w każdym języku oferowanym przez zakład.
curl "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/pdf?locale=en" \
-H "Authorization: Bearer mq_live_YOUR_KEY" \
-o API-1043.pdfContent-Type: application/pdf
Content-Disposition: attachment; filename="quote-API-1043.pdf"/quotes/QUOTE_ID/fileUprawnienie: quotes:read + files:readWgrany plik
Plik klienta pod jego oryginalną nazwą, odszyfrowany przy wydaniu.
curl "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/file" \
-H "Authorization: Bearer mq_live_YOUR_KEY" \
-o bracket.stepContent-Type: application/octet-stream
Content-Disposition: attachment; filename="bracket.step"
Content-Length: 482113/quotes/QUOTE_ID/preview.glbUprawnienie: quotes:read + files:readPodgląd 3D
Model, który rysuje przeglądarka 3D w panelu, jako binarny glTF. Jego powierzchnie są kluczami indywidualnych tolerancji powierzchni.
curl "https://app.metronq.com/api/v1/integration/quotes/QUOTE_ID/preview.glb" \
-H "Authorization: Bearer mq_live_YOUR_KEY" \
-o bracket.glbContent-Type: model/gltf-binary
Content-Length: 211904/quotes/QUOTE_ID/items/2/preview.glbUprawnienie: quotes:read + files:readJedna część złożenia
Podgląd pojedynczej części, wskazanej indeksem z listy części w pełnej wycenie.
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.glbContent-Type: model/gltf-binary
Content-Length: 48212Zamówienia
/orders?since=2026-09-16T00:00:00ZUprawnienie: quotes:readLista zamówień
Zamówienia od najnowszych, z tymi samymi filtrami. Dane klienta wracają tylko z zakresem customers:read.
curl "https://app.metronq.com/api/v1/integration/orders?since=2026-09-16T00:00:00Z" \
-H "Authorization: Bearer mq_live_YOUR_KEY"{
"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
}/orders/ORDER_IDUprawnienie: quotes:readJedno zamówienie
Jedno zamówienie z klientem, któremu trzeba wystawić fakturę i wysłać części.
curl "https://app.metronq.com/api/v1/integration/orders/ORDER_ID" \
-H "Authorization: Bearer mq_live_YOUR_KEY"{
"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": "",
"...": "..."
}/orders/ORDER_IDUprawnienie: quotes:writeStatus 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.
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" }'{
"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.