Files
dashfront/.agents/skills/backend/SKILL.md
2026-10-17 05:00:17 +02:00

52 KiB

name, description
name description
backend Reference documentation for backend service. Use this skill whenever working with backend APIs.

Dash API Routes Overview (All)

Overview of all 261 API endpoints across all modules.

Notation

Types: str string, int integer, num number, bool boolean; T[] array; ? optional. Params: path values first, then query: and body: (body? = optional body). Responses: status code + JSON shape; Tn refers to a reusable type below.

Reusable types

  • T1 = { id: int, number: str, type: str, entityId: int|null, date: str, lines: T20[], externalNumber?: str|null, createdAt?: str, shipping?: T19|null, shippings?: T19[], payment?: T30|null, payments?: T30[], paid?: bool, shipped?: bool, delivered?: bool, orderTotal?: num, paidTotal?: num, orderedQuantity?: num, shippedQuantity?: num, shipments?: T3[], files?: T9[] }
  • T2 = { id: int, sku: str, name: str, slug: str, desc: str|null, seo: str|null, track_stock: bool, unitamount: num|null, weight: num|null, unit: T27, brand: T26|null, categoryIds: int[], photos: T24[], eans: str[], prices: T35[], suppliers: T11[] }
  • T3 = { id: int, number: str, type: str, date: str, lines: T20[], shippings: T19[], entityId?: int|null, externalNumber?: str|null, createdAt?: str|null, lineCount?: int, packageCount?: int, files?: T9[], state?: str }
  • T4 = { id: int, number: str, type: str, entityId: int|null, date: str, lines: T20[], externalNumber?: str|null, createdAt?: str, positions?: int, grossTotal?: num, totalQuantity?: num, customerName?: str|null, files?: T9[] }
  • T5 = { id: int, number: str, type: str, supplierId: int|null, date: str, lines: T20[], files: T9[], externalNumber?: str|null, createdAt?: str, ledger?: T39 }
  • T6 = { name: str, path: str, totalSizeBytes: int, timestamp: str|null, manifest?: T7|null }
  • T7 = { id: str, timestamp: str, dateKey: str, monthKey: str, dbProvider: str, files: T12, totalSizeBytes: int, durationMs: int }
  • T8 = { id: int, name: str, width: num, height: num, dpi: int, type: str, content: { objects: T21[] }, thumb?: str|null }
  • T9 = { id: int, manifestId: int, fileId: int, sort: int, hash: str, mimetype: str, name: str, size: int, created?: str, modified?: str, skeledash?: str|null, thumbx?: int|null, thumby?: int|null, meta?: { [k]: str }|null }
  • T10 = { id: int, name: str, pairingpin?: str|null, token?: str|null, pairedAt?: str|null, clientserial?: str|null, rootCategoryId?: int|null, syncRootArticles?: bool, lastseenAt?: str|null, updatedAt?: str|null, categoryIds?: int[] }
  • T11 = { id: int, articleId: int, entityId: int, pu: num, sort: int, supplierName?: str|null, sku?: str|null, stock?: num|null, priceId?: int|null, price?: T41|null }
  • T12 = { vfs: T40, storage: T40, database: T33 }
  • T13 = { id: int, entityId: int, addressType: str, firstName?: str|null, name?: str|null, street?: str|null, streetNumber?: str|null, zip?: str|null, city?: str|null, county?: str|null }
  • T14 = { id: int, company_id: int, prompt: str, max_itr: int, cron: str, created_at: str, desc?: str|null, skills?: str|null, lastagentnote?: str|null, lastrun_at?: str|null }
  • T15 = { id: int, manifestarticle_id: int, transaction_type: str, amount: num, transaction_text: str, hash_version: int, prev_hash?: str, sku?: str|null, created_at?: str }
  • T16 = { id: int, name: str, sort: int, exclusive: bool, values: T28[], articleCount?: int }
  • T17 = { id: int, companyuser_id: int, provider: str, model: str, created_at: str, updated_at: str, state: str, started_by?: int|null, first_message?: str|null }
  • T18 = { id: int, name: str, rootCategoryId: int|null, languageId: int|null, iso639: str|null, taxrate: num, reducedtaxrate: num, taxfreerate: num }
  • T19 = { id: int, manifestId: int, number: str, carrierId: int, type: str, state: str, trackingCode?: str|null, carrier?: str|null }
  • T20 = { id: int, sku: str|null, name: str|null, pu: num, amount: num, net: num, rebate: num, taxrate: num, comment: str|null }
  • T21 = { id: str, type: str, x: num, y: num, w?: num, h?: num, text?: str, font?: str, fontSize?: num, barcodeFormat?: str }
  • T22 = { id: int, company_id: int, address: str, type: str, sort: int, model?: str|null, serial?: str|null, desc?: str|null }
  • T23 = { amount: num, net: num, taxrate: num, sku?: str|null, name?: str|null, pu?: num, rebate?: num, comment?: str|null }
  • T24 = { sort: int, fullHash: str, fullW: int, fullH: int, fullSize: int, thumbW: int, thumbH: int, thumbHash: str }
  • T25 = { id: int, customergroupId: int, firstName: str|null, name: str, number: str|null, createdAt: str, updatedAt: str }
  • T26 = { name: str, id?: int|null, fullHash?: str|null, thumbW?: int|null, thumbH?: int|null, thumbHash?: str|null }
  • T27 = { si: str, basesi: str, basesifactor: num, symbol?: str|null, name?: str|null }
  • T28 = { id: int, attributeId: int, value: str, sort: int, articleCount?: int }
  • T29 = { id: int, name: str, sort: int, exclusive: bool, articleCount?: int }
  • T30 = { id: int, accountId: int, manifestId: int, type: str, amount: num }
  • T31 = { id: int, name: str, sort: int, hasPackages: bool, isReverse: bool }
  • T32 = { id: int, categoryId: int, name: str, sku: str, track_stock: bool }
  • T33 = { name: str|null, sizeBytes: int, backedUp: bool, reason?: str|null }
  • T34 = { id: int, email: str, selectedCompanyId: int|null, picture?: str }
  • T35 = { minmultiplier: num, net: num, taxRate: num, customergroupId: int }
  • T36 = { fullHash: str, thumbW: int, thumbH: int, thumbHash: str }
  • T37 = { id: int, entityId: int, contactType: str, contact: str }
  • T38 = { id: int, name: str, createdAt: str, updatedAt: str }
  • T39 = { totalPositions: int, completelyOnLedgerPositions: int }
  • T40 = { name: str, sizeBytes: int, sourceExists: bool }
  • T41 = { net: num, taxId: int, taxRate?: num|null }

Routes

Section: /.well-known

OAuth 2.0 Authorization Server Metadata (RFC 8414) — GET /.well-known/oauth-authorization-server

none

  • Returns: 200

OAuth 2.0 Protected Resource Metadata (RFC 9728) — GET /.well-known/oauth-protected-resource

none

  • Returns: 200

Section: /account

