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, mmautomatischFräserdurchmesser. Muss in den kleinsten Innenradius des Teils passen. Weggelassen wählt step2gcode selbst: den größten ganzen Millimeter, der noch durch die kleinste Bohrung passt (Ø3,5 → 3 mm), ohne erkennbare Bohrung 6 mm.
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.
max_sZahl1000Höchster S-Wert der Maschine ($30 bei GRBL, bei Marlin meist 255). Die Leistung wird dagegen gerechnet.

image — Bild-Rastergravur

Gilt, wenn file_id ein Bild ist (PNG, JPG, WebP, BMP, GIF, TIFF, bis 20 MB und 40 Megapixel). Leistung, Vorschub, Durchgänge und max_s kommen aus laser, der Nullpunkt aus origin.origin_xy, die Steuerung aus postprocessor.name – nur grbl_post oder marlin_post. Das Ergebnis zeigt GET /api/preview-image/{job_id} als Bild; bezahlt wird der Download wie bei jedem Modell.

width_mmZahl, mm100Breite der Gravur, die Höhe folgt aus dem Seitenverhältnis.
line_interval_mmZahl, mm0.1Zeilenabstand und Punktgröße (0,1 mm ≈ 254 dpi).
mode'dither' | 'threshold' | 'grayscale' | 'outline' | 'centerline' | 'edges''dither'Zeilenweise: Foto mit Punkten, Schwarz-Weiß am Schwellwert oder Leistung je Punkt (64 Stufen). Entlang von Linien (Vektor, deutlich schneller): Umriss dunkler Flächen, Mittellinie von Strichen oder Kanten eines Fotos.
detail_mmZahl, mm1Nur Vektor: kürzere Linien bzw. kleinere Flächen (mm²) fallen weg.
smooth_mmZahl, mm0.05Nur Vektor: Glättung der Linien.
edge_sensitivityZahl 0–10050Nur edges: mehr zeigt mehr Kanten.
rotation0 | 90 | 180 | 2700Drehung im Uhrzeigersinn; bei 90/270 tauschen Breite und Höhe.
mirrorboolfalseLinks und rechts tauschen (Stempel, Rückseite von Glas/Acryl).
thresholdGanzzahl 0–255128Nur threshold: dunkler als dieser Wert wird gebrannt.
brightness / contrastZahl −100…1000Bildkorrektur vor dem Rastern.
gammaZahl 0,2–51Über 1 hellt die Mitteltöne auf.
invertboolfalseHell und dunkel tauschen (dunkle Materialien).
power_minZahl, %0Nur grayscale: Leistung für den hellsten noch gebrannten Ton. Weiß bleibt aus.
overscan_mmZahl, mm3Überlauf mit ausgeschaltetem Laser an den Zeilenenden.
bidirectionalbooltrueJede zweite Zeile rückwärts.

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.

stl2step — STL oder 3MF in STEP umwandeln

Eigener Dienst, gleiche Abrechnung: Analyse und Bau sind frei, bezahlt wird der Download – ein Credit je Modell, STEP-Körper und DXF-Kontur zusammen. Die hochgeladene Netzdatei wird nicht aufbewahrt, das Ergebnis 24 Stunden.

POST /api/stl2step/analyzemultipartDiagnose ohne Bau: Quellklasse, Dreiecke, Regionen, gefittete Flächen. Feld `file` mit .stl oder .3mf. Kostenlos.
POST /api/stl2step/convertmultipartBaut den Volumenkörper und prüft ihn gegen das Netz. Antwort enthält `step_id`, `verification.deviation_max` (mm), `verification.verdict` und `contour.available`. Kostenlos.
GET /api/stl2step/download-cost?step_id=…Was der Download kosten würde, ohne etwas zu buchen.
GET /api/stl2step/step/{step_id}Die STEP-Datei. **Hier fällt der Credit an.** Über die API zählt nur Guthaben, kein Freikontingent.
GET /api/stl2step/contour/{step_id}Die Kontur als DXF, sofern das Teil eine Extrusion ist. Gehört zum selben Teil und kostet nichts zusätzlich.
GET /api/stl2step/view/{step_id}Der gebaute Körper als Dreiecke für eine eigene Ansicht. Kostenlos.

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