Nordic Layers · Nordic Byte

Documentação da API

O Nordic Layers é uma API REST sobre HTTPS em https://app.layers.nordicbyte.co.uk. Um projeto é um documento JSON de camadas; você o altera com operações e o exporta como imagem. O editor do navegador usa a mesma API.

Autenticação

Crie uma chave de API no painel da sua conta e envie-a em toda requisição a /v1. As chaves começam com nl_key_.

Authorization: Bearer nl_key_…

O fluxo habitual

  1. Envie cada imagem com POST /v1/assets e o arquivo como corpo bruto da requisição (PNG, JPEG, WebP, GIF, BMP ou TIFF). A resposta traz o id dela.
  2. Crie um projeto com POST /v1/projects e um width, height e background. Você pode passar os primeiros steps na mesma chamada.
  3. Edite com POST /v1/projects/{id}/run: uma operação como {"op": …} ou várias como {"steps": [...]}. Confira com GET /v1/projects/{id}/preview, que é gratuito.
  4. Exporte com POST /v1/projects/{id}/export. A resposta traz a URL do arquivo, ou a própria imagem com "response": "image".

Uma primeira requisição

Crie um projeto de 1080×1080 com um degradê e um título, e exporte-o 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étodoCaminhoO que faz
GET/healthStatus do serviço
GET/v1/opsCatálogo de todas as operações e seus parâmetros (público)
POST/v1/assets?name=photo.jpgEnvia uma imagem; o corpo é o arquivo
GET/v1/assetsLista suas imagens e se algum projeto as usa
DELETE/v1/assets/{id}Exclui uma imagem
POST/v1/projectsCria um projeto (tela, ou um documento completo, mais passos opcionais)
GET/v1/projectsLista seus projetos
GET/v1/projects/{id}Um projeto com seu documento
PUT/v1/projects/{id}/documentSubstitui o documento inteiro
POST/v1/projects/{id}/runAplica uma operação ou uma lista de passos
POST/v1/projects/{id}/undoDesfaz a última mudança
POST/v1/projects/{id}/redoRefaz
GET/v1/projects/{id}/preview?size=1024Prévia PNG gratuita, lado maior de até size px
POST/v1/projects/{id}/exportExporta PNG, JPEG ou WebP; passos opcionais só para este arquivo
POST/v1/renderRender sem estado de um documento inteiro
GET/v1/exportsLista suas exportações
GET/v1/exports/{id}/fileBaixa uma exportação
DELETE/v1/projects/{id}Exclui um projeto

Operações

Toda operação é um objeto com op e seus parâmetros. As camadas são referenciadas por id ou por nome; sem layer, usa-se a camada ativa. Os nomes ignoram maiúsculas e espaços, então "Linear Dodge (Add)" e "linearDodge" são o mesmo modo de mesclagem. Com steps, eles rodam em ordem e param no primeiro erro (a não ser que "stopOnError": false); os passos anteriores continuam aplicados.

Camadas

OperaçãoParâmetrosO que faz
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

OperaçãoParâmetrosO que faz
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

OperaçãoParâmetrosO que faz
shape.addshape, rect | from+to, color, cornerRadius, lineWidth, nameAdd a rectangle, ellipse or line.
shape.setlayer, color, cornerRadius, lineWidthChange a shape layer.

Transformar

OperaçãoParâmetrosO que faz
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 em uma camada

OperaçãoParâmetrosO que faz
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

OperaçãoParâmetrosO que faz
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).

Camadas de ajuste

OperaçãoParâmetrosO que faz
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 camada

OperaçãoParâmetrosO que faz
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.

Efeitos de camada

OperaçãoParâmetrosO que faz
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.

Tela

OperaçãoParâmetrosO que faz
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.

Projeto

OperaçãoParâmetrosO que faz
project.state—The whole document.

Modos de mesclagem

Famílias de fontes

Modelos

Passe steps para a chamada de exportação e eles são aplicados a uma cópia do projeto só para aquele arquivo. Um modelo, muitos arquivos: mude o texto com text.set e a foto com layer.setImage, que mantém a caixa da camada.

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 sem estado

POST /v1/render recebe um document inteiro (como devolvido em project.document), steps opcionais e as opções de exportação, e não salva um projeto. Com "response": "image" a resposta é o arquivo de imagem.

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

Erros

Os erros voltam como JSON com um code estável e uma mensagem detail no idioma da sua conta. Um passo que falha informa qual parâmetro estava errado. Quando os renders de um plano acabam, a API responde 402 com quota_renders.

Limites