List accounts — GET /account

none

  • Returns: 200 { accounts: { id: int, companyId: int, type: str, name: str }[] }

Create account — POST /account

  • Params: body: { type: str, name: str }
  • Returns: 201 { account: { id: int, companyId: int, type: str, name: str } }

Delete account — DELETE /account/{id}

  • Params: id: int
  • Returns: 204 void

Section: /article

Create article in category — POST /article

  • Params: body: { categoryId: int, name: str, desc?: str, seo?: str, track_stock?: bool }
  • Returns: 201 { article: T32 }

Export articles as ZIP — GET /article/export.zip

  • Params: query: categoryId?: int
  • Returns: 200 zip

Delete article by SKU — DELETE /article/{sku}

  • Params: sku: str, query: cascade?: bool
  • Returns: 204 void

Get article by SKU — GET /article/{sku}

  • Params: sku: str
  • Returns: 200 { article: T2 }

Update article by SKU — PATCH /article/{sku}

  • Params: sku: str, body: { name?: str, desc?: str, seo?: str, unitamount?: num, unitSi?: str, track_stock?: bool }
  • Returns: 200 { article: T2 }

Get Stückliste (bundle items) for an article — GET /article/{sku}/articlelist

  • Params: sku: str
  • Returns: 200 { items: { id: int, articleId: int, sku: str, name: str, count: int, sort: int }[] }

Set Stückliste (bundle items) for an article — PUT /article/{sku}/articlelist

  • Params: sku: str, body: { items: { articleId?: int, sku?: str, count?: int, sort?: int }[] }
  • Returns: 200 { items: { id: int, articleId: int, sku: str, name: str, count: int, sort: int }[] }

List article attribute values — GET /article/{sku}/attributevalue

  • Params: sku: str
  • Returns: 200 { attributevalues: { id: int, attributeId: int, attributeName: str, attributeValueId: int, value: str, sort: int, articleId?: int, exclusive?: bool }[] }

Bulk set article attribute values — PUT /article/{sku}/attributevalue

  • Params: sku: str, body: int[]
  • Returns: 200 { attributevalues: { id: int, attributeId: int, attributeName: str, attributeValueId: int, value: str, sort: int, articleId?: int, exclusive?: bool }[] }

Set or clear article brand by SKU (null to clear) — PUT /article/{sku}/brand

  • Params: sku: str, body: { brandId: int|null }
  • Returns: 200 { article: T2 }

Replace article categories by SKU — PUT /article/{sku}/categories

  • Params: sku: str, body: { categoryIds: int[] }
  • Returns: 200 { article: T2 }

List child articles of a parent article — GET /article/{sku}/children

  • Params: sku: str
  • Returns: 200 { children: { id: int, sku: str, name: str, parentsort: int, attributeValueId: int, attributeValue: str }[] }

Create and attach a new child article to a parent article — POST /article/{sku}/children

  • Params: sku: str, body: { attributeValueId?: int, value?: str, name?: str }
  • Returns: 201 { article: T32 }

Attach an existing article as a child to a parent article — PUT /article/{sku}/children

  • Params: sku: str, body: { sku: str, attributeValueId?: int, value?: str, reparent?: bool }
  • Returns: 200 { article: T32, children: { id: int, sku: str, name: str, parentsort: int, attributeValueId: int, attributeValue: str }[] }

Remove a child article from a parent article — DELETE /article/{sku}/children/{childSku}

  • Params: sku: str, childSku: str, query: deleteArticle?: bool
  • Returns: 200 { success: bool, deleted: bool }

Replace article EANs by SKU — PUT /article/{sku}/eans

  • Params: sku: str, body: { eans: str[] }
  • Returns: 200 { article: T2 }

Get article history by SKU — GET /article/{sku}/history

  • Params: sku: str, query: limit?: int
  • Returns: 200 { history: { id: int, date: str, text: str }[], truncated: bool }

Add article image — POST /article/{sku}/image

  • Params: sku: str, image/avif
  • Returns: 201 { image: { picId: int, sort: int, full: { w: int, h: int, size: int }, thumb: { w: int, h: int }, hash: str, thumbHash: str } }

Delete article image — DELETE /article/{sku}/image/{fullHash}

  • Params: sku: str, fullHash: str
  • Returns: 204 void

Reorder article images — PUT /article/{sku}/images/order

  • Params: sku: str, body: { fullHashes: str[] }
  • Returns: 200 { fullHashes: str[] }

Get options list for an article — GET /article/{sku}/optionslist

  • Params: sku: str
  • Returns: 200 { options: { id: int, articleId: int, sku: str, name: str, count: int, sort: int, mandated: bool }[] }

Set options list for an article — PUT /article/{sku}/optionslist

  • Params: sku: str, body: { options: { articleId?: int, sku?: str, count?: int, sort?: int, mandated?: bool }[] }
  • Returns: 200 { options: { id: int, articleId: int, sku: str, name: str, count: int, sort: int, mandated: bool }[] }

Toggle parent mode for an article — POST /article/{sku}/parent

  • Params: sku: str, body: { isParent: bool, attributeNameId?: int }
  • Returns: 200 { article: T32 }

Replace POS prices by SKU (net > gross; price=net, tax=taxRate %) — PUT /article/{sku}/prices

  • Params: sku: str, body: { prices: { net?: num, gross?: num, price?: num, taxRate?: num, tax?: num, minmultiplier?: num }[] }
  • Returns: 200 { article: T2 }

Print article label — POST /article/{sku}/print

  • Params: sku: str, body: { templateId: int, printerId: int, quantity: int }
  • Returns: 200 { success: bool }

List article properties — GET /article/{sku}/property

  • Params: sku: str
  • Returns: 200 { properties: { id: int, propertyId: int, name: str, exclusive: bool, value: str, sort: int, articleId?: int }[] }

Bulk set article properties — PUT /article/{sku}/property

  • Params: sku: str, body: { properties: { propertyId: int, value: str, sort?: int }[] }
  • Returns: 200 { properties: { id: int, propertyId: int, name: str, exclusive: bool, value: str, sort: int, articleId?: int }[] }

Delete article property — DELETE /article/{sku}/property/{propertyId}

  • Params: sku: str, propertyId: int
  • Returns: 200 { ok: bool }

List article suppliers — GET /article/{sku}/supplier

  • Params: sku: str
  • Returns: 200 { suppliers: T11[] }

Assign supplier to article — POST /article/{sku}/supplier

  • Params: sku: str, body: { entityId: int, sku?: str|null, pu?: num, stock?: num|null, sort?: int|null, netPrice?: num|null, taxId?: int|null, taxRate?: num|null }
  • Returns: 201 { supplier: T11 }

Reorder article suppliers — PUT /article/{sku}/supplier/order

  • Params: sku: str, body: { ids: int[] }
  • Returns: 200 { ids: int[] }

Remove supplier assignment from article — DELETE /article/{sku}/supplier/{id}

  • Params: sku: str, id: int
  • Returns: 204 void

