Nordic Layers · Nordic Byte

Документация API

Nordic Layers — это REST API по HTTPS на https://app.layers.nordicbyte.co.uk. Проект — 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 px
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.

Лимиты