Nordic Layers · Nordic Byte

API-Dokumentation

Nordic Layers ist eine REST-API über HTTPS unter https://app.layers.nordicbyte.co.uk. Ein Projekt ist ein JSON-Dokument aus Ebenen; Sie ändern es mit Operationen und exportieren es als Bild. Der Browser-Editor nutzt dieselbe API.

Authentifizierung

Erstellen Sie in Ihrem Kontobereich einen API-Schlüssel und senden Sie ihn bei jeder /v1-Anfrage mit. Schlüssel beginnen mit nl_key_.

Authorization: Bearer nl_key_…

Der übliche Ablauf

  1. Laden Sie jedes Bild mit POST /v1/assets hoch, die Datei als roher Request-Body (PNG, JPEG, WebP, GIF, BMP oder TIFF). Die Antwort enthält die id.
  2. Erstellen Sie ein Projekt mit POST /v1/projects sowie width, height und background. Die ersten steps können Sie im selben Aufruf mitgeben.
  3. Bearbeiten Sie es mit POST /v1/projects/{id}/run: eine Operation als {"op": …} oder mehrere als {"steps": [...]}. Ansehen können Sie es mit GET /v1/projects/{id}/preview, das kostenlos ist.
  4. Exportieren Sie mit POST /v1/projects/{id}/export. Die Antwort enthält die Datei-URL oder mit "response": "image" das Bild selbst.

Eine erste Anfrage

Erstellen Sie ein 1080×1080-Projekt mit einem Verlauf und einem Titel und exportieren Sie es als WebP:

curl -X POST https://app.layers.nordicbyte.co.uk/v1/projects \
  -H "Authorization: Bearer $NL_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "First post",
    "width": 1080,
    "height": 1080,
    "steps": [
      {"op": "layer.addFill", "gradient": {"colors": ["#1E3A5F", "#64B5F6"], "angle": 135}},
      {"op": "text.add", "content": "Hello, layers", "fontName": "Segoe UI", "fontSize": 110, "bold": true, "color": "#FFFFFF"},
      {"op": "effects.set", "shadow": {"opacity": 0.4, "distance": 12, "size": 24}}
    ]
  }'

# → {"project": {"id": "…", …}}

curl -X POST https://app.layers.nordicbyte.co.uk/v1/projects/$PROJECT_ID/export \
  -H "Authorization: Bearer $NL_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "format": "webp",
    "quality": 90
  }'

Endpunkte

MethodePfadFunktion
GET/healthDienststatus
GET/v1/opsKatalog aller Operationen mit ihren Parametern (öffentlich)
POST/v1/assets?name=photo.jpgEin Bild hochladen; der Body ist die Datei
GET/v1/assetsIhre Bilder auflisten und zeigen, ob ein Projekt sie verwendet
DELETE/v1/assets/{id}Ein Bild löschen
POST/v1/projectsEin Projekt erstellen (Arbeitsfläche oder ganzes Dokument, plus optionale Schritte)
GET/v1/projectsIhre Projekte auflisten
GET/v1/projects/{id}Ein Projekt mit seinem Dokument
PUT/v1/projects/{id}/documentDas gesamte Dokument ersetzen
POST/v1/projects/{id}/runEine Operation oder eine Liste von Schritten anwenden
POST/v1/projects/{id}/undoDie letzte Änderung rückgängig machen
POST/v1/projects/{id}/redoWiederherstellen
GET/v1/projects/{id}/preview?size=1024Kostenlose PNG-Vorschau, lange Seite bis size px
POST/v1/projects/{id}/exportPNG, JPEG oder WebP exportieren; optionale Schritte nur für diese Datei
POST/v1/renderZustandsloser Render eines ganzen Dokuments
GET/v1/exportsIhre Exporte auflisten
GET/v1/exports/{id}/fileEinen Export herunterladen
DELETE/v1/projects/{id}Ein Projekt löschen

Operationen

Jede Operation ist ein Objekt mit op und ihren Parametern. Ebenen werden über id oder Namen angesprochen; ohne layer wird die aktive Ebene verwendet. Namen ignorieren Groß-/Kleinschreibung und Leerzeichen, daher sind "Linear Dodge (Add)" und "linearDodge" dieselbe Füllmethode. Mit steps laufen sie der Reihe nach und stoppen beim ersten Fehler (außer bei "stopOnError": false); die Schritte davor bleiben angewendet.

