Nordic Layers · Nordic Byte

API 文档

Nordic Layers 是部署在 https://app.layers.nordicbyte.co.uk 的 HTTPS REST API。项目是由图层组成的 JSON 文档;你用操作修改它,并将其导出为图片。浏览器编辑器使用的是同一套 API。

身份验证

在账户面板中创建 API 密钥,并在每个 /v1 请求中携带。密钥以 nl_key_ 开头。

Authorization: Bearer nl_key_…

常规流程

  1. 上传:用 POST /v1/assets 上传每张图片,文件作为原始请求体(PNG、JPEG、WebP、GIF、BMP 或 TIFF)。返回结果中带有它的 id。
  2. 创建:用 POST /v1/projects 创建项目,并提供 width、height 和 background。也可以在同一次调用中传入最初的 steps。
  3. 编辑:用 POST /v1/projects/{id}/run,单个操作写成 {"op": …},多个操作写成 {"steps": [...]}。用免费的 GET /v1/projects/{id}/preview 查看效果。
  4. 导出:用 POST /v1/projects/{id}/export。返回结果包含文件 URL;如果指定 "response": "image",则直接返回图片本身。

第一个请求

创建一个带渐变和标题的 1080×1080 项目,然后导出为 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
  }'

接口

方法路径作用
GET/health服务状态
GET/v1/ops所有操作及其参数的目录(公开)
POST/v1/assets?name=photo.jpg上传图片;请求体即文件
GET/v1/assets列出你的图片以及是否被项目使用
DELETE/v1/assets/{id}删除图片
POST/v1/projects创建项目(画布,或完整文档,另可附带步骤)
GET/v1/projects列出你的项目
GET/v1/projects/{id}获取单个项目及其文档
PUT/v1/projects/{id}/document替换整个文档
POST/v1/projects/{id}/run应用一个操作或一组步骤
POST/v1/projects/{id}/undo撤销上一次更改
POST/v1/projects/{id}/redo重做
GET/v1/projects/{id}/preview?size=1024免费 PNG 预览,长边最大为 size 像素
POST/v1/projects/{id}/export导出 PNG、JPEG 或 WebP;可附带仅作用于此文件的步骤
POST/v1/render对整个文档进行无状态渲染
GET/v1/exports列出你的导出文件
GET/v1/exports/{id}/file下载导出文件
DELETE/v1/projects/{id}删除项目

操作

每个操作都是带有 op 及其参数的对象。图层通过 id 或名称引用;省略 layer 时使用当前活动图层。名称不区分大小写和空格,因此 "Linear Dodge (Add)" 与 "linearDodge" 是同一种混合模式。使用 steps 时按顺序执行,遇到第一个错误即停止(除非设置 "stopOnError": false);出错之前的步骤依然生效。

图层

操作参数作用
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.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.

形状

操作参数作用
shape.addshape, rect | from+to, color, cornerRadius, lineWidth, nameAdd a rectangle, ellipse or line.
shape.setlayer, color, cornerRadius, lineWidthChange a shape layer.

变换

操作参数作用
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.

图层调整

操作参数作用
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.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).

调整图层

操作参数作用
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).

图层蒙版

操作参数作用
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.

图层效果

操作参数作用
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.

画布

操作参数作用
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.

项目

操作参数作用
project.state—The whole document.

混合模式

字体家族

模板

向导出调用传入 steps,这些步骤只会应用到项目的副本上,仅作用于该文件。一个模板,多个文件:用 text.set 更换文字,用 layer.setImage 更换照片,图层的框保持不变。

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

无状态渲染

POST /v1/render 接收完整的 document(即 project.document 中返回的内容)、可选的 steps 和导出选项,不会保存项目。指定 "response": "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

错误

错误以 JSON 形式返回,带有稳定的 code 和以你账户语言书写的 detail 信息。步骤失败时会指出哪个参数有误。套餐的渲染次数用完后,API 返回 402 和 quota_renders。

限制