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. تحمل الاستجابة رابط الملف، أو الصورة نفسها مع "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.

الحدود