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 px
POST/v1/projects/{id}/exportPNG, 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

오류

오류는 고정된 code와 계정 언어로 된 detail 메시지가 담긴 JSON으로 반환됩니다. 실패한 단계는 어떤 매개변수가 잘못되었는지 알려 줍니다. 요금제의 렌더링을 모두 사용하면 API는 402와 quota_renders로 응답합니다.

제한