G-Code aus dem eigenen Skript

Alles, was die Oberfläche kann, geht auch über die Schnittstelle: Datei hochladen, Generierung starten, Status abfragen, G-Code herunterladen. Vier Aufrufe, kein Konto, keine Registrierung — der Zugangsschlüssel aus deinem Guthabenkauf ist der API-Schlüssel.

Gedacht für wiederkehrende Abläufe: Bauteilfamilien mit wechselnden Maßen, Chargen aus einem Konfigurator, nächtliche Läufe. Wer stattdessen einen KI-Assistenten bedienen lassen will, nimmt den MCP-Server, der auf derselben Schnittstelle aufsetzt.

Guthaben und Zugangsschlüssel gibt es unter www.step2gcode.com — ohne Konto und ohne Abo.

Was du wissen solltest

  • Kein Freikontingent: Über die API zählt jedes neue Modell 1 Credit, fällig beim Download. Hochladen, Generieren, Status abfragen und die Bildvorschau sind kostenlos. Das Freikontingent des Browsers greift hier nicht — es hängt am Gerät, und ein Skript hat keines.
  • Gezählt wird das Modell, nicht der Aufruf: Dieselbe Datei mit anderem Fräser, anderer Tiefe oder anderem Nullpunkt kostet zusammen 1 Credit. Ein einmal bezahltes Modell bleibt dauerhaft frei, auch in späteren Monaten — Parameterläufe werden dadurch nicht teuer.
  • Deterministisch: Gleiche Datei und gleiche Einstellungen ergeben immer dasselbe Programm. Das macht die Schnittstelle für automatisierte Abläufe überhaupt erst brauchbar.

Die vier Aufrufe

  • POST /api/upload — CAD-Datei als multipart/form-data, liefert eine file_id (kostenlos)
  • POST /api/generate — file_id plus Einstellungen (tool, depth, origin), liefert eine job_id (kostenlos)
  • GET /api/status/{job_id} — pollen bis completed oder failed (kostenlos)
  • GET /api/preview-image/{job_id} — Werkzeugweg als PNG zur Sichtprüfung (kostenlos)
  • GET /api/download/{job_id} — das fertige Programm (1 Credit je neuem Modell)
  • GET /api/pro/credits/{token} — Guthaben und bezahlte Modelle (kostenlos)

Alle Parameter von POST /api/generate

Das Anfrage-Objekt ist verschachtelt: oberste Ebene ist die file_id, alles andere steht in Blöcken. Jeder Block ist optional — was du weglässt, bleibt auf dem Standardwert. Unbekannte Felder werden stillschweigend verworfen, ein Tippfehler im Feldnamen fällt also nicht als Fehler auf, sondern als Ergebnis, das nicht zu den Vorgaben passt.

(oberste Ebene)

file_idstring, PflichtKennung aus POST /api/upload.
nest_uniform_depthboolfalseNur beim Anordnen mehrerer Teile: erzwingt eine einheitliche Frästiefe für alle Teile. Ohne das Flag behalten STEP-Teile ihre Tiefe aus der 3D-Geometrie, DXF- und SVG-Teile nehmen depth_override.

tool — Werkzeug

bit_diameterZahl, mm6.0Fräserdurchmesser. Muss in den kleinsten Innenradius des Teils passen.
cutting_lengthZahl, mmleerNutzbare Schneidenlänge. Ist sie gesetzt, wird die Zustellung nie größer als dieser Wert.
tool_type'endmill' | 'vbit''endmill'Schaftfräser oder V-Bit. Für Laserjobs stattdessen laser.enabled setzen.
vbit_angleZahl, Grad90Spitzenwinkel des V-Bits. Nur bei tool_type "vbit".
vbit_tip_diameterZahl, mm0Durchmesser der abgeflachten Spitze. 0 = spitz, keine Kompensation.
spindle_speedGanzzahl, U/min10000Drehzahl. Wird von feed_rates überschrieben, falls dieser Block mitkommt.
horizontal_speedZahl, mm/min1200Vorschub in der Ebene. Ebenfalls von feed_rates überschreibbar.
vertical_speedZahl, mm/min300Eintauchvorschub. Ebenfalls von feed_rates überschreibbar.

feed_rates — Schnittwerte

Kommt dieser Block mit, gelten seine Werte statt der drei Geschwindigkeiten aus tool. Wichtig für Skripte: Es gibt keine serverseitige Materialautomatik — die Schnittwerte, die du schickst, werden genau so verwendet.

auto_calculatebooltrueHerkunft aus der Oberfläche, wo damit das Materialpreset rechnet. Über die Schnittstelle hat das Feld keine Wirkung; setze es der Klarheit halber auf false, wenn du eigene Werte schickst.
spindle_speedGanzzahl, U/min18000Drehzahl.
horizontal_speedZahl, mm/min1200Vorschub in der Ebene.
vertical_speedZahl, mm/min400Eintauchvorschub.

material — Werkstoff