Ebenen

OperationParameterFunktion
layer.addcolor, nameAlias of layer.addFill (the web has no empty pixel layers).
layer.addFillcolor | gradient {colors: [..], angle, type: linear|radial}, name, above, atBottomA colour or gradient layer the size of the canvas.
layer.addImageasset_id | color, name, rect | origin | center, width, height, fit (stretch|contain|cover), fitCanvas (contain|cover), above, atBottom, opacity, blendModeAdd an uploaded image (asset_id) or a solid colour (color).
layer.cliplayerClip a layer to the one below it (clipping mask).
layer.deletelayer | layersDelete layers.
layer.duplicatelayer, nameCopy a layer above itself.
layer.getlayerOne layer with all its settings.
layer.list—Layers from bottom to top.
layer.movelayer, above | below (layer), toTop, atBottom, index, offsetReorder a layer.
layer.renamelayer, nameRename a layer.
layer.selectlayerMake a layer the active one.
layer.setBlendModelayer | layers, blendMode (normal, darken, multiply, colorBurn, linearBurn, lighten, screen, colorDodge, linearDodge, overlay, softLight, hardLight, difference, exclusion, subtract, divide, hue, saturation, color, luminosity)Blend mode.
layer.setFilllayer, color | gradientChange a fill layer's colour or gradient.
layer.setImagelayer, asset_id, fit (stretch|contain|cover)Replace a layer's image and keep its box (templates).
layer.setOpacitylayer | layers, opacityLayer opacity, 0 to 1.
layer.setVisiblelayer | layers, visibleShow or hide layers.
layer.uncliplayerRelease a clipping mask.

Text

OperationParameterFunktion
text.addcontent, fontName, fontSize, color, alignment, leading, bold, italic, boxWidth, origin | center, nameAdd a text layer.
text.defaults—Fonts on the server and whether complex scripts are shaped.
text.setlayer, content, fontName, fontSize, color, alignment, leading, bold, italic, boxWidthChange a text layer.

Formen

OperationParameterFunktion
shape.addshape, rect | from+to, color, cornerRadius, lineWidth, nameAdd a rectangle, ellipse or line.
shape.setlayer, color, cornerRadius, lineWidthChange a shape layer.

Transformieren

OperationParameterFunktion
transform.fliplayer | layers, axis (horizontal|vertical)Flip horizontally or vertically.
transform.movelayer | layers, dx, dy | to [x, y]Move by dx/dy or to a point.
transform.rotatelayer | layers, angleRotate by an angle (degrees, clockwise).
transform.scalelayer | layers, factor | percent | width | heightScale around each layer's centre.
transform.setlayer | layers, x, y, width, height, rotation, flipX, flipYBox, rotation and flips.

Korrekturen auf einer Ebene

OperationParameterFunktion
adjust.blackWhitelayer | layers, reds, yellows, greens, cyans, blues, magentas, tint, tintHue, tintSaturationNon-destructive blackWhite on a layer (adds it or updates it).
adjust.brightnessContrastlayer | layers, brightness, contrastNon-destructive brightnessContrast on a layer (adds it or updates it).
adjust.clearlayer | layersRemove every adjustment and filter from a layer.
adjust.colorBalancelayer | layers, shadows, midtones, highlights, preserveLuminosityNon-destructive colorBalance on a layer (adds it or updates it).
adjust.curveslayer | layers, rgb, red, green, blueNon-destructive curves on a layer (adds it or updates it).
adjust.exposurelayer | layers, exposure, offset, gammaNon-destructive exposure on a layer (adds it or updates it).
adjust.gradientMaplayer | layers, shadows, highlights, reversedNon-destructive gradientMap on a layer (adds it or updates it).
adjust.grainlayer | layers, amount, size, seedNon-destructive grain on a layer (adds it or updates it).
adjust.hueSaturationlayer | layers, hue, saturation, lightness, colorizeNon-destructive hueSaturation on a layer (adds it or updates it).
adjust.invertlayer | layers, no settingsNon-destructive invert on a layer (adds it or updates it).
adjust.levelslayer | layers, black, white, gamma, outputBlack, outputWhiteNon-destructive levels on a layer (adds it or updates it).
adjust.removelayer | layers, kindRemove one adjustment or filter from a layer.