Update article supplier assignment — PATCH /article/{sku}/supplier/{id}

  • Params: sku: str, id: int, body: { sku?: str|null, pu?: num, stock?: num|null, sort?: int, netPrice?: num|null, taxId?: int|null, taxRate?: num|null }
  • Returns: 200 { supplier: T11 }

Set article track_stock flag by SKU — PUT /article/{sku}/track_stock

  • Params: sku: str, body: { track_stock: bool }
  • Returns: 200 { article: T2 }

Set article weight by SKU — PUT /article/{sku}/weight

  • Params: sku: str, body: { weight: num }
  • Returns: 200 { article: T2 }

Section: /attributename

List attribute names — GET /attributename

none

  • Returns: 200 { attributenames: T16[] }

Create attribute name — POST /attributename

  • Params: body: { name: str, sort?: int, exclusive?: bool }
  • Returns: 201 { attributename: T16 }

Reorder attribute names — PUT /attributename/order

  • Params: body: { attributenameIds: int[] }
  • Returns: 200 { ok: bool }

List values for an attribute — GET /attributename/{attributeId}/value

  • Params: attributeId: int
  • Returns: 200 { values: T28[] }

Create value for an attribute — POST /attributename/{attributeId}/value

  • Params: attributeId: int, body: { value: str, sort?: int }
  • Returns: 201 { attributevalue: T28 }

Reorder values of an attribute — PUT /attributename/{attributeId}/value/order

  • Params: attributeId: int, body: { attributevalueIds: int[] }
  • Returns: 200 { ok: bool }

Delete attribute name — DELETE /attributename/{id}

  • Params: id: int
  • Returns: 200 { ok: bool }

Update attribute name — PATCH /attributename/{id}

  • Params: id: int, body: { name?: str, sort?: int, exclusive?: bool }
  • Returns: 200 { attributename: T16 }

Section: /attributevalue

Delete attribute value — DELETE /attributevalue/{id}

  • Params: id: int
  • Returns: 200 { ok: bool }

Update attribute value — PATCH /attributevalue/{id}

  • Params: id: int, body: { value?: str, sort?: int }
  • Returns: 200 { attributevalue: T28 }

Delete attribute value image — DELETE /attributevalue/{id}/image

  • Params: id: int
  • Returns: 200 { attributevalue: { id: int, thumbW: int|null, thumbH: int|null, thumbHash: str|null, pics: T36[] } }

Add or replace attribute value image — POST /attributevalue/{id}/image

  • Params: id: int, image/avif
  • Returns: 201 { attributevalue: { id: int, fullHash: str, thumbW: int, thumbH: int, thumbHash: str, pics: T36[] } }

Section: /auth

Login with Google ID token — POST /auth/login

  • Params: body: { idToken: str }
  • Returns: 200 { message: str, user: T34 }

Logout — POST /auth/logout

none

  • Returns: 200 { message: str }

Current user — GET /auth/me

none

  • Returns: 200 { user: T34, googleClientId: str }

Set selected company — PUT /auth/selected-company

  • Params: body: { companyId: int }
  • Returns: 200 { user: T34 }

Section: /backup

List backups and service status — GET /backup

none

  • Returns: 200 { status: { enabled: bool, isRunning: bool, dbProvider: str, mssqlWarning: bool, backupDir: str, retention: { hourlyMax: int, dailyMax: int, monthly: str }, counts: { hourly: int, daily: int, monthly: int }, latestHourly?: T6|null, latestDaily?: T6|null, latestMonthly?: T6|null }, backups: { counts: { hourly: int, daily: int, monthly: int }, hourly: T6[], daily: T6[], monthly: T6[] } }

List VFS files in a backup — GET /backup/{id}/vfs

  • Params: id: str, query: companyId?: int
  • Returns: 200 { backupId: str, companyId: int, files: { name: str, size: int, mime: str, mtime: str }[] }

Recover VFS file from a backup — POST /backup/{id}/vfs/recover

  • Params: id: str, body: { path: str, companyId?: int }
  • Returns: 200 { success: bool, backupId: str, companyId: int, path: str, sizeBytes: int, mime: str }

Section: /brand

List brands — GET /brand

  • Params: query: offset?: int, limit?: int, includeSmallThumbs?: bool
  • Returns: 200 { brands: { id: int, name: str, articleCount: int, pics: { fullHash: str, thumbW: int, thumbH: int, thumbHash: str, smallThumbW?: int|null, smallThumbH?: int|null, smallThumbBinary?: str|null }[], gsprpinfo?: str|null }[], total: int, offset: int, limit: int }

Create brand — POST /brand

  • Params: body: { name: str, gsprpinfo?: str }
  • Returns: 201 { brand: { id: int, name: str, pics: T36[], gsprpinfo?: str|null } }

Delete brand — DELETE /brand/{id}

  • Params: id: int
  • Returns: 204 void

Rename brand — PATCH /brand/{id}

  • Params: id: int, body: { name?: str, gsprpinfo?: str }
  • Returns: 200 { brand: { id: int, name: str, touchedArticleCount: int, gsprpinfo?: str|null } }

Delete brand image — DELETE /brand/{id}/image

  • Params: id: int
  • Returns: 200 { brand: { id: int, thumbW: int|null, thumbH: int|null, thumbHash: str|null, pics: T36[] } }

Add or replace brand image — POST /brand/{id}/image

  • Params: id: int, image/avif
  • Returns: 201 { brand: { id: int, fullHash: str, thumbW: int, thumbH: int, thumbHash: str, pics: T36[] } }

Section: /carrier

List carriers — GET /carrier

none

  • Returns: 200 { carriers: T31[] }

Create carrier — POST /carrier

  • Params: body: { name: str, sort?: int, hasPackages?: bool, isReverse?: bool }
  • Returns: 201 { carrier: T31 }

Reorder carriers — PUT /carrier/order

  • Params: body: { carrierIds: int[] }
  • Returns: 200 { carrierIds: int[] }

Delete carrier — DELETE /carrier/{id}

  • Params: id: int
  • Returns: 204 void

Get carrier by ID — GET /carrier/{id}

  • Params: id: int
  • Returns: 200 { carrier: T31 }

Update carrier — PATCH /carrier/{id}

  • Params: id: int, body: { name?: str, sort?: int, hasPackages?: bool, isReverse?: bool }
  • Returns: 200 { carrier: T31 }

Section: /category

Create category — POST /category

  • Params: body: { parentId: int, name: str }
  • Returns: 201 { category: { id: int, parentId: int|null, sort: int, name: str } }

Export categories as ZIP — GET /category/export.zip

none

  • Returns: 200 zip

Reorder sibling categories — PUT /category/order

  • Params: body: { parentId: int, categoryIds: int[] }
  • Returns: 200 { categoryIds: int[] }

Category tree — GET /category/tree

none

  • Returns: 200 { languageId: int, tree: { id: int, sort: int, posterminalIds: int[], parentId?: int|null, name?: str|null, slug?: str|null, fullHash?: str|null, thumbW?: int|null, thumbH?: int|null, thumbHash?: str|null, articleCount?: int }[], articleCount: int }