typestring'wood'Werkstoff, etwa wood, hardwood, plywood, acrylic, aluminum, steel, brass. Beeinflusst ausschließlich, ab wann Bohrungen helikal statt bohrend erzeugt werden — Drehzahl und Vorschub kommen aus tool beziehungsweise feed_rates.

depth — Tiefe

depth_overrideZahl, mmleer = AUTOFrästiefe. Leer heißt: aus der Geometrie ableiten (bei STEP die Bauteilhöhe). Bei DXF und SVG gibt es nichts abzuleiten, dort ist der Wert praktisch Pflicht.
step_downZahl, mmleer = AUTOZustellung je Durchgang. Achtung: Solange settings.optimize_passes true ist, gilt der Wert nur als Obergrenze und die tatsächliche Zustellung wird darunter optimiert. Für eine exakte Zustellung optimize_passes auf false setzen.
final_depth_offsetZahl, mm0.1Wie weit die letzte Bahn unter die Bauteilunterkante fährt, damit der Zuschnitt sauber durchtrennt wird.

origin — Nullpunkt und Lage

Die Kurzschreibweise xy und z wird ebenfalls angenommen und ist gleichbedeutend mit origin_xy und origin_z.

origin_xy'TL' | 'TR' | 'BL' | 'BR' | 'C''TL'Nullpunkt in der Ebene: Ecke oben links, oben rechts, unten links, unten rechts oder Mitte.
origin_z'top' | 'spoilboard''top'Z-Null auf der Werkstückoberfläche oder auf der Opferplatte.
rotation_zZahl, Grad0Dreht das Teil in der Ebene, etwa um es günstiger auf die Platte zu legen.
rotation_xZahl, Grad0Kippt das Modell um die X-Achse. Für Teile, die im CAD nicht flach liegen.
rotation_yZahl, Grad0Kippt das Modell um die Y-Achse.
work_coordinate_system'G54' … 'G59''G54'Werkstück-Koordinatensystem, das im Programm angewählt wird.

operations — Bearbeitungen

contourbooltrueAußenkontur fräsen.
inner_contourbooltrueInnenkonturen und Ausschnitte, die keine runden Bohrungen sind.
holesbooltrueRunde Bohrungen.
pocketsbooltrueTaschen. Die Tiefeninformation dafür steckt in der STEP-Geometrie; DXF und SVG tragen sie nicht.
pocket_step_overGanzzahl, %50Überlappung der Bahnen beim Ausräumen.
pocket_start_at'Edge' | 'Center''Edge'Ausräumen von außen nach innen oder von innen nach außen.
dogboneboolfalseDogbone-Ecken, damit rechtwinklige Gegenstücke in Innenecken passen.
ramp_entrybooltrueAuf einer Rampe eintauchen statt senkrecht.
cylindrical_hole_mode'auto' | 'helix' | 'normal''auto'Wie runde Bohrungen erzeugt werden: helikal fräsen, bohren, oder automatisch nach Durchmesser und Werkstoff entscheiden.
orderListe von StringsleerEigene Reihenfolge der Bearbeitungen, etwa ["facing","pockets","holes","inner","contour","other"]. Leer heißt: interne Standardreihenfolge.

settings — Ablauf

holding_tabsbooltrueHauptschalter für Haltestege. Die Geometrie der Stege steht in tags.
holding_tabs_outerbooltrueStege an der Außenkontur.
holding_tabs_innerbooltrueStege an Innenkonturen.
ramp_entrybooltrueRampen-Eintauchen, wie in operations.
dogboneboolfalseDogbone-Ecken, wie in operations.
optimize_passesbooltrueVerteilt die Tiefe selbst auf gleichmäßige Durchgänge und behandelt depth.step_down nur als Obergrenze. Auf false setzen, wenn die Zustellung exakt eingehalten werden soll.

tags — Haltestege

Wirkt nur, wenn die Stege über settings.holding_tabs freigeschaltet sind. Leere Maße heißen AUTO: passend zu Werkstückgröße und Fräserdurchmesser.

enabledboolfalseStege erzeugen.
widthZahl, mmleer = AUTOBreite eines Stegs.
heightZahl, mmleer = AUTOHöhe eines Stegs, üblicherweise ein Bruchteil der Frästiefe.
lengthZahl, mmleer = AUTOLänge eines Stegs entlang der Kontur.
angleZahl, Grad45Flankenwinkel der Stege.
spacingZahl, mmleer = AUTOAbstand zwischen zwei Stegen entlang der Kontur.

facing — Planfräsen

enabledboolfalseOberfläche vorher planfräsen.
depthZahl, mm0.5Abzutragende Schicht.
step_overGanzzahl, %50Bahnüberlappung.
pattern'ZigZag' | 'Offset''ZigZag'Bahnmuster.
zigzag_angleZahl, Grad0Richtung der ZigZag-Bahnen.
add_to_depthbooltruetrue: Die Planschicht kommt zur Rohteildicke hinzu. false: Sie wird von der Frästiefe abgezogen.
extensionZahl, mmleer = halber FräserÜberstand über die Werkstückkante hinaus. 0 schaltet den Überstand ab.

