Nordic Layers · Nordic Byte

Documentation de l'API

Nordic Layers est une API REST sur HTTPS à l'adresse https://app.layers.nordicbyte.co.uk. Un projet est un document JSON de calques ; vous le modifiez avec des opérations et l'exportez sous forme d'image. L'éditeur du navigateur utilise la même API.

Authentification

Créez une clé d'API dans le panneau de votre compte et envoyez-la avec chaque requête /v1. Les clés commencent par nl_key_.

Authorization: Bearer nl_key_…

Le déroulement habituel

  1. Importez chaque image avec POST /v1/assets et le fichier comme corps brut de la requête (PNG, JPEG, WebP, GIF, BMP ou TIFF). La réponse contient son id.
  2. Créez un projet avec POST /v1/projects et un width, height et background. Vous pouvez passer les premiers steps dans le même appel.
  3. Modifiez-le avec POST /v1/projects/{id}/run : une opération sous la forme {"op": …} ou plusieurs sous la forme {"steps": [...]}. Consultez-le avec GET /v1/projects/{id}/preview, qui est gratuit.
  4. Exportez avec POST /v1/projects/{id}/export. La réponse contient l'URL du fichier, ou l'image elle-même avec "response": "image".

Une première requête

Créez un projet de 1080×1080 avec un dégradé et un titre, puis exportez-le en 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
  }'

Endpoints

MéthodeCheminCe que ça fait
GET/healthÉtat du service
GET/v1/opsCatalogue de toutes les opérations et de leurs paramètres (public)
POST/v1/assets?name=photo.jpgImporte une image ; le corps est le fichier
GET/v1/assetsListe vos images et indique si un projet les utilise
DELETE/v1/assets/{id}Supprime une image
POST/v1/projectsCrée un projet (zone de travail, ou document complet, plus des étapes facultatives)
GET/v1/projectsListe vos projets
GET/v1/projects/{id}Un projet avec son document
PUT/v1/projects/{id}/documentRemplace le document entier
POST/v1/projects/{id}/runApplique une opération ou une liste d'étapes
POST/v1/projects/{id}/undoAnnule la dernière modification
POST/v1/projects/{id}/redoRétablit
GET/v1/projects/{id}/preview?size=1024Aperçu PNG gratuit, grand côté jusqu'à size px
POST/v1/projects/{id}/exportExporte en PNG, JPEG ou WebP ; étapes facultatives pour ce seul fichier
POST/v1/renderRendu sans état d'un document entier
GET/v1/exportsListe vos exports
GET/v1/exports/{id}/fileTélécharge un export
DELETE/v1/projects/{id}Supprime un projet

Opérations

Chaque opération est un objet avec op et ses paramètres. Les calques sont désignés par id ou par nom ; sans layer, le calque actif est utilisé. Les noms ignorent la casse et les espaces : "Linear Dodge (Add)" et "linearDodge" désignent donc le même mode de fusion. Avec steps, elles s'exécutent dans l'ordre et s'arrêtent à la première erreur (sauf avec "stopOnError": false) ; les étapes précédentes restent appliquées.

Calques

OpérationParamètresCe que ça fait
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.

Texte

OpérationParamètresCe que ça fait
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.

Formes

OpérationParamètresCe que ça fait
shape.addshape, rect | from+to, color, cornerRadius, lineWidth, nameAdd a rectangle, ellipse or line.
shape.setlayer, color, cornerRadius, lineWidthChange a shape layer.

Transformation

OpérationParamètresCe que ça fait
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.

Réglages sur un calque

OpérationParamètresCe que ça fait
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.

Filtres

OpérationParamètresCe que ça fait
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).

Calques de réglage

OpérationParamètresCe que ça fait
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).

Masques de calque

OpérationParamètresCe que ça fait
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.

Effets de calque

OpérationParamètresCe que ça fait
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.

Zone de travail

OpérationParamètresCe que ça fait
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.

Projet

OpérationParamètresCe que ça fait
project.state—The whole document.

Modes de fusion

Familles de polices

Modèles

Passez steps à l'appel d'export et ils sont appliqués à une copie du projet pour ce seul fichier. Un modèle, de nombreux fichiers : changez le texte avec text.set et la photo avec layer.setImage, qui conserve la boîte du calque.

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"}
    ]
  }'

Rendu sans état

POST /v1/render prend un document entier (tel que renvoyé dans project.document), des steps facultatifs et les options d'export, et n'enregistre aucun projet. Avec "response": "image", la réponse est le fichier image.

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

Erreurs

Les erreurs sont renvoyées en JSON avec un code stable et un message detail dans la langue de votre compte. Une étape en échec indique quel paramètre était incorrect. Quand les rendus d'un forfait sont épuisés, l'API répond 402 avec quota_renders.

Limites