Delete category — DELETE /category/{id}

  • Params: id: int, query: recursive?: bool
  • Returns: 204 void

Update category (rename or move) — PATCH /category/{id}

  • Params: id: int, body: { name?: str, parentId?: int }
  • Returns: 200 { category: { id: int, name: str, slug: str, parentId: int, sort: int } }

Articles in category — GET /category/{id}/articles

  • Params: id: int
  • Returns: 200 { articles: { id: int, sku: str, name: str, slug: str, track_stock: bool, optionsCount: int, articleListCount: int, childCount: int, net?: num|null, taxRate?: num|null, parentArticleId?: int|null, parentSku?: str|null, fullHash?: str|null, thumbW?: int|null, thumbH?: int|null, thumbHash?: str|null, brand?: T26|null }[] }

List category attribute values — GET /category/{id}/attributevalue

  • Params: id: int
  • Returns: 200 { attributevalues: { id: int, attributeId: int, attributeName: str, attributeValueId: int, value: str, sort: int, categoryId?: int, exclusive?: bool }[] }

Bulk set category attribute values — PUT /category/{id}/attributevalue

  • Params: id: int, body: int[]
  • Returns: 200 { attributevalues: { id: int, attributeId: int, attributeName: str, attributeValueId: int, value: str, sort: int, categoryId?: int, exclusive?: bool }[] }

Delete category image — DELETE /category/{id}/image

  • Params: id: int
  • Returns: 200 { category: { id: int, thumbW: int|null, thumbH: int|null, thumbHash: str|null } }

Add category image — POST /category/{id}/image

  • Params: id: int, image/avif
  • Returns: 201 { category: { id: int, thumbW: int, thumbH: int, thumbHash: str } }

List category properties — GET /category/{id}/property

  • Params: id: int
  • Returns: 200 { properties: { id: int, propertyId: int, name: str, exclusive: bool, value: str, sort: int, categoryId?: int }[] }

Bulk set category properties — PUT /category/{id}/property

  • Params: id: int, body: { properties: { propertyId: int, value: str, sort?: int }[] }
  • Returns: 200 { properties: { id: int, propertyId: int, name: str, exclusive: bool, value: str, sort: int, categoryId?: int }[] }

Delete category property — DELETE /category/{id}/property/{propertyId}

  • Params: id: int, propertyId: int
  • Returns: 200 { ok: bool }

Section: /company

List companies — GET /company

none

  • Returns: 200 { companies: T18[] }

Create company — POST /company

  • Params: body: { iso639: str, name: str, taxrate: num, reducedtaxrate: num }
  • Returns: 201 { company: T18, user: T34 }

Export company catalog as zip archive (SSE) — GET /company/export

  • Params: query: stream?: str
  • Returns: 200 SSE

Export company catalog as zip archive (SSE) — POST /company/export

none

  • Returns: 200 SSE

Get company history — GET /company/history

  • Params: query: limit?: int
  • Returns: 200 { history: { id: int, date: str, text: str, companyuserId?: int|null }[], truncated: bool }

Add company history entry — POST /company/history

  • Params: body: { text: str }
  • Returns: 201 { history: { id: int, date: str, text: str, companyuserId?: int|null } }

Import company catalog from zip archive (SSE) — POST /company/import

  • Params: form: { file?: str }
  • Returns: 200 SSE

List company settings — GET /company/setting

none

  • Returns: 200 { settings: { key: str, value: str|null }[] }

Get company setting by key — GET /company/setting/{key}

  • Params: key: str
  • Returns: 200 { setting: { key: str, value: str|null } }

Upsert company setting — PUT /company/setting/{key}

  • Params: key: str, body: { value: str, frontend?: bool }
  • Returns: 200 { setting: { key: str, value: str|null } }

Delete company — DELETE /company/{id}

  • Params: id: int
  • Returns: 204 void

Update company — PUT /company/{id}

  • Params: id: int, body: { iso639: str, name: str, taxrate: num, reducedtaxrate: num }
  • Returns: 200 { company: T18 }

Section: /customergroup

List customer groups — GET /customergroup

none

  • Returns: 200 { customergroups: { id: int, name: str, sort: int, editable: bool }[] }

Create customer group — POST /customergroup

  • Params: body: { name: str }
  • Returns: 201 { customergroup: { id: int, name: str, sort: int } }

Reorder customer groups — PUT /customergroup/order

  • Params: body: { customergroupIds: int[] }
  • Returns: 200 { customergroupIds: int[] }

Delete customer group — DELETE /customergroup/{id}

  • Params: id: int
  • Returns: 204 void

Update customer group — PATCH /customergroup/{id}

  • Params: id: int, body: { name: str }
  • Returns: 200 { customergroup: { id: int, name: str, sort: int } }

Section: /delivery

List deliveries — GET /delivery

  • Params: query: offset?: int, limit?: int, search?: str, onlyUnbooked?: bool, supplierId?: int, seekMonths?: int
  • Returns: 200 { deliveries: { id: int, number: str, type: str, supplierId: int|null, date: str, externalNumber?: str|null, createdAt?: str, ledger?: T39 }[], total: int, unfilteredTotal: int, offset: int, limit: int }

Create delivery — POST /delivery

  • Params: body: { externalNumber: str, date: str, lines: T23[], supplierId?: int|null, files?: { mimetype: str, name: str, content: str, sort?: int, size?: int, hash?: str, created?: str, modified?: str, meta?: { [k]: str } }[] }
  • Returns: 201 { delivery: T5 }

Delete delivery — DELETE /delivery/{id}

  • Params: id: int
  • Returns: 204 void

Get delivery — GET /delivery/{id}

  • Params: id: int
  • Returns: 200 { delivery: T5 }

Update delivery — PATCH /delivery/{id}

  • Params: id: int, body: { externalNumber?: str|null, date?: str, supplierId?: int|null, lines?: T23[], files?: { mimetype: str, name: str, content: str, sort?: int, size?: int, hash?: str, created?: str, modified?: str, meta?: { [k]: str } }[] }
  • Returns: 200 { delivery: T5 }

Delete delivery file attachment — DELETE /delivery/{id}/file/{fileId}

  • Params: id: int, fileId: int
  • Returns: 204 void

Get delivery attachment file content — GET /delivery/{id}/file/{fileId}

  • Params: id: int, fileId: int, query: download?: bool
  • Returns: 200 str

Generate and attach delivery note PDF (goods receipt) — POST /delivery/{id}/pdf

  • Params: id: int
  • Returns: 201 { attachment: T9, fileUrl: str }

Section: /entity

List entities — GET /entity

  • Params: query: customergroupId?: int, role?: str
  • Returns: 200 { entities: T25[] }

Create entity — POST /entity

  • Params: body: { customergroupId: int, name: str, firstName?: str|null, number?: str }
  • Returns: 201 { entity: T25 }

