Files
dashfront/.agents/skills/backend/SKILL.md
2026-10-09 19:13:57 +02:00

40 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 205 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 = { article: T2 }
  • 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: T31, brand: T28|null, categoryIds: int[], photos: T26[], eans: str[], prices: T35[], suppliers: T12[] }
  • T3 = { delivery: T4 }
  • T4 = { id: int, number: str, type: str, supplierId: int|null, date: str, lines: T20[], files: T9[], externalNumber?: str|null, createdAt?: str, ledger?: T40 }
  • T5 = { labeltemplate: T6 }
  • T6 = { id: int, name: str, width: num, height: num, dpi: int, type: str, content: T16, thumb?: str|null }
  • T7 = { order: T11 }
  • T8 = { quote: T11 }
  • T9 = { id: int, manifestId: int, fileId: int, sort: int, hash: str, mimetype: str, name: str, size: int, created?: str, modified?: str, thumbavif?: 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, number: str, type: str, entityId: int|null, date: str, lines: T20[], createdAt?: str }
  • T12 = { id: int, articleId: int, entityId: int, pu: num, sort: int, supplierName?: str|null, sku?: str|null, stock?: num|null, priceId?: int|null, price?: T43|null }
  • 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 = { ledger: T15[] }
  • 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 = { objects: T21[] }
  • T17 = { objects: T22[] }
  • T18 = { printer: T23 }
  • T19 = { entity: T27 }
  • 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: str, type: str, x: num, y: num, w?: num, h?: num, text?: str, font?: str, fontSize?: num, barcodeFormat?: str }
  • T23 = { id: int, company_id: int, address: str, type: str, sort: int, model?: str|null, serial?: str|null, desc?: str|null }
  • T24 = { id: int, name: str, sort: int, exclusive: bool, values: T38[] }
  • T25 = { amount: num, net: num, taxrate: num, sku?: str|null, name?: str|null, pu?: num, rebate?: num, comment?: str|null }
  • T26 = { sort: int, fullHash: str, fullW: int, fullH: int, fullSize: int, thumbW: int, thumbH: int, thumbHash: str }
  • T27 = { id: int, customergroupId: int, firstName: str|null, name: str, number: str|null, createdAt: str, updatedAt: str }
  • T28 = { name: str, id?: int|null, fullHash?: str|null, thumbW?: int|null, thumbH?: int|null, thumbHash?: str|null }
  • T29 = { id: int, companyuser_id: int, provider: str, model: str, created_at: str, updated_at: str, state: str }
  • T30 = { article: T33 }
  • T31 = { si: str, basesi: str, basesifactor: num, symbol?: str|null, name?: str|null }
  • T32 = { id: int, iso639: str, name: str, taxrate: num, reducedtaxrate: num }
  • T33 = { id: int, categoryId: int, name: str, sku: str, track_stock: bool }
  • 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, attributeId: int, value: str, sort: int }
  • T39 = { id: int, name: str, createdAt: str, updatedAt: str }
  • T40 = { totalPositions: int, completelyOnLedgerPositions: int }
  • T41 = { id: int, name: str, sort: int, exclusive: bool }
  • T42 = { warehouse: T44 }
  • T43 = { net: num, taxId: int, taxRate?: num|null }
  • T44 = { id: int, name: str, sort: int }
  • T45 = { id: int, categoryIds: int[] }

Routes

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

Create article in category — POST /article

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

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 T1

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 T1

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 T1

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

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

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 T30

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: T33, 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 T1

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 T30

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 T1

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: T12[] }

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: T12 }

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: T12 }

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

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

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

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

List attribute names — GET /attributename

none

  • Returns: 200 { attributenames: T24[] }

Create attribute name — POST /attributename

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

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: T38[] }

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

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

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: T24 }

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: T38 }

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 }

List brands — GET /brand

  • Params: query: offset?: int, limit?: int, includeSmallThumbs?: bool
  • Returns: 200 { brands: { id: int, name: str, 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[] } }

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 }[], 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?: T28|null }[] }

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?: T28|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 }

List companies — GET /company

none

  • Returns: 200 { companies: T32[] }

Create company — POST /company

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

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: T32 }

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: T44 }

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: T44 }

List deliveries — GET /delivery

none

  • Returns: 200 { deliveries: { id: int, number: str, type: str, supplierId: int|null, date: str, externalNumber?: str|null, createdAt?: str, ledger?: T40 }[] }

Create delivery — POST /delivery

  • Params: body: { externalNumber: str, date: str, lines: T25[], 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 T3

Parse document (SSE) — POST /delivery/parse

  • Params: form: { file: str }

  • Returns: 200 SSE

  • Events:

    • status: { "message": "…" }
    • llm_call: { "model": "…", "promptSize": 0, "messages": 0 }
    • tool_call: { "name": "output_manifest" }
    • usage: { "input": 0, "cached": 0, "output": 0, "cost": 0 }
    • progress: ManifestResult
    • result: ManifestResult
    • error: { "message": "…" }

Delete delivery — DELETE /delivery/{id}

  • Params: id: int
  • Returns: 204 void

Get delivery — GET /delivery/{id}

  • Params: id: int
  • Returns: 200 T3

Update delivery — PATCH /delivery/{id}

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

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

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

List entities — GET /entity

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

Create entity — POST /entity

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

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 T19

Update entity — PATCH /entity/{id}

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

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 }

