API und ERP-Anbindung
Die Preisliste aus Ihrem ERP, die Anfragen zurück ins ERP.Keine Doppelerfassung.
MetronQ hat eine API für das System, mit dem Ihr Betrieb bereits arbeitet: ein ERP, ein CRM, eine Tabelle oder ein Automatisierungstool. Von dort kommen Materialpreise, Maschinen, Werkzeuge und Teiledateien, dorthin gehen Kalkulationen, Geometrieauswertungen und Aufträge zurück. Jede Änderung an der Preisliste durchläuft eine Vorschau, bevor etwas gespeichert wird.
- REST und JSON
- 7 Berechtigungen
- Vorschau vor dem Speichern
- Limits in jeder Antwort
- Materialpreise
POST /config/import - Werkzeugdaten
PUT /machines/{key}/tools - Dateien zur Kalkulation
POST /quotes - Neue Anfragen
GET /quotes?since= - Geometrieauswertung
GET /quotes/{id}/metrics - Auftragsstatus
PATCH /orders/{id}
Preisliste · Kalkulationen · Aufträge01Vorteile
Was nicht mehr von Hand erledigt wird
Sechs Dinge, die in einem Betrieb heute jemand von einem System ins andere überträgt. Mit der API übernimmt das System diese Arbeit, und ein Mensch sieht sich den Unterschied an.
Werkzeugverwaltung und Maschinenpark
Neue Anfragen
Dateien zur Kalkulation
Arbeitsvorbereitung
Auftragsstatus
02Datenwege
Die vier am häufigsten gebauten Datenwege
Wählen Sie einen Weg, um seine Stationen und den wichtigsten Aufruf zu sehen - als echtes Beispiel samt Antwort.
Preise und Kataloge fließen aus Ihrem System in MetronQ. Gespeichert wird nichts, bevor eine Vorschau den Unterschied gezeigt hat.
- Export aus dem ERP
Eine CSV-Tabelle oder ein einziges JSON-Dokument mit Werkstoffen, Maschinen und Behandlungen.
- Vorschau
Was hinzukäme und was sich ändern würde, Feld für Feld, dazu alle Zeilen und Spalten, die das System nicht versteht.
- Übernahme
Das System schickt den base_hash der Vorschau zurück. Hat jemand die Preisliste zwischendurch gespeichert, bekommt es 409 und erstellt die Vorschau neu.
- Verlauf
Der Import landet Feld für Feld im Änderungsprotokoll der Einstellungen, mit dem Namen des Schlüssels, der ihn ausgeführt hat.
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": [ "..." ], "...": "..." }
}03Kontrolle
Der Schlüssel gehört dem Betrieb, nicht dem Integrator
Sie legen einen Schlüssel in den Einstellungen an, vergeben Berechtigungen und sehen, was wann damit geschehen ist.
Ein Schlüssel wird nur einmal angezeigt, beim Erstellen, und wir speichern ihn nicht in lesbarer Form. Ein verlorener Schlüssel wird widerrufen und ersetzt. Er gehört dem Betrieb und nicht einer Person und funktioniert deshalb weiter, während die Person, die ihn angelegt hat, im Urlaub ist.
Die Berechtigungen sind bewusst eng gefasst. Ein Schlüssel, der den Katalog liest, kann keine Anfragen lesen, und ein Schlüssel, der Anfragen liest, sieht weder die personenbezogenen Daten des Kunden noch die von ihm hochgeladenen Dateien ohne eigene Berechtigungen dafür. Ein Schlüssel, der Dateien sendet, ist kein Schlüssel, der Kalkulationen liest. Kein Schlüssel kann einen anderen Schlüssel erstellen oder widerrufen.
Sieben Berechtigungen
- config:read
- Katalog und Kalkulationsregeln lesen.
- config:write
- Katalog und Kalkulationsregeln ändern, über dieselbe Vorschau und Übernahme wie im Panel.
- quotes:read
- Anfragen und Aufträge: Teil, Werkstoff, Menge, Preis und Geometrieauswertung.
- customers:read
- Die Kontaktdaten des Kunden. Ohne diese Berechtigung bleiben die Felder leer.
- quotes:write
- Ihre eigene Nummer und der Auftragsstatus. Kalkulieren oder freigeben kann dieser Schlüssel nichts.
- quotes:create
- Teiledateien zur Kalkulation senden und die Parameter einer Kalkulation ändern. Den Preis rechnet die Engine; freigeben oder einen Rabatt gewähren kann der Schlüssel nicht.
- files:read
- Die von Kunden hochgeladenen Dateien und die 3D-Vorschauen, zusammen mit quotes:read. Bewusst getrennt: Eine Datei ist die Konstruktion eines anderen.
- Ein Schlüssel läuft 365 Tage nach dem Anlegen ab
- Ein Widerruf wirkt schon ab dem nächsten Aufruf
- Ein Zugriffsprotokoll, das zwei Jahre aufbewahrt wird
- Das Präfix mq_live_ für den Secret-Scanner in Ihrem Repository
Ein Schlüssel erlaubt Ihrem ERP, CRM oder Automatisierungswerkzeug, mit diesem Konto zu arbeiten, ohne dass sich jemand anmeldet: Katalog und Kalkulationsregeln lesen und aktualisieren, Kalkulationen und Bestellungen lesen, Teiledateien zur Kalkulation senden und Dateien herunterladen - jeweils nur mit den Berechtigungen, die Sie ihm geben.
Limit: 120 Anfragen pro Minute und 20.000 pro Tag, gezählt ab 00:00 UTC. Heute verbraucht: 212.
| Name | Berechtigungen | Zuletzt genutzt | Gültig bis | Tageslimit | |
|---|---|---|---|---|---|
| ERP-Abgleicha1b2c3d4... | config:read, quotes:read, quotes:write | heute 09:14 | 16.09.2027 | Kontolimit | Widerrufen |
| Preislisten-Importe5f6a7b8... | config:read, config:write | gestern 06:00 | 02.10.2027 | Kontolimit | Widerrufen |
Wann etwas die Fähigkeit erhalten oder verloren hat, dieses Konto zu lesen. Zwei Jahre aufbewahrt.
- Katalog importiertPreislisten-Import · e5f6a7b818.09.2026 06:00
- Schlüssel erstelltERP-Abgleich · a1b2c3d416.09.2026 10:12
- Schlüssel erstelltPreislisten-Import · e5f6a7b802.10.2026 08:30
Einstellungen, Reiter Integrationen - Beispieldaten
04Limits
Jede Antwort zeigt, wie viel noch übrig ist
Eine Integration weiß, wo sie steht, bevor sie an ein Limit stößt - nicht erst danach.
Den API-Zugang und seine Limits vereinbaren wir mit jedem Betrieb einzeln. Standardmäßig erhält ein Betrieb 120 Aufrufe pro Minute und 20.000 pro Tag, gezählt ab 00:00 UTC; die für ein Konto vereinbarten Werte können abweichen. Ein stündlicher Katalogabgleich und eine minütliche Abfrage neuer Anfragen passen bequem in die Standardwerte.
Header in jeder Antwort
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
Solange eine Integration gebaut wird, kann ein Betrieb einen Schlüssel mit einem Budget für den gesamten Test bekommen. Das Budget erneuert sich nicht und ist im Panel, in whoami und in den Headern sichtbar. Es reicht, um die Anbindung zu bauen - und bewusst nicht, um sie damit zu betreiben.
Was eine Ablehnung bedeutet
| Status | Code | Was tun |
|---|---|---|
| 429 | rate_limited | Die Minute ist voll. Derselbe Aufruf funktioniert kurz darauf wieder; Retry-After nennt die Sekunden bis dahin. |
| 429 | daily_quota_exceeded | Der Tag ist aufgebraucht. Retry-After zählt bis 00:00 UTC herunter. |
| 429 | total_quota_exceeded | Das Testbudget ist aufgebraucht. Kein Retry-After, denn Warten ändert nichts. |
| 401 | invalid_api_key | Unbekannter, widerrufener oder abgelaufener Schlüssel oder ein Konto, dessen API-Zugang gesperrt ist oder dessen Testphase, Tarif oder Lizenz abgelaufen ist. Bewusst eine einzige Antwort für alle diese Fälle. |
| 403 | missing_scope | Der Schlüssel ist gültig, aber ihm fehlt die Berechtigung für diesen Aufruf. Abhilfe schafft ein Schlüssel mit der richtigen Berechtigung. |
| 404 | not_found | Diese Anfrage oder diesen Auftrag gibt es in diesem Konto nicht. Ein nicht vorhandener Katalog und eine nicht vorhandene Maschine haben eigene Codes: unknown_catalog, unknown_machine. |
| 404 | unknown_tool | Die Maschine hat kein Werkzeug mit diesem key. Entfernt wurde nichts, so kann ein Abgleich ein Entfernen von einem Tippfehler in der eigenen Zuordnung unterscheiden. |
| 404 | file_not_found | Die gespeicherte Datei oder Vorschau konnte nicht gelesen werden. Die Kalkulation existiert, ihre Dateien ließen sich aber nicht abrufen. |
| 400 | invalid_base64 | Das Feld csv_base64 einer Importvorschau ist kein gültiges Base64. Nichts wurde gelesen oder gespeichert. |
| 409 | config_changed | Jemand hat die Preisliste zwischen Vorschau und Übernahme gespeichert. Neu lesen, neue Vorschau erstellen und erneut übernehmen. |
| 409 | not_analysed | Die Anfrage hat noch keine Auswertung: Ihre Datei wird noch analysiert, oder die Analyse ist fehlgeschlagen (Status analysis_failed). |
| 403 | quoting_blocked:... | Der Betrieb darf gerade keine neuen Kalkulationen anlegen. Der Grund steht nach dem Doppelpunkt: trial_limit (die Kalkulationen der Testphase sind aufgebraucht), plan_limit (die Kalkulationen des Tarifs für diesen Monat) oder daily_limit (das eigene Tageslimit des Betriebs). |
| 429 | analysis_backlog | Fünf Dateien, die der Betrieb über die API gesendet hat, warten bereits auf die Analyse oder werden analysiert (Kalkulationen aus Widget und Panel zählen nicht). Retry-After: 30 Sekunden. |
| 409 | file_not_uploaded | Der Upload ist nicht im Speicher angekommen. Die Datei erneut senden, solange die Adresse gilt (15 Minuten), dann bestätigen; danach eine neue Kalkulation anlegen. |
| 409 | upload_expired | Zu spät bestätigt: Ab 45 Minuten nach dem Anlegen der Kalkulation (15 Minuten Gültigkeit der Adresse plus 30 Minuten Kulanz) gilt der Upload als abgebrochen. Eine neue Kalkulation anlegen. |
| 409 | quote_closed | Ein Mensch hat die Kalkulation freigegeben oder abgelehnt, oder der Kunde hat sie bestellt. Ihre Parameter ändern sich nicht mehr. |
| 409 | quote_in_review | Die Arbeitsvorbereitung hat bereits mit der Entscheidung begonnen und einen Preis für die Kalkulation oder eines ihrer Teile eingetragen. Eine Neuberechnung würde diese Arbeit löschen und wird deshalb abgelehnt. |
| 409 | not_a_drawing | Die Kalkulation ist keine Zeichnung, also gibt es nichts zu ergänzen oder an einen Menschen zu übergeben. |
| 409 | quote_already_analyzed | Die Zeichnung wartet nicht mehr auf Angaben: Sie wurde rekonstruiert und kalkuliert, bereits an den Betrieb übergeben oder wird erneut analysiert. |
| 422 | unknown_material, ... | Der Aufruf wurde abgelehnt, gespeichert wurde nichts. Ein bekanntes Problem ist ein einzelner kurzer Code: unknown_material, unknown_treatment, unknown_tolerance_class, unknown_hole_fit, file_too_large, unsupported_file_type, implausible_scale und ähnliche. |
| 422 | detail: [...] | Der Body passt nicht zum Schema: ein unbekanntes Feld, ein Wert außerhalb des zulässigen Bereichs, ein Steuerzeichen im Dateinamen. Zurück kommt die Liste von FastAPI unter detail, jeder Eintrag mit type, loc und msg. Gespeichert wurde nichts. |
05API-Referenz
Alle Aufrufe, jeder mit Beispiel
Eine Basisadresse, der Schlüssel im Header und JSON in beide Richtungen. Wählen Sie die Programmiersprache Ihrer Integration - alle Beispiele wechseln mit.
https://app.metronq.com/api/v1/integrationnur HTTPSAuthorization: Bearer mq_live_...ein Schlüssel aus den Einstellungen des BetriebsJSONaußer CSV (.csv), PDF (/pdf), Kundendateien (/file) und 3D-Vorschauen (.glb)Start
/whoamiBerechtigung: keineWer dieser Schlüssel ist
Zu welchem Betrieb der Schlüssel gehört, was er darf und wie viel ihm noch bleibt. Der erste Aufruf, den es sich zu schreiben lohnt: Funktioniert er, ist der Rest nur noch eine Frage der Pfade.
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
/configBerechtigung: config:readDie gesamte Preisliste
Das gesamte Preisdokument: drei Kataloge, alle Parameter, die Prüf-Gates, die Strategien für Maschinen- und Rohteilwahl und die Währung. Der Import nimmt dasselbe Dokument wieder entgegen.
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/materialsBerechtigung: config:readEin Katalog
Werkstoffe, Maschinen oder Behandlungen als JSON, ohne die ganze Preisliste zu durchlaufen. Maschinen bringen ihre Werkzeugbibliothek und ihre Identifikationsdaten mit.
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.csvBerechtigung: config:readEin Katalog als Tabelle
Derselbe Katalog als CSV-Datei, wie sie die Schaltfläche Export im Panel erzeugt: mit BOM für Excel und dem eigenen Trennzeichen des Betriebs.
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-dataBerechtigung: config:readSchnittdaten
Je Werkstoff die Schnittgeschwindigkeit und die Zeitspanvolumina, aus denen ein Preis berechnet wird; je Maschine die Spindel, mit der sie skaliert werden. Das ist keine Tabelle für den Zahnvorschub und gibt auch nicht vor, eine zu sein.
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,
"...": "..."
}
]
}Werkzeuge
/tools?machine=dmu50Berechtigung: config:readDie Werkzeuge des Betriebs
Alle Werkzeuge als flache Liste, jedes mit der Maschine, in der es steckt, und dem Eckenradius, den es hinterlässt. Der Parameter machine grenzt die Liste auf eine Maschine ein.
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/toolsBerechtigung: config:readDie Werkzeuge einer Maschine
Das Werkzeugmagazin einer Maschine und der Eckenradius, der sich daraus ergibt.
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/toolsBerechtigung: config:writeWerkzeugbibliothek ersetzen
Idempotent: Das System sendet die Liste, die es führt, ohne zu prüfen, was vorher da war. Eine leere Liste setzt die Maschine auf ihren eingetragenen Radius zurück.
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/toolsBerechtigung: config:writeEin Werkzeug hinzufügen
Fügt ein Werkzeug hinzu oder ersetzt das mit demselben Werkzeugschlüssel - für ein System, das eine einzelne Änderung meldet.
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/r8h7Berechtigung: config:writeEin Werkzeug entfernen
Entfernt ein Werkzeug. Ein unbekannter Werkzeugschlüssel ergibt 404, damit ein Abgleich eine Entfernung von einem Tippfehler im eigenen Mapping unterscheiden kann.
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/previewBerechtigung: config:writeVorschau eines Tabellenimports
Was diese Tabelle bewirken würde. Gespeichert wird nichts: Die Antwort nennt die neuen und geänderten Einträge, die Unterschiede Feld für Feld, fehlerhafte Zeilen, unbekannte Spalten und einen 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-jsonBerechtigung: config:writeVorschau eines Dokumentimports
Dasselbe für ein ganzes Dokument. Der Modus merge ändert nur, was das Dokument nennt; replace lässt es vollständig gewinnen, Löschungen eingeschlossen.
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/importBerechtigung: config:writeImport übernehmen
Speichert, was eine Vorschau geliefert hat, unter Angabe ihres base_hash. Hat sich die Preisliste zwischendurch geändert, lautet die Antwort 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"
}Anfragen
/quotes?since=2026-09-16T00:00:00Z&limit=50Berechtigung: quotes:readAnfragen auflisten
Anfragen, die neuesten zuerst. Für die regelmäßige Abfrage dient since; status, external_ref, limit und offset erledigen den Rest. Ein Status ist einer von: 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_IDBerechtigung: quotes:readEine Anfrage
Eine Anfrage mit ihrer gespeicherten Preisaufschlüsselung - das, was ein System für den Abgleich in den eigenen Büchern braucht.
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/metricsBerechtigung: quotes:readGeometrieauswertung
Was die Analyse gemessen hat: Abmessungen, Volumen, Bohrungen, Taschen, Gewinde, dünnste Wand und die Gründe, aus denen eine Kalkulation angehalten wurde. 409 not_analysed heißt, dass die Datei noch gelesen wird.
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/detailBerechtigung: quotes:readDie vollständige Kalkulation
Alles, was die Kalkulationsansicht zeigt: wo der Preis steht und ob ein Kunde ihn sehen darf, die Preiszeilen und die Umsatzsteuer, die Spezifikation, die Werte, die eine Neukalkulation annimmt, aufgeschlüsselte Ablehnungsgründe, die Prüfung, die Geometrieauswertung, die Teile einer Baugruppe und wo die Dateien liegen.
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/similarBerechtigung: quotes:readÄhnliche Teile
Die drei geprüften Teile des Betriebs, die diesem am nächsten kommen, mit dem freigegebenen Preis und damit, wie weit die Engine davon entfernt lag.
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-optionsBerechtigung: quotes:readDer Preis auf jeder Maschine
Der Maschinenpark, gegen diese Kalkulation gerechnet: ein Stückpreis je Maschine oder die Gründe, warum sie das Teil nicht annehmen kann, und welche Maschine die Engine wählt.
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/partsBerechtigung: quotes:readDie Teile einer Baugruppe
Jedes Teil einer Baugruppe mit eigenen zu bestätigenden Gewinden und Passungen, der Maschine, dem Werkstoff und dem Rohteil, die die Arbeitsvorbereitung dafür gewählt hat, und dem Grund, wenn ein Teil keinen Preis hat.
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_IDBerechtigung: quotes:writeIhre Nummer an der Anfrage
Speichert die Nummer aus Ihrem System und sonst nichts. Preis und Freigabe liegen bei der Engine und bei der Arbeitsvorbereitung.
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",
"...": "..."
}Teil senden
/quotesBerechtigung: quotes:createEine Kalkulation für eine Datei anlegen
Name und Größe der Datei und die Parameter der Kalkulation. Die Antwort enthält die Upload-Adresse und die Header; die Datei geht in den Speicher, nicht über uns. Jede Datei ist eine Kalkulation im Tarif.
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-uploadBerechtigung: quotes:createUpload bestätigen
Die Datei ist angekommen: Die Analyse wird eingereiht, und direkt danach wird das Teil kalkuliert. Zweimal zu bestätigen schadet nicht.
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/repriceBerechtigung: quotes:createParameter ändern
Menge, Werkstoff, Toleranzen, Gewinde, Passungen, Behandlungen oder Lieferzeit - die Engine kalkuliert neu. Jede Kalkulation, bis ein Mensch entscheidet.
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-inputsBerechtigung: quotes:createEine Zeichnung ergänzen
Werkstoff, Maßstab oder Dicke für eine Zeichnung, die Ihr System gesendet hat und aus der die Engine kein Modell erzeugen konnte. Die Analyse läuft erneut.
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-drawingBerechtigung: quotes:createEine Zeichnung an einen Menschen übergeben
Eine Zeichnung, die Ihr System gesendet hat und die die Engine nicht rekonstruieren konnte, geht an die Arbeitsvorbereitung, die sie von Hand kalkuliert.
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 }
}Dateien und Dokumente
/quotes/QUOTE_ID/pdf?locale=enBerechtigung: quotes:readDas Angebotsdokument
Das PDF, das die Schaltfläche Export im Panel erzeugt, in jeder Sprache, die der Betrieb anbietet.
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/fileBerechtigung: quotes:read + files:readDie hochgeladene Datei
Die Datei des Kunden unter ihrem ursprünglichen Namen, beim Abruf entschlüsselt.
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.glbBerechtigung: quotes:read + files:readDie 3D-Vorschau
Das Modell, das der Viewer im Panel zeichnet, als binäres glTF. Seine Flächen sind die Schlüssel der Toleranzen je Fläche.
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.glbBerechtigung: quotes:read + files:readEin Teil einer Baugruppe
Die Vorschau eines einzelnen Teils, über den Index, den die vollständige Kalkulation auflistet.
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: 48212Aufträge
/orders?since=2026-09-16T00:00:00ZBerechtigung: quotes:readAufträge auflisten
Aufträge, die neuesten zuerst, mit denselben Filtern. Kundendaten kommen nur mit der Berechtigung customers:read zurück.
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_IDBerechtigung: quotes:readEin Auftrag
Ein Auftrag mit dem Kunden, an den Rechnung und Teile gehen.
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_IDBerechtigung: quotes:writeStatus und Auftragsnummer
Ihre Nummer, der Status und die Zahlungsmarkierung. Geändert werden nur die Felder im Body; Bestätigung und Versand lösen eine E-Mail an den Kunden aus.
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",
"...": "..."
}06Fragen
Häufige Fragen zur API
Wie bekomme ich Zugang zur API?
Den Zugang vereinbaren wir mit jedem Betrieb einzeln - schreiben Sie uns einfach, welches System Sie einsetzen. Die Schlüssel legt danach der Kontoinhaber in den Einstellungen an, im Reiter Integrationen.
Kann ich eine Integration testen, bevor ich mich entscheide?
Ja. Solange die Anbindung entsteht, kann ein Betrieb einen Testschlüssel mit einem Budget an Aufrufen für den gesamten Test bekommen. Das Budget ist im Panel und in jeder Antwort der API sichtbar.
Kann die API von sich aus die Preise ändern, die Kunden sehen?
Nur über Vorschau und Übernahme, genau wie ein Import im Panel, und nur mit einem Schlüssel, der config:write besitzt. Jede Änderung landet im Änderungsprotokoll der Einstellungen, mit dem Namen des Schlüssels, der sie vorgenommen hat.
Kann ein API-Schlüssel eine Kalkulation freigeben oder ihren Preis ändern?
Nein. Ein Schlüssel kann eine Datei senden und die Parameter ändern, mit denen sie kalkuliert wird (den Preis rechnet dann die Engine), Ihre Nummer an eine Anfrage schreiben und den Status eines Auftrags weitersetzen. Ein von Hand eingetragener Preis, die Freigabe und Rabatte liegen bei einem Menschen.
Kann mein System Teiledateien zur Kalkulation senden?
Ja, mit einem Schlüssel, der quotes:create besitzt. Das System legt eine Kalkulation an, lädt die Datei direkt in den verschlüsselten Speicher hoch und bestätigt; die Engine analysiert und kalkuliert das Teil, und die vollständige Kalkulation kommt zurück. Jede Datei ist eine Kalkulation im Tarif des Betriebs, genau wie eine aus dem Widget.
Benachrichtigt MetronQ mein System von selbst über neue Anfragen?
Noch nicht. Heute fragt Ihr System neue Anfragen und Aufträge mit dem Parameter since ab, was bequem in das Standardlimit von 120 Aufrufen pro Minute passt. Wenn Sie Benachrichtigungen von unserer Seite brauchen, sagen Sie es uns - solche Wünsche entscheiden, was wir als Nächstes bauen.
Welche Kundendaten sieht eine Integration?
Nur das, was der Schlüssel erlaubt. Ohne die Berechtigung customers:read kommen Anfragen und Aufträge ohne E-Mail-Adresse, Kontaktdaten und Notizen des Kunden zurück, und das Feld customer_data_visible sagt ausdrücklich, dass diese Daten zurückgehalten wurden.
Kann ich Daten auch ohne Entwickler über Excel austauschen?
Ja. CSV-Export und -Import funktionieren im Panel unter den Kalkulationsregeln: zuerst exportieren, die Tabelle bearbeiten, dann mit einer Vorschau der Änderungen importieren.
Verbinden wir MetronQ mit dem System, das Sie bereits nutzen
Sagen Sie uns, welches ERP oder CRM Sie einsetzen. Wir stimmen Berechtigungen und Limits ab und geben Ihnen einen Testschlüssel, solange die Anbindung entsteht.