Nordic Layers · Nordic Byte

Dokumentasi API

Nordic Layers adalah REST API lewat HTTPS di https://app.layers.nordicbyte.co.uk. Proyek adalah dokumen JSON berisi layer; Anda mengubahnya dengan operasi dan mengekspornya sebagai gambar. Editor browser memakai API yang sama.

Autentikasi

Buat API key di panel akun Anda dan kirim pada setiap permintaan /v1. Key diawali dengan nl_key_.

Authorization: Bearer nl_key_…

Alur yang biasa

  1. Unggah setiap gambar dengan POST /v1/assets dan file sebagai body mentah permintaan (PNG, JPEG, WebP, GIF, BMP, atau TIFF). Responsnya membawa id-nya.
  2. Buat proyek dengan POST /v1/projects beserta width, height, dan background. Anda bisa menyertakan steps pertama dalam panggilan yang sama.
  3. Edit dengan POST /v1/projects/{id}/run: satu operasi sebagai {"op": …} atau beberapa sebagai {"steps": [...]}. Lihat hasilnya dengan GET /v1/projects/{id}/preview, yang gratis.
  4. Ekspor dengan POST /v1/projects/{id}/export. Responsnya berisi URL file, atau gambarnya langsung dengan "response": "image".

Permintaan pertama

Buat proyek 1080×1080 dengan gradien dan judul, lalu ekspor sebagai 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
  }'

Endpoint

MetodePathFungsinya
GET/healthStatus layanan
GET/v1/opsKatalog semua operasi beserta parameternya (publik)
POST/v1/assets?name=photo.jpgUnggah gambar; body-nya adalah file
GET/v1/assetsDaftar gambar Anda dan apakah ada proyek yang memakainya
DELETE/v1/assets/{id}Hapus gambar
POST/v1/projectsBuat proyek (kanvas, atau seluruh dokumen, plus langkah opsional)
GET/v1/projectsDaftar proyek Anda
GET/v1/projects/{id}Satu proyek beserta dokumennya
PUT/v1/projects/{id}/documentGanti seluruh dokumen
POST/v1/projects/{id}/runTerapkan satu operasi atau daftar langkah
POST/v1/projects/{id}/undoUrungkan perubahan terakhir
POST/v1/projects/{id}/redoUlangi
GET/v1/projects/{id}/preview?size=1024Pratinjau PNG gratis, sisi terpanjang hingga size px
POST/v1/projects/{id}/exportEkspor PNG, JPEG, atau WebP; langkah opsional hanya untuk file ini
POST/v1/renderRender stateless untuk seluruh dokumen
GET/v1/exportsDaftar ekspor Anda
GET/v1/exports/{id}/fileUnduh ekspor
DELETE/v1/projects/{id}Hapus proyek

Operasi

Setiap operasi adalah objek dengan op dan parameternya. Layer dirujuk lewat id atau nama; tanpa layer, layer aktif yang dipakai. Nama tidak membedakan huruf besar-kecil dan spasi, jadi "Linear Dodge (Add)" dan "linearDodge" adalah mode blending yang sama. Dengan steps, operasi dijalankan berurutan dan berhenti pada kesalahan pertama (kecuali "stopOnError": false); langkah sebelumnya tetap diterapkan.

Layer

OperasiParameterFungsinya
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.

Teks

OperasiParameterFungsinya
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.

Bentuk

OperasiParameterFungsinya
shape.addshape, rect | from+to, color, cornerRadius, lineWidth, nameAdd a rectangle, ellipse or line.
shape.setlayer, color, cornerRadius, lineWidthChange a shape layer.

Transformasi

OperasiParameterFungsinya
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.

Penyesuaian pada layer

OperasiParameterFungsinya
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

OperasiParameterFungsinya
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).

Layer penyesuaian

OperasiParameterFungsinya
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).

Layer mask

OperasiParameterFungsinya
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.

Efek layer

OperasiParameterFungsinya
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.

Kanvas

OperasiParameterFungsinya
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.

Proyek

OperasiParameterFungsinya
project.state—The whole document.

Mode blending

Keluarga font

Template

Sertakan steps pada panggilan ekspor dan langkah itu diterapkan ke salinan proyek hanya untuk file tersebut. Satu template, banyak file: ganti teks dengan text.set dan foto dengan layer.setImage, yang mempertahankan kotak layer.

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 stateless

POST /v1/render menerima seluruh document (seperti yang dikembalikan di project.document), steps opsional, dan opsi ekspor, serta tidak menyimpan proyek. Dengan "response": "image" responsnya adalah file gambar.

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

Kesalahan

Kesalahan dikembalikan sebagai JSON dengan code yang stabil dan pesan detail dalam bahasa akun Anda. Langkah yang gagal melaporkan parameter mana yang salah. Saat render pada suatu paket habis, API menjawab 402 dengan quota_renders.

Batasan