Peek next customer number — GET /entity/next-number

none

  • Returns: 200 { number: str }

List entity addresses — GET /entity/{entityId}/address

  • Params: entityId: int
  • Returns: 200 { addresses: T13[] }

Create entity address — POST /entity/{entityId}/address

  • Params: entityId: int, body: { addressType: str, firstName?: str|null, name?: str|null, street?: str|null, streetNumber?: str|null, zip?: str|null, city?: str|null, county?: str|null }
  • Returns: 201 { address: T13 }

Delete entity address — DELETE /entity/{entityId}/address/{id}

  • Params: entityId: int, id: int
  • Returns: 204 void

Update entity address — PATCH /entity/{entityId}/address/{id}

  • Params: entityId: int, id: int, body: { addressType?: str, firstName?: str|null, name?: str|null, street?: str|null, streetNumber?: str|null, zip?: str|null, city?: str|null, county?: str|null }
  • Returns: 200 { address: T13 }

List entity contacts — GET /entity/{entityId}/contact

  • Params: entityId: int
  • Returns: 200 { contacts: T37[] }

Create entity contact — POST /entity/{entityId}/contact

  • Params: entityId: int, body: { contactType: str, contact: str }
  • Returns: 201 { contact: T37 }

Delete entity contact — DELETE /entity/{entityId}/contact/{id}

  • Params: entityId: int, id: int
  • Returns: 204 void

Update entity contact — PATCH /entity/{entityId}/contact/{id}

  • Params: entityId: int, id: int, body: { contactType?: str, contact?: str }
  • Returns: 200 { contact: T37 }

Delete entity — DELETE /entity/{id}

  • Params: id: int
  • Returns: 204 void

Get entity — GET /entity/{id}

  • Params: id: int
  • Returns: 200 { entity: T25 }

Update entity — PATCH /entity/{id}

  • Params: id: int, body: { name?: str, firstName?: str|null, number?: str|null }
  • Returns: 200 { entity: T25 }

Section: /events

Subscribe to update signals (SSE) — GET /events

none

  • Returns: 200 SSE

  • Events:

    • category: {}
    • articles: {}
    • article-<sku>: {}
    • stock: {}
    • ledger: {}
    • attributename: {}
    • propertyname: {}
    • labeltemplate: {}
    • printer: {}
    • warehouse: {}
    • vfs: {}
    • modelconversation: {}
    • modelconversation-<id>: {}
    • brand: { sender, brandId }

Section: /health

Database health check — GET /health

none

  • Returns: 200 { ok: bool }

Section: /image

Full image by hash — GET /image/{fullHash}

  • Params: fullHash: str
  • Returns: 200 avif

Section: /labeltemplate

List label templates — GET /labeltemplate

none

  • Returns: 200 { labeltemplates: { id: int, name: str, width: num, height: num, dpi: int, type: str, thumb?: str|null }[] }

Create label template — POST /labeltemplate

  • Params: body: { name: str, width: num, height: num, dpi: int, type: str, content: { objects: T21[] } }
  • Returns: 201 { labeltemplate: T8 }

Delete label template — DELETE /labeltemplate/{id}

  • Params: id: int
  • Returns: 204 void

Get label template by ID — GET /labeltemplate/{id}

  • Params: id: int
  • Returns: 200 { labeltemplate: T8 }

Update label template (partial) — PATCH /labeltemplate/{id}

  • Params: id: int, body: { name?: str, width?: num, height?: num, dpi?: int, type?: str, content?: { objects: T21[] } }
  • Returns: 200 { labeltemplate: T8 }

Update label template — PUT /labeltemplate/{id}

  • Params: id: int, body: { name?: str, width?: num, height?: num, dpi?: int, type?: str, content?: { objects: T21[] } }
  • Returns: 200 { labeltemplate: T8 }

Section: /ledger

Query ledger by manifest article ID or SKU — GET /ledger

  • Params: query: manifestarticle_id?: int, sku?: str, transaction_type?: str
  • Returns: 200 { ledger: T15[] }

Query ledger by manifest article ID — GET /ledger/manifestarticle/{manifestarticleId}

  • Params: manifestarticleId: int, query: transaction_type?: str
  • Returns: 200 { ledger: T15[] }

Query ledger by article SKU — GET /ledger/sku/{sku}

  • Params: sku: str, query: transaction_type?: str
  • Returns: 200 { ledger: T15[] }

Section: /mcp

Model Context Protocol (MCP) Streamable HTTP endpoint — POST /mcp

none

  • Returns: 200

List active MCP client authorizations — GET /mcp/authorizations

none

  • Returns: 200

Revoke MCP client authorizations — DELETE /mcp/authorizations/{clientId}

  • Params: clientId: str
  • Returns: 200

Get MCP authorization prompt details — GET /mcp/authorize

  • Params: query: client_id: str, redirect_uri: str, response_type?: str, code_challenge?: str, code_challenge_method?: str, state?: str, scope?: str
  • Returns: 200

Grant or deny MCP client authorization — POST /mcp/authorize

  • Params: body: { client_id: str, redirect_uri: str, action: str, code_challenge?: str, code_challenge_method?: str, state?: str, scope?: str }
  • Returns: 200

List registered MCP clients — GET /mcp/clients

none

  • Returns: 200

Delete registered MCP client — DELETE /mcp/clients/{clientId}

  • Params: clientId: str
  • Returns: 200

Section: /modelconversation

List conversations — GET /modelconversation

none

  • Returns: 200 { conversations: T17[] }

Create conversation — POST /modelconversation

  • Params: body: { provider: str, model: str }
  • Returns: 201 { conversation: T17 }

Delete conversation — DELETE /modelconversation/{id}

  • Params: id: int
  • Returns: 204 void

Get conversation — GET /modelconversation/{id}

  • Params: id: int
  • Returns: 200 { conversation: T17 }

List conversation messages — GET /modelconversation/{id}/message

  • Params: id: int
  • Returns: 200 { messages: { id: int, conversation_id: int, created_at: str, role: str, message: str }[] }

Post a user message — POST /modelconversation/{id}/message

  • Params: id: int, body: { message?: str, role?: str, tool_call_id?: str, content?: any, answer?: any }
  • Returns: 201 { message: { id: int, conversation_id: int, created_at: str, role: str, message: str } }

Stream conversation events (SSE) — GET /modelconversation/{id}/stream

  • Params: id: int
  • Returns: 200 SSE

Section: /number

List number sequences — GET /number

none

  • Returns: 200 { numbers: { id: int, type: str, prefix: str, padding: int, next: int }[] }

Update number sequence — PATCH /number/{id}

  • Params: id: int, body: { prefix?: str, padding?: int, next?: int }
  • Returns: 200 { number: { id: int, type: str, prefix: str, padding: int, next: int } }

Section: /oauth

OAuth 2.1 Authorization Endpoint (RFC 6749 & RFC 7636) — GET /oauth/authorize

  • Params: query: client_id?: str, redirect_uri?: str, response_type?: str, code_challenge?: str, code_challenge_method?: str, state?: str no response body