Filter

OperationParameterFunktion
filter.addNoiselayer | layers, amount, gaussian, monochromatic, seedNon-destructive addNoise on a layer (adds it or updates it).
filter.gaussianBlurlayer | layers, radiusNon-destructive gaussianBlur on a layer (adds it or updates it).
filter.motionBlurlayer | layers, angle, distanceNon-destructive motionBlur on a layer (adds it or updates it).
filter.pixelatelayer | layers, sizeNon-destructive pixelate on a layer (adds it or updates it).
filter.sharpenlayer | layers, amount, radius, thresholdNon-destructive sharpen on a layer (adds it or updates it).
filter.vignettelayer | layers, amount, midpoint, roundness, feather, colorNon-destructive vignette on a layer (adds it or updates it).

Einstellungsebenen

OperationParameterFunktion
adjustmentLayer.addkind, settings…, name, aboveAn adjustment layer: changes everything below it.
adjustmentLayer.getlayerAn adjustment layer's settings.
adjustmentLayer.setlayer, settings…Change an adjustment layer (partial).

Ebenenmasken

OperationParameterFunktion
mask.addlayer, reveal | hide | rect | ellipse (rect) | gradient (from, to) | asset_id (+ rect), feather, invert, cornerRadiusAdd or replace a layer mask.
mask.blurlayer, radiusFeather the layer mask.
mask.deletelayerRemove the layer mask.
mask.invertlayerInvert the layer mask.
mask.setEnabledlayer, enabledTurn the layer mask on or off.

Ebeneneffekte

OperationParameterFunktion
effects.copyfrom, layer | layersCopy effects from one layer to others.
effects.getlayerA layer's effects.
effects.removelayer | layers, kindsRemove effects (all, or the ones named).
effects.setlayer | layers, shadow {…}, stroke {…}, outerGlow {…}, colorOverlay {…}Set effects (partial): shadow, outerGlow, stroke, colorOverlay.
effects.setEnabledlayer, kind, enabledTurn one effect on or off.

Arbeitsfläche

OperationParameterFunktion
canvas.croprect [x, y, width, height]Crop the canvas to a rectangle.
canvas.imageSizewidth and/or height, or percentScale the whole document.
canvas.setBackgroundcolorBackground colour, or null for transparent.
canvas.sizewidth, height, anchor (topLeft…bottomRight, default center)Change the canvas without scaling layers.

Projekt

OperationParameterFunktion
project.state—The whole document.

Füllmethoden

Schriftfamilien

Vorlagen

Übergeben Sie steps an den Export-Aufruf, und sie werden nur für diese Datei auf eine Kopie des Projekts angewendet. Eine Vorlage, viele Dateien: Ändern Sie den Text mit text.set und das Foto mit layer.setImage, das die Box der Ebene beibehält.

curl -X POST https://app.layers.nordicbyte.co.uk/v1/projects/$TEMPLATE_ID/export \
  -H "Authorization: Bearer $NL_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "format": "png",
    "steps": [
      {"op": "text.set", "layer": "Title", "content": "Nueva colección"},
      {"op": "layer.setImage", "layer": "Photo", "asset_id": "photo_dunes"}
    ]
  }'

Zustandsloser Render

POST /v1/render nimmt ein ganzes document (wie in project.document zurückgegeben), optionale steps und die Exportoptionen entgegen und speichert kein Projekt. Mit "response": "image" ist die Antwort die Bilddatei.

curl -X POST https://app.layers.nordicbyte.co.uk/v1/render \
  -H "Authorization: Bearer $NL_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "document": {"width": 1200, "height": 630, "background": "#1E3A5F", "layers": ["…"]},
    "format": "png",
    "response": "image"
  }' \
  -o card.png

Fehler

Fehler kommen als JSON mit einem stabilen code und einer detail-Meldung in der Sprache Ihres Kontos zurück. Ein fehlschlagender Schritt nennt den fehlerhaften Parameter. Sind die Renders eines Tarifs aufgebraucht, antwortet die API mit 402 und quota_renders.

Limits