chamfer — Fase, Gravur und 2D-Direktmodus

enabledboolfalseFase mit dem V-Bit fahren.
depthZahl, mm2.0Tiefe der Fase.
hole_depthZahl, mmleerAbweichende Fasentiefe an Bohrungen. Leer heißt: wie depth.
engravingboolfalseGravurmodus: fährt die Kontur ohne Werkzeugradius-Kompensation ab, auch bei abgeflachter Spitze.
dxf_directboolfalse2D-Direktmodus: G-Code unmittelbar aus den DXF-Pfaden, ohne den Umweg über eine Extrusion.
controller_compensationboolfalseRadiuskompensation der Steuerung überlassen (G41/G42), statt sie in die Bahn zu rechnen.

vshape_adaptive — V-Carve

enabledboolfalseV-Carve mit anpassender Tiefe statt konstanter Fasentiefe.
max_depthZahl, mm0 = unbegrenztObergrenze der Schnitttiefe.
depth_stepZahl, mm0.5Tiefenzuwachs je Durchgang.
nesting_mode'inner' | 'outer''inner'Kontur-Auswahl: in den Innenkonturen schnitzen oder die Außenbereiche abtragen und Löcher aussparen. Nicht zu verwechseln mit dem Anordnen mehrerer Teile.

laser — Laser

enabledboolfalseLaserjob statt Fräsjob.
powerZahl, %100Leistung.
speedZahl, mm/min1000Geschwindigkeit.
passesGanzzahl1Anzahl der Durchgänge.
mode'cut' | 'engrave''cut'Schneiden oder gravieren.
kerfZahl, mm0Schnittfugenbreite, um die die Bahn versetzt wird.
kerf_enabledboolfalseSchaltet die Kompensation ein. Ohne dieses Flag bleibt kerf wirkungslos.
nesting'all' | 'outer' | 'inner''all'Kontur-Auswahl: alle Konturen, nur äußere oder nur innere.

postprocessor — Ausgabeformat

Die vollständige Liste der Namen liefert GET /api/postprocessors.

namestring'grbl_post'Steuerungsdialekt, etwa grbl_post, linuxcnc_post, mach3_mach4_post, uccnc_post, marlin_post, fanuc_post, heidenhain_post, estlcam_post.
custom_preamblestringleerEigene G-Code-Zeilen vor allen Bearbeitungen.
custom_postamblestringleerEigene G-Code-Zeilen nach allen Bearbeitungen.

Prüfen bleibt Pflicht

Der erzeugte G-Code ist ein maschinell erstellter Vorschlag. Prüfe Werkzeugwege, Zustellungen, Vorschübe und Sicherheitsabstände vor jedem Lauf, und fahre im Zweifel einen Luftschnitt ohne Werkstück. Hochgeladene Dateien werden spätestens nach 24 Stunden gelöscht.

Häufige Fragen

Wie authentifiziere ich mich?

Mit dem Zugangsschlüssel aus deinem Guthabenkauf, als Kopfzeile Authorization: Bearer DEIN-TOKEN. Ist dieser Kopf schon belegt — hinter manchen Firmenproxys oder einer vorgelagerten Basic-Auth —, nimm stattdessen X-Api-Token: DEIN-TOKEN. Beide Wege sind gleichwertig.

Was passiert ohne Guthaben?

Upload und Generierung laufen weiterhin, der Download antwortet mit dem Statuscode 402 und der Begründung no_credits. Ein ungültiger Schlüssel wird schon beim Upload mit 401 und invalid_token abgewiesen.

Welche Einstellungen kann ich übergeben?

Dieselben wie in der Oberfläche, als verschachteltes Objekt. Sämtliche Felder mit Typ, Standardwert und Wirkung stehen weiter oben unter „Alle Parameter von POST /api/generate" — jeder Block ist optional, was du weglässt, bleibt auf dem Standard. Drei Fallstricke lohnen den Blick: depth.step_down wirkt nur als Obergrenze, solange settings.optimize_passes true ist; laser.kerf braucht zusätzlich kerf_enabled; und ein Materialname setzt keine Schnittwerte, die kommen aus tool beziehungsweise feed_rates.

Gibt es Beschränkungen?

Ja, eine Ratenbegrenzung je IP-Adresse, damit der Dienst für alle erreichbar bleibt. Ein gültiger Zugangsschlüssel hebt die Grenze an. Massenabfragen ohne Schlüssel sind laut Nutzungsbedingungen nicht erlaubt.

Wie lange bleiben Jobs abrufbar?

Hochgeladene Dateien und Ergebnisse werden spätestens nach 24 Stunden gelöscht, ein Neustart des Dienstes kann laufende Job-Kennungen früher ungültig machen. Lade den G-Code also zeitnah herunter.

Und wenn ich lieber einen Assistenten bedienen lasse?

Dann nimm den MCP-Server: Er setzt auf derselben Schnittstelle auf und macht daraus Werkzeuge für Claude, ChatGPT, die Gemini CLI und andere Clients.

MCP-Server: dieselbe Schnittstelle im KI-Assistenten