OAuth 2.0 Token Introspection (RFC 7662) — POST /oauth/introspect

none

  • Returns: 200

Dynamic Client Registration (RFC 7591) — POST /oauth/register

  • Params: body: { redirect_uris: str[], client_name?: str }
  • Returns: 201

OAuth 2.1 Token Endpoint (RFC 6749 & RFC 7636) — POST /oauth/token

  • Params: application/x-www-form-urlencoded
  • Returns: 200

Section: /order

List orders — GET /order

  • Params: query: offset?: int, limit?: int, search?: str, onlyUnpaid?: bool, onlyUndelivered?: bool, seekMonths?: int
  • Returns: 200 { orders: T1[], total: int, unfilteredTotal: int, offset: int, limit: int }

Create order — POST /order

  • Params: body: { number: str, date: str, lines: T23[], entityId?: int|null, externalNumber?: str|null }
  • Returns: 201 { order: T1 }

Delete order — DELETE /order/{id}

  • Params: id: int
  • Returns: 204 void

Get order — GET /order/{id}

  • Params: id: int
  • Returns: 200 { order: T1 }

Update order — PATCH /order/{id}

  • Params: id: int, body: { number?: str, date?: str, entityId?: int|null, externalNumber?: str|null, lines?: T23[] }
  • Returns: 200 { order: T1 }

Delete order file attachment — DELETE /order/{id}/file/{fileId}

  • Params: id: int, fileId: int
  • Returns: 204 void

Get order attachment file content — GET /order/{id}/file/{fileId}

  • Params: id: int, fileId: int, query: download?: bool
  • Returns: 200 str

List payments of an order — GET /order/{id}/payment

  • Params: id: int
  • Returns: 200 { payments: T30[] }

Add payment to an order — POST /order/{id}/payment

  • Params: id: int, body: { accountId: int, type: str, amount: num }
  • Returns: 201 { payment: T30 }

Generate and attach order PDF — POST /order/{id}/pdf

  • Params: id: int
  • Returns: 201 { attachment: T9, fileUrl: str }

List shipments of an order — GET /order/{id}/shipment

  • Params: id: int
  • Returns: 200 { shipments: T3[] }

Create shipment for an order — POST /order/{id}/shipment

  • Params: id: int, body?: { date?: str, externalNumber?: str, lines?: { sku: str, amount?: num, name?: str, pu?: num, net?: num, rebate?: num, taxrate?: num, comment?: str }[] }
  • Returns: 201 { shipment: T3 }

List shippings of an order — GET /order/{id}/shipping

  • Params: id: int
  • Returns: 200 { shippings: T19[] }

Create shipping for an order — POST /order/{id}/shipping

  • Params: id: int, body: { carrierId: int, type: str, state: str, trackingCode?: str, warehouseId?: int }
  • Returns: 201 { shipping: T19 }

Section: /package

Delete package — DELETE /package/{id}

  • Params: id: int
  • Returns: 204 void

Section: /payment

Delete payment — DELETE /payment/{id}

  • Params: id: int
  • Returns: 204 void

Section: /posterminal

List POS terminals — GET /posterminal

none

  • Returns: 200 { posterminals: T10[] }

Create POS terminal — PUT /posterminal

  • Params: body: { name: str, rootCategoryId?: int|null, syncRootArticles?: bool }
  • Returns: 200 { posterminal: T10 }

Delete POS terminal — DELETE /posterminal/{id}

  • Params: id: int
  • Returns: 204 void

Update POS terminal — PATCH /posterminal/{id}

  • Params: id: int, body: { name?: str, rootCategoryId?: int|null, syncRootArticles?: bool, pairingpin?: str|null }
  • Returns: 200 { posterminal: T10 }

Disable all categories on terminal — DELETE /posterminal/{id}/all

  • Params: id: int
  • Returns: 200 { id: int, categoryIds: int[] }

Enable all categories on terminal — PUT /posterminal/{id}/all

  • Params: id: int
  • Returns: 200 { id: int, categoryIds: int[] }

Disable category on terminal — DELETE /posterminal/{id}/category/{categoryId}

  • Params: id: int, categoryId: int
  • Returns: 200 { id: int, categoryIds: int[] }

Enable category on terminal — PUT /posterminal/{id}/category/{categoryId}

  • Params: id: int, categoryId: int
  • Returns: 200 { id: int, categoryIds: int[] }

Section: /printer

List printers — GET /printer

none

  • Returns: 200 { printers: T22[] }

Create printer — POST /printer

  • Params: body: { address: str, type: str, model?: str|null, serial?: str|null, sort?: int, desc?: str|null }
  • Returns: 201 { printer: T22 }

Reorder printers — PUT /printer/order

  • Params: body: { printerIds: int[] }
  • Returns: 200 { printerIds: int[] }

Delete printer — DELETE /printer/{id}

  • Params: id: int
  • Returns: 204 void

Get printer by ID — GET /printer/{id}

  • Params: id: int
  • Returns: 200 { printer: T22 }

Update printer (partial) — PATCH /printer/{id}

  • Params: id: int, body: { address?: str, type?: str, model?: str|null, serial?: str|null, sort?: int, desc?: str|null }
  • Returns: 200 { printer: T22 }

Update printer — PUT /printer/{id}

  • Params: id: int, body: { address?: str, type?: str, model?: str|null, serial?: str|null, sort?: int, desc?: str|null }
  • Returns: 200 { printer: T22 }

Section: /propertyname

List property names — GET /propertyname

none

  • Returns: 200 { propertynames: T29[] }

Create property name — POST /propertyname

  • Params: body: { name: str, sort?: int, exclusive?: bool }
  • Returns: 201 { propertyname: T29 }

Reorder property names — PUT /propertyname/order

  • Params: body: { propertynameIds: int[] }
  • Returns: 200 { ok: bool }

Delete property name — DELETE /propertyname/{id}

  • Params: id: int
  • Returns: 200 { ok: bool }

Update property name — PATCH /propertyname/{id}

  • Params: id: int, body: { name?: str, sort?: int, exclusive?: bool }
  • Returns: 200 { propertyname: T29 }

Section: /public

Receipt crash dump — POST /public/telemetry/crash

  • Params: body: { content: str|{} }
  • Returns: 200 { ok: bool, filename: str }

List public articles — GET /public/{companyId}/articles

  • Params: companyId: int, query: categoryId?: int, search?: str, limit?: int, offset?: int
  • Returns: 200 { articles: { id: int, sku: str, name: str, slug: str, net: num|null, taxRate: num|null, gross: num|null, trackStock: bool, brand: { id: int|null, name: str }, fullHash: str|null, thumbW: int|null, thumbH: int|null, thumbHash: str|null }[] }

