API 文档
Nordic Layers 是部署在 https://app.layers.nordicbyte.co.uk 的 HTTPS REST API。项目是由图层组成的 JSON 文档;你用操作修改它,并将其导出为图片。浏览器编辑器使用的是同一套 API。
身份验证
在账户面板中创建 API 密钥,并在每个 /v1 请求中携带。密钥以 nl_key_ 开头。
Authorization: Bearer nl_key_…
常规流程
- 上传:用
POST /v1/assets 上传每张图片,文件作为原始请求体(PNG、JPEG、WebP、GIF、BMP 或 TIFF)。返回结果中带有它的 id。 - 创建:用
POST /v1/projects 创建项目,并提供 width、height 和 background。也可以在同一次调用中传入最初的 steps。 - 编辑:用
POST /v1/projects/{id}/run,单个操作写成 {"op": …},多个操作写成 {"steps": [...]}。用免费的 GET /v1/projects/{id}/preview 查看效果。 - 导出:用
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.add | color, name | Alias of layer.addFill (the web has no empty pixel layers). |
layer.addFill | color | gradient {colors: [..], angle, type: linear|radial}, name, above, atBottom | A colour or gradient layer the size of the canvas. |
layer.addImage | asset_id | color, name, rect | origin | center, width, height, fit (stretch|contain|cover), fitCanvas (contain|cover), above, atBottom, opacity, blendMode | Add an uploaded image (asset_id) or a solid colour (color). |
layer.clip | layer | Clip a layer to the one below it (clipping mask). |
layer.delete | layer | layers | Delete layers. |
layer.duplicate | layer, name | Copy a layer above itself. |
layer.get | layer | One layer with all its settings. |
layer.list | — | Layers from bottom to top. |
layer.move | layer, above | below (layer), toTop, atBottom, index, offset | Reorder a layer. |
layer.rename | layer, name | Rename a layer. |
layer.select | layer | Make a layer the active one. |
layer.setBlendMode | layer | 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.setFill | layer, color | gradient | Change a fill layer's colour or gradient. |
layer.setImage | layer, asset_id, fit (stretch|contain|cover) | Replace a layer's image and keep its box (templates). |
layer.setOpacity | layer | layers, opacity | Layer opacity, 0 to 1. |
layer.setVisible | layer | layers, visible | Show or hide layers. |
layer.unclip | layer | Release a clipping mask. |
文字
| 操作 | 参数 | 作用 |
|---|
text.add | content, fontName, fontSize, color, alignment, leading, bold, italic, boxWidth, origin | center, name | Add a text layer. |
text.defaults | — | Fonts on the server and whether complex scripts are shaped. |
text.set | layer, content, fontName, fontSize, color, alignment, leading, bold, italic, boxWidth | Change a text layer. |
形状
| 操作 | 参数 | 作用 |
|---|
shape.add | shape, rect | from+to, color, cornerRadius, lineWidth, name | Add a rectangle, ellipse or line. |
shape.set | layer, color, cornerRadius, lineWidth | Change a shape layer. |
| 操作 | 参数 | 作用 |
|---|
transform.flip | layer | layers, axis (horizontal|vertical) | Flip horizontally or vertically. |
transform.move | layer | layers, dx, dy | to [x, y] | Move by dx/dy or to a point. |
transform.rotate | layer | layers, angle | Rotate by an angle (degrees, clockwise). |
transform.scale | layer | layers, factor | percent | width | height | Scale around each layer's centre. |
transform.set | layer | layers, x, y, width, height, rotation, flipX, flipY | Box, rotation and flips. |
图层调整
| 操作 | 参数 | 作用 |
|---|
adjust.blackWhite | layer | layers, reds, yellows, greens, cyans, blues, magentas, tint, tintHue, tintSaturation | Non-destructive blackWhite on a layer (adds it or updates it). |
adjust.brightnessContrast | layer | layers, brightness, contrast | Non-destructive brightnessContrast on a layer (adds it or updates it). |
adjust.clear | layer | layers | Remove every adjustment and filter from a layer. |
adjust.colorBalance | layer | layers, shadows, midtones, highlights, preserveLuminosity | Non-destructive colorBalance on a layer (adds it or updates it). |
adjust.curves | layer | layers, rgb, red, green, blue | Non-destructive curves on a layer (adds it or updates it). |
adjust.exposure | layer | layers, exposure, offset, gamma | Non-destructive exposure on a layer (adds it or updates it). |
adjust.gradientMap | layer | layers, shadows, highlights, reversed | Non-destructive gradientMap on a layer (adds it or updates it). |
adjust.grain | layer | layers, amount, size, seed | Non-destructive grain on a layer (adds it or updates it). |
adjust.hueSaturation | layer | layers, hue, saturation, lightness, colorize | Non-destructive hueSaturation on a layer (adds it or updates it). |
adjust.invert | layer | layers, no settings | Non-destructive invert on a layer (adds it or updates it). |
adjust.levels | layer | layers, black, white, gamma, outputBlack, outputWhite | Non-destructive levels on a layer (adds it or updates it). |
adjust.remove | layer | layers, kind | Remove one adjustment or filter from a layer. |
滤镜
| 操作 | 参数 | 作用 |
|---|
filter.addNoise | layer | layers, amount, gaussian, monochromatic, seed | Non-destructive addNoise on a layer (adds it or updates it). |
filter.gaussianBlur | layer | layers, radius | Non-destructive gaussianBlur on a layer (adds it or updates it). |
filter.motionBlur | layer | layers, angle, distance | Non-destructive motionBlur on a layer (adds it or updates it). |
filter.pixelate | layer | layers, size | Non-destructive pixelate on a layer (adds it or updates it). |
filter.sharpen | layer | layers, amount, radius, threshold | Non-destructive sharpen on a layer (adds it or updates it). |
filter.vignette | layer | layers, amount, midpoint, roundness, feather, color | Non-destructive vignette on a layer (adds it or updates it). |
调整图层
| 操作 | 参数 | 作用 |
|---|
adjustmentLayer.add | kind, settings…, name, above | An adjustment layer: changes everything below it. |
adjustmentLayer.get | layer | An adjustment layer's settings. |
adjustmentLayer.set | layer, settings… | Change an adjustment layer (partial). |
图层蒙版
| 操作 | 参数 | 作用 |
|---|
mask.add | layer, reveal | hide | rect | ellipse (rect) | gradient (from, to) | asset_id (+ rect), feather, invert, cornerRadius | Add or replace a layer mask. |
mask.blur | layer, radius | Feather the layer mask. |
mask.delete | layer | Remove the layer mask. |
mask.invert | layer | Invert the layer mask. |
mask.setEnabled | layer, enabled | Turn the layer mask on or off. |
图层效果
| 操作 | 参数 | 作用 |
|---|
effects.copy | from, layer | layers | Copy effects from one layer to others. |
effects.get | layer | A layer's effects. |
effects.remove | layer | layers, kinds | Remove effects (all, or the ones named). |
effects.set | layer | layers, shadow {…}, stroke {…}, outerGlow {…}, colorOverlay {…} | Set effects (partial): shadow, outerGlow, stroke, colorOverlay. |
effects.setEnabled | layer, kind, enabled | Turn one effect on or off. |
画布
| 操作 | 参数 | 作用 |
|---|
canvas.crop | rect [x, y, width, height] | Crop the canvas to a rectangle. |
canvas.imageSize | width and/or height, or percent | Scale the whole document. |
canvas.setBackground | color | Background colour, or null for transparent. |
canvas.size | width, 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。
限制
- 上传最大 50 MB,每边最大 12,000 px。
- 画布每边最大 20,000 px,且不超过套餐的兆像素上限。
- 每次调用最多 200 个步骤。
- 预览长边最大 2,048 px。
- 兆像素、图层、项目、存储空间和每月渲染次数取决于套餐:详见价格。