Nordic Layers · Nordic Byte

Documentación de la API

Nordic Layers es una API REST sobre HTTPS en https://app.layers.nordicbyte.co.uk. Un proyecto es un documento JSON de capas; lo modificas con operaciones y lo exportas como imagen. El editor del navegador usa la misma API.

Autenticación

Crea una clave de API en el panel de tu cuenta y envíala en cada petición a /v1. Las claves empiezan por nl_key_.

Authorization: Bearer nl_key_…

El flujo habitual

  1. Sube cada imagen con POST /v1/assets y el archivo como cuerpo de la petición (PNG, JPEG, WebP, GIF, BMP o TIFF). La respuesta incluye su id.
  2. Crea un proyecto con POST /v1/projects y un width, height y background. Puedes pasar los primeros steps en la misma llamada.
  3. Edítalo con POST /v1/projects/{id}/run: una operación como {"op": …} o varias como {"steps": [...]}. Míralo con GET /v1/projects/{id}/preview, que es gratis.
  4. Exporta con POST /v1/projects/{id}/export. La respuesta trae la URL del archivo, o la propia imagen con "response": "image".

Una primera petición

Crea un proyecto de 1080×1080 con un degradado y un título, y expórtalo como 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étodoRutaQué hace
GET/healthEstado del servicio
GET/v1/opsCatálogo de todas las operaciones y sus parámetros (público)
POST/v1/assets?name=photo.jpgSube una imagen; el cuerpo es el archivo
GET/v1/assetsLista tus imágenes y si algún proyecto las usa
DELETE/v1/assets/{id}Elimina una imagen
POST/v1/projectsCrea un proyecto (lienzo, o un documento completo, y pasos opcionales)
GET/v1/projectsLista tus proyectos
GET/v1/projects/{id}Un proyecto con su documento
PUT/v1/projects/{id}/documentSustituye el documento completo
POST/v1/projects/{id}/runAplica una operación o una lista de pasos
POST/v1/projects/{id}/undoDeshace el último cambio
POST/v1/projects/{id}/redoRehace
GET/v1/projects/{id}/preview?size=1024Vista previa PNG gratuita, lado largo de hasta size px
POST/v1/projects/{id}/exportExporta PNG, JPEG o WebP; pasos opcionales solo para este archivo
POST/v1/renderRender sin estado de un documento completo
GET/v1/exportsLista tus exportaciones
GET/v1/exports/{id}/fileDescarga una exportación
DELETE/v1/projects/{id}Elimina un proyecto

Operaciones

Cada operación es un objeto con op y sus parámetros. Las capas se referencian por id o por nombre; sin layer, se usa la capa activa. Los nombres ignoran mayúsculas y espacios, así que "Linear Dodge (Add)" y "linearDodge" son el mismo modo de fusión. Con steps, se ejecutan en orden y se detienen en el primer error (salvo "stopOnError": false); los pasos anteriores quedan aplicados.

Capas

OperaciónParámetrosQué hace
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.

Texto

OperaciónParámetrosQué hace
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.

Formas

OperaciónParámetrosQué hace
shape.addshape, rect | from+to, color, cornerRadius, lineWidth, nameAdd a rectangle, ellipse or line.
shape.setlayer, color, cornerRadius, lineWidthChange a shape layer.

Transformar

OperaciónParámetrosQué hace
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.

Ajustes en una capa

OperaciónParámetrosQué hace
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.

Filtros

OperaciónParámetrosQué hace
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).

Capas de ajuste

OperaciónParámetrosQué hace
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).

Máscaras de capa

OperaciónParámetrosQué hace
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.

Efectos de capa

OperaciónParámetrosQué hace
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.

Lienzo

OperaciónParámetrosQué hace
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.

Proyecto

OperaciónParámetrosQué hace
project.state—The whole document.

Modos de fusión

Familias tipográficas

Plantillas

Pasa steps a la llamada de exportación y se aplican a una copia del proyecto solo para ese archivo. Una plantilla, muchos archivos: cambia el texto con text.set y la foto con layer.setImage, que conserva la caja de la capa.

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

Render sin estado

POST /v1/render recibe un document completo (tal como lo devuelve project.document), steps opcionales y las opciones de exportación, y no guarda ningún proyecto. Con "response": "image" la respuesta es el archivo de imagen.

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

Errores

Los errores llegan como JSON con un code estable y un mensaje detail en el idioma de tu cuenta. Un paso que falla indica qué parámetro era incorrecto. Cuando se agotan los renders de un plan, la API responde 402 con quota_renders.

Límites