Get public article detail — GET /public/{companyId}/articles/{sku}

  • Params: companyId: int, sku: str
  • Returns: 200 { article: { id: int, sku: str, name: str, slug: str, description: str, unitamount: num|null, weight: num|null, trackStock: bool, unit: T27|null, brand: T26|null, price: { minmultiplier: num, net: num|null, taxRate: num|null, gross: num|null }, prices: { minmultiplier: num, net: num|null, taxRate: num|null, gross: num|null }[], categories: { id: int, name: str, slug: str }[], photos: T24[], eans: str[], isParent: bool, parentSku: str|null, variants: { id: int, sku: str, sort: int, name: str, slug: str, attributeValueId: int|null, attributeValue: str|null, unitamount: num|null, weight: num|null, trackStock: bool }[] } }

List public categories — GET /public/{companyId}/categories

  • Params: companyId: int
  • Returns: 200 { categories: { id: int, parentId: int|null, sort: int, name: str, slug: str, fullHash: str|null, thumbW: int|null, thumbH: int|null, thumbHash: str|null }[] }

Section: /quote

List quotes — GET /quote

  • Params: query: offset?: int, limit?: int, search?: str, seekMonths?: int
  • Returns: 200 { quotes: T4[], total: int, unfilteredTotal: int, offset: int, limit: int }

Create quote — POST /quote

  • Params: body: { number: str, date: str, lines: T23[], entityId?: int|null, externalNumber?: str|null }
  • Returns: 201 { quote: T4 }

Delete quote — DELETE /quote/{id}

  • Params: id: int
  • Returns: 204 void

Get quote — GET /quote/{id}

  • Params: id: int
  • Returns: 200 { quote: T4 }

Update quote — PATCH /quote/{id}

  • Params: id: int, body: { number?: str, date?: str, entityId?: int|null, externalNumber?: str|null, lines?: T23[] }
  • Returns: 200 { quote: T4 }

Delete quote file attachment — DELETE /quote/{id}/file/{fileId}

  • Params: id: int, fileId: int
  • Returns: 204 void

Get quote attachment file content — GET /quote/{id}/file/{fileId}

  • Params: id: int, fileId: int, query: download?: bool
  • Returns: 200 str

Create order from quote — POST /quote/{id}/order

  • Params: id: int, body?: { number?: str, date?: str, createdAt?: str, entityId?: int|null, externalNumber?: str|null, lines?: T23[] }
  • Returns: 201 { order: T1 }

Generate and attach quote PDF — POST /quote/{id}/pdf

  • Params: id: int
  • Returns: 201 { attachment: T9, fileUrl: str }

Section: /serper

Crawl image from URL, crop white/transparency borders, and return AVIF — POST /serper/image

  • Params: body: { url: str }
  • Returns: 200 avif

Search images via Serper.dev and stream WebP thumbnails (SSE) — POST /serper/images

  • Params: body: { q: str, gl?: str, hl?: str, num?: int, preferSource?: bool }

  • Returns: 200 SSE

  • Events:

    • images: { "images": [ { "id": 0, "url": "…", "width": 1000, "height": 800 } ] }
    • thumb: { "id": 0, "dataUrl": "data:image/webp;base64,…" }
    • done: { "total": 100 }
    • error: { "error": "…" }

Section: /shipment

List shipments — GET /shipment

  • Params: query: offset?: int, limit?: int, search?: str, state?: str, seekMonths?: int
  • Returns: 200 { shipments: { id: int, number: str, type: str, date: str, positions: int, totalQuantity: num, packageCount: int, state: str, entityId?: int|null, externalNumber?: str|null, createdAt?: str|null, orderId?: int|null, orderNumber?: str|null, customerName?: str|null, carrier?: str|null, trackingCode?: str|null }[], total: int, unfilteredTotal: int, offset: int, limit: int }

Delete shipment — DELETE /shipment/{id}

  • Params: id: int
  • Returns: 204 void

Get shipment by ID — GET /shipment/{id}

  • Params: id: int
  • Returns: 200 { shipment: T3 }

Update shipment state or metadata — PATCH /shipment/{id}

  • Params: id: int, body: { state?: str }
  • Returns: 200 { shipment: T3 }

Delete shipment file attachment — DELETE /shipment/{id}/file/{fileId}

  • Params: id: int, fileId: int
  • Returns: 204 void

Get shipment attachment file content — GET /shipment/{id}/file/{fileId}

  • Params: id: int, fileId: int, query: download?: bool
  • Returns: 200 str

Generate and attach shipment PDF (delivery note) — POST /shipment/{id}/pdf

  • Params: id: int
  • Returns: 201 { attachment: T9, fileUrl: str }

List packages of a shipment — GET /shipment/{id}/shipping

  • Params: id: int
  • Returns: 200 { shippings: T19[] }

Create package for a shipment — POST /shipment/{id}/shipping

  • Params: id: int, body: { carrierId: int, type: str, state: str, trackingCode?: str, warehouseId?: int }
  • Returns: 201 { shipping: T19 }

Section: /shipping

Delete shipping — DELETE /shipping/{id}

  • Params: id: int
  • Returns: 204 void

Update shipping — PATCH /shipping/{id}

  • Params: id: int, body: { type?: str, state?: str, trackingCode?: str, carrierId?: int, warehouseId?: int }
  • Returns: 200 { shipping: T19 }

List packages of a shipping — GET /shipping/{id}/package

  • Params: id: int
  • Returns: 200 { packages: { id: int, shippingId: int, entityaddressId: int, number: str, type: str, state: str, details?: str|null }[] }

Create package for a shipping — POST /shipping/{id}/package

  • Params: id: int, body: { entityaddressId: int, type: str, state: str, details?: str }
  • Returns: 201 { package: { id: int, shippingId: int, entityaddressId: int, number: str, type: str, state: str, details?: str|null } }

Section: /smallthumb

Small thumb image by hash — GET /smallthumb/{fullHash}

  • Params: fullHash: str
  • Returns: 200 avif

Section: /stock

Accept delivery manifest item(s) — POST /stock/accept

  • Params: body: { manifestarticleId?: int, warehouseId?: int, items?: { manifestarticleId: int, warehouseId?: int }[] }
  • Returns: 200

Adjust stock manually — POST /stock/adjust

  • Params: body: { sku?: str, warehouseId?: int, amount?: num, text?: str|null, lines?: { sku: str, amount: num, warehouseId?: int, text?: str }[] }
  • Returns: 201 { manifest: { id: int, number: str, type: str, date: str, createdAt: str }, lines: { manifestarticle_id: int, sku: str, name: str, warehouse_id: int, amount: num, text: str }[], ledger: T15[] }

Ship shipment manifest item(s) — POST /stock/ship

  • Params: body: { manifestarticleId?: int, warehouseId?: int, items?: { manifestarticleId: int, warehouseId?: int }[] }
  • Returns: 200

Section: /subagentschedule

List subagent schedules — GET /subagentschedule

none

  • Returns: 200 { schedules: T14[] }

Create subagent schedule — POST /subagentschedule

  • Params: body: { prompt: str, cron: str, desc?: str|null, skills?: str|null, lastagentnote?: str|null, max_itr?: int }
  • Returns: 201 { schedule: T14 }