Database health check — GET /health

none

  • Returns: 200 { ok: bool }

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

  • Params: fullHash: str
  • Returns: 200 avif

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: T17 }
  • Returns: 201 T5

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 T5

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

  • Params: id: int, body: { name?: str, width?: num, height?: num, dpi?: int, type?: str, content?: T17 }
  • Returns: 200 T5

Update label template — PUT /labeltemplate/{id}

  • Params: id: int, body: { name?: str, width?: num, height?: num, dpi?: int, type?: str, content?: T17 }
  • Returns: 200 T5

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

  • Params: query: manifestarticle_id?: int, sku?: str, transaction_type?: str
  • Returns: 200 T14

Add ledger entry — POST /ledger

  • Params: body: { manifestarticle_id: int, transaction_type: str, amount: num, transaction_text: str }
  • Returns: 201 { ledger: T15 }

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

  • Params: manifestarticleId: int, query: transaction_type?: str
  • Returns: 200 T14

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

  • Params: sku: str, query: transaction_type?: str
  • Returns: 200 T14

List conversations — GET /modelconversation

none

  • Returns: 200 { conversations: T29[] }

Create conversation — POST /modelconversation

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

Delete conversation — DELETE /modelconversation/{id}

  • Params: id: int
  • Returns: 204 void

Get conversation — GET /modelconversation/{id}

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

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

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 } }

List orders — GET /order

  • Params: query: offset?: int, limit?: int
  • Returns: 200 { orders: T11[], total: int, offset: int, limit: int }

Create order — POST /order

  • Params: body: { number: str, date: str, lines: T25[], entityId?: int|null }
  • Returns: 201 T7

Delete order — DELETE /order/{id}

  • Params: id: int
  • Returns: 204 void

Get order — GET /order/{id}

  • Params: id: int
  • Returns: 200 T7

Update order — PATCH /order/{id}

  • Params: id: int, body: { number?: str, date?: str, entityId?: int|null, lines?: T25[] }
  • Returns: 200 T7

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

  • Params: id: int
  • Returns: 200 { payments: { id: int, accountId: int, manifestId: int, type: str, amount: num }[] }

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

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

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

  • Params: id: int
  • Returns: 200 { shippings: { id: int, manifestId: int, number: str, type: str, state: str }[] }

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

  • Params: id: int, body: { type: str, state: str }
  • Returns: 201 { shipping: { id: int, manifestId: int, number: str, type: str, state: str } }

Delete package — DELETE /package/{id}

  • Params: id: int
  • Returns: 204 void

Delete payment — DELETE /payment/{id}

  • Params: id: int
  • Returns: 204 void

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 T45

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

  • Params: id: int
  • Returns: 200 T45

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

  • Params: id: int, categoryId: int
  • Returns: 200 T45

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

  • Params: id: int, categoryId: int
  • Returns: 200 T45

List printers — GET /printer

none

  • Returns: 200 { printers: T23[] }

Create printer — POST /printer

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

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 T18

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 T18

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 T18

List property names — GET /propertyname

none

  • Returns: 200 { propertynames: T41[] }

Create property name — POST /propertyname

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

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: T41 }

Receipt crash dump — POST /public/telemetry/crash

  • Params: body: { content: any }
  • 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: {}|null, brand: {}|null, price: {}|null, prices: {}[], categories: {}[], photos: {}[], eans: str[], isParent: bool, parentSku: str|null, variants: {}[] } }

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 }[] }

List quotes — GET /quote

none

  • Returns: 200 { quotes: { id: int, number: str, type: str, entityId: int|null, date: str, createdAt?: str }[] }

Create quote — POST /quote

  • Params: body: { number: str, date: str, lines: T25[], entityId?: int|null }
  • Returns: 201 T8

Delete quote — DELETE /quote/{id}

  • Params: id: int
  • Returns: 204 void

Get quote — GET /quote/{id}

  • Params: id: int
  • Returns: 200 T8

Update quote — PATCH /quote/{id}

  • Params: id: int, body: { number?: str, date?: str, entityId?: int|null, lines?: T25[] }
  • Returns: 200 T8

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": "…" }

Delete shipping — DELETE /shipping/{id}

  • Params: id: int
  • Returns: 204 void

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 } }

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[] }

List suppliers — GET /supplier

none

  • Returns: 200 { suppliers: T39[] }

Create supplier — POST /supplier

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

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: T39 }

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

  • Params: id: int, query: skus?: string
  • 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?: T43|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?: T43|null }[] }

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

  • Params: fullHash: str
  • Returns: 200 avif

Delete unit — DELETE /unit

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

List units — GET /unit

none

  • Returns: 200 { units: T31[] }

Upsert unit — PUT /unit

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

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 {}[]

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 }[] }

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 }

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

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 } }

List warehouses — GET /warehouse

none

  • Returns: 200 { warehouses: T44[] }

Create warehouse — POST /warehouse

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

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 T42

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

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

Update warehouse — PUT /warehouse/{id}

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