Delete subagent schedule — DELETE /subagentschedule/{id}

  • Params: id: int
  • Returns: 204 void

Get subagent schedule by ID — GET /subagentschedule/{id}

  • Params: id: int
  • Returns: 200 { schedule: T14 }

Update subagent schedule — PUT /subagentschedule/{id}

  • Params: id: int, body: { prompt?: str, cron?: str, desc?: str|null, skills?: str|null, lastagentnote?: str|null, max_itr?: int, lastrun_at?: str|null }
  • Returns: 200 { schedule: T14 }

Section: /supplier

List suppliers — GET /supplier

none

  • Returns: 200 { suppliers: T38[] }

Create supplier — POST /supplier

  • Params: body: { name: str }
  • Returns: 201 { supplier: T38 }

Delete supplier — DELETE /supplier/{id}

  • Params: id: int
  • Returns: 204 void

Update supplier — PATCH /supplier/{id}

  • Params: id: int, body: { name: str }
  • Returns: 200 { supplier: T38 }

List supplier articles by SKUs — GET /supplier/{id}/articles

  • Params: id: int, query: skus?: str
  • Returns: 200 { articles: { id: int, articleId: int, entityId: int, pu: num, sort: int, article: { id: int, sku: str, name?: str|null, slug?: str|null, photos?: { sort: int, fullHash: str, thumbW: int, thumbH: int, thumbHash: str }[], eans?: str[] }, supplierName?: str|null, sku?: str|null, stock?: num|null, priceId?: int|null, price?: T41|null }[] }

Query supplier articles by SKUs (bulk) — POST /supplier/{id}/articles

  • Params: id: int, body?: { skus?: str[] }
  • Returns: 200 { articles: { id: int, articleId: int, entityId: int, pu: num, sort: int, article: { id: int, sku: str, name?: str|null, slug?: str|null, photos?: { sort: int, fullHash: str, thumbW: int, thumbH: int, thumbHash: str }[], eans?: str[] }, supplierName?: str|null, sku?: str|null, stock?: num|null, priceId?: int|null, price?: T41|null }[] }

Section: /thumb

Thumb image by hash — GET /thumb/{fullHash}

  • Params: fullHash: str
  • Returns: 200 avif

Section: /unit

Delete unit — DELETE /unit

  • Params: query: si: str
  • Returns: 204 void

List units — GET /unit

none

  • Returns: 200 { units: T27[] }

Upsert unit — PUT /unit

  • Params: body: { si: str, basesi: str, basesifactor: num, symbol: str, name: str }
  • Returns: 200 { unit: T27 }

Section: /v1

JTL-POS category synchronization — GET /v1/category

  • Params: query: lastChangedCategory?: str, limit?: int
  • Returns: 200 {}[]

POS discovery and pairing — GET /v1/client

  • Params: query: authCode: str, name?: str
  • Returns: 200 { authCode: str|null, authToken: str|null, certificateFingerprint: str, certificateSerialNumber: str, mandantId: str, mandantName: str|null, mandantDatabase: str|null, serverFingerprint: str|null, name: str|null, serverTimestamp: str }

POS sync initialization counts — GET /v1/init

  • Params: query: lastChangedProduct?: int, lastChangedCategory?: int, lastChangedCustomer?: int, lastChangedCustomerGroup?: int, lastChangedCompositeProduct?: int, lastChangedDeletedEntity?: int
  • Returns: 200 { version: str, product_count: str, category_count: str, customer_count: str, customerGroup_count: str, compositeProduct_count: str, configurationGroup_count: str, configurationItem_count: str, deletedEntity_count: str, max_orderId_count: str }

POS product image delivery — GET /v1/pimage

  • Params: query: path: str, w?: int, h?: int, format?: str
  • Returns: 200 jpeg

JTL-POS product catalog synchronization — GET /v1/product

  • Params: query: lastChangedProduct?: str, limit?: int
  • Returns: 200 {}[]

Section: /vfs

List virtual filesystem files — GET /vfs

none

  • Returns: 200 { files: { name: str, size: int, mime: str, updated_at: str, created_at: str, isText: bool, isImage: bool, isPdf: bool }[] }

Restore system default applets — POST /vfs/applets/restore

none

  • Returns: 200 { success: bool, restored: str[], count: int }

Create directory in virtual filesystem — POST /vfs/mkdir

  • Params: body: { path: str }
  • Returns: 200 { success: bool, dir: str }

Rename or move a virtual filesystem file or directory — POST /vfs/rename

  • Params: body: { oldPath: str, newPath: str }
  • Returns: 200 { success: bool, oldPath: str, newPath: str }

Restore system default skills — POST /vfs/skills/restore

none

  • Returns: 200 { success: bool, restored: str[], count: int }

Upload files to virtual filesystem — POST /vfs/upload

  • Params: form: { files: str[], targetDir?: str }
  • Returns: 200 { success: bool, uploaded: { name: str, size: int, mime: str }[] }

Delete a virtual filesystem file — DELETE /vfs/{*path}

  • Params: path: str
  • Returns: 200 { success: bool, deleted: str }

Get a virtual filesystem file — GET /vfs/{*path}

  • Params: path: str, query: download?: bool, raw?: bool
  • Returns: 200 str

Execute a virtual filesystem applet — POST /vfs/{*path}

  • Params: path: str, body?: { input?: {}, timeout?: int, max_output?: int }
  • Returns: 200 { ok: bool, result: str, columns: { name: str, type: str }[], rows: int, stdout: str, consoleLines: int, durationMs: int, description?: str, warnings?: str[], truncated?: bool, truncationNote?: str }

Create or overwrite a virtual filesystem file — PUT /vfs/{*path}

  • Params: path: str, body: { content: str, mime?: str }
  • Returns: 200 { success: bool, file: { name: str, size: int, mime: str, updated_at: str } }

Section: /warehouse

List warehouses — GET /warehouse

none

  • Returns: 200 { warehouses: { id: int, name: str, sort: int }[] }

Create warehouse — POST /warehouse

  • Params: body: { name: str, sort?: int }
  • Returns: 201 { warehouse: { id: int, name: str, sort: int } }

Reorder warehouses — PUT /warehouse/order

  • Params: body: { warehouseIds: int[] }
  • Returns: 200 { warehouseIds: int[] }

Delete warehouse — DELETE /warehouse/{id}

  • Params: id: int
  • Returns: 204 void

Get warehouse by ID — GET /warehouse/{id}

  • Params: id: int
  • Returns: 200 { warehouse: { id: int, name: str, sort: int } }

Update warehouse (partial) — PATCH /warehouse/{id}

  • Params: id: int, body: { name?: str, sort?: int }
  • Returns: 200 { warehouse: { id: int, name: str, sort: int } }

Update warehouse — PUT /warehouse/{id}

  • Params: id: int, body: { name?: str, sort?: int }
  • Returns: 200 { warehouse: { id: int, name: str, sort: int } }