diff --git a/README.md b/README.md index d0b8d279..f504ec69 100644 --- a/README.md +++ b/README.md @@ -108,3 +108,20 @@ FORCE=1 ./scripts/clone-live-to-debug-db.sh - **OpenAPI:** The authoritative OpenAPI 3.0 contract is at `openapi.yaml`. - **Self-Serve Module Guide:** Implementation and API guide at `services/nginx/app/modules/selfserve/selfserve.md`. - **Writerside:** Documentation projects are located in `/Writerside` and `/Writerside2`. +- **Generated Writerside API Reference:** The active Writerside project lives in `/documentation` and is generated from `openapi.yaml`. + +### Writerside OpenAPI Generation Workflow +Prerequisite: +- Python 3 with PyYAML (`pip install pyyaml`) + +Run from repository root: + +```powershell +python scripts/generate_writerside_openapi_docs.py generate +python scripts/generate_writerside_openapi_docs.py check +``` + +Contribution rule: +1. Update `openapi.yaml`. +2. Regenerate docs (`python scripts/generate_writerside_openapi_docs.py generate`). +3. Verify (`python scripts/generate_writerside_openapi_docs.py check`). diff --git a/documentation/_build/algolia-indexes-CTW.zip b/documentation/_build/algolia-indexes-CTW.zip new file mode 100644 index 00000000..e3786566 Binary files /dev/null and b/documentation/_build/algolia-indexes-CTW.zip differ diff --git a/documentation/_build/report.html b/documentation/_build/report.html new file mode 100644 index 00000000..7faab3e6 --- /dev/null +++ b/documentation/_build/report.html @@ -0,0 +1,493 @@ + + + + + Build results + + +

Tests

+

180 tests total.

+ +

Errors

+ +

MRK004 — Topic ID doesn't match the containing file name

+ +

REF006 — 'toc-element' for the current instance references a topic file that cannot be found

+ +

TOC001 — <toc-element> points to an article that doesn't exist

+ +

Warnings

+ +

INT002 — Map ID is not unique

+ +

Passed

+ + + diff --git a/documentation/_build/report.json b/documentation/_build/report.json new file mode 100644 index 00000000..08312a9d --- /dev/null +++ b/documentation/_build/report.json @@ -0,0 +1,2634 @@ +{ + "testsErrorsCount" : 3, + "testsTotal" : 180, + "testsWarningsCount" : 1, + "testsPassedCount" : 176, + "testsWarnings" : { + "INT002" : [ { + "id" : "INT002---Bird---Page-1-of-1---in-ctw-tree-589-13--ctw-tree-677-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"Bird - Page 1 of 1\"\" in ctw.tree:589:13; ctw.tree:677:5" + }, { + "id" : "INT002---Bird---in-ctw-tree-588-9--ctw-tree-669-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"Bird\"\" in ctw.tree:588:9; ctw.tree:669:5" + }, { + "id" : "INT002---Bird---Page-1-of-1---in-ctw-tree-589-13--ctw-tree-677-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"Bird+-+Page+1+of+1\"\" in ctw.tree:589:13; ctw.tree:677:5" + }, { + "id" : "INT002---Entra---Page-1-of-1---in-ctw-tree-636-5--ctw-tree-690-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"Entra - Page 1 of 1\"\" in ctw.tree:636:5; ctw.tree:690:5" + }, { + "id" : "INT002---Entra---in-ctw-tree-645-5--ctw-tree-692-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"Entra\"\" in ctw.tree:645:5; ctw.tree:692:5" + }, { + "id" : "INT002---Entra---Page-1-of-1---in-ctw-tree-636-5--ctw-tree-690-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"Entra+-+Page+1+of+1\"\" in ctw.tree:636:5; ctw.tree:690:5" + }, { + "id" : "INT002---FXRatesAPI---Page-1-of-1---in-ctw-tree-663-5--ctw-tree-682-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"FXRatesAPI - Page 1 of 1\"\" in ctw.tree:663:5; ctw.tree:682:5" + }, { + "id" : "INT002---FXRatesAPI---in-ctw-tree-644-5--ctw-tree-651-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"FXRatesAPI\"\" in ctw.tree:644:5; ctw.tree:651:5" + }, { + "id" : "INT002---FXRatesAPI---Page-1-of-1---in-ctw-tree-663-5--ctw-tree-682-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"FXRatesAPI+-+Page+1+of+1\"\" in ctw.tree:663:5; ctw.tree:682:5" + }, { + "id" : "INT002---MotorAPI---Page-1-of-1---in-ctw-tree-659-5--ctw-tree-673-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"MotorAPI - Page 1 of 1\"\" in ctw.tree:659:5; ctw.tree:673:5" + }, { + "id" : "INT002---MotorAPI---in-ctw-tree-648-5--ctw-tree-671-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"MotorAPI\"\" in ctw.tree:648:5; ctw.tree:671:5" + }, { + "id" : "INT002---MotorAPI---Page-1-of-1---in-ctw-tree-659-5--ctw-tree-673-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"MotorAPI+-+Page+1+of+1\"\" in ctw.tree:659:5; ctw.tree:673:5" + }, { + "id" : "INT002---Record-machine-start-button-press-webhook---in-ctw-tree-389-17--ctw-tree-390-17", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"Record machine start button press webhook\"\" in ctw.tree:389:17; ctw.tree:390:17" + }, { + "id" : "INT002---Record-machine-start-button-press-webhook---in-ctw-tree-389-17--ctw-tree-390-17", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"Record+machine+start+button+press+webhook\"\" in ctw.tree:389:17; ctw.tree:390:17" + }, { + "id" : "INT002---Self-Serve---Page-1-of-1---in-ctw-tree-649-5--ctw-tree-691-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"Self-Serve - Page 1 of 1\"\" in ctw.tree:649:5; ctw.tree:691:5" + }, { + "id" : "INT002---Self-Serve---in-ctw-tree-527-9--ctw-tree-666-5--ctw-tree-668-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"Self-Serve\"\" in ctw.tree:527:9; ctw.tree:666:5; ctw.tree:668:5" + }, { + "id" : "INT002---Self-Serve---Page-1-of-1---in-ctw-tree-649-5--ctw-tree-691-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"Self-Serve+-+Page+1+of+1\"\" in ctw.tree:649:5; ctw.tree:691:5" + }, { + "id" : "INT002---Stripe---Page-1-of-1---in-ctw-tree-641-5--ctw-tree-683-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"Stripe - Page 1 of 1\"\" in ctw.tree:641:5; ctw.tree:683:5" + }, { + "id" : "INT002---Stripe---in-ctw-tree-650-5--ctw-tree-681-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"Stripe\"\" in ctw.tree:650:5; ctw.tree:681:5" + }, { + "id" : "INT002---Stripe---Page-1-of-1---in-ctw-tree-641-5--ctw-tree-683-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"Stripe+-+Page+1+of+1\"\" in ctw.tree:641:5; ctw.tree:683:5" + }, { + "id" : "INT002---System-wide-search---in-ctw-tree-84-17--ctw-tree-85-17", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"System-wide search\"\" in ctw.tree:84:17; ctw.tree:85:17" + }, { + "id" : "INT002---System-wide-search---in-ctw-tree-84-17--ctw-tree-85-17", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"System-wide+search\"\" in ctw.tree:84:17; ctw.tree:85:17" + }, { + "id" : "INT002---VirkData---Page-1-of-1---in-ctw-tree-661-5--ctw-tree-693-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"VirkData - Page 1 of 1\"\" in ctw.tree:661:5; ctw.tree:693:5" + }, { + "id" : "INT002---VirkData---in-ctw-tree-638-5--ctw-tree-695-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"VirkData\"\" in ctw.tree:638:5; ctw.tree:695:5" + }, { + "id" : "INT002---VirkData---Page-1-of-1---in-ctw-tree-661-5--ctw-tree-693-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"VirkData+-+Page+1+of+1\"\" in ctw.tree:661:5; ctw.tree:693:5" + }, { + "id" : "INT002---WeatherAPI---Page-1-of-1---in-ctw-tree-643-5--ctw-tree-646-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"WeatherAPI - Page 1 of 1\"\" in ctw.tree:643:5; ctw.tree:646:5" + }, { + "id" : "INT002---WeatherAPI---in-ctw-tree-658-5--ctw-tree-665-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"WeatherAPI\"\" in ctw.tree:658:5; ctw.tree:665:5" + }, { + "id" : "INT002---WeatherAPI---Page-1-of-1---in-ctw-tree-643-5--ctw-tree-646-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"WeatherAPI+-+Page+1+of+1\"\" in ctw.tree:643:5; ctw.tree:646:5" + }, { + "id" : "INT002---XLVask---Page-1-of-1---in-ctw-tree-639-5--ctw-tree-642-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"XLVask - Page 1 of 1\"\" in ctw.tree:639:5; ctw.tree:642:5" + }, { + "id" : "INT002---XLVask---in-ctw-tree-637-5--ctw-tree-688-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"XLVask\"\" in ctw.tree:637:5; ctw.tree:688:5" + }, { + "id" : "INT002---XLVask---Page-1-of-1---in-ctw-tree-639-5--ctw-tree-642-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"XLVask+-+Page+1+of+1\"\" in ctw.tree:639:5; ctw.tree:642:5" + }, { + "id" : "INT002---e-conomic---Page-1-of-1---in-ctw-tree-672-5--ctw-tree-694-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"e-conomic - Page 1 of 1\"\" in ctw.tree:672:5; ctw.tree:694:5" + }, { + "id" : "INT002---e-conomic---in-ctw-tree-657-5--ctw-tree-685-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"e-conomic\"\" in ctw.tree:657:5; ctw.tree:685:5" + }, { + "id" : "INT002---e-conomic---Page-1-of-1---in-ctw-tree-672-5--ctw-tree-694-5", + "problemId" : "INT002", + "name" : "Map ID is not unique", + "description" : "\"\"e-conomic+-+Page+1+of+1\"\" in ctw.tree:672:5; ctw.tree:694:5" + } ] + }, + "testsErrors" : { + "MRK004" : [ { + "id" : "MRK004-In-Config_Module_Backups-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_Backups.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_Backups_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_Backups_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_Bird-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_Bird.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_Bird_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_Bird_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_Email-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_Email.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_Email_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_Email_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_Entra-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_Entra.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_Entra_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_Entra_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_FXRatesAPI-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_FXRatesAPI.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_FXRatesAPI_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_FXRatesAPI_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_GatewayAPI-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_GatewayAPI.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_GatewayAPI_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_GatewayAPI_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_LicensePlateRecognizer-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_LicensePlateRecognizer.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_LicensePlateRecognizer_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_LicensePlateRecognizer_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_Limble-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_Limble.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_Limble_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_Limble_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_MotorAPI-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_MotorAPI.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_MotorAPI_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_MotorAPI_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_OcrSpace-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_OcrSpace.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_OcrSpace_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_OcrSpace_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_OpenAI-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_OpenAI.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_OpenAI_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_OpenAI_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_Self_Serve-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_Self_Serve.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_Self_Serve_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_Self_Serve_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_Shelly-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_Shelly.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_Shelly_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_Shelly_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_Stripe-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_Stripe.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_Stripe_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_Stripe_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_VirkData-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_VirkData.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_VirkData_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_VirkData_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_WeatherAPI-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_WeatherAPI.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_WeatherAPI_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_WeatherAPI_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_XLVask-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_XLVask.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_XLVask_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_XLVask_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_e_conomic-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_e_conomic.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_e_conomic_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_e_conomic_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_reCAPTCHA-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_reCAPTCHA.topic:4:1" + }, { + "id" : "MRK004-In-Config_Module_reCAPTCHA_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Config_Module_reCAPTCHA_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_Action_Logs-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_Action_Logs.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_Action_Logs_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_Action_Logs_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_Backup-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_Backup.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_Backup_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_Backup_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_CVR-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_CVR.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_CVR_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_CVR_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_Entra-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_Entra.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_Entra_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_Entra_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_FXRatesAPI-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_FXRatesAPI.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_FXRatesAPI_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_FXRatesAPI_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_MotorAPI-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_MotorAPI.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_MotorAPI_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_MotorAPI_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_Self_Serve-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_Self_Serve.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_Self_Serve_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_Self_Serve_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_Stripe-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_Stripe.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_Stripe_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_Stripe_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_VirkData-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_VirkData.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_VirkData_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_VirkData_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_Wash_Certificates-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_Wash_Certificates.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_Wash_Certificates_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_Wash_Certificates_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_WeatherAPI-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_WeatherAPI.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_WeatherAPI_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_WeatherAPI_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_XLVask-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_XLVask.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_XLVask_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_XLVask_Page_1.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_e_conomic-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_e_conomic.topic:4:1" + }, { + "id" : "MRK004-In-Modules_Module_e_conomic_Page_1-topic-4-1", + "problemId" : "MRK004", + "name" : "Topic ID doesn't match the containing file name", + "description" : "In Modules_Module_e_conomic_Page_1.topic:4:1" + } ], + "REF006" : [ { + "id" : "REF006---API_Reference-topic---in-ctw-tree-613-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"API_Reference.topic\"\" in ctw.tree:613:5" + }, { + "id" : "REF006---Admin_Bookings_CompleteWithoutWashCertificate_POST-topic---in-ctw-tree-629-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Admin_Bookings_CompleteWithoutWashCertificate_POST.topic\"\" in ctw.tree:629:5" + }, { + "id" : "REF006---Admin_Bookings_Delete_POST-topic---in-ctw-tree-626-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Admin_Bookings_Delete_POST.topic\"\" in ctw.tree:626:5" + }, { + "id" : "REF006---Admin_Bookings_Department_Count_GET-topic---in-ctw-tree-632-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Admin_Bookings_Department_Count_GET.topic\"\" in ctw.tree:632:5" + }, { + "id" : "REF006---Admin_Bookings_Sync_POST-topic---in-ctw-tree-624-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Admin_Bookings_Sync_POST.topic\"\" in ctw.tree:624:5" + }, { + "id" : "REF006---Bookings_Download_PDF_GET-topic---in-ctw-tree-621-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Bookings_Download_PDF_GET.topic\"\" in ctw.tree:621:5" + }, { + "id" : "REF006---Bookings_GET-topic---in-ctw-tree-633-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Bookings_GET.topic\"\" in ctw.tree:633:5" + }, { + "id" : "REF006---Bookings_PUT-topic---in-ctw-tree-628-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Bookings_PUT.topic\"\" in ctw.tree:628:5" + }, { + "id" : "REF006---Customers_GET-topic---in-ctw-tree-618-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Customers_GET.topic\"\" in ctw.tree:618:5" + }, { + "id" : "REF006---Customers_POST-topic---in-ctw-tree-615-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Customers_POST.topic\"\" in ctw.tree:615:5" + }, { + "id" : "REF006---Customers_PUT-topic---in-ctw-tree-608-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Customers_PUT.topic\"\" in ctw.tree:608:5" + }, { + "id" : "REF006---Customers_id_DELETE-topic---in-ctw-tree-610-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Customers_id_DELETE.topic\"\" in ctw.tree:610:5" + }, { + "id" : "REF006---Department_Timebookings_Entries_Public_GET-topic---in-ctw-tree-625-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Department_Timebookings_Entries_Public_GET.topic\"\" in ctw.tree:625:5" + }, { + "id" : "REF006---Department_Timebookings_Entries_Public_POST-topic---in-ctw-tree-620-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Department_Timebookings_Entries_Public_POST.topic\"\" in ctw.tree:620:5" + }, { + "id" : "REF006---Department_Timebookings_OpeningHours_Public_GET-topic---in-ctw-tree-630-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Department_Timebookings_OpeningHours_Public_GET.topic\"\" in ctw.tree:630:5" + }, { + "id" : "REF006---Department_Timebookings_Types_Public_GET-topic---in-ctw-tree-627-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Department_Timebookings_Types_Public_GET.topic\"\" in ctw.tree:627:5" + }, { + "id" : "REF006---Superuser_Bookings_Sync_All_POST-topic---in-ctw-tree-631-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Superuser_Bookings_Sync_All_POST.topic\"\" in ctw.tree:631:5" + }, { + "id" : "REF006---UsageLog_GET-topic---in-ctw-tree-617-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"UsageLog_GET.topic\"\" in ctw.tree:617:5" + }, { + "id" : "REF006---User_Bookings_Delete_POST-topic---in-ctw-tree-619-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"User_Bookings_Delete_POST.topic\"\" in ctw.tree:619:5" + }, { + "id" : "REF006---User_Bookings_GET-topic---in-ctw-tree-623-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"User_Bookings_GET.topic\"\" in ctw.tree:623:5" + }, { + "id" : "REF006---User_Bookings_Washcertificate_Download_POST-topic---in-ctw-tree-622-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"User_Bookings_Washcertificate_Download_POST.topic\"\" in ctw.tree:622:5" + }, { + "id" : "REF006---Vehicles_GET-topic---in-ctw-tree-609-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Vehicles_GET.topic\"\" in ctw.tree:609:5" + }, { + "id" : "REF006---Vehicles_POST-topic---in-ctw-tree-616-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Vehicles_POST.topic\"\" in ctw.tree:616:5" + }, { + "id" : "REF006---Vehicles_PUT-topic---in-ctw-tree-607-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Vehicles_PUT.topic\"\" in ctw.tree:607:5" + }, { + "id" : "REF006---Vehicles_id_DELETE-topic---in-ctw-tree-614-5", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"Vehicles_id_DELETE.topic\"\" in ctw.tree:614:5" + }, { + "id" : "REF006---config_module_backups-topic---in-ctw-tree-394-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_backups.topic\"\" in ctw.tree:394:13" + }, { + "id" : "REF006---config_module_backups_page_1-topic---in-ctw-tree-395-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_backups_page_1.topic\"\" in ctw.tree:395:17" + }, { + "id" : "REF006---config_module_bird-topic---in-ctw-tree-400-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_bird.topic\"\" in ctw.tree:400:13" + }, { + "id" : "REF006---config_module_bird_page_1-topic---in-ctw-tree-401-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_bird_page_1.topic\"\" in ctw.tree:401:17" + }, { + "id" : "REF006---config_module_e_conomic-topic---in-ctw-tree-406-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_e_conomic.topic\"\" in ctw.tree:406:13" + }, { + "id" : "REF006---config_module_e_conomic_page_1-topic---in-ctw-tree-407-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_e_conomic_page_1.topic\"\" in ctw.tree:407:17" + }, { + "id" : "REF006---config_module_email-topic---in-ctw-tree-412-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_email.topic\"\" in ctw.tree:412:13" + }, { + "id" : "REF006---config_module_email_page_1-topic---in-ctw-tree-413-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_email_page_1.topic\"\" in ctw.tree:413:17" + }, { + "id" : "REF006---config_module_entra-topic---in-ctw-tree-419-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_entra.topic\"\" in ctw.tree:419:13" + }, { + "id" : "REF006---config_module_entra_page_1-topic---in-ctw-tree-420-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_entra_page_1.topic\"\" in ctw.tree:420:17" + }, { + "id" : "REF006---config_module_fxratesapi-topic---in-ctw-tree-425-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_fxratesapi.topic\"\" in ctw.tree:425:13" + }, { + "id" : "REF006---config_module_fxratesapi_page_1-topic---in-ctw-tree-426-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_fxratesapi_page_1.topic\"\" in ctw.tree:426:17" + }, { + "id" : "REF006---config_module_gatewayapi-topic---in-ctw-tree-431-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_gatewayapi.topic\"\" in ctw.tree:431:13" + }, { + "id" : "REF006---config_module_gatewayapi_page_1-topic---in-ctw-tree-432-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_gatewayapi_page_1.topic\"\" in ctw.tree:432:17" + }, { + "id" : "REF006---config_module_licenseplaterecognizer-topic---in-ctw-tree-437-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_licenseplaterecognizer.topic\"\" in ctw.tree:437:13" + }, { + "id" : "REF006---config_module_licenseplaterecognizer_page_1-topic---in-ctw-tree-438-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_licenseplaterecognizer_page_1.topic\"\" in ctw.tree:438:17" + }, { + "id" : "REF006---config_module_limble-topic---in-ctw-tree-443-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_limble.topic\"\" in ctw.tree:443:13" + }, { + "id" : "REF006---config_module_limble_page_1-topic---in-ctw-tree-444-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_limble_page_1.topic\"\" in ctw.tree:444:17" + }, { + "id" : "REF006---config_module_motorapi-topic---in-ctw-tree-449-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_motorapi.topic\"\" in ctw.tree:449:13" + }, { + "id" : "REF006---config_module_motorapi_page_1-topic---in-ctw-tree-450-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_motorapi_page_1.topic\"\" in ctw.tree:450:17" + }, { + "id" : "REF006---config_module_ocrspace-topic---in-ctw-tree-455-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_ocrspace.topic\"\" in ctw.tree:455:13" + }, { + "id" : "REF006---config_module_ocrspace_page_1-topic---in-ctw-tree-456-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_ocrspace_page_1.topic\"\" in ctw.tree:456:17" + }, { + "id" : "REF006---config_module_openai-topic---in-ctw-tree-461-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_openai.topic\"\" in ctw.tree:461:13" + }, { + "id" : "REF006---config_module_openai_page_1-topic---in-ctw-tree-462-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_openai_page_1.topic\"\" in ctw.tree:462:17" + }, { + "id" : "REF006---config_module_recaptcha-topic---in-ctw-tree-467-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_recaptcha.topic\"\" in ctw.tree:467:13" + }, { + "id" : "REF006---config_module_recaptcha_page_1-topic---in-ctw-tree-468-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_recaptcha_page_1.topic\"\" in ctw.tree:468:17" + }, { + "id" : "REF006---config_module_self_serve-topic---in-ctw-tree-473-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_self_serve.topic\"\" in ctw.tree:473:13" + }, { + "id" : "REF006---config_module_self_serve_page_1-topic---in-ctw-tree-474-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_self_serve_page_1.topic\"\" in ctw.tree:474:17" + }, { + "id" : "REF006---config_module_shelly-topic---in-ctw-tree-479-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_shelly.topic\"\" in ctw.tree:479:13" + }, { + "id" : "REF006---config_module_shelly_page_1-topic---in-ctw-tree-480-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_shelly_page_1.topic\"\" in ctw.tree:480:17" + }, { + "id" : "REF006---config_module_stripe-topic---in-ctw-tree-485-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_stripe.topic\"\" in ctw.tree:485:13" + }, { + "id" : "REF006---config_module_stripe_page_1-topic---in-ctw-tree-486-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_stripe_page_1.topic\"\" in ctw.tree:486:17" + }, { + "id" : "REF006---config_module_virkdata-topic---in-ctw-tree-491-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_virkdata.topic\"\" in ctw.tree:491:13" + }, { + "id" : "REF006---config_module_virkdata_page_1-topic---in-ctw-tree-492-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_virkdata_page_1.topic\"\" in ctw.tree:492:17" + }, { + "id" : "REF006---config_module_weatherapi-topic---in-ctw-tree-497-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_weatherapi.topic\"\" in ctw.tree:497:13" + }, { + "id" : "REF006---config_module_weatherapi_page_1-topic---in-ctw-tree-498-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_weatherapi_page_1.topic\"\" in ctw.tree:498:17" + }, { + "id" : "REF006---config_module_xlvask-topic---in-ctw-tree-503-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_xlvask.topic\"\" in ctw.tree:503:13" + }, { + "id" : "REF006---config_module_xlvask_page_1-topic---in-ctw-tree-504-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"config_module_xlvask_page_1.topic\"\" in ctw.tree:504:17" + }, { + "id" : "REF006---modules_module_action_logs-topic---in-ctw-tree-257-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_action_logs.topic\"\" in ctw.tree:257:13" + }, { + "id" : "REF006---modules_module_action_logs_page_1-topic---in-ctw-tree-258-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_action_logs_page_1.topic\"\" in ctw.tree:258:17" + }, { + "id" : "REF006---modules_module_backup-topic---in-ctw-tree-262-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_backup.topic\"\" in ctw.tree:262:13" + }, { + "id" : "REF006---modules_module_backup_page_1-topic---in-ctw-tree-263-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_backup_page_1.topic\"\" in ctw.tree:263:17" + }, { + "id" : "REF006---modules_module_cvr-topic---in-ctw-tree-268-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_cvr.topic\"\" in ctw.tree:268:13" + }, { + "id" : "REF006---modules_module_cvr_page_1-topic---in-ctw-tree-269-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_cvr_page_1.topic\"\" in ctw.tree:269:17" + }, { + "id" : "REF006---modules_module_e_conomic-topic---in-ctw-tree-274-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_e_conomic.topic\"\" in ctw.tree:274:13" + }, { + "id" : "REF006---modules_module_e_conomic_page_1-topic---in-ctw-tree-275-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_e_conomic_page_1.topic\"\" in ctw.tree:275:17" + }, { + "id" : "REF006---modules_module_entra-topic---in-ctw-tree-288-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_entra.topic\"\" in ctw.tree:288:13" + }, { + "id" : "REF006---modules_module_entra_page_1-topic---in-ctw-tree-289-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_entra_page_1.topic\"\" in ctw.tree:289:17" + }, { + "id" : "REF006---modules_module_fxratesapi-topic---in-ctw-tree-293-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_fxratesapi.topic\"\" in ctw.tree:293:13" + }, { + "id" : "REF006---modules_module_fxratesapi_page_1-topic---in-ctw-tree-294-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_fxratesapi_page_1.topic\"\" in ctw.tree:294:17" + }, { + "id" : "REF006---modules_module_motorapi-topic---in-ctw-tree-299-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_motorapi.topic\"\" in ctw.tree:299:13" + }, { + "id" : "REF006---modules_module_motorapi_page_1-topic---in-ctw-tree-300-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_motorapi_page_1.topic\"\" in ctw.tree:300:17" + }, { + "id" : "REF006---modules_module_self_serve-topic---in-ctw-tree-304-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_self_serve.topic\"\" in ctw.tree:304:13" + }, { + "id" : "REF006---modules_module_self_serve_page_1-topic---in-ctw-tree-305-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_self_serve_page_1.topic\"\" in ctw.tree:305:17" + }, { + "id" : "REF006---modules_module_stripe-topic---in-ctw-tree-314-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_stripe.topic\"\" in ctw.tree:314:13" + }, { + "id" : "REF006---modules_module_stripe_page_1-topic---in-ctw-tree-315-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_stripe_page_1.topic\"\" in ctw.tree:315:17" + }, { + "id" : "REF006---modules_module_virkdata-topic---in-ctw-tree-327-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_virkdata.topic\"\" in ctw.tree:327:13" + }, { + "id" : "REF006---modules_module_virkdata_page_1-topic---in-ctw-tree-328-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_virkdata_page_1.topic\"\" in ctw.tree:328:17" + }, { + "id" : "REF006---modules_module_wash_certificates-topic---in-ctw-tree-332-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_wash_certificates.topic\"\" in ctw.tree:332:13" + }, { + "id" : "REF006---modules_module_wash_certificates_page_1-topic---in-ctw-tree-333-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_wash_certificates_page_1.topic\"\" in ctw.tree:333:17" + }, { + "id" : "REF006---modules_module_weatherapi-topic---in-ctw-tree-337-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_weatherapi.topic\"\" in ctw.tree:337:13" + }, { + "id" : "REF006---modules_module_weatherapi_page_1-topic---in-ctw-tree-338-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_weatherapi_page_1.topic\"\" in ctw.tree:338:17" + }, { + "id" : "REF006---modules_module_xlvask-topic---in-ctw-tree-344-13", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_xlvask.topic\"\" in ctw.tree:344:13" + }, { + "id" : "REF006---modules_module_xlvask_page_1-topic---in-ctw-tree-345-17", + "problemId" : "REF006", + "name" : "'toc-element' for the current instance references a topic file that cannot be found", + "description" : "\"\"modules_module_xlvask_page_1.topic\"\" in ctw.tree:345:17" + } ], + "TOC001" : [ { + "id" : "TOC001--API_Reference-topic--in-ctw-tree-613-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"API_Reference.topic\" in ctw.tree:613:5" + }, { + "id" : "TOC001--Admin_Bookings_CompleteWithoutWashCertificate_POST-topic--in-ctw-tree-629-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Admin_Bookings_CompleteWithoutWashCertificate_POST.topic\" in ctw.tree:629:5" + }, { + "id" : "TOC001--Admin_Bookings_Delete_POST-topic--in-ctw-tree-626-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Admin_Bookings_Delete_POST.topic\" in ctw.tree:626:5" + }, { + "id" : "TOC001--Admin_Bookings_Department_Count_GET-topic--in-ctw-tree-632-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Admin_Bookings_Department_Count_GET.topic\" in ctw.tree:632:5" + }, { + "id" : "TOC001--Admin_Bookings_Sync_POST-topic--in-ctw-tree-624-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Admin_Bookings_Sync_POST.topic\" in ctw.tree:624:5" + }, { + "id" : "TOC001--Bookings_Download_PDF_GET-topic--in-ctw-tree-621-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Bookings_Download_PDF_GET.topic\" in ctw.tree:621:5" + }, { + "id" : "TOC001--Bookings_GET-topic--in-ctw-tree-633-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Bookings_GET.topic\" in ctw.tree:633:5" + }, { + "id" : "TOC001--Bookings_PUT-topic--in-ctw-tree-628-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Bookings_PUT.topic\" in ctw.tree:628:5" + }, { + "id" : "TOC001--Customers_GET-topic--in-ctw-tree-618-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Customers_GET.topic\" in ctw.tree:618:5" + }, { + "id" : "TOC001--Customers_POST-topic--in-ctw-tree-615-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Customers_POST.topic\" in ctw.tree:615:5" + }, { + "id" : "TOC001--Customers_PUT-topic--in-ctw-tree-608-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Customers_PUT.topic\" in ctw.tree:608:5" + }, { + "id" : "TOC001--Customers_id_DELETE-topic--in-ctw-tree-610-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Customers_id_DELETE.topic\" in ctw.tree:610:5" + }, { + "id" : "TOC001--Department_Timebookings_Entries_Public_GET-topic--in-ctw-tree-625-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Department_Timebookings_Entries_Public_GET.topic\" in ctw.tree:625:5" + }, { + "id" : "TOC001--Department_Timebookings_Entries_Public_POST-topic--in-ctw-tree-620-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Department_Timebookings_Entries_Public_POST.topic\" in ctw.tree:620:5" + }, { + "id" : "TOC001--Department_Timebookings_OpeningHours_Public_GET-topic--in-ctw-tree-630-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Department_Timebookings_OpeningHours_Public_GET.topic\" in ctw.tree:630:5" + }, { + "id" : "TOC001--Department_Timebookings_Types_Public_GET-topic--in-ctw-tree-627-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Department_Timebookings_Types_Public_GET.topic\" in ctw.tree:627:5" + }, { + "id" : "TOC001--Superuser_Bookings_Sync_All_POST-topic--in-ctw-tree-631-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Superuser_Bookings_Sync_All_POST.topic\" in ctw.tree:631:5" + }, { + "id" : "TOC001--UsageLog_GET-topic--in-ctw-tree-617-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"UsageLog_GET.topic\" in ctw.tree:617:5" + }, { + "id" : "TOC001--User_Bookings_Delete_POST-topic--in-ctw-tree-619-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"User_Bookings_Delete_POST.topic\" in ctw.tree:619:5" + }, { + "id" : "TOC001--User_Bookings_GET-topic--in-ctw-tree-623-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"User_Bookings_GET.topic\" in ctw.tree:623:5" + }, { + "id" : "TOC001--User_Bookings_Washcertificate_Download_POST-topic--in-ctw-tree-622-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"User_Bookings_Washcertificate_Download_POST.topic\" in ctw.tree:622:5" + }, { + "id" : "TOC001--Vehicles_GET-topic--in-ctw-tree-609-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Vehicles_GET.topic\" in ctw.tree:609:5" + }, { + "id" : "TOC001--Vehicles_POST-topic--in-ctw-tree-616-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Vehicles_POST.topic\" in ctw.tree:616:5" + }, { + "id" : "TOC001--Vehicles_PUT-topic--in-ctw-tree-607-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Vehicles_PUT.topic\" in ctw.tree:607:5" + }, { + "id" : "TOC001--Vehicles_id_DELETE-topic--in-ctw-tree-614-5", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"Vehicles_id_DELETE.topic\" in ctw.tree:614:5" + }, { + "id" : "TOC001--config_module_backups-topic--in-ctw-tree-394-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_backups.topic\" in ctw.tree:394:13" + }, { + "id" : "TOC001--config_module_backups_page_1-topic--in-ctw-tree-395-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_backups_page_1.topic\" in ctw.tree:395:17" + }, { + "id" : "TOC001--config_module_bird-topic--in-ctw-tree-400-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_bird.topic\" in ctw.tree:400:13" + }, { + "id" : "TOC001--config_module_bird_page_1-topic--in-ctw-tree-401-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_bird_page_1.topic\" in ctw.tree:401:17" + }, { + "id" : "TOC001--config_module_e_conomic-topic--in-ctw-tree-406-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_e_conomic.topic\" in ctw.tree:406:13" + }, { + "id" : "TOC001--config_module_e_conomic_page_1-topic--in-ctw-tree-407-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_e_conomic_page_1.topic\" in ctw.tree:407:17" + }, { + "id" : "TOC001--config_module_email-topic--in-ctw-tree-412-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_email.topic\" in ctw.tree:412:13" + }, { + "id" : "TOC001--config_module_email_page_1-topic--in-ctw-tree-413-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_email_page_1.topic\" in ctw.tree:413:17" + }, { + "id" : "TOC001--config_module_entra-topic--in-ctw-tree-419-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_entra.topic\" in ctw.tree:419:13" + }, { + "id" : "TOC001--config_module_entra_page_1-topic--in-ctw-tree-420-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_entra_page_1.topic\" in ctw.tree:420:17" + }, { + "id" : "TOC001--config_module_fxratesapi-topic--in-ctw-tree-425-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_fxratesapi.topic\" in ctw.tree:425:13" + }, { + "id" : "TOC001--config_module_fxratesapi_page_1-topic--in-ctw-tree-426-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_fxratesapi_page_1.topic\" in ctw.tree:426:17" + }, { + "id" : "TOC001--config_module_gatewayapi-topic--in-ctw-tree-431-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_gatewayapi.topic\" in ctw.tree:431:13" + }, { + "id" : "TOC001--config_module_gatewayapi_page_1-topic--in-ctw-tree-432-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_gatewayapi_page_1.topic\" in ctw.tree:432:17" + }, { + "id" : "TOC001--config_module_licenseplaterecognizer-topic--in-ctw-tree-437-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_licenseplaterecognizer.topic\" in ctw.tree:437:13" + }, { + "id" : "TOC001--config_module_licenseplaterecognizer_page_1-topic--in-ctw-tree-438-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_licenseplaterecognizer_page_1.topic\" in ctw.tree:438:17" + }, { + "id" : "TOC001--config_module_limble-topic--in-ctw-tree-443-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_limble.topic\" in ctw.tree:443:13" + }, { + "id" : "TOC001--config_module_limble_page_1-topic--in-ctw-tree-444-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_limble_page_1.topic\" in ctw.tree:444:17" + }, { + "id" : "TOC001--config_module_motorapi-topic--in-ctw-tree-449-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_motorapi.topic\" in ctw.tree:449:13" + }, { + "id" : "TOC001--config_module_motorapi_page_1-topic--in-ctw-tree-450-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_motorapi_page_1.topic\" in ctw.tree:450:17" + }, { + "id" : "TOC001--config_module_ocrspace-topic--in-ctw-tree-455-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_ocrspace.topic\" in ctw.tree:455:13" + }, { + "id" : "TOC001--config_module_ocrspace_page_1-topic--in-ctw-tree-456-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_ocrspace_page_1.topic\" in ctw.tree:456:17" + }, { + "id" : "TOC001--config_module_openai-topic--in-ctw-tree-461-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_openai.topic\" in ctw.tree:461:13" + }, { + "id" : "TOC001--config_module_openai_page_1-topic--in-ctw-tree-462-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_openai_page_1.topic\" in ctw.tree:462:17" + }, { + "id" : "TOC001--config_module_recaptcha-topic--in-ctw-tree-467-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_recaptcha.topic\" in ctw.tree:467:13" + }, { + "id" : "TOC001--config_module_recaptcha_page_1-topic--in-ctw-tree-468-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_recaptcha_page_1.topic\" in ctw.tree:468:17" + }, { + "id" : "TOC001--config_module_self_serve-topic--in-ctw-tree-473-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_self_serve.topic\" in ctw.tree:473:13" + }, { + "id" : "TOC001--config_module_self_serve_page_1-topic--in-ctw-tree-474-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_self_serve_page_1.topic\" in ctw.tree:474:17" + }, { + "id" : "TOC001--config_module_shelly-topic--in-ctw-tree-479-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_shelly.topic\" in ctw.tree:479:13" + }, { + "id" : "TOC001--config_module_shelly_page_1-topic--in-ctw-tree-480-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_shelly_page_1.topic\" in ctw.tree:480:17" + }, { + "id" : "TOC001--config_module_stripe-topic--in-ctw-tree-485-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_stripe.topic\" in ctw.tree:485:13" + }, { + "id" : "TOC001--config_module_stripe_page_1-topic--in-ctw-tree-486-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_stripe_page_1.topic\" in ctw.tree:486:17" + }, { + "id" : "TOC001--config_module_virkdata-topic--in-ctw-tree-491-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_virkdata.topic\" in ctw.tree:491:13" + }, { + "id" : "TOC001--config_module_virkdata_page_1-topic--in-ctw-tree-492-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_virkdata_page_1.topic\" in ctw.tree:492:17" + }, { + "id" : "TOC001--config_module_weatherapi-topic--in-ctw-tree-497-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_weatherapi.topic\" in ctw.tree:497:13" + }, { + "id" : "TOC001--config_module_weatherapi_page_1-topic--in-ctw-tree-498-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_weatherapi_page_1.topic\" in ctw.tree:498:17" + }, { + "id" : "TOC001--config_module_xlvask-topic--in-ctw-tree-503-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_xlvask.topic\" in ctw.tree:503:13" + }, { + "id" : "TOC001--config_module_xlvask_page_1-topic--in-ctw-tree-504-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"config_module_xlvask_page_1.topic\" in ctw.tree:504:17" + }, { + "id" : "TOC001--modules_module_action_logs-topic--in-ctw-tree-257-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_action_logs.topic\" in ctw.tree:257:13" + }, { + "id" : "TOC001--modules_module_action_logs_page_1-topic--in-ctw-tree-258-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_action_logs_page_1.topic\" in ctw.tree:258:17" + }, { + "id" : "TOC001--modules_module_backup-topic--in-ctw-tree-262-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_backup.topic\" in ctw.tree:262:13" + }, { + "id" : "TOC001--modules_module_backup_page_1-topic--in-ctw-tree-263-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_backup_page_1.topic\" in ctw.tree:263:17" + }, { + "id" : "TOC001--modules_module_cvr-topic--in-ctw-tree-268-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_cvr.topic\" in ctw.tree:268:13" + }, { + "id" : "TOC001--modules_module_cvr_page_1-topic--in-ctw-tree-269-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_cvr_page_1.topic\" in ctw.tree:269:17" + }, { + "id" : "TOC001--modules_module_e_conomic-topic--in-ctw-tree-274-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_e_conomic.topic\" in ctw.tree:274:13" + }, { + "id" : "TOC001--modules_module_e_conomic_page_1-topic--in-ctw-tree-275-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_e_conomic_page_1.topic\" in ctw.tree:275:17" + }, { + "id" : "TOC001--modules_module_entra-topic--in-ctw-tree-288-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_entra.topic\" in ctw.tree:288:13" + }, { + "id" : "TOC001--modules_module_entra_page_1-topic--in-ctw-tree-289-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_entra_page_1.topic\" in ctw.tree:289:17" + }, { + "id" : "TOC001--modules_module_fxratesapi-topic--in-ctw-tree-293-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_fxratesapi.topic\" in ctw.tree:293:13" + }, { + "id" : "TOC001--modules_module_fxratesapi_page_1-topic--in-ctw-tree-294-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_fxratesapi_page_1.topic\" in ctw.tree:294:17" + }, { + "id" : "TOC001--modules_module_motorapi-topic--in-ctw-tree-299-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_motorapi.topic\" in ctw.tree:299:13" + }, { + "id" : "TOC001--modules_module_motorapi_page_1-topic--in-ctw-tree-300-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_motorapi_page_1.topic\" in ctw.tree:300:17" + }, { + "id" : "TOC001--modules_module_self_serve-topic--in-ctw-tree-304-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_self_serve.topic\" in ctw.tree:304:13" + }, { + "id" : "TOC001--modules_module_self_serve_page_1-topic--in-ctw-tree-305-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_self_serve_page_1.topic\" in ctw.tree:305:17" + }, { + "id" : "TOC001--modules_module_stripe-topic--in-ctw-tree-314-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_stripe.topic\" in ctw.tree:314:13" + }, { + "id" : "TOC001--modules_module_stripe_page_1-topic--in-ctw-tree-315-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_stripe_page_1.topic\" in ctw.tree:315:17" + }, { + "id" : "TOC001--modules_module_virkdata-topic--in-ctw-tree-327-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_virkdata.topic\" in ctw.tree:327:13" + }, { + "id" : "TOC001--modules_module_virkdata_page_1-topic--in-ctw-tree-328-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_virkdata_page_1.topic\" in ctw.tree:328:17" + }, { + "id" : "TOC001--modules_module_wash_certificates-topic--in-ctw-tree-332-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_wash_certificates.topic\" in ctw.tree:332:13" + }, { + "id" : "TOC001--modules_module_wash_certificates_page_1-topic--in-ctw-tree-333-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_wash_certificates_page_1.topic\" in ctw.tree:333:17" + }, { + "id" : "TOC001--modules_module_weatherapi-topic--in-ctw-tree-337-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_weatherapi.topic\" in ctw.tree:337:13" + }, { + "id" : "TOC001--modules_module_weatherapi_page_1-topic--in-ctw-tree-338-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_weatherapi_page_1.topic\" in ctw.tree:338:17" + }, { + "id" : "TOC001--modules_module_xlvask-topic--in-ctw-tree-344-13", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_xlvask.topic\" in ctw.tree:344:13" + }, { + "id" : "TOC001--modules_module_xlvask_page_1-topic--in-ctw-tree-345-17", + "problemId" : "TOC001", + "name" : " points to an article that doesn't exist", + "description" : "\"modules_module_xlvask_page_1.topic\" in ctw.tree:345:17" + } ] + }, + "idsAndTitles" : { + "CDE001" : "The element must contain exactly two code blocks", + "CDE002" : "The 'collapsed-title-line-number' attribute value on a 'code-block' element is not a valid number", + "CDE003" : "The code snippet doesn't contain the line with the number specified in the 'collapsed-title-line-number' attribute", + "CDE004" : "Cannot read the source code snippet from the specified location, falling back to the 'code-block' element content", + "CDE005" : "Cannot read the source code snippet from the specified location, and there is no fallback content in the 'code-block' element", + "CDE006" : "'code-block' cannot be empty", + "CDE007" : "The 'include-lines' attribute on a 'code-block' element must represent a line number range like 1-3, or multiple comma-separated ranges like 1-3,5-7", + "CDE008" : "The code snippet doesn't contain the lines specified in the 'include-lines' attribute of the corresponding 'code-block' element", + "CDE009" : "Cannot use both the 'include-symbol' and the 'include-lines' attributes to reference a code snippet", + "CDE010" : "The specified code construct is not found in the source file or the file language is not recognized", + "CDE011" : "Code sample contains errors", + "CDE012" : "Cannot validate code sample because its language is not supported", + "CDE013" : "Cannot validate code sample because its language is not specified", + "CDE014" : "Content other than text or CDATA in a code block, for example, HTML/XML-like tags", + "CDE015" : "Unsupported 'style' value on the element", + "CDE016" : "Unknown language is specified for a code block", + "CDE017" : "Syntax error in a code block", + "CDE018" : "Expected at least one closed @start...@end block, but found none.", + "CNF001" : "Category specified in is not declared in c.list", + "CNF002" : "Topic title cannot be empty", + "CNF003" : "Invalid buildprofiles.xml property value", + "CNF005" : "The 'accepts-web-file-names' attribute contains symbols that cannot appear in a file name", + "CNF006" : "The 'accepts-web-file-names' attribute points to a non-existing redirection rule", + "CNF008" : "The 'start-page' attribute on 'instance-profile' cannot be empty", + "CNF009" : "Global variable name in v.list is duplicated", + "CNF010" : "Cannot find specified resource in the resources folder", + "CNF011" : "Category sort order is not a valid number", + "CNF012" : "Tooltip not found", + "CNF013" : "Cannot reference a resource as the r.list file is missing", + "CNF014" : "The instance version links require 'web-path' in instance declaration", + "CNF015" : "Cannot write the result to the specified output directory", + "CNF016" : "Redirect map ID is not unique", + "CNF017" : "Cannot read analytics script or html snippet", + "CNF018" : "Footer link without 'href' attribute", + "CNF019" : "Unknown social link type {0}", + "CNF020" : "Absolute images web-path was given, but images are bundled into single artifact", + "CNF021" : "Web filename is reserved, use a different value for the tag", + "CNF022" : "Web filename is duplicated, ensure that web filename is unique", + "CNF023" : "Topic filenames must be unique, regardless of letter case", + "CNF024" : "The 'start-page' attribute on 'instance-profile' is empty", + "CNF025" : "Web filename is empty. Add letters or digits to the topic filename or specify a custom web filename", + "CNF026" : "Referenced file {0} does not exist or is not possible to read.", + "CNF027" : "Multiple values for {0} are not allowed here.", + "CNF028" : "Expected true or false.", + "CTT001" : "Inappropriate language detected", + "CTT002" : "The generated HTML file size exceeds 1 MB, which may lead to poor performance when rendered in the browser. Consider splitting large topics into multiple smaller ones.", + "CTT004" : "Undefined variable", + "CTT005" : "Variable depends on itself", + "INT001" : "Error description template is not found", + "INT002" : "Map ID is not unique", + "INT004" : "Unexpected article rendering error:", + "INT007" : "XML serialization error", + "INT008" : "Unexpected HTML rendering error: cannot produce a PDF", + "INT009" : "Unexpected diagram rendering error", + "INT010" : "Unexpected PlantUML error:", + "MRK001" : "The element doesn't comply with validation rules", + "MRK002" : "Source file syntax is corrupted", + "MRK003" : "Element ID is not unique", + "MRK004" : "Topic ID doesn't match the containing file name", + "MRK006" : "The 'term' attribute is missing for the element", + "MRK007" : "The 'resource-id' attribute is missing for the element", + "MRK008" : "The 'ref' attribute is missing for the element", + "MRK009" : "Element is not allowed in the current context", + "MRK011" : "Only , , , image or text with inline formatting is allowed inside an element to define link text", + "MRK012" : "Element is unknown", + "MRK013" : "Starting page title is empty", + "MRK014" : "Section starting page description is empty", + "MRK015" : "Section starting page must contain exactly two links under the 'spotlight' element", + "MRK016" : "Section starting page link summary is empty", + "MRK017" : "Section starting page group title is empty", + "MRK018" : "Section starting page group is empty", + "MRK019" : "Element is not allowed on a section starting page", + "MRK020" : "Javascript expression specified in the 'use-when' attribute failed to execute", + "MRK026" : "Unknown 'type' attribute value", + "MRK027" : "The source file for the 'include' is corrupted", + "MRK028" : "Invalid 'style' attribute value on a deflist", + "MRK032" : "Element ID contains whitespace characters", + "MRK033" : "Unknown 'style' attribute value on a list", + "MRK034" : "The value of the 'columns' attribute on a list must be a number between 1 and 5", + "MRK035" : "The value of the 'start' attribute on a list must be a valid number", + "MRK036" : "The 'start' attribute on a list is only valid for 'alpha-lower' and 'decimal' list types", + "MRK037" : "Unknown 'sorted' attribute value", + "MRK038" : "The value of the 'level' attribute on a chapter must be a valid number between 2 and 6", + "MRK039" : "Unknown 'style' attribute value on a procedure", + "MRK040" : "Tab with an empty title", + "MRK041" : "Unknown 'style' attribute value on a table", + "MRK042" : "'colspan' and 'rowspan' attributes of a table cell must be valid numbers", + "MRK043" : "Cannot sort table with 'colspan' or 'rowspan'", + "MRK044" : "Cannot sort table with rows of different length", + "MRK045" : "'sorted' attribute must appear on the first row cells", + "MRK046" : "Element referred from 'rel' attribute does not exist or is inaccessible in the current context", + "MRK047" : "Summary element has both 'rel' attribute and text specified", + "MRK048" : "Summary element does not provide any text", + "MRK049" : "Unknown 'style' attribute value on a format element", + "MRK050" : "Unknown 'color' attribute value on a format element", + "MRK051" : "The topic must contain exactly one element. All except the first one were ignored", + "MRK052" : "Web name is empty", + "MRK053" : "Element has no title", + "MRK054" : "Collapsible procedure title is empty", + "MRK055" : "Unknown 'caps' attribute value", + "MRK056" : "Title can not contain inline formatting", + "MRK057" : "Paragraph can only contain inline elements", + "MRK058" : "Large image in paragraph rendered as a block element by default. Put it outside the paragraph or set the 'style' attribute to indicate your intent.", + "MRK059" : "Nested paragraphs are not allowed. Consider unwrapping or properly breaking the paragraphs.", + "MRK060" : "The chapter must contain exactly one element. All except the first one were ignored", + "MRK061" : "Chapter titles with level more than 6 are rendered as level 6", + "MRK062" : "The value of the 'depth' attribute on a must be a valid number", + "MRK063" : "The 'src' attribute is missing for the element", + "MRK064" : "The topic must contain exactly one element. All except the first one were ignored", + "MRK065" : "The chapter must contain exactly one element. All except the first one were ignored", + "MRK066" : "Unknown 'border' attribute value on a table. It should be 'false' for no border or 'true' for a border", + "MRK067" : "The 'height' attribute of an iframe cannot be set to 100%. Height will be set to 250px", + "MRK068" : "A 'card' can have only one of the following attributes: 'image', 'icon', or 'badge'", + "MRK069" : "Last modified date must be either a specific date in the format YYYY-MM-DD, 'git' (to get the date from Git history) or 'file' (to get the date from the file system)", + "PTY001" : "The element must contain the 'bundle' and 'key' attributes", + "PTY002" : "The property bundle referenced from a element cannot be found", + "PTY003" : "The specified property key cannot be found in the bundle specified by element", + "PTY004" : "Product specified in the 'from-product' attribute on the element is not found", + "PTY005" : "The specified property bundle is not available for the current product", + "PTY006" : "Cannot process regular expression that cleans up a property value", + "PTY007" : "Property content is corrupted", + "REF001" : "Cannot link to a topic that is not included in the current instance", + "REF002" : "Referenced topic doesn't exist", + "REF003" : "Cannot include element with the specified ID because it does not exist", + "REF004" : "Link uses anchor that does not exist", + "REF005" : "Link inside topic points to the same topic without an anchor", + "REF006" : "'toc-element' for the current instance references a topic file that cannot be found", + "REF007" : "Cannot redirect from file name that is associated with an existing article", + "REF008" : "Link points to a topic in a 'draft' state that is not included in the current build", + "REF009" : "Cannot include from topic that does not exist", + "REF010" : "Link in the 'seealso' section points to itself", + "REF012" : "Unknown 'style' attribute value on a 'seealso' section", + "REF013" : "Cannot include a parent element in its child element", + "REF014" : "Cannot include an include directly", + "REF015" : "Include points to multiple IDs", + "SCT001" : "Hard-coded shortcut: consider referencing the corresponding action in the 'key' attribute of the 'shortcut' element", + "SCT002" : "Shortcut is not defined for the requested keymap", + "SCT003" : "Shortcut is not defined for the requested platform", + "SCT004" : "The file containing the keymap referenced from platforms.xml cannot be found or is empty", + "SCT005" : "Action ID is not found in the product keymap.", + "SCT006" : "Shortcut is not defined for layout", + "SCT007" : "Shortcut is not defined for the default keymap", + "SCT008" : "Shortcut is not defined in the current product's keymap", + "SCT009" : "The requested keymap cannot be found", + "SCT011" : "platforms.xml file is corrupted", + "TOC001" : " points to an article that doesn't exist", + "TOC002" : " points to a library topic", + "TOC003" : "The nesting level for a is more than 3. Consider restructuring content for easier navigation.", + "TOC004" : "Wrapper cannot have the 'accepts-web-file-names' attribute as it does not produce any content, so it cannot take redirects", + "TOC005" : "Wrapper cannot have the 'help-id' attribute as it does not produce any content, so there is nothing to link from the UI", + "TOC006" : " ID is duplicated", + "TOC007" : "The 'toc-title' attribute is redundant as it matches the topic title", + "TOC010" : " cannot have both the 'accepts-web-file-names' and the 'accepts-web-file-names-ref' attribute. Consider moving all references to redirection-rules.xml", + "TOC011" : "The 'accepts-web-file-names' attribute references the same topic in several TOC elements", + "TOC012" : "The 'custom-title' attribute on a is deprecated. Move it to the topic itself.", + "TOC013" : "The value of the 'show-structure-depth' attribute on a must be a valid number", + "TOC016" : " should have one of following attributes: 'topic', 'toc-title', or 'ref'", + "TOC017" : "Invalid value of attribute \"for\"", + "TOC018" : "Target for external redirect conflicts with topic reference", + "TOC019" : "Target for external redirect requires web file names", + "TOC020" : "Target for external redirect must be a hidden TOC element", + "VIS001" : "Image or video file cannot be found", + "VIS002" : "GIF animations and image thumbnails can only be block elements, do not place them inside a paragraph", + "VIS003" : "Logo aspect ratio H:W must be between 0.24 and 1.20", + "VIS004" : "Image or video must have the 'src' attribute", + "VIS005" : "Origin module for image cannot be found in the project", + "VIS006" : "Image or video 'width' and 'height' attributes must be positive integers", + "VIS007" : "Unable to count frames in a GIF image", + "VIS008" : "GIF animations cannot be rendered without a border, do not use 'border-effect=\"none\"'", + "VIS009" : "Unknown image 'border-effect' value", + "VIS010" : "Unknown image style", + "VIS011" : "Dark version of image or video file cannot be found", + "VIS012" : "Image file type is not supported, must be PNG or SVG", + "VIS013" : "Video file type is not supported, must be MP4", + "VIS014" : "Referenced file is outside the documentation project", + "VIS015" : "Image file type is not supported", + "API001" : "API documentation markup validation issue", + "API002" : "API Reference Generation Error", + "API003" : "Specification file contains features or content not supported by our generator", + "API004" : "API model building problem" + }, + "testsPassed" : { + "API001" : [ { + "id" : "API001-", + "problemId" : "API001", + "name" : "API documentation markup validation issue", + "description" : "" + } ], + "API002" : [ { + "id" : "API002-", + "problemId" : "API002", + "name" : "API Reference Generation Error", + "description" : "" + } ], + "API003" : [ { + "id" : "API003-", + "problemId" : "API003", + "name" : "Specification file contains features or content not supported by our generator", + "description" : "" + } ], + "API004" : [ { + "id" : "API004-", + "problemId" : "API004", + "name" : "API model building problem", + "description" : "" + } ], + "CDE001" : [ { + "id" : "CDE001-", + "problemId" : "CDE001", + "name" : "The element must contain exactly two code blocks", + "description" : "" + } ], + "CDE002" : [ { + "id" : "CDE002-", + "problemId" : "CDE002", + "name" : "The 'collapsed-title-line-number' attribute value on a 'code-block' element is not a valid number", + "description" : "" + } ], + "CDE003" : [ { + "id" : "CDE003-", + "problemId" : "CDE003", + "name" : "The code snippet doesn't contain the line with the number specified in the 'collapsed-title-line-number' attribute", + "description" : "" + } ], + "CDE004" : [ { + "id" : "CDE004-", + "problemId" : "CDE004", + "name" : "Cannot read the source code snippet from the specified location, falling back to the 'code-block' element content", + "description" : "" + } ], + "CDE005" : [ { + "id" : "CDE005-", + "problemId" : "CDE005", + "name" : "Cannot read the source code snippet from the specified location, and there is no fallback content in the 'code-block' element", + "description" : "" + } ], + "CDE006" : [ { + "id" : "CDE006-", + "problemId" : "CDE006", + "name" : "'code-block' cannot be empty", + "description" : "" + } ], + "CDE007" : [ { + "id" : "CDE007-", + "problemId" : "CDE007", + "name" : "The 'include-lines' attribute on a 'code-block' element must represent a line number range like 1-3, or multiple comma-separated ranges like 1-3,5-7", + "description" : "" + } ], + "CDE008" : [ { + "id" : "CDE008-", + "problemId" : "CDE008", + "name" : "The code snippet doesn't contain the lines specified in the 'include-lines' attribute of the corresponding 'code-block' element", + "description" : "" + } ], + "CDE009" : [ { + "id" : "CDE009-", + "problemId" : "CDE009", + "name" : "Cannot use both the 'include-symbol' and the 'include-lines' attributes to reference a code snippet", + "description" : "" + } ], + "CDE010" : [ { + "id" : "CDE010-", + "problemId" : "CDE010", + "name" : "The specified code construct is not found in the source file or the file language is not recognized", + "description" : "" + } ], + "CDE011" : [ { + "id" : "CDE011-", + "problemId" : "CDE011", + "name" : "Code sample contains errors", + "description" : "" + } ], + "CDE012" : [ { + "id" : "CDE012-", + "problemId" : "CDE012", + "name" : "Cannot validate code sample because its language is not supported", + "description" : "" + } ], + "CDE013" : [ { + "id" : "CDE013-", + "problemId" : "CDE013", + "name" : "Cannot validate code sample because its language is not specified", + "description" : "" + } ], + "CDE014" : [ { + "id" : "CDE014-", + "problemId" : "CDE014", + "name" : "Content other than text or CDATA in a code block, for example, HTML/XML-like tags", + "description" : "" + } ], + "CDE015" : [ { + "id" : "CDE015-", + "problemId" : "CDE015", + "name" : "Unsupported 'style' value on the element", + "description" : "" + } ], + "CDE016" : [ { + "id" : "CDE016-", + "problemId" : "CDE016", + "name" : "Unknown language is specified for a code block", + "description" : "" + } ], + "CDE017" : [ { + "id" : "CDE017-", + "problemId" : "CDE017", + "name" : "Syntax error in a code block", + "description" : "" + } ], + "CDE018" : [ { + "id" : "CDE018-", + "problemId" : "CDE018", + "name" : "Expected at least one closed @start...@end block, but found none.", + "description" : "" + } ], + "CNF001" : [ { + "id" : "CNF001-", + "problemId" : "CNF001", + "name" : "Category specified in is not declared in c.list", + "description" : "" + } ], + "CNF002" : [ { + "id" : "CNF002-", + "problemId" : "CNF002", + "name" : "Topic title cannot be empty", + "description" : "" + } ], + "CNF003" : [ { + "id" : "CNF003-", + "problemId" : "CNF003", + "name" : "Invalid buildprofiles.xml property value", + "description" : "" + } ], + "CNF005" : [ { + "id" : "CNF005-", + "problemId" : "CNF005", + "name" : "The 'accepts-web-file-names' attribute contains symbols that cannot appear in a file name", + "description" : "" + } ], + "CNF006" : [ { + "id" : "CNF006-", + "problemId" : "CNF006", + "name" : "The 'accepts-web-file-names' attribute points to a non-existing redirection rule", + "description" : "" + } ], + "CNF008" : [ { + "id" : "CNF008-", + "problemId" : "CNF008", + "name" : "The 'start-page' attribute on 'instance-profile' cannot be empty", + "description" : "" + } ], + "CNF009" : [ { + "id" : "CNF009-", + "problemId" : "CNF009", + "name" : "Global variable name in v.list is duplicated", + "description" : "" + } ], + "CNF010" : [ { + "id" : "CNF010-", + "problemId" : "CNF010", + "name" : "Cannot find specified resource in the resources folder", + "description" : "" + } ], + "CNF011" : [ { + "id" : "CNF011-", + "problemId" : "CNF011", + "name" : "Category sort order is not a valid number", + "description" : "" + } ], + "CNF012" : [ { + "id" : "CNF012-", + "problemId" : "CNF012", + "name" : "Tooltip not found", + "description" : "" + } ], + "CNF013" : [ { + "id" : "CNF013-", + "problemId" : "CNF013", + "name" : "Cannot reference a resource as the r.list file is missing", + "description" : "" + } ], + "CNF014" : [ { + "id" : "CNF014-", + "problemId" : "CNF014", + "name" : "The instance version links require 'web-path' in instance declaration", + "description" : "" + } ], + "CNF015" : [ { + "id" : "CNF015-", + "problemId" : "CNF015", + "name" : "Cannot write the result to the specified output directory", + "description" : "" + } ], + "CNF016" : [ { + "id" : "CNF016-", + "problemId" : "CNF016", + "name" : "Redirect map ID is not unique", + "description" : "" + } ], + "CNF017" : [ { + "id" : "CNF017-", + "problemId" : "CNF017", + "name" : "Cannot read analytics script or html snippet", + "description" : "" + } ], + "CNF018" : [ { + "id" : "CNF018-", + "problemId" : "CNF018", + "name" : "Footer link without 'href' attribute", + "description" : "" + } ], + "CNF019" : [ { + "id" : "CNF019-", + "problemId" : "CNF019", + "name" : "Unknown social link type {0}", + "description" : "" + } ], + "CNF020" : [ { + "id" : "CNF020-", + "problemId" : "CNF020", + "name" : "Absolute images web-path was given, but images are bundled into single artifact", + "description" : "" + } ], + "CNF021" : [ { + "id" : "CNF021-", + "problemId" : "CNF021", + "name" : "Web filename is reserved, use a different value for the tag", + "description" : "" + } ], + "CNF022" : [ { + "id" : "CNF022-", + "problemId" : "CNF022", + "name" : "Web filename is duplicated, ensure that web filename is unique", + "description" : "" + } ], + "CNF023" : [ { + "id" : "CNF023-", + "problemId" : "CNF023", + "name" : "Topic filenames must be unique, regardless of letter case", + "description" : "" + } ], + "CNF024" : [ { + "id" : "CNF024-", + "problemId" : "CNF024", + "name" : "The 'start-page' attribute on 'instance-profile' is empty", + "description" : "" + } ], + "CNF025" : [ { + "id" : "CNF025-", + "problemId" : "CNF025", + "name" : "Web filename is empty. Add letters or digits to the topic filename or specify a custom web filename", + "description" : "" + } ], + "CNF026" : [ { + "id" : "CNF026-", + "problemId" : "CNF026", + "name" : "Referenced file {0} does not exist or is not possible to read.", + "description" : "" + } ], + "CNF027" : [ { + "id" : "CNF027-", + "problemId" : "CNF027", + "name" : "Multiple values for {0} are not allowed here.", + "description" : "" + } ], + "CNF028" : [ { + "id" : "CNF028-", + "problemId" : "CNF028", + "name" : "Expected true or false.", + "description" : "" + } ], + "CTT001" : [ { + "id" : "CTT001-", + "problemId" : "CTT001", + "name" : "Inappropriate language detected", + "description" : "" + } ], + "CTT002" : [ { + "id" : "CTT002-", + "problemId" : "CTT002", + "name" : "The generated HTML file size exceeds 1 MB, which may lead to poor performance when rendered in the browser. Consider splitting large topics into multiple smaller ones.", + "description" : "" + } ], + "CTT004" : [ { + "id" : "CTT004-", + "problemId" : "CTT004", + "name" : "Undefined variable", + "description" : "" + } ], + "CTT005" : [ { + "id" : "CTT005-", + "problemId" : "CTT005", + "name" : "Variable depends on itself", + "description" : "" + } ], + "INT001" : [ { + "id" : "INT001-", + "problemId" : "INT001", + "name" : "Error description template is not found", + "description" : "" + } ], + "INT004" : [ { + "id" : "INT004-", + "problemId" : "INT004", + "name" : "Unexpected article rendering error:", + "description" : "" + } ], + "INT007" : [ { + "id" : "INT007-", + "problemId" : "INT007", + "name" : "XML serialization error", + "description" : "" + } ], + "INT008" : [ { + "id" : "INT008-", + "problemId" : "INT008", + "name" : "Unexpected HTML rendering error: cannot produce a PDF", + "description" : "" + } ], + "INT009" : [ { + "id" : "INT009-", + "problemId" : "INT009", + "name" : "Unexpected diagram rendering error", + "description" : "" + } ], + "INT010" : [ { + "id" : "INT010-", + "problemId" : "INT010", + "name" : "Unexpected PlantUML error:", + "description" : "" + } ], + "MRK001" : [ { + "id" : "MRK001-", + "problemId" : "MRK001", + "name" : "The element doesn't comply with validation rules", + "description" : "" + } ], + "MRK002" : [ { + "id" : "MRK002-", + "problemId" : "MRK002", + "name" : "Source file syntax is corrupted", + "description" : "" + } ], + "MRK003" : [ { + "id" : "MRK003-", + "problemId" : "MRK003", + "name" : "Element ID is not unique", + "description" : "" + } ], + "MRK006" : [ { + "id" : "MRK006-", + "problemId" : "MRK006", + "name" : "The 'term' attribute is missing for the element", + "description" : "" + } ], + "MRK007" : [ { + "id" : "MRK007-", + "problemId" : "MRK007", + "name" : "The 'resource-id' attribute is missing for the element", + "description" : "" + } ], + "MRK008" : [ { + "id" : "MRK008-", + "problemId" : "MRK008", + "name" : "The 'ref' attribute is missing for the element", + "description" : "" + } ], + "MRK009" : [ { + "id" : "MRK009-", + "problemId" : "MRK009", + "name" : "Element is not allowed in the current context", + "description" : "" + } ], + "MRK011" : [ { + "id" : "MRK011-", + "problemId" : "MRK011", + "name" : "Only , , , image or text with inline formatting is allowed inside an element to define link text", + "description" : "" + } ], + "MRK012" : [ { + "id" : "MRK012-", + "problemId" : "MRK012", + "name" : "Element is unknown", + "description" : "" + } ], + "MRK013" : [ { + "id" : "MRK013-", + "problemId" : "MRK013", + "name" : "Starting page title is empty", + "description" : "" + } ], + "MRK014" : [ { + "id" : "MRK014-", + "problemId" : "MRK014", + "name" : "Section starting page description is empty", + "description" : "" + } ], + "MRK015" : [ { + "id" : "MRK015-", + "problemId" : "MRK015", + "name" : "Section starting page must contain exactly two links under the 'spotlight' element", + "description" : "" + } ], + "MRK016" : [ { + "id" : "MRK016-", + "problemId" : "MRK016", + "name" : "Section starting page link summary is empty", + "description" : "" + } ], + "MRK017" : [ { + "id" : "MRK017-", + "problemId" : "MRK017", + "name" : "Section starting page group title is empty", + "description" : "" + } ], + "MRK018" : [ { + "id" : "MRK018-", + "problemId" : "MRK018", + "name" : "Section starting page group is empty", + "description" : "" + } ], + "MRK019" : [ { + "id" : "MRK019-", + "problemId" : "MRK019", + "name" : "Element is not allowed on a section starting page", + "description" : "" + } ], + "MRK020" : [ { + "id" : "MRK020-", + "problemId" : "MRK020", + "name" : "Javascript expression specified in the 'use-when' attribute failed to execute", + "description" : "" + } ], + "MRK026" : [ { + "id" : "MRK026-", + "problemId" : "MRK026", + "name" : "Unknown 'type' attribute value", + "description" : "" + } ], + "MRK027" : [ { + "id" : "MRK027-", + "problemId" : "MRK027", + "name" : "The source file for the 'include' is corrupted", + "description" : "" + } ], + "MRK028" : [ { + "id" : "MRK028-", + "problemId" : "MRK028", + "name" : "Invalid 'style' attribute value on a deflist", + "description" : "" + } ], + "MRK032" : [ { + "id" : "MRK032-", + "problemId" : "MRK032", + "name" : "Element ID contains whitespace characters", + "description" : "" + } ], + "MRK033" : [ { + "id" : "MRK033-", + "problemId" : "MRK033", + "name" : "Unknown 'style' attribute value on a list", + "description" : "" + } ], + "MRK034" : [ { + "id" : "MRK034-", + "problemId" : "MRK034", + "name" : "The value of the 'columns' attribute on a list must be a number between 1 and 5", + "description" : "" + } ], + "MRK035" : [ { + "id" : "MRK035-", + "problemId" : "MRK035", + "name" : "The value of the 'start' attribute on a list must be a valid number", + "description" : "" + } ], + "MRK036" : [ { + "id" : "MRK036-", + "problemId" : "MRK036", + "name" : "The 'start' attribute on a list is only valid for 'alpha-lower' and 'decimal' list types", + "description" : "" + } ], + "MRK037" : [ { + "id" : "MRK037-", + "problemId" : "MRK037", + "name" : "Unknown 'sorted' attribute value", + "description" : "" + } ], + "MRK038" : [ { + "id" : "MRK038-", + "problemId" : "MRK038", + "name" : "The value of the 'level' attribute on a chapter must be a valid number between 2 and 6", + "description" : "" + } ], + "MRK039" : [ { + "id" : "MRK039-", + "problemId" : "MRK039", + "name" : "Unknown 'style' attribute value on a procedure", + "description" : "" + } ], + "MRK040" : [ { + "id" : "MRK040-", + "problemId" : "MRK040", + "name" : "Tab with an empty title", + "description" : "" + } ], + "MRK041" : [ { + "id" : "MRK041-", + "problemId" : "MRK041", + "name" : "Unknown 'style' attribute value on a table", + "description" : "" + } ], + "MRK042" : [ { + "id" : "MRK042-", + "problemId" : "MRK042", + "name" : "'colspan' and 'rowspan' attributes of a table cell must be valid numbers", + "description" : "" + } ], + "MRK043" : [ { + "id" : "MRK043-", + "problemId" : "MRK043", + "name" : "Cannot sort table with 'colspan' or 'rowspan'", + "description" : "" + } ], + "MRK044" : [ { + "id" : "MRK044-", + "problemId" : "MRK044", + "name" : "Cannot sort table with rows of different length", + "description" : "" + } ], + "MRK045" : [ { + "id" : "MRK045-", + "problemId" : "MRK045", + "name" : "'sorted' attribute must appear on the first row cells", + "description" : "" + } ], + "MRK046" : [ { + "id" : "MRK046-", + "problemId" : "MRK046", + "name" : "Element referred from 'rel' attribute does not exist or is inaccessible in the current context", + "description" : "" + } ], + "MRK047" : [ { + "id" : "MRK047-", + "problemId" : "MRK047", + "name" : "Summary element has both 'rel' attribute and text specified", + "description" : "" + } ], + "MRK048" : [ { + "id" : "MRK048-", + "problemId" : "MRK048", + "name" : "Summary element does not provide any text", + "description" : "" + } ], + "MRK049" : [ { + "id" : "MRK049-", + "problemId" : "MRK049", + "name" : "Unknown 'style' attribute value on a format element", + "description" : "" + } ], + "MRK050" : [ { + "id" : "MRK050-", + "problemId" : "MRK050", + "name" : "Unknown 'color' attribute value on a format element", + "description" : "" + } ], + "MRK051" : [ { + "id" : "MRK051-", + "problemId" : "MRK051", + "name" : "The topic must contain exactly one element. All except the first one were ignored", + "description" : "" + } ], + "MRK052" : [ { + "id" : "MRK052-", + "problemId" : "MRK052", + "name" : "Web name is empty", + "description" : "" + } ], + "MRK053" : [ { + "id" : "MRK053-", + "problemId" : "MRK053", + "name" : "Element has no title", + "description" : "" + } ], + "MRK054" : [ { + "id" : "MRK054-", + "problemId" : "MRK054", + "name" : "Collapsible procedure title is empty", + "description" : "" + } ], + "MRK055" : [ { + "id" : "MRK055-", + "problemId" : "MRK055", + "name" : "Unknown 'caps' attribute value", + "description" : "" + } ], + "MRK056" : [ { + "id" : "MRK056-", + "problemId" : "MRK056", + "name" : "Title can not contain inline formatting", + "description" : "" + } ], + "MRK057" : [ { + "id" : "MRK057-", + "problemId" : "MRK057", + "name" : "Paragraph can only contain inline elements", + "description" : "" + } ], + "MRK058" : [ { + "id" : "MRK058-", + "problemId" : "MRK058", + "name" : "Large image in paragraph rendered as a block element by default. Put it outside the paragraph or set the 'style' attribute to indicate your intent.", + "description" : "" + } ], + "MRK059" : [ { + "id" : "MRK059-", + "problemId" : "MRK059", + "name" : "Nested paragraphs are not allowed. Consider unwrapping or properly breaking the paragraphs.", + "description" : "" + } ], + "MRK060" : [ { + "id" : "MRK060-", + "problemId" : "MRK060", + "name" : "The chapter must contain exactly one element. All except the first one were ignored", + "description" : "" + } ], + "MRK061" : [ { + "id" : "MRK061-", + "problemId" : "MRK061", + "name" : "Chapter titles with level more than 6 are rendered as level 6", + "description" : "" + } ], + "MRK062" : [ { + "id" : "MRK062-", + "problemId" : "MRK062", + "name" : "The value of the 'depth' attribute on a must be a valid number", + "description" : "" + } ], + "MRK063" : [ { + "id" : "MRK063-", + "problemId" : "MRK063", + "name" : "The 'src' attribute is missing for the element", + "description" : "" + } ], + "MRK064" : [ { + "id" : "MRK064-", + "problemId" : "MRK064", + "name" : "The topic must contain exactly one element. All except the first one were ignored", + "description" : "" + } ], + "MRK065" : [ { + "id" : "MRK065-", + "problemId" : "MRK065", + "name" : "The chapter must contain exactly one element. All except the first one were ignored", + "description" : "" + } ], + "MRK066" : [ { + "id" : "MRK066-", + "problemId" : "MRK066", + "name" : "Unknown 'border' attribute value on a table. It should be 'false' for no border or 'true' for a border", + "description" : "" + } ], + "MRK067" : [ { + "id" : "MRK067-", + "problemId" : "MRK067", + "name" : "The 'height' attribute of an iframe cannot be set to 100%. Height will be set to 250px", + "description" : "" + } ], + "MRK068" : [ { + "id" : "MRK068-", + "problemId" : "MRK068", + "name" : "A 'card' can have only one of the following attributes: 'image', 'icon', or 'badge'", + "description" : "" + } ], + "MRK069" : [ { + "id" : "MRK069-", + "problemId" : "MRK069", + "name" : "Last modified date must be either a specific date in the format YYYY-MM-DD, 'git' (to get the date from Git history) or 'file' (to get the date from the file system)", + "description" : "" + } ], + "PTY001" : [ { + "id" : "PTY001-", + "problemId" : "PTY001", + "name" : "The element must contain the 'bundle' and 'key' attributes", + "description" : "" + } ], + "PTY002" : [ { + "id" : "PTY002-", + "problemId" : "PTY002", + "name" : "The property bundle referenced from a element cannot be found", + "description" : "" + } ], + "PTY003" : [ { + "id" : "PTY003-", + "problemId" : "PTY003", + "name" : "The specified property key cannot be found in the bundle specified by element", + "description" : "" + } ], + "PTY004" : [ { + "id" : "PTY004-", + "problemId" : "PTY004", + "name" : "Product specified in the 'from-product' attribute on the element is not found", + "description" : "" + } ], + "PTY005" : [ { + "id" : "PTY005-", + "problemId" : "PTY005", + "name" : "The specified property bundle is not available for the current product", + "description" : "" + } ], + "PTY006" : [ { + "id" : "PTY006-", + "problemId" : "PTY006", + "name" : "Cannot process regular expression that cleans up a property value", + "description" : "" + } ], + "PTY007" : [ { + "id" : "PTY007-", + "problemId" : "PTY007", + "name" : "Property content is corrupted", + "description" : "" + } ], + "REF001" : [ { + "id" : "REF001-", + "problemId" : "REF001", + "name" : "Cannot link to a topic that is not included in the current instance", + "description" : "" + } ], + "REF002" : [ { + "id" : "REF002-", + "problemId" : "REF002", + "name" : "Referenced topic doesn't exist", + "description" : "" + } ], + "REF003" : [ { + "id" : "REF003-", + "problemId" : "REF003", + "name" : "Cannot include element with the specified ID because it does not exist", + "description" : "" + } ], + "REF004" : [ { + "id" : "REF004-", + "problemId" : "REF004", + "name" : "Link uses anchor that does not exist", + "description" : "" + } ], + "REF005" : [ { + "id" : "REF005-", + "problemId" : "REF005", + "name" : "Link inside topic points to the same topic without an anchor", + "description" : "" + } ], + "REF007" : [ { + "id" : "REF007-", + "problemId" : "REF007", + "name" : "Cannot redirect from file name that is associated with an existing article", + "description" : "" + } ], + "REF008" : [ { + "id" : "REF008-", + "problemId" : "REF008", + "name" : "Link points to a topic in a 'draft' state that is not included in the current build", + "description" : "" + } ], + "REF009" : [ { + "id" : "REF009-", + "problemId" : "REF009", + "name" : "Cannot include from topic that does not exist", + "description" : "" + } ], + "REF010" : [ { + "id" : "REF010-", + "problemId" : "REF010", + "name" : "Link in the 'seealso' section points to itself", + "description" : "" + } ], + "REF012" : [ { + "id" : "REF012-", + "problemId" : "REF012", + "name" : "Unknown 'style' attribute value on a 'seealso' section", + "description" : "" + } ], + "REF013" : [ { + "id" : "REF013-", + "problemId" : "REF013", + "name" : "Cannot include a parent element in its child element", + "description" : "" + } ], + "REF014" : [ { + "id" : "REF014-", + "problemId" : "REF014", + "name" : "Cannot include an include directly", + "description" : "" + } ], + "REF015" : [ { + "id" : "REF015-", + "problemId" : "REF015", + "name" : "Include points to multiple IDs", + "description" : "" + } ], + "SCT001" : [ { + "id" : "SCT001-", + "problemId" : "SCT001", + "name" : "Hard-coded shortcut: consider referencing the corresponding action in the 'key' attribute of the 'shortcut' element", + "description" : "" + } ], + "SCT002" : [ { + "id" : "SCT002-", + "problemId" : "SCT002", + "name" : "Shortcut is not defined for the requested keymap", + "description" : "" + } ], + "SCT003" : [ { + "id" : "SCT003-", + "problemId" : "SCT003", + "name" : "Shortcut is not defined for the requested platform", + "description" : "" + } ], + "SCT004" : [ { + "id" : "SCT004-", + "problemId" : "SCT004", + "name" : "The file containing the keymap referenced from platforms.xml cannot be found or is empty", + "description" : "" + } ], + "SCT005" : [ { + "id" : "SCT005-", + "problemId" : "SCT005", + "name" : "Action ID is not found in the product keymap.", + "description" : "" + } ], + "SCT006" : [ { + "id" : "SCT006-", + "problemId" : "SCT006", + "name" : "Shortcut is not defined for layout", + "description" : "" + } ], + "SCT007" : [ { + "id" : "SCT007-", + "problemId" : "SCT007", + "name" : "Shortcut is not defined for the default keymap", + "description" : "" + } ], + "SCT008" : [ { + "id" : "SCT008-", + "problemId" : "SCT008", + "name" : "Shortcut is not defined in the current product's keymap", + "description" : "" + } ], + "SCT009" : [ { + "id" : "SCT009-", + "problemId" : "SCT009", + "name" : "The requested keymap cannot be found", + "description" : "" + } ], + "SCT011" : [ { + "id" : "SCT011-", + "problemId" : "SCT011", + "name" : "platforms.xml file is corrupted", + "description" : "" + } ], + "TOC002" : [ { + "id" : "TOC002-", + "problemId" : "TOC002", + "name" : " points to a library topic", + "description" : "" + } ], + "TOC003" : [ { + "id" : "TOC003-", + "problemId" : "TOC003", + "name" : "The nesting level for a is more than 3. Consider restructuring content for easier navigation.", + "description" : "" + } ], + "TOC004" : [ { + "id" : "TOC004-", + "problemId" : "TOC004", + "name" : "Wrapper cannot have the 'accepts-web-file-names' attribute as it does not produce any content, so it cannot take redirects", + "description" : "" + } ], + "TOC005" : [ { + "id" : "TOC005-", + "problemId" : "TOC005", + "name" : "Wrapper cannot have the 'help-id' attribute as it does not produce any content, so there is nothing to link from the UI", + "description" : "" + } ], + "TOC006" : [ { + "id" : "TOC006-", + "problemId" : "TOC006", + "name" : " ID is duplicated", + "description" : "" + } ], + "TOC007" : [ { + "id" : "TOC007-", + "problemId" : "TOC007", + "name" : "The 'toc-title' attribute is redundant as it matches the topic title", + "description" : "" + } ], + "TOC010" : [ { + "id" : "TOC010-", + "problemId" : "TOC010", + "name" : " cannot have both the 'accepts-web-file-names' and the 'accepts-web-file-names-ref' attribute. Consider moving all references to redirection-rules.xml", + "description" : "" + } ], + "TOC011" : [ { + "id" : "TOC011-", + "problemId" : "TOC011", + "name" : "The 'accepts-web-file-names' attribute references the same topic in several TOC elements", + "description" : "" + } ], + "TOC012" : [ { + "id" : "TOC012-", + "problemId" : "TOC012", + "name" : "The 'custom-title' attribute on a is deprecated. Move it to the topic itself.", + "description" : "" + } ], + "TOC013" : [ { + "id" : "TOC013-", + "problemId" : "TOC013", + "name" : "The value of the 'show-structure-depth' attribute on a must be a valid number", + "description" : "" + } ], + "TOC016" : [ { + "id" : "TOC016-", + "problemId" : "TOC016", + "name" : " should have one of following attributes: 'topic', 'toc-title', or 'ref'", + "description" : "" + } ], + "TOC017" : [ { + "id" : "TOC017-", + "problemId" : "TOC017", + "name" : "Invalid value of attribute \"for\"", + "description" : "" + } ], + "TOC018" : [ { + "id" : "TOC018-", + "problemId" : "TOC018", + "name" : "Target for external redirect conflicts with topic reference", + "description" : "" + } ], + "TOC019" : [ { + "id" : "TOC019-", + "problemId" : "TOC019", + "name" : "Target for external redirect requires web file names", + "description" : "" + } ], + "TOC020" : [ { + "id" : "TOC020-", + "problemId" : "TOC020", + "name" : "Target for external redirect must be a hidden TOC element", + "description" : "" + } ], + "VIS001" : [ { + "id" : "VIS001-", + "problemId" : "VIS001", + "name" : "Image or video file cannot be found", + "description" : "" + } ], + "VIS002" : [ { + "id" : "VIS002-", + "problemId" : "VIS002", + "name" : "GIF animations and image thumbnails can only be block elements, do not place them inside a paragraph", + "description" : "" + } ], + "VIS003" : [ { + "id" : "VIS003-", + "problemId" : "VIS003", + "name" : "Logo aspect ratio H:W must be between 0.24 and 1.20", + "description" : "" + } ], + "VIS004" : [ { + "id" : "VIS004-", + "problemId" : "VIS004", + "name" : "Image or video must have the 'src' attribute", + "description" : "" + } ], + "VIS005" : [ { + "id" : "VIS005-", + "problemId" : "VIS005", + "name" : "Origin module for image cannot be found in the project", + "description" : "" + } ], + "VIS006" : [ { + "id" : "VIS006-", + "problemId" : "VIS006", + "name" : "Image or video 'width' and 'height' attributes must be positive integers", + "description" : "" + } ], + "VIS007" : [ { + "id" : "VIS007-", + "problemId" : "VIS007", + "name" : "Unable to count frames in a GIF image", + "description" : "" + } ], + "VIS008" : [ { + "id" : "VIS008-", + "problemId" : "VIS008", + "name" : "GIF animations cannot be rendered without a border, do not use 'border-effect=\"none\"'", + "description" : "" + } ], + "VIS009" : [ { + "id" : "VIS009-", + "problemId" : "VIS009", + "name" : "Unknown image 'border-effect' value", + "description" : "" + } ], + "VIS010" : [ { + "id" : "VIS010-", + "problemId" : "VIS010", + "name" : "Unknown image style", + "description" : "" + } ], + "VIS011" : [ { + "id" : "VIS011-", + "problemId" : "VIS011", + "name" : "Dark version of image or video file cannot be found", + "description" : "" + } ], + "VIS012" : [ { + "id" : "VIS012-", + "problemId" : "VIS012", + "name" : "Image file type is not supported, must be PNG or SVG", + "description" : "" + } ], + "VIS013" : [ { + "id" : "VIS013-", + "problemId" : "VIS013", + "name" : "Video file type is not supported, must be MP4", + "description" : "" + } ], + "VIS014" : [ { + "id" : "VIS014-", + "problemId" : "VIS014", + "name" : "Referenced file is outside the documentation project", + "description" : "" + } ], + "VIS015" : [ { + "id" : "VIS015-", + "problemId" : "VIS015", + "name" : "Image file type is not supported", + "description" : "" + } ] + } +} \ No newline at end of file diff --git a/documentation/_build/webHelpCTW2-all.zip b/documentation/_build/webHelpCTW2-all.zip new file mode 100644 index 00000000..c1d53376 Binary files /dev/null and b/documentation/_build/webHelpCTW2-all.zip differ diff --git a/documentation/_site_rebuild_20260317/HelpTOC.json b/documentation/_site_rebuild_20260317/HelpTOC.json new file mode 100644 index 00000000..d59909da --- /dev/null +++ b/documentation/_site_rebuild_20260317/HelpTOC.json @@ -0,0 +1 @@ +{"entities":{"pages":{"Introduction":{"id":"Introduction","title":"Introduction","url":"introduction.html","level":0,"tabIndex":0},"API-Overview":{"id":"API-Overview","title":"API Overview","url":"api-overview.html","level":0,"pages":["Authentication","Error-Handling"],"tabIndex":1},"Authentication":{"id":"Authentication","title":"Authentication","url":"authentication.html","level":1,"parentId":"API-Overview","tabIndex":0},"Error-Handling":{"id":"Error-Handling","title":"Error Handling","url":"error-handling.html","level":1,"parentId":"API-Overview","tabIndex":1},"API-Reference":{"id":"API-Reference","title":"API Reference","url":"api-reference.html","level":0,"pages":["Tag_Authentication","Tag_Security","Tag_Users","Tag_Search","Tag_Orders","Tag_Order_Items","Tag_Bookings","Tag_Departments","Tag_Products","Tag_Categories","Tag_Invoices","Tag_Vehicles","Tag_Notifications","Tag_Statistics","Tag_Modules","Tag_Attachments","Tag_Forms","Tag_Worker","Tag_Plate_Scans","Tag_Config","Tag_Branding","Tag_Roles","Tag_Self_Serve","Tag_Goals","Tag_Subusers","Tag_Bird"],"tabIndex":2},"Tag_Authentication":{"id":"Tag_Authentication","title":"Authentication","url":"tag-authentication.html","level":1,"parentId":"API-Reference","pages":["Tag_Authentication_Page_1"],"tabIndex":0},"Tag_Authentication_Page_1":{"id":"Tag_Authentication_Page_1","title":"Authentication - Page 1 of 1","url":"tag-authentication-page-1.html","level":2,"parentId":"Tag_Authentication","pages":["disable2fa","enable2fa","setup2fa","verify2fa","employeeLogin","customerLogin","logout","passkeyChallenge","passkeyVerify","requestPasswordReset","setPasswordUsingResetToken","validatePasswordResetToken","getRecaptchaConfig","registerCustomerByCvr","getSession","suIntimidate"],"tabIndex":0},"disable2fa":{"id":"disable2fa","title":"Disable 2FA","url":"disable2fa.html","level":3,"parentId":"Tag_Authentication_Page_1","tabIndex":0},"enable2fa":{"id":"enable2fa","title":"Enable 2FA","url":"enable2fa.html","level":3,"parentId":"Tag_Authentication_Page_1","tabIndex":1},"setup2fa":{"id":"setup2fa","title":"Generate 2FA secret","url":"setup2fa.html","level":3,"parentId":"Tag_Authentication_Page_1","tabIndex":2},"verify2fa":{"id":"verify2fa","title":"Verify 2FA code during login","url":"verify2fa.html","level":3,"parentId":"Tag_Authentication_Page_1","tabIndex":3},"employeeLogin":{"id":"employeeLogin","title":"Employee login","url":"employeelogin.html","level":3,"parentId":"Tag_Authentication_Page_1","tabIndex":4},"customerLogin":{"id":"customerLogin","title":"Customer login","url":"customerlogin.html","level":3,"parentId":"Tag_Authentication_Page_1","tabIndex":5},"logout":{"id":"logout","title":"Logout","url":"logout.html","level":3,"parentId":"Tag_Authentication_Page_1","tabIndex":6},"passkeyChallenge":{"id":"passkeyChallenge","title":"Initiate passkey authentication challenge","url":"passkeychallenge.html","level":3,"parentId":"Tag_Authentication_Page_1","tabIndex":7},"passkeyVerify":{"id":"passkeyVerify","title":"Verify passkey authentication and start session","url":"passkeyverify.html","level":3,"parentId":"Tag_Authentication_Page_1","tabIndex":8},"requestPasswordReset":{"id":"requestPasswordReset","title":"Request a customer password reset email","url":"requestpasswordreset.html","level":3,"parentId":"Tag_Authentication_Page_1","tabIndex":9},"setPasswordUsingResetToken":{"id":"setPasswordUsingResetToken","title":"Set a customer password using a reset key","url":"setpasswordusingresettoken.html","level":3,"parentId":"Tag_Authentication_Page_1","tabIndex":10},"validatePasswordResetToken":{"id":"validatePasswordResetToken","title":"Validate a customer password reset key","url":"validatepasswordresettoken.html","level":3,"parentId":"Tag_Authentication_Page_1","tabIndex":11},"getRecaptchaConfig":{"id":"getRecaptchaConfig","title":"Get reCAPTCHA configuration","url":"getrecaptchaconfig.html","level":3,"parentId":"Tag_Authentication_Page_1","tabIndex":12},"registerCustomerByCvr":{"id":"registerCustomerByCvr","title":"Register new customer by CVR","url":"registercustomerbycvr.html","level":3,"parentId":"Tag_Authentication_Page_1","tabIndex":13},"getSession":{"id":"getSession","title":"Get current session","url":"getsession.html","level":3,"parentId":"Tag_Authentication_Page_1","tabIndex":14},"suIntimidate":{"id":"suIntimidate","title":"Intimidate a user","url":"suintimidate.html","level":3,"parentId":"Tag_Authentication_Page_1","tabIndex":15},"Tag_Security":{"id":"Tag_Security","title":"Security","url":"tag-security.html","level":1,"parentId":"API-Reference","pages":["Tag_Security_Page_1"],"tabIndex":1},"Tag_Security_Page_1":{"id":"Tag_Security_Page_1","title":"Security - Page 1 of 1","url":"tag-security-page-1.html","level":2,"parentId":"Tag_Security","pages":["listPasskeys","createPasskey","deletePasskey","renamePasskey"],"tabIndex":0},"listPasskeys":{"id":"listPasskeys","title":"List passkeys for the authenticated user","url":"listpasskeys.html","level":3,"parentId":"Tag_Security_Page_1","tabIndex":0},"createPasskey":{"id":"createPasskey","title":"Create/add a passkey for the authenticated user","url":"createpasskey.html","level":3,"parentId":"Tag_Security_Page_1","tabIndex":1},"deletePasskey":{"id":"deletePasskey","title":"Delete a passkey","url":"deletepasskey.html","level":3,"parentId":"Tag_Security_Page_1","tabIndex":2},"renamePasskey":{"id":"renamePasskey","title":"Rename a passkey","url":"renamepasskey.html","level":3,"parentId":"Tag_Security_Page_1","tabIndex":3},"Tag_Users":{"id":"Tag_Users","title":"Users","url":"tag-users.html","level":1,"parentId":"API-Reference","pages":["Tag_Users_Page_1","Tag_Users_Page_2"],"tabIndex":2},"Tag_Users_Page_1":{"id":"Tag_Users_Page_1","title":"Users - Page 1 of 2","url":"tag-users-page-1.html","level":2,"parentId":"Tag_Users","pages":["updateUserNotifications","getCustomerCode","addCustomerCode","getUserIdFromCustomerNumber","getCustomerName","deleteCustomerAttribute","getCustomerAttributes","addCustomerAttribute","deleteCustomerDefaultDepartment","getCustomerDefaultDepartment","addCustomerDefaultDepartment","deleteCustomerNote","getCustomerNotes","addCustomerNote","deleteCustomerFixedPricing","getCustomerFixedPricing","addCustomerFixedPricing","listCustomers","searchCustomers","validateCustomerNumber"],"tabIndex":0},"updateUserNotifications":{"id":"updateUserNotifications","title":"Update user notification settings","url":"updateusernotifications.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":0},"getCustomerCode":{"id":"getCustomerCode","title":"Get customer code","url":"getcustomercode.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":1},"addCustomerCode":{"id":"addCustomerCode","title":"Add customer code","url":"addcustomercode.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":2},"getUserIdFromCustomerNumber":{"id":"getUserIdFromCustomerNumber","title":"Get user ID from customer number","url":"getuseridfromcustomernumber.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":3},"getCustomerName":{"id":"getCustomerName","title":"Get customer name","url":"getcustomername.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":4},"deleteCustomerAttribute":{"id":"deleteCustomerAttribute","title":"Delete customer attribute","url":"deletecustomerattribute.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":5},"getCustomerAttributes":{"id":"getCustomerAttributes","title":"Get customer attributes","url":"getcustomerattributes.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":6},"addCustomerAttribute":{"id":"addCustomerAttribute","title":"Add customer attribute","url":"addcustomerattribute.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":7},"deleteCustomerDefaultDepartment":{"id":"deleteCustomerDefaultDepartment","title":"Delete customer default department","url":"deletecustomerdefaultdepartment.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":8},"getCustomerDefaultDepartment":{"id":"getCustomerDefaultDepartment","title":"Get customer default department","url":"getcustomerdefaultdepartment.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":9},"addCustomerDefaultDepartment":{"id":"addCustomerDefaultDepartment","title":"Add customer default department","url":"addcustomerdefaultdepartment.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":10},"deleteCustomerNote":{"id":"deleteCustomerNote","title":"Delete customer note","url":"deletecustomernote.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":11},"getCustomerNotes":{"id":"getCustomerNotes","title":"Get customer notes","url":"getcustomernotes.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":12},"addCustomerNote":{"id":"addCustomerNote","title":"Add customer note","url":"addcustomernote.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":13},"deleteCustomerFixedPricing":{"id":"deleteCustomerFixedPricing","title":"Delete customer fixed pricing","url":"deletecustomerfixedpricing.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":14},"getCustomerFixedPricing":{"id":"getCustomerFixedPricing","title":"Get customer fixed pricing","url":"getcustomerfixedpricing.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":15},"addCustomerFixedPricing":{"id":"addCustomerFixedPricing","title":"Add customer fixed pricing","url":"addcustomerfixedpricing.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":16},"listCustomers":{"id":"listCustomers","title":"List customers","url":"listcustomers.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":17},"searchCustomers":{"id":"searchCustomers","title":"Search customers","url":"searchcustomers.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":18},"validateCustomerNumber":{"id":"validateCustomerNumber","title":"Validate customer number","url":"validatecustomernumber.html","level":3,"parentId":"Tag_Users_Page_1","tabIndex":19},"Tag_Users_Page_2":{"id":"Tag_Users_Page_2","title":"Users - Page 2 of 2","url":"tag-users-page-2.html","level":2,"parentId":"Tag_Users","pages":["listPermissions","getSuperuserUser","getUserDiscounts","setUserDiscount","getUserKeys","setUserKey","setUserPassword","getUserPermissions","listUsers","createUser","updateUser","getCustomer"],"tabIndex":1},"listPermissions":{"id":"listPermissions","title":"List permissions","url":"listpermissions.html","level":3,"parentId":"Tag_Users_Page_2","tabIndex":0},"getSuperuserUser":{"id":"getSuperuserUser","title":"Get user by ID (superuser)","url":"getsuperuseruser.html","level":3,"parentId":"Tag_Users_Page_2","tabIndex":1},"getUserDiscounts":{"id":"getUserDiscounts","title":"Get user discounts","url":"getuserdiscounts.html","level":3,"parentId":"Tag_Users_Page_2","tabIndex":2},"setUserDiscount":{"id":"setUserDiscount","title":"Set user discount","url":"setuserdiscount.html","level":3,"parentId":"Tag_Users_Page_2","tabIndex":3},"getUserKeys":{"id":"getUserKeys","title":"Get user keys","url":"getuserkeys.html","level":3,"parentId":"Tag_Users_Page_2","tabIndex":4},"setUserKey":{"id":"setUserKey","title":"Set user key","url":"setuserkey.html","level":3,"parentId":"Tag_Users_Page_2","tabIndex":5},"setUserPassword":{"id":"setUserPassword","title":"Set user password","url":"setuserpassword.html","level":3,"parentId":"Tag_Users_Page_2","tabIndex":6},"getUserPermissions":{"id":"getUserPermissions","title":"Get user permissions","url":"getuserpermissions.html","level":3,"parentId":"Tag_Users_Page_2","tabIndex":7},"listUsers":{"id":"listUsers","title":"List users","url":"listusers.html","level":3,"parentId":"Tag_Users_Page_2","tabIndex":8},"createUser":{"id":"createUser","title":"Create new user","url":"createuser.html","level":3,"parentId":"Tag_Users_Page_2","tabIndex":9},"updateUser":{"id":"updateUser","title":"Update user","url":"updateuser.html","level":3,"parentId":"Tag_Users_Page_2","tabIndex":10},"getCustomer":{"id":"getCustomer","title":"Get customer details","url":"getcustomer.html","level":3,"parentId":"Tag_Users_Page_2","tabIndex":11},"Tag_Search":{"id":"Tag_Search","title":"Search","url":"tag-search.html","level":1,"parentId":"API-Reference","pages":["Tag_Search_Page_1"],"tabIndex":3},"Tag_Search_Page_1":{"id":"Tag_Search_Page_1","title":"Search - Page 1 of 1","url":"tag-search-page-1.html","level":2,"parentId":"Tag_Search","pages":["systemWideSearchGet","systemWideSearchPost","clearSystemSearchCache","rebuildSystemSearchCache"],"tabIndex":0},"systemWideSearchGet":{"id":"systemWideSearchGet","title":"System-wide search","url":"systemwidesearchget.html","level":3,"parentId":"Tag_Search_Page_1","tabIndex":0},"systemWideSearchPost":{"id":"systemWideSearchPost","title":"System-wide search","url":"systemwidesearchpost.html","level":3,"parentId":"Tag_Search_Page_1","tabIndex":1},"clearSystemSearchCache":{"id":"clearSystemSearchCache","title":"Clear system search caches","url":"clearsystemsearchcache.html","level":3,"parentId":"Tag_Search_Page_1","tabIndex":2},"rebuildSystemSearchCache":{"id":"rebuildSystemSearchCache","title":"Queue system search cache rebuild","url":"rebuildsystemsearchcache.html","level":3,"parentId":"Tag_Search_Page_1","tabIndex":3},"Tag_Orders":{"id":"Tag_Orders","title":"Orders","url":"tag-orders.html","level":1,"parentId":"API-Reference","pages":["Tag_Orders_Page_1"],"tabIndex":4},"Tag_Orders_Page_1":{"id":"Tag_Orders_Page_1","title":"Orders - Page 1 of 1","url":"tag-orders-page-1.html","level":2,"parentId":"Tag_Orders","pages":["getOrder","updateOrder","generateWashCertificate","deleteOrder","listOrders","createOrder","updateOrders","markOrderCompleted","simulateStripePayment","deleteStripePaymentIntent","getStripePaymentIntent","createStripePaymentIntent","captureStripePaymentIntent","getUserOrder","getUserOrders"],"tabIndex":0},"getOrder":{"id":"getOrder","title":"Get order details","url":"getorder.html","level":3,"parentId":"Tag_Orders_Page_1","tabIndex":0},"updateOrder":{"id":"updateOrder","title":"Update order","url":"updateorder.html","level":3,"parentId":"Tag_Orders_Page_1","tabIndex":1},"generateWashCertificate":{"id":"generateWashCertificate","title":"Generate wash certificate","url":"generatewashcertificate.html","level":3,"parentId":"Tag_Orders_Page_1","tabIndex":2},"deleteOrder":{"id":"deleteOrder","title":"Delete order","url":"deleteorder.html","level":3,"parentId":"Tag_Orders_Page_1","tabIndex":3},"listOrders":{"id":"listOrders","title":"List orders","url":"listorders.html","level":3,"parentId":"Tag_Orders_Page_1","tabIndex":4},"createOrder":{"id":"createOrder","title":"Create new order","url":"createorder.html","level":3,"parentId":"Tag_Orders_Page_1","tabIndex":5},"updateOrders":{"id":"updateOrders","title":"Update order (alias)","url":"updateorders.html","level":3,"parentId":"Tag_Orders_Page_1","tabIndex":6},"markOrderCompleted":{"id":"markOrderCompleted","title":"Mark order as completed","url":"markordercompleted.html","level":3,"parentId":"Tag_Orders_Page_1","tabIndex":7},"simulateStripePayment":{"id":"simulateStripePayment","title":"Simulate Stripe payment","url":"simulatestripepayment.html","level":3,"parentId":"Tag_Orders_Page_1","tabIndex":8},"deleteStripePaymentIntent":{"id":"deleteStripePaymentIntent","title":"Delete Stripe payment intent","url":"deletestripepaymentintent.html","level":3,"parentId":"Tag_Orders_Page_1","tabIndex":9},"getStripePaymentIntent":{"id":"getStripePaymentIntent","title":"Get Stripe payment intent","url":"getstripepaymentintent.html","level":3,"parentId":"Tag_Orders_Page_1","tabIndex":10},"createStripePaymentIntent":{"id":"createStripePaymentIntent","title":"Create Stripe payment intent","url":"createstripepaymentintent.html","level":3,"parentId":"Tag_Orders_Page_1","tabIndex":11},"captureStripePaymentIntent":{"id":"captureStripePaymentIntent","title":"Capture Stripe payment intent","url":"capturestripepaymentintent.html","level":3,"parentId":"Tag_Orders_Page_1","tabIndex":12},"getUserOrder":{"id":"getUserOrder","title":"Get user\u0027s specific order","url":"getuserorder.html","level":3,"parentId":"Tag_Orders_Page_1","tabIndex":13},"getUserOrders":{"id":"getUserOrders","title":"Get current user\u0027s orders","url":"getuserorders.html","level":3,"parentId":"Tag_Orders_Page_1","tabIndex":14},"Tag_Order_Items":{"id":"Tag_Order_Items","title":"Order Items","url":"tag-order-items.html","level":1,"parentId":"API-Reference","pages":["Tag_Order_Items_Page_1"],"tabIndex":5},"Tag_Order_Items_Page_1":{"id":"Tag_Order_Items_Page_1","title":"Order Items - Page 1 of 1","url":"tag-order-items-page-1.html","level":2,"parentId":"Tag_Order_Items","pages":["deleteOrderItem","listOrderItems","addOrderItem","updateOrderItem"],"tabIndex":0},"deleteOrderItem":{"id":"deleteOrderItem","title":"Delete order item","url":"deleteorderitem.html","level":3,"parentId":"Tag_Order_Items_Page_1","tabIndex":0},"listOrderItems":{"id":"listOrderItems","title":"List order items","url":"listorderitems.html","level":3,"parentId":"Tag_Order_Items_Page_1","tabIndex":1},"addOrderItem":{"id":"addOrderItem","title":"Add item to order","url":"addorderitem.html","level":3,"parentId":"Tag_Order_Items_Page_1","tabIndex":2},"updateOrderItem":{"id":"updateOrderItem","title":"Update order item","url":"updateorderitem.html","level":3,"parentId":"Tag_Order_Items_Page_1","tabIndex":3},"Tag_Bookings":{"id":"Tag_Bookings","title":"Bookings","url":"tag-bookings.html","level":1,"parentId":"API-Reference","pages":["Tag_Bookings_Page_1"],"tabIndex":6},"Tag_Bookings_Page_1":{"id":"Tag_Bookings_Page_1","title":"Bookings - Page 1 of 1","url":"tag-bookings-page-1.html","level":2,"parentId":"Tag_Bookings","pages":["completeWashWithoutWashCertificate","adminDeleteBooking","getDepartmentBookingCount","syncBooking","listBookings","updateBooking","downloadBookingPdf","listOrderBookings","completeOrderBooking","syncAllBookings","getUserBookings","deleteOwnBooking","downloadOwnWashCertificate"],"tabIndex":0},"completeWashWithoutWashCertificate":{"id":"completeWashWithoutWashCertificate","title":"Complete wash without wash certificate","url":"completewashwithoutwashcertificate.html","level":3,"parentId":"Tag_Bookings_Page_1","tabIndex":0},"adminDeleteBooking":{"id":"adminDeleteBooking","title":"Delete booking (admin)","url":"admindeletebooking.html","level":3,"parentId":"Tag_Bookings_Page_1","tabIndex":1},"getDepartmentBookingCount":{"id":"getDepartmentBookingCount","title":"Get department unfulfilled bookings count","url":"getdepartmentbookingcount.html","level":3,"parentId":"Tag_Bookings_Page_1","tabIndex":2},"syncBooking":{"id":"syncBooking","title":"Sync booking from external system","url":"syncbooking.html","level":3,"parentId":"Tag_Bookings_Page_1","tabIndex":3},"listBookings":{"id":"listBookings","title":"List bookings","url":"listbookings.html","level":3,"parentId":"Tag_Bookings_Page_1","tabIndex":4},"updateBooking":{"id":"updateBooking","title":"Update booking","url":"updatebooking.html","level":3,"parentId":"Tag_Bookings_Page_1","tabIndex":5},"downloadBookingPdf":{"id":"downloadBookingPdf","title":"Download booking PDF","url":"downloadbookingpdf.html","level":3,"parentId":"Tag_Bookings_Page_1","tabIndex":6},"listOrderBookings":{"id":"listOrderBookings","title":"List order bookings","url":"listorderbookings.html","level":3,"parentId":"Tag_Bookings_Page_1","tabIndex":7},"completeOrderBooking":{"id":"completeOrderBooking","title":"Complete order booking","url":"completeorderbooking.html","level":3,"parentId":"Tag_Bookings_Page_1","tabIndex":8},"syncAllBookings":{"id":"syncAllBookings","title":"Sync all bookings from external system","url":"syncallbookings.html","level":3,"parentId":"Tag_Bookings_Page_1","tabIndex":9},"getUserBookings":{"id":"getUserBookings","title":"Get user bookings","url":"getuserbookings.html","level":3,"parentId":"Tag_Bookings_Page_1","tabIndex":10},"deleteOwnBooking":{"id":"deleteOwnBooking","title":"Delete own booking","url":"deleteownbooking.html","level":3,"parentId":"Tag_Bookings_Page_1","tabIndex":11},"downloadOwnWashCertificate":{"id":"downloadOwnWashCertificate","title":"Get download link for own wash certificate","url":"downloadownwashcertificate.html","level":3,"parentId":"Tag_Bookings_Page_1","tabIndex":12},"Tag_Departments":{"id":"Tag_Departments","title":"Departments","url":"tag-departments.html","level":1,"parentId":"API-Reference","pages":["Tag_Departments_Page_1","Tag_Departments_Page_2"],"tabIndex":7},"Tag_Departments_Page_1":{"id":"Tag_Departments_Page_1","title":"Departments - Page 1 of 2","url":"tag-departments-page-1.html","level":2,"parentId":"Tag_Departments","pages":["deleteDepartmentGate","listDepartmentGates","createDepartmentGate","updateDepartmentGate","listDepartmentLanes","createDepartmentLane","updateDepartmentLane","getDepartmentLaneDynamicImage","deleteDepartmentRelay","listDepartmentRelays","createDepartmentRelay","updateDepartmentRelay","listDepartments","createDepartment","updateDepartment","removeDepartmentCategory","getDepartmentCategories","addDepartmentCategory","listDailyReports","addDailyReport"],"tabIndex":0},"deleteDepartmentGate":{"id":"deleteDepartmentGate","title":"Delete department gate","url":"deletedepartmentgate.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":0},"listDepartmentGates":{"id":"listDepartmentGates","title":"List department gates","url":"listdepartmentgates.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":1},"createDepartmentGate":{"id":"createDepartmentGate","title":"Create department gate","url":"createdepartmentgate.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":2},"updateDepartmentGate":{"id":"updateDepartmentGate","title":"Update department gate","url":"updatedepartmentgate.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":3},"listDepartmentLanes":{"id":"listDepartmentLanes","title":"List department lanes","url":"listdepartmentlanes.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":4},"createDepartmentLane":{"id":"createDepartmentLane","title":"Create department lane","url":"createdepartmentlane.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":5},"updateDepartmentLane":{"id":"updateDepartmentLane","title":"Update department lane","url":"updatedepartmentlane.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":6},"getDepartmentLaneDynamicImage":{"id":"getDepartmentLaneDynamicImage","title":"Generate dynamic image for a department lane","url":"getdepartmentlanedynamicimage.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":7},"deleteDepartmentRelay":{"id":"deleteDepartmentRelay","title":"Delete department relay","url":"deletedepartmentrelay.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":8},"listDepartmentRelays":{"id":"listDepartmentRelays","title":"List department relays","url":"listdepartmentrelays.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":9},"createDepartmentRelay":{"id":"createDepartmentRelay","title":"Create department relay","url":"createdepartmentrelay.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":10},"updateDepartmentRelay":{"id":"updateDepartmentRelay","title":"Update department relay","url":"updatedepartmentrelay.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":11},"listDepartments":{"id":"listDepartments","title":"List departments","url":"listdepartments.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":12},"createDepartment":{"id":"createDepartment","title":"Create department","url":"createdepartment.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":13},"updateDepartment":{"id":"updateDepartment","title":"Update department","url":"updatedepartment.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":14},"removeDepartmentCategory":{"id":"removeDepartmentCategory","title":"Remove category from department","url":"removedepartmentcategory.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":15},"getDepartmentCategories":{"id":"getDepartmentCategories","title":"Get department categories","url":"getdepartmentcategories.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":16},"addDepartmentCategory":{"id":"addDepartmentCategory","title":"Add category to department","url":"adddepartmentcategory.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":17},"listDailyReports":{"id":"listDailyReports","title":"List daily reports","url":"listdailyreports.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":18},"addDailyReport":{"id":"addDailyReport","title":"Add daily report","url":"adddailyreport.html","level":3,"parentId":"Tag_Departments_Page_1","tabIndex":19},"Tag_Departments_Page_2":{"id":"Tag_Departments_Page_2","title":"Departments - Page 2 of 2","url":"tag-departments-page-2.html","level":2,"parentId":"Tag_Departments","pages":["editDailyReport","getDailyReportBookingsCount","getDailyReport","getDailyReportProductCount","getDailyReportTransactionCount","getDepartmentRecommendedOrder","getDepartmentSelfServeEnabled","updateDepartmentSelfServeEnabled","getDepartmentWeatherTimeline","listGuestDepartments","listSuperuserDepartments","getDepartmentPrices","setDepartmentPrice","getDepartmentVariables","setDepartmentVariable"],"tabIndex":1},"editDailyReport":{"id":"editDailyReport","title":"Edit daily report","url":"editdailyreport.html","level":3,"parentId":"Tag_Departments_Page_2","tabIndex":0},"getDailyReportBookingsCount":{"id":"getDailyReportBookingsCount","title":"Get bookings count for daily reports","url":"getdailyreportbookingscount.html","level":3,"parentId":"Tag_Departments_Page_2","tabIndex":1},"getDailyReport":{"id":"getDailyReport","title":"Get daily report","url":"getdailyreport.html","level":3,"parentId":"Tag_Departments_Page_2","tabIndex":2},"getDailyReportProductCount":{"id":"getDailyReportProductCount","title":"Get product count for daily reports","url":"getdailyreportproductcount.html","level":3,"parentId":"Tag_Departments_Page_2","tabIndex":3},"getDailyReportTransactionCount":{"id":"getDailyReportTransactionCount","title":"Get transaction count for daily reports","url":"getdailyreporttransactioncount.html","level":3,"parentId":"Tag_Departments_Page_2","tabIndex":4},"getDepartmentRecommendedOrder":{"id":"getDepartmentRecommendedOrder","title":"Get recommended order for department","url":"getdepartmentrecommendedorder.html","level":3,"parentId":"Tag_Departments_Page_2","tabIndex":5},"getDepartmentSelfServeEnabled":{"id":"getDepartmentSelfServeEnabled","title":"Get department self-serve status","url":"getdepartmentselfserveenabled.html","level":3,"parentId":"Tag_Departments_Page_2","tabIndex":6},"updateDepartmentSelfServeEnabled":{"id":"updateDepartmentSelfServeEnabled","title":"Update department self-serve status","url":"updatedepartmentselfserveenabled.html","level":3,"parentId":"Tag_Departments_Page_2","tabIndex":7},"getDepartmentWeatherTimeline":{"id":"getDepartmentWeatherTimeline","title":"Get department weather timeline","url":"getdepartmentweathertimeline.html","level":3,"parentId":"Tag_Departments_Page_2","tabIndex":8},"listGuestDepartments":{"id":"listGuestDepartments","title":"List public departments","url":"listguestdepartments.html","level":3,"parentId":"Tag_Departments_Page_2","tabIndex":9},"listSuperuserDepartments":{"id":"listSuperuserDepartments","title":"List departments (superuser)","url":"listsuperuserdepartments.html","level":3,"parentId":"Tag_Departments_Page_2","tabIndex":10},"getDepartmentPrices":{"id":"getDepartmentPrices","title":"Get department prices","url":"getdepartmentprices.html","level":3,"parentId":"Tag_Departments_Page_2","tabIndex":11},"setDepartmentPrice":{"id":"setDepartmentPrice","title":"Set department price","url":"setdepartmentprice.html","level":3,"parentId":"Tag_Departments_Page_2","tabIndex":12},"getDepartmentVariables":{"id":"getDepartmentVariables","title":"Get department variables","url":"getdepartmentvariables.html","level":3,"parentId":"Tag_Departments_Page_2","tabIndex":13},"setDepartmentVariable":{"id":"setDepartmentVariable","title":"Set department variable","url":"setdepartmentvariable.html","level":3,"parentId":"Tag_Departments_Page_2","tabIndex":14},"Tag_Products":{"id":"Tag_Products","title":"Products","url":"tag-products.html","level":1,"parentId":"API-Reference","pages":["Tag_Products_Page_1"],"tabIndex":8},"Tag_Products_Page_1":{"id":"Tag_Products_Page_1","title":"Products - Page 1 of 1","url":"tag-products-page-1.html","level":2,"parentId":"Tag_Products","pages":["listProducts","createProduct","updateProduct"],"tabIndex":0},"listProducts":{"id":"listProducts","title":"List products","url":"listproducts.html","level":3,"parentId":"Tag_Products_Page_1","tabIndex":0},"createProduct":{"id":"createProduct","title":"Create product","url":"createproduct.html","level":3,"parentId":"Tag_Products_Page_1","tabIndex":1},"updateProduct":{"id":"updateProduct","title":"Update product","url":"updateproduct.html","level":3,"parentId":"Tag_Products_Page_1","tabIndex":2},"Tag_Categories":{"id":"Tag_Categories","title":"Categories","url":"tag-categories.html","level":1,"parentId":"API-Reference","pages":["Tag_Categories_Page_1"],"tabIndex":9},"Tag_Categories_Page_1":{"id":"Tag_Categories_Page_1","title":"Categories - Page 1 of 1","url":"tag-categories-page-1.html","level":2,"parentId":"Tag_Categories","pages":["listCategories","createCategory","updateCategory"],"tabIndex":0},"listCategories":{"id":"listCategories","title":"List categories","url":"listcategories.html","level":3,"parentId":"Tag_Categories_Page_1","tabIndex":0},"createCategory":{"id":"createCategory","title":"Create category","url":"createcategory.html","level":3,"parentId":"Tag_Categories_Page_1","tabIndex":1},"updateCategory":{"id":"updateCategory","title":"Update category","url":"updatecategory.html","level":3,"parentId":"Tag_Categories_Page_1","tabIndex":2},"Tag_Invoices":{"id":"Tag_Invoices","title":"Invoices","url":"tag-invoices.html","level":1,"parentId":"API-Reference","pages":["Tag_Invoices_Page_1","Tag_Invoices_Page_2"],"tabIndex":10},"Tag_Invoices_Page_1":{"id":"Tag_Invoices_Page_1","title":"Invoices - Page 1 of 2","url":"tag-invoices-page-1.html","level":2,"parentId":"Tag_Invoices","pages":["listCollectedInvoices","createCollectedInvoice","updateCollectedInvoice","compareCollectedInvoiceEconomic","compareCollectedInvoiceEconomicV2","compareCollectedInvoiceEconomicV2Bulk","getCollectedInvoiceEconomicV2Details","getCollectedInvoiceEconomicV2RevenueStatistics","getReadyToInvoice","listDraftInvoices","closeDraftInvoice","getInvoicePdf","getCustomerPricingHistoryV2","getInvoicingPeriods","getInvoicingFixedPricingDistribution","getInvoicingPeriodDistributionV2All","getInvoicingPeriodDistributionV2BookedDepartment75","getInvoicingPeriodDistributionV2CustomerPrices","getInvoicingPeriodDistributionV2FixedPricing","getInvoicingPeriodDistributionV2WashSubscriptions"],"tabIndex":0},"listCollectedInvoices":{"id":"listCollectedInvoices","title":"List collected invoices","url":"listcollectedinvoices.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":0},"createCollectedInvoice":{"id":"createCollectedInvoice","title":"Create collected invoice","url":"createcollectedinvoice.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":1},"updateCollectedInvoice":{"id":"updateCollectedInvoice","title":"Update collected invoice","url":"updatecollectedinvoice.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":2},"compareCollectedInvoiceEconomic":{"id":"compareCollectedInvoiceEconomic","title":"Compare collected invoice totals with E-conomic","url":"comparecollectedinvoiceeconomic.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":3},"compareCollectedInvoiceEconomicV2":{"id":"compareCollectedInvoiceEconomicV2","title":"Compare internal invoice with draft/booked (V2)","url":"comparecollectedinvoiceeconomicv2.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":4},"compareCollectedInvoiceEconomicV2Bulk":{"id":"compareCollectedInvoiceEconomicV2Bulk","title":"Bulk compare collected invoices against draft/booked (V2)","url":"comparecollectedinvoiceeconomicv2bulk.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":5},"getCollectedInvoiceEconomicV2Details":{"id":"getCollectedInvoiceEconomicV2Details","title":"Get deep V2 e-conomic invoice details","url":"getcollectedinvoiceeconomicv2details.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":6},"getCollectedInvoiceEconomicV2RevenueStatistics":{"id":"getCollectedInvoiceEconomicV2RevenueStatistics","title":"Get overall booked revenue statistics from e-conomic (V2)","url":"getcollectedinvoiceeconomicv2revenuestatistics.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":7},"getReadyToInvoice":{"id":"getReadyToInvoice","title":"Get invoices ready to process","url":"getreadytoinvoice.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":8},"listDraftInvoices":{"id":"listDraftInvoices","title":"List draft invoices","url":"listdraftinvoices.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":9},"closeDraftInvoice":{"id":"closeDraftInvoice","title":"Close draft invoice","url":"closedraftinvoice.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":10},"getInvoicePdf":{"id":"getInvoicePdf","title":"Get invoice PDF","url":"getinvoicepdf.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":11},"getCustomerPricingHistoryV2":{"id":"getCustomerPricingHistoryV2","title":"Get customer versioned pricing/subscription/discount timeline","url":"getcustomerpricinghistoryv2.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":12},"getInvoicingPeriods":{"id":"getInvoicingPeriods","title":"Get invoicing periods","url":"getinvoicingperiods.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":13},"getInvoicingFixedPricingDistribution":{"id":"getInvoicingFixedPricingDistribution","title":"Get fixed pricing distribution","url":"getinvoicingfixedpricingdistribution.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":14},"getInvoicingPeriodDistributionV2All":{"id":"getInvoicingPeriodDistributionV2All","title":"Get version-aware historical distribution (all)","url":"getinvoicingperioddistributionv2all.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":15},"getInvoicingPeriodDistributionV2BookedDepartment75":{"id":"getInvoicingPeriodDistributionV2BookedDepartment75","title":"Get booked e-conomic department 75 redistribution","url":"getinvoicingperioddistributionv2bookeddepartment75.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":16},"getInvoicingPeriodDistributionV2CustomerPrices":{"id":"getInvoicingPeriodDistributionV2CustomerPrices","title":"Get version-aware historical customer-price discount distribution","url":"getinvoicingperioddistributionv2customerprices.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":17},"getInvoicingPeriodDistributionV2FixedPricing":{"id":"getInvoicingPeriodDistributionV2FixedPricing","title":"Get version-aware historical fixed pricing distribution","url":"getinvoicingperioddistributionv2fixedpricing.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":18},"getInvoicingPeriodDistributionV2WashSubscriptions":{"id":"getInvoicingPeriodDistributionV2WashSubscriptions","title":"Get version-aware historical wash subscription distribution","url":"getinvoicingperioddistributionv2washsubscriptions.html","level":3,"parentId":"Tag_Invoices_Page_1","tabIndex":19},"Tag_Invoices_Page_2":{"id":"Tag_Invoices_Page_2","title":"Invoices - Page 2 of 2","url":"tag-invoices-page-2.html","level":2,"parentId":"Tag_Invoices","pages":["getInvoicingWashSubscriptionsDistribution","getUserInvoices"],"tabIndex":1},"getInvoicingWashSubscriptionsDistribution":{"id":"getInvoicingWashSubscriptionsDistribution","title":"Get wash subscriptions distribution","url":"getinvoicingwashsubscriptionsdistribution.html","level":3,"parentId":"Tag_Invoices_Page_2","tabIndex":0},"getUserInvoices":{"id":"getUserInvoices","title":"Get user invoices","url":"getuserinvoices.html","level":3,"parentId":"Tag_Invoices_Page_2","tabIndex":1},"Tag_Vehicles":{"id":"Tag_Vehicles","title":"Vehicles","url":"tag-vehicles.html","level":1,"parentId":"API-Reference","pages":["Tag_Vehicles_Page_1"],"tabIndex":11},"Tag_Vehicles_Page_1":{"id":"Tag_Vehicles_Page_1","title":"Vehicles - Page 1 of 1","url":"tag-vehicles-page-1.html","level":2,"parentId":"Tag_Vehicles","pages":["getVehicleCustomerSuggestions","getUnknownCustomerVehicles","getUsersWithVehicleSubscriptions","deleteVehicle","listVehicles","addVehicle","editVehicle","getAvailableVehicleAddons","toggleVehicleAddon","searchVehicles","setVehicleAutoStartOnLpr","setVehicleTypeId","getVehicleStatus"],"tabIndex":0},"getVehicleCustomerSuggestions":{"id":"getVehicleCustomerSuggestions","title":"Get vehicle customer suggestions","url":"getvehiclecustomersuggestions.html","level":3,"parentId":"Tag_Vehicles_Page_1","tabIndex":0},"getUnknownCustomerVehicles":{"id":"getUnknownCustomerVehicles","title":"Get unknown customer vehicles in department","url":"getunknowncustomervehicles.html","level":3,"parentId":"Tag_Vehicles_Page_1","tabIndex":1},"getUsersWithVehicleSubscriptions":{"id":"getUsersWithVehicleSubscriptions","title":"Get users with vehicle subscriptions","url":"getuserswithvehiclesubscriptions.html","level":3,"parentId":"Tag_Vehicles_Page_1","tabIndex":2},"deleteVehicle":{"id":"deleteVehicle","title":"Delete vehicle","url":"deletevehicle.html","level":3,"parentId":"Tag_Vehicles_Page_1","tabIndex":3},"listVehicles":{"id":"listVehicles","title":"List vehicles","url":"listvehicles.html","level":3,"parentId":"Tag_Vehicles_Page_1","tabIndex":4},"addVehicle":{"id":"addVehicle","title":"Add vehicle","url":"addvehicle.html","level":3,"parentId":"Tag_Vehicles_Page_1","tabIndex":5},"editVehicle":{"id":"editVehicle","title":"Edit vehicle","url":"editvehicle.html","level":3,"parentId":"Tag_Vehicles_Page_1","tabIndex":6},"getAvailableVehicleAddons":{"id":"getAvailableVehicleAddons","title":"Get available vehicle addons","url":"getavailablevehicleaddons.html","level":3,"parentId":"Tag_Vehicles_Page_1","tabIndex":7},"toggleVehicleAddon":{"id":"toggleVehicleAddon","title":"Toggle vehicle addon","url":"togglevehicleaddon.html","level":3,"parentId":"Tag_Vehicles_Page_1","tabIndex":8},"searchVehicles":{"id":"searchVehicles","title":"Search vehicles","url":"searchvehicles.html","level":3,"parentId":"Tag_Vehicles_Page_1","tabIndex":9},"setVehicleAutoStartOnLpr":{"id":"setVehicleAutoStartOnLpr","title":"Set auto start on LPR","url":"setvehicleautostartonlpr.html","level":3,"parentId":"Tag_Vehicles_Page_1","tabIndex":10},"setVehicleTypeId":{"id":"setVehicleTypeId","title":"Set vehicle type ID","url":"setvehicletypeid.html","level":3,"parentId":"Tag_Vehicles_Page_1","tabIndex":11},"getVehicleStatus":{"id":"getVehicleStatus","title":"Get vehicle status","url":"getvehiclestatus.html","level":3,"parentId":"Tag_Vehicles_Page_1","tabIndex":12},"Tag_Notifications":{"id":"Tag_Notifications","title":"Notifications","url":"tag-notifications.html","level":1,"parentId":"API-Reference","pages":["Tag_Notifications_Page_1"],"tabIndex":12},"Tag_Notifications_Page_1":{"id":"Tag_Notifications_Page_1","title":"Notifications - Page 1 of 1","url":"tag-notifications-page-1.html","level":2,"parentId":"Tag_Notifications","pages":["deleteNotification","listNotifications","createNotification"],"tabIndex":0},"deleteNotification":{"id":"deleteNotification","title":"Delete notification","url":"deletenotification.html","level":3,"parentId":"Tag_Notifications_Page_1","tabIndex":0},"listNotifications":{"id":"listNotifications","title":"List notifications","url":"listnotifications.html","level":3,"parentId":"Tag_Notifications_Page_1","tabIndex":1},"createNotification":{"id":"createNotification","title":"Create notification","url":"createnotification.html","level":3,"parentId":"Tag_Notifications_Page_1","tabIndex":2},"Tag_Statistics":{"id":"Tag_Statistics","title":"Statistics","url":"tag-statistics.html","level":1,"parentId":"API-Reference","pages":["Tag_Statistics_Page_1"],"tabIndex":13},"Tag_Statistics_Page_1":{"id":"Tag_Statistics_Page_1","title":"Statistics - Page 1 of 1","url":"tag-statistics-page-1.html","level":2,"parentId":"Tag_Statistics","pages":["getNewBookingsStats","getEconomicTotals","getDepartmentDraftInvoiceTotals","getDepartmentSentInvoiceTotals","getTotalIncomeTodayByDepartments","getLastMonthIncome","getThisMonthIncome","getThisYearIncome","getTodayIncome","getYesterdayIncome","getNewOrdersStats"],"tabIndex":0},"getNewBookingsStats":{"id":"getNewBookingsStats","title":"Get new bookings statistics","url":"getnewbookingsstats.html","level":3,"parentId":"Tag_Statistics_Page_1","tabIndex":0},"getEconomicTotals":{"id":"getEconomicTotals","title":"Get total economic statistics","url":"geteconomictotals.html","level":3,"parentId":"Tag_Statistics_Page_1","tabIndex":1},"getDepartmentDraftInvoiceTotals":{"id":"getDepartmentDraftInvoiceTotals","title":"Get department draft invoice totals","url":"getdepartmentdraftinvoicetotals.html","level":3,"parentId":"Tag_Statistics_Page_1","tabIndex":2},"getDepartmentSentInvoiceTotals":{"id":"getDepartmentSentInvoiceTotals","title":"Get department sent invoice totals","url":"getdepartmentsentinvoicetotals.html","level":3,"parentId":"Tag_Statistics_Page_1","tabIndex":3},"getTotalIncomeTodayByDepartments":{"id":"getTotalIncomeTodayByDepartments","title":"Get total income today by departments","url":"gettotalincometodaybydepartments.html","level":3,"parentId":"Tag_Statistics_Page_1","tabIndex":4},"getLastMonthIncome":{"id":"getLastMonthIncome","title":"Get last month\u0027s income","url":"getlastmonthincome.html","level":3,"parentId":"Tag_Statistics_Page_1","tabIndex":5},"getThisMonthIncome":{"id":"getThisMonthIncome","title":"Get this month\u0027s income","url":"getthismonthincome.html","level":3,"parentId":"Tag_Statistics_Page_1","tabIndex":6},"getThisYearIncome":{"id":"getThisYearIncome","title":"Get this year\u0027s income","url":"getthisyearincome.html","level":3,"parentId":"Tag_Statistics_Page_1","tabIndex":7},"getTodayIncome":{"id":"getTodayIncome","title":"Get today\u0027s income","url":"gettodayincome.html","level":3,"parentId":"Tag_Statistics_Page_1","tabIndex":8},"getYesterdayIncome":{"id":"getYesterdayIncome","title":"Get yesterday\u0027s income","url":"getyesterdayincome.html","level":3,"parentId":"Tag_Statistics_Page_1","tabIndex":9},"getNewOrdersStats":{"id":"getNewOrdersStats","title":"Get new orders statistics","url":"getnewordersstats.html","level":3,"parentId":"Tag_Statistics_Page_1","tabIndex":10},"Tag_Modules":{"id":"Tag_Modules","title":"Modules","url":"tag-modules.html","level":1,"parentId":"API-Reference","pages":["modules_module_action_logs","modules_module_backup","modules_module_cvr","modules_module_e_conomic","modules_module_entra","modules_module_fxratesapi","modules_module_motorapi","modules_module_self_serve","modules_module_stripe","modules_module_virkdata","modules_module_wash_certificates","modules_module_weatherapi","modules_module_xlvask"],"tabIndex":14},"modules_module_action_logs":{"id":"modules_module_action_logs","level":2,"parentId":"Tag_Modules","pages":["modules_module_action_logs_page_1"],"tabIndex":0},"modules_module_action_logs_page_1":{"id":"modules_module_action_logs_page_1","level":3,"parentId":"modules_module_action_logs","pages":["listModuleActionLogs"],"tabIndex":0},"listModuleActionLogs":{"id":"listModuleActionLogs","title":"List module action logs","url":"listmoduleactionlogs.html","level":4,"parentId":"modules_module_action_logs_page_1","tabIndex":0},"modules_module_backup":{"id":"modules_module_backup","level":2,"parentId":"Tag_Modules","pages":["modules_module_backup_page_1"],"tabIndex":1},"modules_module_backup_page_1":{"id":"modules_module_backup_page_1","level":3,"parentId":"modules_module_backup","pages":["createBackupModule","listBackupModules"],"tabIndex":0},"createBackupModule":{"id":"createBackupModule","title":"Create backup module","url":"createbackupmodule.html","level":4,"parentId":"modules_module_backup_page_1","tabIndex":0},"listBackupModules":{"id":"listBackupModules","title":"List backup modules","url":"listbackupmodules.html","level":4,"parentId":"modules_module_backup_page_1","tabIndex":1},"modules_module_cvr":{"id":"modules_module_cvr","level":2,"parentId":"Tag_Modules","pages":["modules_module_cvr_page_1"],"tabIndex":2},"modules_module_cvr_page_1":{"id":"modules_module_cvr_page_1","level":3,"parentId":"modules_module_cvr","pages":["lookupCvr","searchCvr"],"tabIndex":0},"lookupCvr":{"id":"lookupCvr","title":"Lookup CVR information","url":"lookupcvr.html","level":4,"parentId":"modules_module_cvr_page_1","tabIndex":0},"searchCvr":{"id":"searchCvr","title":"Search CVR","url":"searchcvr.html","level":4,"parentId":"modules_module_cvr_page_1","tabIndex":1},"modules_module_e_conomic":{"id":"modules_module_e_conomic","level":2,"parentId":"Tag_Modules","pages":["modules_module_e_conomic_page_1"],"tabIndex":3},"modules_module_e_conomic_page_1":{"id":"modules_module_e_conomic_page_1","level":3,"parentId":"modules_module_e_conomic","pages":["checkEconomicCustomerExists","createEconomicCustomer","exportDraftInvoiceToEconomic","exportInvoiceToEconomic","getEconomicCustomer","getEconomicDepartments","getEconomicLayouts","getEconomicPaymentTerms","getEconomicProducts","importEconomicCustomers"],"tabIndex":0},"checkEconomicCustomerExists":{"id":"checkEconomicCustomerExists","title":"Check if customer exists in e-conomic","url":"checkeconomiccustomerexists.html","level":4,"parentId":"modules_module_e_conomic_page_1","tabIndex":0},"createEconomicCustomer":{"id":"createEconomicCustomer","title":"Create e-conomic customer","url":"createeconomiccustomer.html","level":4,"parentId":"modules_module_e_conomic_page_1","tabIndex":1},"exportDraftInvoiceToEconomic":{"id":"exportDraftInvoiceToEconomic","title":"Export draft invoice to e-conomic","url":"exportdraftinvoicetoeconomic.html","level":4,"parentId":"modules_module_e_conomic_page_1","tabIndex":2},"exportInvoiceToEconomic":{"id":"exportInvoiceToEconomic","title":"Export invoice to e-conomic","url":"exportinvoicetoeconomic.html","level":4,"parentId":"modules_module_e_conomic_page_1","tabIndex":3},"getEconomicCustomer":{"id":"getEconomicCustomer","title":"Get e-conomic customer details","url":"geteconomiccustomer.html","level":4,"parentId":"modules_module_e_conomic_page_1","tabIndex":4},"getEconomicDepartments":{"id":"getEconomicDepartments","title":"Get e-conomic departments","url":"geteconomicdepartments.html","level":4,"parentId":"modules_module_e_conomic_page_1","tabIndex":5},"getEconomicLayouts":{"id":"getEconomicLayouts","title":"Get e-conomic layouts","url":"geteconomiclayouts.html","level":4,"parentId":"modules_module_e_conomic_page_1","tabIndex":6},"getEconomicPaymentTerms":{"id":"getEconomicPaymentTerms","title":"Get e-conomic payment terms","url":"geteconomicpaymentterms.html","level":4,"parentId":"modules_module_e_conomic_page_1","tabIndex":7},"getEconomicProducts":{"id":"getEconomicProducts","title":"Get e-conomic products","url":"geteconomicproducts.html","level":4,"parentId":"modules_module_e_conomic_page_1","tabIndex":8},"importEconomicCustomers":{"id":"importEconomicCustomers","title":"Import e-conomic customers","url":"importeconomiccustomers.html","level":4,"parentId":"modules_module_e_conomic_page_1","tabIndex":9},"modules_module_entra":{"id":"modules_module_entra","level":2,"parentId":"Tag_Modules","pages":["modules_module_entra_page_1"],"tabIndex":4},"modules_module_entra_page_1":{"id":"modules_module_entra_page_1","level":3,"parentId":"modules_module_entra","pages":["listEntraUsers"],"tabIndex":0},"listEntraUsers":{"id":"listEntraUsers","title":"List Microsoft Entra users","url":"listentrausers.html","level":4,"parentId":"modules_module_entra_page_1","tabIndex":0},"modules_module_fxratesapi":{"id":"modules_module_fxratesapi","level":2,"parentId":"Tag_Modules","pages":["modules_module_fxratesapi_page_1"],"tabIndex":5},"modules_module_fxratesapi_page_1":{"id":"modules_module_fxratesapi_page_1","level":3,"parentId":"modules_module_fxratesapi","pages":["getAllExchangeRates","getExchangeRate"],"tabIndex":0},"getAllExchangeRates":{"id":"getAllExchangeRates","title":"Get all exchange rates","url":"getallexchangerates.html","level":4,"parentId":"modules_module_fxratesapi_page_1","tabIndex":0},"getExchangeRate":{"id":"getExchangeRate","title":"Get exchange rate","url":"getexchangerate.html","level":4,"parentId":"modules_module_fxratesapi_page_1","tabIndex":1},"modules_module_motorapi":{"id":"modules_module_motorapi","level":2,"parentId":"Tag_Modules","pages":["modules_module_motorapi_page_1"],"tabIndex":6},"modules_module_motorapi_page_1":{"id":"modules_module_motorapi_page_1","level":3,"parentId":"modules_module_motorapi","pages":["motorApiLookup"],"tabIndex":0},"motorApiLookup":{"id":"motorApiLookup","title":"Lookup vehicle via MotorAPI","url":"motorapilookup.html","level":4,"parentId":"modules_module_motorapi_page_1","tabIndex":0},"modules_module_self_serve":{"id":"modules_module_self_serve","level":2,"parentId":"Tag_Modules","pages":["modules_module_self_serve_page_1"],"tabIndex":7},"modules_module_self_serve_page_1":{"id":"modules_module_self_serve_page_1","level":3,"parentId":"modules_module_self_serve","pages":["forceDisableSelfServeLaneMachine","forceEnableSelfServeLaneMachine","getSelfServeLaneStatus","enableSelfServeLaneMachineRelay","sendSelfServeLaneCommand","setSelfServeLaneAllowedServices"],"tabIndex":0},"forceDisableSelfServeLaneMachine":{"id":"forceDisableSelfServeLaneMachine","title":"Force disable MACHINE relay but keep lane as in-wash (superusers only)","url":"forcedisableselfservelanemachine.html","level":4,"parentId":"modules_module_self_serve_page_1","tabIndex":0},"forceEnableSelfServeLaneMachine":{"id":"forceEnableSelfServeLaneMachine","title":"Force enable MACHINE relay and mark lane as in-wash (superusers only)","url":"forceenableselfservelanemachine.html","level":4,"parentId":"modules_module_self_serve_page_1","tabIndex":1},"getSelfServeLaneStatus":{"id":"getSelfServeLaneStatus","title":"Get self-serve lane status","url":"getselfservelanestatus.html","level":4,"parentId":"modules_module_self_serve_page_1","tabIndex":2},"enableSelfServeLaneMachineRelay":{"id":"enableSelfServeLaneMachineRelay","title":"Manually enable MACHINE relay for a lane","url":"enableselfservelanemachinerelay.html","level":4,"parentId":"modules_module_self_serve_page_1","tabIndex":3},"sendSelfServeLaneCommand":{"id":"sendSelfServeLaneCommand","title":"Send self-serve lane command","url":"sendselfservelanecommand.html","level":4,"parentId":"modules_module_self_serve_page_1","tabIndex":4},"setSelfServeLaneAllowedServices":{"id":"setSelfServeLaneAllowedServices","title":"Set allowed services for a lane based on shown tasks","url":"setselfservelaneallowedservices.html","level":4,"parentId":"modules_module_self_serve_page_1","tabIndex":5},"modules_module_stripe":{"id":"modules_module_stripe","level":2,"parentId":"Tag_Modules","pages":["modules_module_stripe_page_1"],"tabIndex":8},"modules_module_stripe_page_1":{"id":"modules_module_stripe_page_1","level":3,"parentId":"modules_module_stripe","pages":["createStripeInvoice","getDepartmentTerminalLocation","getDepartmentTerminalReaders","listStripeCustomers","listStripePrices","listStripeProducts","listStripeTerminalLocations","listStripeTerminalReaders","setDepartmentTerminalLocation"],"tabIndex":0},"createStripeInvoice":{"id":"createStripeInvoice","title":"Create Stripe invoice","url":"createstripeinvoice.html","level":4,"parentId":"modules_module_stripe_page_1","tabIndex":0},"getDepartmentTerminalLocation":{"id":"getDepartmentTerminalLocation","title":"Get department terminal location","url":"getdepartmentterminallocation.html","level":4,"parentId":"modules_module_stripe_page_1","tabIndex":1},"getDepartmentTerminalReaders":{"id":"getDepartmentTerminalReaders","title":"Get department terminal readers","url":"getdepartmentterminalreaders.html","level":4,"parentId":"modules_module_stripe_page_1","tabIndex":2},"listStripeCustomers":{"id":"listStripeCustomers","title":"List Stripe customers","url":"liststripecustomers.html","level":4,"parentId":"modules_module_stripe_page_1","tabIndex":3},"listStripePrices":{"id":"listStripePrices","title":"List Stripe prices","url":"liststripeprices.html","level":4,"parentId":"modules_module_stripe_page_1","tabIndex":4},"listStripeProducts":{"id":"listStripeProducts","title":"List Stripe products","url":"liststripeproducts.html","level":4,"parentId":"modules_module_stripe_page_1","tabIndex":5},"listStripeTerminalLocations":{"id":"listStripeTerminalLocations","title":"List Stripe terminal locations","url":"liststripeterminallocations.html","level":4,"parentId":"modules_module_stripe_page_1","tabIndex":6},"listStripeTerminalReaders":{"id":"listStripeTerminalReaders","title":"List Stripe terminal readers","url":"liststripeterminalreaders.html","level":4,"parentId":"modules_module_stripe_page_1","tabIndex":7},"setDepartmentTerminalLocation":{"id":"setDepartmentTerminalLocation","title":"Set department terminal location","url":"setdepartmentterminallocation.html","level":4,"parentId":"modules_module_stripe_page_1","tabIndex":8},"modules_module_virkdata":{"id":"modules_module_virkdata","level":2,"parentId":"Tag_Modules","pages":["modules_module_virkdata_page_1"],"tabIndex":9},"modules_module_virkdata_page_1":{"id":"modules_module_virkdata_page_1","level":3,"parentId":"modules_module_virkdata","pages":["virkdataSearch"],"tabIndex":0},"virkdataSearch":{"id":"virkdataSearch","title":"Search VirkData","url":"virkdatasearch.html","level":4,"parentId":"modules_module_virkdata_page_1","tabIndex":0},"modules_module_wash_certificates":{"id":"modules_module_wash_certificates","level":2,"parentId":"Tag_Modules","pages":["modules_module_wash_certificates_page_1"],"tabIndex":10},"modules_module_wash_certificates_page_1":{"id":"modules_module_wash_certificates_page_1","level":3,"parentId":"modules_module_wash_certificates","pages":["listWashCertificates"],"tabIndex":0},"listWashCertificates":{"id":"listWashCertificates","title":"List wash certificates","url":"listwashcertificates.html","level":4,"parentId":"modules_module_wash_certificates_page_1","tabIndex":0},"modules_module_weatherapi":{"id":"modules_module_weatherapi","level":2,"parentId":"Tag_Modules","pages":["modules_module_weatherapi_page_1"],"tabIndex":11},"modules_module_weatherapi_page_1":{"id":"modules_module_weatherapi_page_1","level":3,"parentId":"modules_module_weatherapi","pages":["weatherApiCurrent","weatherApiForecast","weatherApiSearch"],"tabIndex":0},"weatherApiCurrent":{"id":"weatherApiCurrent","title":"Get current weather","url":"weatherapicurrent.html","level":4,"parentId":"modules_module_weatherapi_page_1","tabIndex":0},"weatherApiForecast":{"id":"weatherApiForecast","title":"Get weather forecast","url":"weatherapiforecast.html","level":4,"parentId":"modules_module_weatherapi_page_1","tabIndex":1},"weatherApiSearch":{"id":"weatherApiSearch","title":"Search weather locations","url":"weatherapisearch.html","level":4,"parentId":"modules_module_weatherapi_page_1","tabIndex":2},"modules_module_xlvask":{"id":"modules_module_xlvask","level":2,"parentId":"Tag_Modules","pages":["modules_module_xlvask_page_1"],"tabIndex":12},"modules_module_xlvask_page_1":{"id":"modules_module_xlvask_page_1","level":3,"parentId":"modules_module_xlvask","pages":["getXlvaskUsageLogs","getXlvaskUsageOrders","getXlvaskUsageOrdersFastLink","listXlvaskCustomers","listXlvaskVehicles"],"tabIndex":0},"getXlvaskUsageLogs":{"id":"getXlvaskUsageLogs","title":"Get XLVask usage logs","url":"getxlvaskusagelogs.html","level":4,"parentId":"modules_module_xlvask_page_1","tabIndex":0},"getXlvaskUsageOrders":{"id":"getXlvaskUsageOrders","title":"Get XLVask usage orders","url":"getxlvaskusageorders.html","level":4,"parentId":"modules_module_xlvask_page_1","tabIndex":1},"getXlvaskUsageOrdersFastLink":{"id":"getXlvaskUsageOrdersFastLink","title":"Get XLVask usage orders fast link","url":"getxlvaskusageordersfastlink.html","level":4,"parentId":"modules_module_xlvask_page_1","tabIndex":2},"listXlvaskCustomers":{"id":"listXlvaskCustomers","title":"List XLVask customers","url":"listxlvaskcustomers.html","level":4,"parentId":"modules_module_xlvask_page_1","tabIndex":3},"listXlvaskVehicles":{"id":"listXlvaskVehicles","title":"List XLVask vehicles","url":"listxlvaskvehicles.html","level":4,"parentId":"modules_module_xlvask_page_1","tabIndex":4},"Tag_Attachments":{"id":"Tag_Attachments","title":"Attachments","url":"tag-attachments.html","level":1,"parentId":"API-Reference","pages":["Tag_Attachments_Page_1"],"tabIndex":15},"Tag_Attachments_Page_1":{"id":"Tag_Attachments_Page_1","title":"Attachments - Page 1 of 1","url":"tag-attachments-page-1.html","level":2,"parentId":"Tag_Attachments","pages":["uploadAttachment","listOrderAttachments","downloadOrderAttachment","uploadOrderAttachment"],"tabIndex":0},"uploadAttachment":{"id":"uploadAttachment","title":"Upload attachment","url":"uploadattachment.html","level":3,"parentId":"Tag_Attachments_Page_1","tabIndex":0},"listOrderAttachments":{"id":"listOrderAttachments","title":"List order attachments","url":"listorderattachments.html","level":3,"parentId":"Tag_Attachments_Page_1","tabIndex":1},"downloadOrderAttachment":{"id":"downloadOrderAttachment","title":"Download order attachment","url":"downloadorderattachment.html","level":3,"parentId":"Tag_Attachments_Page_1","tabIndex":2},"uploadOrderAttachment":{"id":"uploadOrderAttachment","title":"Upload order attachment","url":"uploadorderattachment.html","level":3,"parentId":"Tag_Attachments_Page_1","tabIndex":3},"Tag_Forms":{"id":"Tag_Forms","title":"Forms","url":"tag-forms.html","level":1,"parentId":"API-Reference","pages":["Tag_Forms_Page_1"],"tabIndex":16},"Tag_Forms_Page_1":{"id":"Tag_Forms_Page_1","title":"Forms - Page 1 of 1","url":"tag-forms-page-1.html","level":2,"parentId":"Tag_Forms","pages":["getForm","submitForm"],"tabIndex":0},"getForm":{"id":"getForm","title":"Get form","url":"getform.html","level":3,"parentId":"Tag_Forms_Page_1","tabIndex":0},"submitForm":{"id":"submitForm","title":"Submit form","url":"submitform.html","level":3,"parentId":"Tag_Forms_Page_1","tabIndex":1},"Tag_Worker":{"id":"Tag_Worker","title":"Worker","url":"tag-worker.html","level":1,"parentId":"API-Reference","pages":["Tag_Worker_Page_1"],"tabIndex":17},"Tag_Worker_Page_1":{"id":"Tag_Worker_Page_1","title":"Worker - Page 1 of 1","url":"tag-worker-page-1.html","level":2,"parentId":"Tag_Worker","pages":["debugWorker","disableWorkerDebug","enableWorkerDebug","getWorkerLicensePlates","getWorkerStatus","updateWorkerVersion","getWorkerVersion"],"tabIndex":0},"debugWorker":{"id":"debugWorker","title":"Debug worker","url":"debugworker.html","level":3,"parentId":"Tag_Worker_Page_1","tabIndex":0},"disableWorkerDebug":{"id":"disableWorkerDebug","title":"Disable worker debug","url":"disableworkerdebug.html","level":3,"parentId":"Tag_Worker_Page_1","tabIndex":1},"enableWorkerDebug":{"id":"enableWorkerDebug","title":"Enable worker debug","url":"enableworkerdebug.html","level":3,"parentId":"Tag_Worker_Page_1","tabIndex":2},"getWorkerLicensePlates":{"id":"getWorkerLicensePlates","title":"Get unique license plates","url":"getworkerlicenseplates.html","level":3,"parentId":"Tag_Worker_Page_1","tabIndex":3},"getWorkerStatus":{"id":"getWorkerStatus","title":"Get worker status","url":"getworkerstatus.html","level":3,"parentId":"Tag_Worker_Page_1","tabIndex":4},"updateWorkerVersion":{"id":"updateWorkerVersion","title":"Update worker version","url":"updateworkerversion.html","level":3,"parentId":"Tag_Worker_Page_1","tabIndex":5},"getWorkerVersion":{"id":"getWorkerVersion","title":"Get worker version","url":"getworkerversion.html","level":3,"parentId":"Tag_Worker_Page_1","tabIndex":6},"Tag_Plate_Scans":{"id":"Tag_Plate_Scans","title":"Plate Scans","url":"tag-plate-scans.html","level":1,"parentId":"API-Reference","pages":["Tag_Plate_Scans_Page_1"],"tabIndex":18},"Tag_Plate_Scans_Page_1":{"id":"Tag_Plate_Scans_Page_1","title":"Plate Scans - Page 1 of 1","url":"tag-plate-scans-page-1.html","level":2,"parentId":"Tag_Plate_Scans","pages":["listDepartmentPlateScanners","listPlateScanners","addPlateScanner","updatePlateScanner","listPlateScans","recordPlateScan","recordDepartmentPlateScan","getPlateScanPostResults","addButtonPress","addButtonPressPost"],"tabIndex":0},"listDepartmentPlateScanners":{"id":"listDepartmentPlateScanners","title":"List department plate scanners","url":"listdepartmentplatescanners.html","level":3,"parentId":"Tag_Plate_Scans_Page_1","tabIndex":0},"listPlateScanners":{"id":"listPlateScanners","title":"List plate scanners","url":"listplatescanners.html","level":3,"parentId":"Tag_Plate_Scans_Page_1","tabIndex":1},"addPlateScanner":{"id":"addPlateScanner","title":"Add plate scanner","url":"addplatescanner.html","level":3,"parentId":"Tag_Plate_Scans_Page_1","tabIndex":2},"updatePlateScanner":{"id":"updatePlateScanner","title":"Update plate scanner","url":"updateplatescanner.html","level":3,"parentId":"Tag_Plate_Scans_Page_1","tabIndex":3},"listPlateScans":{"id":"listPlateScans","title":"List plate scans","url":"listplatescans.html","level":3,"parentId":"Tag_Plate_Scans_Page_1","tabIndex":4},"recordPlateScan":{"id":"recordPlateScan","title":"Record plate scan","url":"recordplatescan.html","level":3,"parentId":"Tag_Plate_Scans_Page_1","tabIndex":5},"recordDepartmentPlateScan":{"id":"recordDepartmentPlateScan","title":"Record plate scan for department","url":"recorddepartmentplatescan.html","level":3,"parentId":"Tag_Plate_Scans_Page_1","tabIndex":6},"getPlateScanPostResults":{"id":"getPlateScanPostResults","title":"Get post-scan results","url":"getplatescanpostresults.html","level":3,"parentId":"Tag_Plate_Scans_Page_1","tabIndex":7},"addButtonPress":{"id":"addButtonPress","title":"Record machine start button press webhook","url":"addbuttonpress.html","level":3,"parentId":"Tag_Plate_Scans_Page_1","tabIndex":8},"addButtonPressPost":{"id":"addButtonPressPost","title":"Record machine start button press webhook","url":"addbuttonpresspost.html","level":3,"parentId":"Tag_Plate_Scans_Page_1","tabIndex":9},"Tag_Config":{"id":"Tag_Config","title":"Config","url":"tag-config.html","level":1,"parentId":"API-Reference","pages":["config_module_backups","config_module_bird","config_module_e_conomic","config_module_email","config_module_entra","config_module_fxratesapi","config_module_gatewayapi","config_module_licenseplaterecognizer","config_module_limble","config_module_motorapi","config_module_ocrspace","config_module_openai","config_module_recaptcha","config_module_self_serve","config_module_shelly","config_module_stripe","config_module_virkdata","config_module_weatherapi","config_module_xlvask"],"tabIndex":19},"config_module_backups":{"id":"config_module_backups","level":2,"parentId":"Tag_Config","pages":["config_module_backups_page_1"],"tabIndex":0},"config_module_backups_page_1":{"id":"config_module_backups_page_1","level":3,"parentId":"config_module_backups","pages":["getBackupsConfig","updateBackupsConfig"],"tabIndex":0},"getBackupsConfig":{"id":"getBackupsConfig","title":"Get backups config","url":"getbackupsconfig.html","level":4,"parentId":"config_module_backups_page_1","tabIndex":0},"updateBackupsConfig":{"id":"updateBackupsConfig","title":"Update backups config","url":"updatebackupsconfig.html","level":4,"parentId":"config_module_backups_page_1","tabIndex":1},"config_module_bird":{"id":"config_module_bird","level":2,"parentId":"Tag_Config","pages":["config_module_bird_page_1"],"tabIndex":1},"config_module_bird_page_1":{"id":"config_module_bird_page_1","level":3,"parentId":"config_module_bird","pages":["getBirdConfig","updateBirdConfig"],"tabIndex":0},"getBirdConfig":{"id":"getBirdConfig","title":"Get Bird config","url":"getbirdconfig.html","level":4,"parentId":"config_module_bird_page_1","tabIndex":0},"updateBirdConfig":{"id":"updateBirdConfig","title":"Update Bird config","url":"updatebirdconfig.html","level":4,"parentId":"config_module_bird_page_1","tabIndex":1},"config_module_e_conomic":{"id":"config_module_e_conomic","level":2,"parentId":"Tag_Config","pages":["config_module_e_conomic_page_1"],"tabIndex":2},"config_module_e_conomic_page_1":{"id":"config_module_e_conomic_page_1","level":3,"parentId":"config_module_e_conomic","pages":["getEconomicConfig","updateEconomicConfig"],"tabIndex":0},"getEconomicConfig":{"id":"getEconomicConfig","title":"Get e-conomic config","url":"geteconomicconfig.html","level":4,"parentId":"config_module_e_conomic_page_1","tabIndex":0},"updateEconomicConfig":{"id":"updateEconomicConfig","title":"Update e-conomic config","url":"updateeconomicconfig.html","level":4,"parentId":"config_module_e_conomic_page_1","tabIndex":1},"config_module_email":{"id":"config_module_email","level":2,"parentId":"Tag_Config","pages":["config_module_email_page_1"],"tabIndex":3},"config_module_email_page_1":{"id":"config_module_email_page_1","level":3,"parentId":"config_module_email","pages":["getEmailConfig","testEmailConfig","updateEmailConfig"],"tabIndex":0},"getEmailConfig":{"id":"getEmailConfig","title":"Get email config","url":"getemailconfig.html","level":4,"parentId":"config_module_email_page_1","tabIndex":0},"testEmailConfig":{"id":"testEmailConfig","title":"Test email config","url":"testemailconfig.html","level":4,"parentId":"config_module_email_page_1","tabIndex":1},"updateEmailConfig":{"id":"updateEmailConfig","title":"Update email config","url":"updateemailconfig.html","level":4,"parentId":"config_module_email_page_1","tabIndex":2},"config_module_entra":{"id":"config_module_entra","level":2,"parentId":"Tag_Config","pages":["config_module_entra_page_1"],"tabIndex":4},"config_module_entra_page_1":{"id":"config_module_entra_page_1","level":3,"parentId":"config_module_entra","pages":["getEntraConfig","updateEntraConfig"],"tabIndex":0},"getEntraConfig":{"id":"getEntraConfig","title":"Get Entra config","url":"getentraconfig.html","level":4,"parentId":"config_module_entra_page_1","tabIndex":0},"updateEntraConfig":{"id":"updateEntraConfig","title":"Update Entra config","url":"updateentraconfig.html","level":4,"parentId":"config_module_entra_page_1","tabIndex":1},"config_module_fxratesapi":{"id":"config_module_fxratesapi","level":2,"parentId":"Tag_Config","pages":["config_module_fxratesapi_page_1"],"tabIndex":5},"config_module_fxratesapi_page_1":{"id":"config_module_fxratesapi_page_1","level":3,"parentId":"config_module_fxratesapi","pages":["getFxRatesApiConfig","updateFxRatesApiConfig"],"tabIndex":0},"getFxRatesApiConfig":{"id":"getFxRatesApiConfig","title":"Get FXRatesAPI config","url":"getfxratesapiconfig.html","level":4,"parentId":"config_module_fxratesapi_page_1","tabIndex":0},"updateFxRatesApiConfig":{"id":"updateFxRatesApiConfig","title":"Update FXRatesAPI config","url":"updatefxratesapiconfig.html","level":4,"parentId":"config_module_fxratesapi_page_1","tabIndex":1},"config_module_gatewayapi":{"id":"config_module_gatewayapi","level":2,"parentId":"Tag_Config","pages":["config_module_gatewayapi_page_1"],"tabIndex":6},"config_module_gatewayapi_page_1":{"id":"config_module_gatewayapi_page_1","level":3,"parentId":"config_module_gatewayapi","pages":["getGatewayApiConfig","updateGatewayApiConfig"],"tabIndex":0},"getGatewayApiConfig":{"id":"getGatewayApiConfig","title":"Get GatewayAPI config","url":"getgatewayapiconfig.html","level":4,"parentId":"config_module_gatewayapi_page_1","tabIndex":0},"updateGatewayApiConfig":{"id":"updateGatewayApiConfig","title":"Update GatewayAPI config","url":"updategatewayapiconfig.html","level":4,"parentId":"config_module_gatewayapi_page_1","tabIndex":1},"config_module_licenseplaterecognizer":{"id":"config_module_licenseplaterecognizer","level":2,"parentId":"Tag_Config","pages":["config_module_licenseplaterecognizer_page_1"],"tabIndex":7},"config_module_licenseplaterecognizer_page_1":{"id":"config_module_licenseplaterecognizer_page_1","level":3,"parentId":"config_module_licenseplaterecognizer","pages":["getLicensePlateRecognizerConfig","updateLicensePlateRecognizerConfig"],"tabIndex":0},"getLicensePlateRecognizerConfig":{"id":"getLicensePlateRecognizerConfig","title":"Get LicensePlateRecognizer config","url":"getlicenseplaterecognizerconfig.html","level":4,"parentId":"config_module_licenseplaterecognizer_page_1","tabIndex":0},"updateLicensePlateRecognizerConfig":{"id":"updateLicensePlateRecognizerConfig","title":"Update LicensePlateRecognizer config","url":"updatelicenseplaterecognizerconfig.html","level":4,"parentId":"config_module_licenseplaterecognizer_page_1","tabIndex":1},"config_module_limble":{"id":"config_module_limble","level":2,"parentId":"Tag_Config","pages":["config_module_limble_page_1"],"tabIndex":8},"config_module_limble_page_1":{"id":"config_module_limble_page_1","level":3,"parentId":"config_module_limble","pages":["getLimbleConfig","updateLimbleConfig"],"tabIndex":0},"getLimbleConfig":{"id":"getLimbleConfig","title":"Get Limble config","url":"getlimbleconfig.html","level":4,"parentId":"config_module_limble_page_1","tabIndex":0},"updateLimbleConfig":{"id":"updateLimbleConfig","title":"Update Limble config","url":"updatelimbleconfig.html","level":4,"parentId":"config_module_limble_page_1","tabIndex":1},"config_module_motorapi":{"id":"config_module_motorapi","level":2,"parentId":"Tag_Config","pages":["config_module_motorapi_page_1"],"tabIndex":9},"config_module_motorapi_page_1":{"id":"config_module_motorapi_page_1","level":3,"parentId":"config_module_motorapi","pages":["getMotorApiConfig","updateMotorApiConfig"],"tabIndex":0},"getMotorApiConfig":{"id":"getMotorApiConfig","title":"Get MotorAPI config","url":"getmotorapiconfig.html","level":4,"parentId":"config_module_motorapi_page_1","tabIndex":0},"updateMotorApiConfig":{"id":"updateMotorApiConfig","title":"Update MotorAPI config","url":"updatemotorapiconfig.html","level":4,"parentId":"config_module_motorapi_page_1","tabIndex":1},"config_module_ocrspace":{"id":"config_module_ocrspace","level":2,"parentId":"Tag_Config","pages":["config_module_ocrspace_page_1"],"tabIndex":10},"config_module_ocrspace_page_1":{"id":"config_module_ocrspace_page_1","level":3,"parentId":"config_module_ocrspace","pages":["getOcrSpaceConfig","updateOcrSpaceConfig"],"tabIndex":0},"getOcrSpaceConfig":{"id":"getOcrSpaceConfig","title":"Get OcrSpace config","url":"getocrspaceconfig.html","level":4,"parentId":"config_module_ocrspace_page_1","tabIndex":0},"updateOcrSpaceConfig":{"id":"updateOcrSpaceConfig","title":"Update OcrSpace config","url":"updateocrspaceconfig.html","level":4,"parentId":"config_module_ocrspace_page_1","tabIndex":1},"config_module_openai":{"id":"config_module_openai","level":2,"parentId":"Tag_Config","pages":["config_module_openai_page_1"],"tabIndex":11},"config_module_openai_page_1":{"id":"config_module_openai_page_1","level":3,"parentId":"config_module_openai","pages":["getOpenAiConfig","updateOpenAiConfig"],"tabIndex":0},"getOpenAiConfig":{"id":"getOpenAiConfig","title":"Get OpenAI config","url":"getopenaiconfig.html","level":4,"parentId":"config_module_openai_page_1","tabIndex":0},"updateOpenAiConfig":{"id":"updateOpenAiConfig","title":"Update OpenAI config","url":"updateopenaiconfig.html","level":4,"parentId":"config_module_openai_page_1","tabIndex":1},"config_module_recaptcha":{"id":"config_module_recaptcha","level":2,"parentId":"Tag_Config","pages":["config_module_recaptcha_page_1"],"tabIndex":12},"config_module_recaptcha_page_1":{"id":"config_module_recaptcha_page_1","level":3,"parentId":"config_module_recaptcha","pages":["getRecaptchaModuleConfig","updateRecaptchaConfig"],"tabIndex":0},"getRecaptchaModuleConfig":{"id":"getRecaptchaModuleConfig","title":"Get reCAPTCHA config","url":"getrecaptchamoduleconfig.html","level":4,"parentId":"config_module_recaptcha_page_1","tabIndex":0},"updateRecaptchaConfig":{"id":"updateRecaptchaConfig","title":"Update reCAPTCHA config","url":"updaterecaptchaconfig.html","level":4,"parentId":"config_module_recaptcha_page_1","tabIndex":1},"config_module_self_serve":{"id":"config_module_self_serve","level":2,"parentId":"Tag_Config","pages":["config_module_self_serve_page_1"],"tabIndex":13},"config_module_self_serve_page_1":{"id":"config_module_self_serve_page_1","level":3,"parentId":"config_module_self_serve","pages":["getSelfServeConfig","updateSelfServeConfig"],"tabIndex":0},"getSelfServeConfig":{"id":"getSelfServeConfig","title":"Get Self-Serve config","url":"getselfserveconfig.html","level":4,"parentId":"config_module_self_serve_page_1","tabIndex":0},"updateSelfServeConfig":{"id":"updateSelfServeConfig","title":"Update Self-Serve config","url":"updateselfserveconfig.html","level":4,"parentId":"config_module_self_serve_page_1","tabIndex":1},"config_module_shelly":{"id":"config_module_shelly","level":2,"parentId":"Tag_Config","pages":["config_module_shelly_page_1"],"tabIndex":14},"config_module_shelly_page_1":{"id":"config_module_shelly_page_1","level":3,"parentId":"config_module_shelly","pages":["getShellyConfig","updateShellyConfig"],"tabIndex":0},"getShellyConfig":{"id":"getShellyConfig","title":"Get Shelly config","url":"getshellyconfig.html","level":4,"parentId":"config_module_shelly_page_1","tabIndex":0},"updateShellyConfig":{"id":"updateShellyConfig","title":"Update Shelly config","url":"updateshellyconfig.html","level":4,"parentId":"config_module_shelly_page_1","tabIndex":1},"config_module_stripe":{"id":"config_module_stripe","level":2,"parentId":"Tag_Config","pages":["config_module_stripe_page_1"],"tabIndex":15},"config_module_stripe_page_1":{"id":"config_module_stripe_page_1","level":3,"parentId":"config_module_stripe","pages":["getStripeConfig","updateStripeConfig"],"tabIndex":0},"getStripeConfig":{"id":"getStripeConfig","title":"Get Stripe config","url":"getstripeconfig.html","level":4,"parentId":"config_module_stripe_page_1","tabIndex":0},"updateStripeConfig":{"id":"updateStripeConfig","title":"Update Stripe config","url":"updatestripeconfig.html","level":4,"parentId":"config_module_stripe_page_1","tabIndex":1},"config_module_virkdata":{"id":"config_module_virkdata","level":2,"parentId":"Tag_Config","pages":["config_module_virkdata_page_1"],"tabIndex":16},"config_module_virkdata_page_1":{"id":"config_module_virkdata_page_1","level":3,"parentId":"config_module_virkdata","pages":["getVirkdataConfig","updateVirkdataConfig"],"tabIndex":0},"getVirkdataConfig":{"id":"getVirkdataConfig","title":"Get Virkdata config","url":"getvirkdataconfig.html","level":4,"parentId":"config_module_virkdata_page_1","tabIndex":0},"updateVirkdataConfig":{"id":"updateVirkdataConfig","title":"Update Virkdata config","url":"updatevirkdataconfig.html","level":4,"parentId":"config_module_virkdata_page_1","tabIndex":1},"config_module_weatherapi":{"id":"config_module_weatherapi","level":2,"parentId":"Tag_Config","pages":["config_module_weatherapi_page_1"],"tabIndex":17},"config_module_weatherapi_page_1":{"id":"config_module_weatherapi_page_1","level":3,"parentId":"config_module_weatherapi","pages":["getWeatherApiConfig","updateWeatherApiConfig"],"tabIndex":0},"getWeatherApiConfig":{"id":"getWeatherApiConfig","title":"Get WeatherAPI config","url":"getweatherapiconfig.html","level":4,"parentId":"config_module_weatherapi_page_1","tabIndex":0},"updateWeatherApiConfig":{"id":"updateWeatherApiConfig","title":"Update WeatherAPI config","url":"updateweatherapiconfig.html","level":4,"parentId":"config_module_weatherapi_page_1","tabIndex":1},"config_module_xlvask":{"id":"config_module_xlvask","level":2,"parentId":"Tag_Config","pages":["config_module_xlvask_page_1"],"tabIndex":18},"config_module_xlvask_page_1":{"id":"config_module_xlvask_page_1","level":3,"parentId":"config_module_xlvask","pages":["getXlvaskConfig","updateXlvaskConfig"],"tabIndex":0},"getXlvaskConfig":{"id":"getXlvaskConfig","title":"Get XLVask config","url":"getxlvaskconfig.html","level":4,"parentId":"config_module_xlvask_page_1","tabIndex":0},"updateXlvaskConfig":{"id":"updateXlvaskConfig","title":"Update XLVask config","url":"updatexlvaskconfig.html","level":4,"parentId":"config_module_xlvask_page_1","tabIndex":1},"Tag_Branding":{"id":"Tag_Branding","title":"Branding","url":"tag-branding.html","level":1,"parentId":"API-Reference","pages":["Tag_Branding_Page_1"],"tabIndex":20},"Tag_Branding_Page_1":{"id":"Tag_Branding_Page_1","title":"Branding - Page 1 of 1","url":"tag-branding-page-1.html","level":2,"parentId":"Tag_Branding","pages":["listBrandingOptions","addBrandingOption","editBrandingOption"],"tabIndex":0},"listBrandingOptions":{"id":"listBrandingOptions","title":"List branding options","url":"listbrandingoptions.html","level":3,"parentId":"Tag_Branding_Page_1","tabIndex":0},"addBrandingOption":{"id":"addBrandingOption","title":"Add branding option","url":"addbrandingoption.html","level":3,"parentId":"Tag_Branding_Page_1","tabIndex":1},"editBrandingOption":{"id":"editBrandingOption","title":"Edit branding option","url":"editbrandingoption.html","level":3,"parentId":"Tag_Branding_Page_1","tabIndex":2},"Tag_Roles":{"id":"Tag_Roles","title":"Roles","url":"tag-roles.html","level":1,"parentId":"API-Reference","pages":["Tag_Roles_Page_1"],"tabIndex":21},"Tag_Roles_Page_1":{"id":"Tag_Roles_Page_1","title":"Roles - Page 1 of 1","url":"tag-roles-page-1.html","level":2,"parentId":"Tag_Roles","pages":["listRoles","addRole","editRole","cloneRole","removeRolePermission","addRolePermission"],"tabIndex":0},"listRoles":{"id":"listRoles","title":"List roles","url":"listroles.html","level":3,"parentId":"Tag_Roles_Page_1","tabIndex":0},"addRole":{"id":"addRole","title":"Add role","url":"addrole.html","level":3,"parentId":"Tag_Roles_Page_1","tabIndex":1},"editRole":{"id":"editRole","title":"Edit role","url":"editrole.html","level":3,"parentId":"Tag_Roles_Page_1","tabIndex":2},"cloneRole":{"id":"cloneRole","title":"Clone role","url":"clonerole.html","level":3,"parentId":"Tag_Roles_Page_1","tabIndex":3},"removeRolePermission":{"id":"removeRolePermission","title":"Remove permission from role","url":"removerolepermission.html","level":3,"parentId":"Tag_Roles_Page_1","tabIndex":4},"addRolePermission":{"id":"addRolePermission","title":"Add permission to role","url":"addrolepermission.html","level":3,"parentId":"Tag_Roles_Page_1","tabIndex":5},"Tag_Self_Serve":{"id":"Tag_Self_Serve","title":"Self-Serve","url":"tag-self-serve.html","level":1,"parentId":"API-Reference","pages":["Tag_Self_Serve_Page_1","Tag_Self_Serve_Page_2"],"tabIndex":22},"Tag_Self_Serve_Page_1":{"id":"Tag_Self_Serve_Page_1","title":"Self-Serve - Page 1 of 2","url":"tag-self-serve-page-1.html","level":2,"parentId":"Tag_Self_Serve","pages":["deleteSelfserveConditionRule","listSelfserveConditionRules","addSelfserveConditionRule","updateSelfserveConditionRule","deleteSelfserveCondition","listSelfserveConditions","addSelfserveCondition","updateSelfserveCondition","deleteSelfserveMachineType","listSelfserveMachineTypes","addSelfserveMachineType","updateSelfserveMachineType","deleteSelfserveQuestion","listSelfserveQuestions","addSelfserveQuestion","updateSelfserveQuestion","deleteSelfserveTask","listSelfserveTasks","addSelfserveTask","updateSelfserveTask"],"tabIndex":0},"deleteSelfserveConditionRule":{"id":"deleteSelfserveConditionRule","title":"Delete self-serve condition rule","url":"deleteselfserveconditionrule.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":0},"listSelfserveConditionRules":{"id":"listSelfserveConditionRules","title":"List self-serve condition rules","url":"listselfserveconditionrules.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":1},"addSelfserveConditionRule":{"id":"addSelfserveConditionRule","title":"Add self-serve condition rule","url":"addselfserveconditionrule.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":2},"updateSelfserveConditionRule":{"id":"updateSelfserveConditionRule","title":"Update self-serve condition rule","url":"updateselfserveconditionrule.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":3},"deleteSelfserveCondition":{"id":"deleteSelfserveCondition","title":"Delete self-serve condition","url":"deleteselfservecondition.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":4},"listSelfserveConditions":{"id":"listSelfserveConditions","title":"List self-serve conditions","url":"listselfserveconditions.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":5},"addSelfserveCondition":{"id":"addSelfserveCondition","title":"Add self-serve condition","url":"addselfservecondition.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":6},"updateSelfserveCondition":{"id":"updateSelfserveCondition","title":"Update self-serve condition","url":"updateselfservecondition.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":7},"deleteSelfserveMachineType":{"id":"deleteSelfserveMachineType","title":"Delete reusable self-serve machine type","url":"deleteselfservemachinetype.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":8},"listSelfserveMachineTypes":{"id":"listSelfserveMachineTypes","title":"List reusable self-serve machine types","url":"listselfservemachinetypes.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":9},"addSelfserveMachineType":{"id":"addSelfserveMachineType","title":"Add reusable self-serve machine type","url":"addselfservemachinetype.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":10},"updateSelfserveMachineType":{"id":"updateSelfserveMachineType","title":"Update reusable self-serve machine type","url":"updateselfservemachinetype.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":11},"deleteSelfserveQuestion":{"id":"deleteSelfserveQuestion","title":"Delete self-serve question","url":"deleteselfservequestion.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":12},"listSelfserveQuestions":{"id":"listSelfserveQuestions","title":"List self-serve questions","url":"listselfservequestions.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":13},"addSelfserveQuestion":{"id":"addSelfserveQuestion","title":"Add self-serve question","url":"addselfservequestion.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":14},"updateSelfserveQuestion":{"id":"updateSelfserveQuestion","title":"Update self-serve question","url":"updateselfservequestion.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":15},"deleteSelfserveTask":{"id":"deleteSelfserveTask","title":"Delete self-serve task","url":"deleteselfservetask.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":16},"listSelfserveTasks":{"id":"listSelfserveTasks","title":"List self-serve tasks","url":"listselfservetasks.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":17},"addSelfserveTask":{"id":"addSelfserveTask","title":"Add self-serve task","url":"addselfservetask.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":18},"updateSelfserveTask":{"id":"updateSelfserveTask","title":"Update self-serve task","url":"updateselfservetask.html","level":3,"parentId":"Tag_Self_Serve_Page_1","tabIndex":19},"Tag_Self_Serve_Page_2":{"id":"Tag_Self_Serve_Page_2","title":"Self-Serve - Page 2 of 2","url":"tag-self-serve-page-2.html","level":2,"parentId":"Tag_Self_Serve","pages":["deleteSelfserveTaskAttachment","listSelfserveTaskAttachments","downloadSelfserveTaskAttachment","uploadSelfserveTaskAttachment","getSelfserveVehicleAllowed","deleteSelfserveVehicleCondition","listSelfserveVehicleConditions","addSelfserveVehicleCondition","updateSelfserveVehicleCondition","getSelfserveWashSummary"],"tabIndex":1},"deleteSelfserveTaskAttachment":{"id":"deleteSelfserveTaskAttachment","title":"Delete task attachment","url":"deleteselfservetaskattachment.html","level":3,"parentId":"Tag_Self_Serve_Page_2","tabIndex":0},"listSelfserveTaskAttachments":{"id":"listSelfserveTaskAttachments","title":"List task attachments","url":"listselfservetaskattachments.html","level":3,"parentId":"Tag_Self_Serve_Page_2","tabIndex":1},"downloadSelfserveTaskAttachment":{"id":"downloadSelfserveTaskAttachment","title":"Download task attachment","url":"downloadselfservetaskattachment.html","level":3,"parentId":"Tag_Self_Serve_Page_2","tabIndex":2},"uploadSelfserveTaskAttachment":{"id":"uploadSelfserveTaskAttachment","title":"Upload task attachment","url":"uploadselfservetaskattachment.html","level":3,"parentId":"Tag_Self_Serve_Page_2","tabIndex":3},"getSelfserveVehicleAllowed":{"id":"getSelfserveVehicleAllowed","title":"Check whether self-serve is allowed for a vehicle on a lane","url":"getselfservevehicleallowed.html","level":3,"parentId":"Tag_Self_Serve_Page_2","tabIndex":4},"deleteSelfserveVehicleCondition":{"id":"deleteSelfserveVehicleCondition","title":"Delete vehicle condition","url":"deleteselfservevehiclecondition.html","level":3,"parentId":"Tag_Self_Serve_Page_2","tabIndex":5},"listSelfserveVehicleConditions":{"id":"listSelfserveVehicleConditions","title":"List vehicle conditions","url":"listselfservevehicleconditions.html","level":3,"parentId":"Tag_Self_Serve_Page_2","tabIndex":6},"addSelfserveVehicleCondition":{"id":"addSelfserveVehicleCondition","title":"Add vehicle condition","url":"addselfservevehiclecondition.html","level":3,"parentId":"Tag_Self_Serve_Page_2","tabIndex":7},"updateSelfserveVehicleCondition":{"id":"updateSelfserveVehicleCondition","title":"Update vehicle condition","url":"updateselfservevehiclecondition.html","level":3,"parentId":"Tag_Self_Serve_Page_2","tabIndex":8},"getSelfserveWashSummary":{"id":"getSelfserveWashSummary","title":"Get self-serve wash summary","url":"getselfservewashsummary.html","level":3,"parentId":"Tag_Self_Serve_Page_2","tabIndex":9},"Tag_Goals":{"id":"Tag_Goals","title":"Goals","url":"tag-goals.html","level":1,"parentId":"API-Reference","pages":["Tag_Goals_Page_1"],"tabIndex":23},"Tag_Goals_Page_1":{"id":"Tag_Goals_Page_1","title":"Goals - Page 1 of 1","url":"tag-goals-page-1.html","level":2,"parentId":"Tag_Goals","pages":["listDepartmentGoals","createDepartmentGoal","updateDepartmentGoal","deleteDepartmentGoal","sendDepartmentGoalProgressAlertTest"],"tabIndex":0},"listDepartmentGoals":{"id":"listDepartmentGoals","title":"List or get department goals","url":"listdepartmentgoals.html","level":3,"parentId":"Tag_Goals_Page_1","tabIndex":0},"createDepartmentGoal":{"id":"createDepartmentGoal","title":"Create department goal","url":"createdepartmentgoal.html","level":3,"parentId":"Tag_Goals_Page_1","tabIndex":1},"updateDepartmentGoal":{"id":"updateDepartmentGoal","title":"Update department goal","url":"updatedepartmentgoal.html","level":3,"parentId":"Tag_Goals_Page_1","tabIndex":2},"deleteDepartmentGoal":{"id":"deleteDepartmentGoal","title":"Delete department goal","url":"deletedepartmentgoal.html","level":3,"parentId":"Tag_Goals_Page_1","tabIndex":3},"sendDepartmentGoalProgressAlertTest":{"id":"sendDepartmentGoalProgressAlertTest","title":"Send a test progress alert for a department goal","url":"senddepartmentgoalprogressalerttest.html","level":3,"parentId":"Tag_Goals_Page_1","tabIndex":4},"Tag_Subusers":{"id":"Tag_Subusers","title":"Subusers","url":"tag-subusers.html","level":1,"parentId":"API-Reference","pages":["Tag_Subusers_Page_1"],"tabIndex":24},"Tag_Subusers_Page_1":{"id":"Tag_Subusers_Page_1","title":"Subusers - Page 1 of 1","url":"tag-subusers-page-1.html","level":2,"parentId":"Tag_Subusers","pages":["listSubusers","subuserPasswordAuth","listSubuserGrants","createSubuserGrant","deleteSubuserGrant","updateSubuserGrant","getCurrentSubuser","createSubuser","listSubuserPermissionNodes","validateSubuserSetupToken","completeSubuserSetup","getSubuser"],"tabIndex":0},"listSubusers":{"id":"listSubusers","title":"List subusers visible to the authenticated user","url":"listsubusers.html","level":3,"parentId":"Tag_Subusers_Page_1","tabIndex":0},"subuserPasswordAuth":{"id":"subuserPasswordAuth","title":"Authenticate subuser with password","url":"subuserpasswordauth.html","level":3,"parentId":"Tag_Subusers_Page_1","tabIndex":1},"listSubuserGrants":{"id":"listSubuserGrants","title":"List subuser grants","url":"listsubusergrants.html","level":3,"parentId":"Tag_Subusers_Page_1","tabIndex":2},"createSubuserGrant":{"id":"createSubuserGrant","title":"Create subuser grant","url":"createsubusergrant.html","level":3,"parentId":"Tag_Subusers_Page_1","tabIndex":3},"deleteSubuserGrant":{"id":"deleteSubuserGrant","title":"Delete subuser grant","url":"deletesubusergrant.html","level":3,"parentId":"Tag_Subusers_Page_1","tabIndex":4},"updateSubuserGrant":{"id":"updateSubuserGrant","title":"Update subuser grant","url":"updatesubusergrant.html","level":3,"parentId":"Tag_Subusers_Page_1","tabIndex":5},"getCurrentSubuser":{"id":"getCurrentSubuser","title":"Get current subuser profile","url":"getcurrentsubuser.html","level":3,"parentId":"Tag_Subusers_Page_1","tabIndex":6},"createSubuser":{"id":"createSubuser","title":"Create a subuser registration","url":"createsubuser.html","level":3,"parentId":"Tag_Subusers_Page_1","tabIndex":7},"listSubuserPermissionNodes":{"id":"listSubuserPermissionNodes","title":"List available subuser permission nodes","url":"listsubuserpermissionnodes.html","level":3,"parentId":"Tag_Subusers_Page_1","tabIndex":8},"validateSubuserSetupToken":{"id":"validateSubuserSetupToken","title":"Validate setup token","url":"validatesubusersetuptoken.html","level":3,"parentId":"Tag_Subusers_Page_1","tabIndex":9},"completeSubuserSetup":{"id":"completeSubuserSetup","title":"Complete subuser setup","url":"completesubusersetup.html","level":3,"parentId":"Tag_Subusers_Page_1","tabIndex":10},"getSubuser":{"id":"getSubuser","title":"Get a subuser by ID (visible by grant)","url":"getsubuser.html","level":3,"parentId":"Tag_Subusers_Page_1","tabIndex":11},"Tag_Bird":{"id":"Tag_Bird","title":"Bird","url":"tag-bird.html","level":1,"parentId":"API-Reference","pages":["Tag_Bird_Page_1"],"tabIndex":25},"Tag_Bird_Page_1":{"id":"Tag_Bird_Page_1","title":"Bird - Page 1 of 1","url":"tag-bird-page-1.html","level":2,"parentId":"Tag_Bird","pages":["birdListNumbers","birdDeleteNumber","birdGetNumber","birdListVoiceCalls","birdCreateVoiceCall","birdTestOutboundVoiceCall","birdGetVoiceCall","birdHangupVoiceCall","birdSayOnVoiceCall","birdListFlashCalls","birdCreateFlashCall","birdEndFlashCallByNumbers","birdGetFlashCall","birdEndFlashCall"],"tabIndex":0},"birdListNumbers":{"id":"birdListNumbers","title":"List your numbers","url":"birdlistnumbers.html","level":3,"parentId":"Tag_Bird_Page_1","tabIndex":0},"birdDeleteNumber":{"id":"birdDeleteNumber","title":"Delete/release a number by ID","url":"birddeletenumber.html","level":3,"parentId":"Tag_Bird_Page_1","tabIndex":1},"birdGetNumber":{"id":"birdGetNumber","title":"Get a number by ID","url":"birdgetnumber.html","level":3,"parentId":"Tag_Bird_Page_1","tabIndex":2},"birdListVoiceCalls":{"id":"birdListVoiceCalls","title":"List voice calls","url":"birdlistvoicecalls.html","level":3,"parentId":"Tag_Bird_Page_1","tabIndex":3},"birdCreateVoiceCall":{"id":"birdCreateVoiceCall","title":"Create/place a voice call via Bird","url":"birdcreatevoicecall.html","level":3,"parentId":"Tag_Bird_Page_1","tabIndex":4},"birdTestOutboundVoiceCall":{"id":"birdTestOutboundVoiceCall","title":"Place a test outbound call and hang up when accepted","url":"birdtestoutboundvoicecall.html","level":3,"parentId":"Tag_Bird_Page_1","tabIndex":5},"birdGetVoiceCall":{"id":"birdGetVoiceCall","title":"Get a voice call by ID","url":"birdgetvoicecall.html","level":3,"parentId":"Tag_Bird_Page_1","tabIndex":6},"birdHangupVoiceCall":{"id":"birdHangupVoiceCall","title":"Hang up a voice call by ID","url":"birdhangupvoicecall.html","level":3,"parentId":"Tag_Bird_Page_1","tabIndex":7},"birdSayOnVoiceCall":{"id":"birdSayOnVoiceCall","title":"Say a message on an active voice call and hang up afterwards","url":"birdsayonvoicecall.html","level":3,"parentId":"Tag_Bird_Page_1","tabIndex":8},"birdListFlashCalls":{"id":"birdListFlashCalls","title":"List flash calls","url":"birdlistflashcalls.html","level":3,"parentId":"Tag_Bird_Page_1","tabIndex":9},"birdCreateFlashCall":{"id":"birdCreateFlashCall","title":"Create/place a flash call via Bird","url":"birdcreateflashcall.html","level":3,"parentId":"Tag_Bird_Page_1","tabIndex":10},"birdEndFlashCallByNumbers":{"id":"birdEndFlashCallByNumbers","title":"Complete/end a flash call using from/to numbers","url":"birdendflashcallbynumbers.html","level":3,"parentId":"Tag_Bird_Page_1","tabIndex":11},"birdGetFlashCall":{"id":"birdGetFlashCall","title":"Get a flash call by ID","url":"birdgetflashcall.html","level":3,"parentId":"Tag_Bird_Page_1","tabIndex":12},"birdEndFlashCall":{"id":"birdEndFlashCall","title":"Complete/end a flash call by ID","url":"birdendflashcall.html","level":3,"parentId":"Tag_Bird_Page_1","tabIndex":13},"Vehicles_PUT":{"id":"Vehicles_PUT","level":0,"tabIndex":3},"Customers_PUT":{"id":"Customers_PUT","level":0,"tabIndex":4},"Vehicles_GET":{"id":"Vehicles_GET","level":0,"tabIndex":5},"Customers_id_DELETE":{"id":"Customers_id_DELETE","level":0,"tabIndex":6},"Config_Module_GatewayAPI":{"id":"Config_Module_GatewayAPI","title":"GatewayAPI","url":"config-module-gatewayapi.html","level":0,"tabIndex":7},"Config_Module_reCAPTCHA":{"id":"Config_Module_reCAPTCHA","title":"reCAPTCHA","url":"config-module-recaptcha.html","level":0,"tabIndex":8},"API_Reference":{"id":"API_Reference","level":0,"tabIndex":9},"Vehicles_id_DELETE":{"id":"Vehicles_id_DELETE","level":0,"tabIndex":10},"Customers_POST":{"id":"Customers_POST","level":0,"tabIndex":11},"Vehicles_POST":{"id":"Vehicles_POST","level":0,"tabIndex":12},"UsageLog_GET":{"id":"UsageLog_GET","level":0,"tabIndex":13},"Customers_GET":{"id":"Customers_GET","level":0,"tabIndex":14},"User_Bookings_Delete_POST":{"id":"User_Bookings_Delete_POST","level":0,"tabIndex":15},"Department_Timebookings_Entries_Public_POST":{"id":"Department_Timebookings_Entries_Public_POST","level":0,"tabIndex":16},"Bookings_Download_PDF_GET":{"id":"Bookings_Download_PDF_GET","level":0,"tabIndex":17},"User_Bookings_Washcertificate_Download_POST":{"id":"User_Bookings_Washcertificate_Download_POST","level":0,"tabIndex":18},"User_Bookings_GET":{"id":"User_Bookings_GET","level":0,"tabIndex":19},"Admin_Bookings_Sync_POST":{"id":"Admin_Bookings_Sync_POST","level":0,"tabIndex":20},"Department_Timebookings_Entries_Public_GET":{"id":"Department_Timebookings_Entries_Public_GET","level":0,"tabIndex":21},"Admin_Bookings_Delete_POST":{"id":"Admin_Bookings_Delete_POST","level":0,"tabIndex":22},"Department_Timebookings_Types_Public_GET":{"id":"Department_Timebookings_Types_Public_GET","level":0,"tabIndex":23},"Bookings_PUT":{"id":"Bookings_PUT","level":0,"tabIndex":24},"Admin_Bookings_CompleteWithoutWashCertificate_POST":{"id":"Admin_Bookings_CompleteWithoutWashCertificate_POST","level":0,"tabIndex":25},"Department_Timebookings_OpeningHours_Public_GET":{"id":"Department_Timebookings_OpeningHours_Public_GET","level":0,"tabIndex":26},"Superuser_Bookings_Sync_All_POST":{"id":"Superuser_Bookings_Sync_All_POST","level":0,"tabIndex":27},"Admin_Bookings_Department_Count_GET":{"id":"Admin_Bookings_Department_Count_GET","level":0,"tabIndex":28},"Bookings_GET":{"id":"Bookings_GET","level":0,"tabIndex":29},"Modules_Module_CVR_Page_1":{"id":"Modules_Module_CVR_Page_1","title":"CVR - Page 1 of 1","url":"modules-module-cvr-page-1.html","level":0,"tabIndex":30},"Modules_Module_Wash_Certificates_Page_1":{"id":"Modules_Module_Wash_Certificates_Page_1","title":"Wash Certificates - Page 1 of 1","url":"modules-module-wash-certificates-page-1.html","level":0,"tabIndex":31},"Modules_Module_Entra_Page_1":{"id":"Modules_Module_Entra_Page_1","title":"Entra - Page 1 of 1","url":"modules-module-entra-page-1.html","level":0,"tabIndex":32},"Modules_Module_XLVask":{"id":"Modules_Module_XLVask","title":"XLVask","url":"modules-module-xlvask.html","level":0,"tabIndex":33},"Modules_Module_VirkData":{"id":"Modules_Module_VirkData","title":"VirkData","url":"modules-module-virkdata.html","level":0,"tabIndex":34},"Modules_Module_XLVask_Page_1":{"id":"Modules_Module_XLVask_Page_1","title":"XLVask - Page 1 of 1","url":"modules-module-xlvask-page-1.html","level":0,"tabIndex":35},"Config_Module_OcrSpace_Page_1":{"id":"Config_Module_OcrSpace_Page_1","title":"OcrSpace - Page 1 of 1","url":"config-module-ocrspace-page-1.html","level":0,"tabIndex":36},"Modules_Module_Stripe_Page_1":{"id":"Modules_Module_Stripe_Page_1","title":"Stripe - Page 1 of 1","url":"modules-module-stripe-page-1.html","level":0,"tabIndex":37},"Config_Module_XLVask_Page_1":{"id":"Config_Module_XLVask_Page_1","title":"XLVask - Page 1 of 1","url":"config-module-xlvask-page-1.html","level":0,"tabIndex":38},"Modules_Module_WeatherAPI_Page_1":{"id":"Modules_Module_WeatherAPI_Page_1","title":"WeatherAPI - Page 1 of 1","url":"modules-module-weatherapi-page-1.html","level":0,"tabIndex":39},"Config_Module_FXRatesAPI":{"id":"Config_Module_FXRatesAPI","title":"FXRatesAPI","url":"config-module-fxratesapi.html","level":0,"tabIndex":40},"Modules_Module_Entra":{"id":"Modules_Module_Entra","title":"Entra","url":"modules-module-entra.html","level":0,"tabIndex":41},"Config_Module_WeatherAPI_Page_1":{"id":"Config_Module_WeatherAPI_Page_1","title":"WeatherAPI - Page 1 of 1","url":"config-module-weatherapi-page-1.html","level":0,"tabIndex":42},"Modules_Module_Action_Logs_Page_1":{"id":"Modules_Module_Action_Logs_Page_1","title":"Action Logs - Page 1 of 1","url":"modules-module-action-logs-page-1.html","level":0,"tabIndex":43},"Modules_Module_MotorAPI":{"id":"Modules_Module_MotorAPI","title":"MotorAPI","url":"modules-module-motorapi.html","level":0,"tabIndex":44},"Modules_Module_Self_Serve_Page_1":{"id":"Modules_Module_Self_Serve_Page_1","title":"Self-Serve - Page 1 of 1","url":"modules-module-self-serve-page-1.html","level":0,"tabIndex":45},"Modules_Module_Stripe":{"id":"Modules_Module_Stripe","title":"Stripe","url":"modules-module-stripe.html","level":0,"tabIndex":46},"Modules_Module_FXRatesAPI":{"id":"Modules_Module_FXRatesAPI","title":"FXRatesAPI","url":"modules-module-fxratesapi.html","level":0,"tabIndex":47},"Config_Module_LicensePlateRecognizer":{"id":"Config_Module_LicensePlateRecognizer","title":"LicensePlateRecognizer","url":"config-module-licenseplaterecognizer.html","level":0,"tabIndex":48},"Modules_Module_Backup_Page_1":{"id":"Modules_Module_Backup_Page_1","title":"Backup - Page 1 of 1","url":"modules-module-backup-page-1.html","level":0,"tabIndex":49},"Config_Module_reCAPTCHA_Page_1":{"id":"Config_Module_reCAPTCHA_Page_1","title":"reCAPTCHA - Page 1 of 1","url":"config-module-recaptcha-page-1.html","level":0,"tabIndex":50},"Modules_Module_Wash_Certificates":{"id":"Modules_Module_Wash_Certificates","title":"Wash Certificates","url":"modules-module-wash-certificates.html","level":0,"tabIndex":51},"Config_Module_Shelly":{"id":"Config_Module_Shelly","title":"Shelly","url":"config-module-shelly.html","level":0,"tabIndex":52},"Modules_Module_e_conomic":{"id":"Modules_Module_e_conomic","title":"e-conomic","url":"modules-module-e-conomic.html","level":0,"tabIndex":53},"Config_Module_WeatherAPI":{"id":"Config_Module_WeatherAPI","title":"WeatherAPI","url":"config-module-weatherapi.html","level":0,"tabIndex":54},"Modules_Module_MotorAPI_Page_1":{"id":"Modules_Module_MotorAPI_Page_1","title":"MotorAPI - Page 1 of 1","url":"modules-module-motorapi-page-1.html","level":0,"tabIndex":55},"Config_Module_Email_Page_1":{"id":"Config_Module_Email_Page_1","title":"Email - Page 1 of 1","url":"config-module-email-page-1.html","level":0,"tabIndex":56},"Modules_Module_VirkData_Page_1":{"id":"Modules_Module_VirkData_Page_1","title":"VirkData - Page 1 of 1","url":"modules-module-virkdata-page-1.html","level":0,"tabIndex":57},"Config_Module_Email":{"id":"Config_Module_Email","title":"Email","url":"config-module-email.html","level":0,"tabIndex":58},"Modules_Module_FXRatesAPI_Page_1":{"id":"Modules_Module_FXRatesAPI_Page_1","title":"FXRatesAPI - Page 1 of 1","url":"modules-module-fxratesapi-page-1.html","level":0,"tabIndex":59},"Config_Module_Backups_Page_1":{"id":"Config_Module_Backups_Page_1","title":"Backups - Page 1 of 1","url":"config-module-backups-page-1.html","level":0,"tabIndex":60},"Modules_Module_WeatherAPI":{"id":"Modules_Module_WeatherAPI","title":"WeatherAPI","url":"modules-module-weatherapi.html","level":0,"tabIndex":61},"Config_Module_Self_Serve":{"id":"Config_Module_Self_Serve","title":"Self-Serve","url":"config-module-self-serve.html","level":0,"tabIndex":62},"Config_Module_OcrSpace":{"id":"Config_Module_OcrSpace","title":"OcrSpace","url":"config-module-ocrspace.html","level":0,"tabIndex":63},"Modules_Module_Self_Serve":{"id":"Modules_Module_Self_Serve","title":"Self-Serve","url":"modules-module-self-serve.html","level":0,"tabIndex":64},"Config_Module_Bird":{"id":"Config_Module_Bird","title":"Bird","url":"config-module-bird.html","level":0,"tabIndex":65},"Config_Module_Limble_Page_1":{"id":"Config_Module_Limble_Page_1","title":"Limble - Page 1 of 1","url":"config-module-limble-page-1.html","level":0,"tabIndex":66},"Config_Module_MotorAPI":{"id":"Config_Module_MotorAPI","title":"MotorAPI","url":"config-module-motorapi.html","level":0,"tabIndex":67},"Modules_Module_e_conomic_Page_1":{"id":"Modules_Module_e_conomic_Page_1","title":"e-conomic - Page 1 of 1","url":"modules-module-e-conomic-page-1.html","level":0,"tabIndex":68},"Config_Module_MotorAPI_Page_1":{"id":"Config_Module_MotorAPI_Page_1","title":"MotorAPI - Page 1 of 1","url":"config-module-motorapi-page-1.html","level":0,"tabIndex":69},"Modules_Module_Action_Logs":{"id":"Modules_Module_Action_Logs","title":"Action Logs","url":"modules-module-action-logs.html","level":0,"tabIndex":70},"Config_Module_LicensePlateRecognizer_Page_1":{"id":"Config_Module_LicensePlateRecognizer_Page_1","title":"LicensePlateRecognizer - Page 1 of 1","url":"config-module-licenseplaterecognizer-page-1.html","level":0,"tabIndex":71},"Modules_Module_Backup":{"id":"Modules_Module_Backup","title":"Backup","url":"modules-module-backup.html","level":0,"tabIndex":72},"Config_Module_Bird_Page_1":{"id":"Config_Module_Bird_Page_1","title":"Bird - Page 1 of 1","url":"config-module-bird-page-1.html","level":0,"tabIndex":73},"Modules_Module_CVR":{"id":"Modules_Module_CVR","title":"CVR","url":"modules-module-cvr.html","level":0,"tabIndex":74},"Config_Module_OpenAI":{"id":"Config_Module_OpenAI","title":"OpenAI","url":"config-module-openai.html","level":0,"tabIndex":75},"Config_Module_OpenAI_Page_1":{"id":"Config_Module_OpenAI_Page_1","title":"OpenAI - Page 1 of 1","url":"config-module-openai-page-1.html","level":0,"tabIndex":76},"Config_Module_Stripe":{"id":"Config_Module_Stripe","title":"Stripe","url":"config-module-stripe.html","level":0,"tabIndex":77},"Config_Module_FXRatesAPI_Page_1":{"id":"Config_Module_FXRatesAPI_Page_1","title":"FXRatesAPI - Page 1 of 1","url":"config-module-fxratesapi-page-1.html","level":0,"tabIndex":78},"Config_Module_Stripe_Page_1":{"id":"Config_Module_Stripe_Page_1","title":"Stripe - Page 1 of 1","url":"config-module-stripe-page-1.html","level":0,"tabIndex":79},"Config_Module_Backups":{"id":"Config_Module_Backups","title":"Backups","url":"config-module-backups.html","level":0,"tabIndex":80},"Config_Module_e_conomic":{"id":"Config_Module_e_conomic","title":"e-conomic","url":"config-module-e-conomic.html","level":0,"tabIndex":81},"Config_Module_Limble":{"id":"Config_Module_Limble","title":"Limble","url":"config-module-limble.html","level":0,"tabIndex":82},"Config_Module_Shelly_Page_1":{"id":"Config_Module_Shelly_Page_1","title":"Shelly - Page 1 of 1","url":"config-module-shelly-page-1.html","level":0,"tabIndex":83},"Config_Module_XLVask":{"id":"Config_Module_XLVask","title":"XLVask","url":"config-module-xlvask.html","level":0,"tabIndex":84},"Config_Module_GatewayAPI_Page_1":{"id":"Config_Module_GatewayAPI_Page_1","title":"GatewayAPI - Page 1 of 1","url":"config-module-gatewayapi-page-1.html","level":0,"tabIndex":85},"Config_Module_Entra_Page_1":{"id":"Config_Module_Entra_Page_1","title":"Entra - Page 1 of 1","url":"config-module-entra-page-1.html","level":0,"tabIndex":86},"Config_Module_Self_Serve_Page_1":{"id":"Config_Module_Self_Serve_Page_1","title":"Self-Serve - Page 1 of 1","url":"config-module-self-serve-page-1.html","level":0,"tabIndex":87},"Config_Module_Entra":{"id":"Config_Module_Entra","title":"Entra","url":"config-module-entra.html","level":0,"tabIndex":88},"Config_Module_VirkData_Page_1":{"id":"Config_Module_VirkData_Page_1","title":"VirkData - Page 1 of 1","url":"config-module-virkdata-page-1.html","level":0,"tabIndex":89},"Config_Module_e_conomic_Page_1":{"id":"Config_Module_e_conomic_Page_1","title":"e-conomic - Page 1 of 1","url":"config-module-e-conomic-page-1.html","level":0,"tabIndex":90},"Config_Module_VirkData":{"id":"Config_Module_VirkData","title":"VirkData","url":"config-module-virkdata.html","level":0,"tabIndex":91}}},"topLevelIds":["Introduction","API-Overview","API-Reference","Vehicles_PUT","Customers_PUT","Vehicles_GET","Customers_id_DELETE","Config_Module_GatewayAPI","Config_Module_reCAPTCHA","API_Reference","Vehicles_id_DELETE","Customers_POST","Vehicles_POST","UsageLog_GET","Customers_GET","User_Bookings_Delete_POST","Department_Timebookings_Entries_Public_POST","Bookings_Download_PDF_GET","User_Bookings_Washcertificate_Download_POST","User_Bookings_GET","Admin_Bookings_Sync_POST","Department_Timebookings_Entries_Public_GET","Admin_Bookings_Delete_POST","Department_Timebookings_Types_Public_GET","Bookings_PUT","Admin_Bookings_CompleteWithoutWashCertificate_POST","Department_Timebookings_OpeningHours_Public_GET","Superuser_Bookings_Sync_All_POST","Admin_Bookings_Department_Count_GET","Bookings_GET","Modules_Module_CVR_Page_1","Modules_Module_Wash_Certificates_Page_1","Modules_Module_Entra_Page_1","Modules_Module_XLVask","Modules_Module_VirkData","Modules_Module_XLVask_Page_1","Config_Module_OcrSpace_Page_1","Modules_Module_Stripe_Page_1","Config_Module_XLVask_Page_1","Modules_Module_WeatherAPI_Page_1","Config_Module_FXRatesAPI","Modules_Module_Entra","Config_Module_WeatherAPI_Page_1","Modules_Module_Action_Logs_Page_1","Modules_Module_MotorAPI","Modules_Module_Self_Serve_Page_1","Modules_Module_Stripe","Modules_Module_FXRatesAPI","Config_Module_LicensePlateRecognizer","Modules_Module_Backup_Page_1","Config_Module_reCAPTCHA_Page_1","Modules_Module_Wash_Certificates","Config_Module_Shelly","Modules_Module_e_conomic","Config_Module_WeatherAPI","Modules_Module_MotorAPI_Page_1","Config_Module_Email_Page_1","Modules_Module_VirkData_Page_1","Config_Module_Email","Modules_Module_FXRatesAPI_Page_1","Config_Module_Backups_Page_1","Modules_Module_WeatherAPI","Config_Module_Self_Serve","Config_Module_OcrSpace","Modules_Module_Self_Serve","Config_Module_Bird","Config_Module_Limble_Page_1","Config_Module_MotorAPI","Modules_Module_e_conomic_Page_1","Config_Module_MotorAPI_Page_1","Modules_Module_Action_Logs","Config_Module_LicensePlateRecognizer_Page_1","Modules_Module_Backup","Config_Module_Bird_Page_1","Modules_Module_CVR","Config_Module_OpenAI","Config_Module_OpenAI_Page_1","Config_Module_Stripe","Config_Module_FXRatesAPI_Page_1","Config_Module_Stripe_Page_1","Config_Module_Backups","Config_Module_e_conomic","Config_Module_Limble","Config_Module_Shelly_Page_1","Config_Module_XLVask","Config_Module_GatewayAPI_Page_1","Config_Module_Entra_Page_1","Config_Module_Self_Serve_Page_1","Config_Module_Entra","Config_Module_VirkData_Page_1","Config_Module_e_conomic_Page_1","Config_Module_VirkData"]} \ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/Map.jhm b/documentation/_site_rebuild_20260317/Map.jhm new file mode 100644 index 00000000..d5b71b10 --- /dev/null +++ b/documentation/_site_rebuild_20260317/Map.jhm @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/addbrandingoption.html b/documentation/_site_rebuild_20260317/addbrandingoption.html new file mode 100644 index 00000000..308b6ffe --- /dev/null +++ b/documentation/_site_rebuild_20260317/addbrandingoption.html @@ -0,0 +1,38 @@ + +Add branding option | Copenhagen Truck Wash API \ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/addbuttonpress.html b/documentation/_site_rebuild_20260317/addbuttonpress.html new file mode 100644 index 00000000..145cdabc --- /dev/null +++ b/documentation/_site_rebuild_20260317/addbuttonpress.html @@ -0,0 +1,20 @@ + +Record machine start button press webhook | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Record machine start button press webhook

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /relay/button/press/post

Operation

Operation ID: addButtonPress

Record machine start button press webhook

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

token

query

no

string

lane_id

query

no

integer

reg

query

no

string

Responses

Status

Description

Content Types

201

Button press recorded and linked to a self-serve wash session

application/json

404

Schema for response 201 (application/json):

+{ + "$ref": "#/components/schemas/MachineButtonPressWebhookResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/addbuttonpresspost.html b/documentation/_site_rebuild_20260317/addbuttonpresspost.html new file mode 100644 index 00000000..33e975dc --- /dev/null +++ b/documentation/_site_rebuild_20260317/addbuttonpresspost.html @@ -0,0 +1,35 @@ + +Record machine start button press webhook | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Record machine start button press webhook

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /relay/button/press/post

Operation

Operation ID: addButtonPressPost

Record machine start button press webhook

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{ + "properties": { + "lane_id": { + "type": "integer" + }, + "reg": { + "type": "string" + }, + "token": { + "type": "string" + } + }, + "type": "object" +} +

Responses

Status

Description

Content Types

201

Button press recorded and linked to a self-serve wash session

application/json

404

Schema for response 201 (application/json):

+{ + "$ref": "#/components/schemas/MachineButtonPressWebhookResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/addcustomerattribute.html b/documentation/_site_rebuild_20260317/addcustomerattribute.html new file mode 100644 index 00000000..665094d9 --- /dev/null +++ b/documentation/_site_rebuild_20260317/addcustomerattribute.html @@ -0,0 +1,20 @@ + +Add customer attribute | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Add customer attribute

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /customer/attributes

Operation

Operation ID: addCustomerAttribute

Add a custom attribute to a customer

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

201

Customer attribute added successfully

application/json

Schema for response 201 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/addcustomercode.html b/documentation/_site_rebuild_20260317/addcustomercode.html new file mode 100644 index 00000000..b5bf34e6 --- /dev/null +++ b/documentation/_site_rebuild_20260317/addcustomercode.html @@ -0,0 +1,33 @@ + +Add customer code | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Add customer code

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /admin/customer/code

Operation

Operation ID: addCustomerCode

Add customer code

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "code": { + "type": "string" + }, + "customer_number": { + "type": "integer" + }, + "user_id": { + "type": "integer" + } + }, + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/addcustomerdefaultdepartment.html b/documentation/_site_rebuild_20260317/addcustomerdefaultdepartment.html new file mode 100644 index 00000000..baa01b3f --- /dev/null +++ b/documentation/_site_rebuild_20260317/addcustomerdefaultdepartment.html @@ -0,0 +1,33 @@ + +Add customer default department | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Add customer default department

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /customer/department/default

Operation

Operation ID: addCustomerDefaultDepartment

Add customer default department

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "customer_number": { + "type": "integer" + }, + "department": { + "type": "integer" + } + }, + "required": [ + "department" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/addcustomerfixedpricing.html b/documentation/_site_rebuild_20260317/addcustomerfixedpricing.html new file mode 100644 index 00000000..b7570f45 --- /dev/null +++ b/documentation/_site_rebuild_20260317/addcustomerfixedpricing.html @@ -0,0 +1,38 @@ + +Add customer fixed pricing | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Add customer fixed pricing

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /customer/pricing/fixed

Operation

Operation ID: addCustomerFixedPricing

Add customer fixed pricing

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "customer_number": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "price": { + "type": "integer" + } + }, + "required": [ + "customer_number", + "price", + "description" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/addcustomernote.html b/documentation/_site_rebuild_20260317/addcustomernote.html new file mode 100644 index 00000000..a184351c --- /dev/null +++ b/documentation/_site_rebuild_20260317/addcustomernote.html @@ -0,0 +1,20 @@ + +Add customer note | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Add customer note

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /customer/notes

Operation

Operation ID: addCustomerNote

Add a note to a customer

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

201

Customer note added successfully

application/json

Schema for response 201 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/adddailyreport.html b/documentation/_site_rebuild_20260317/adddailyreport.html new file mode 100644 index 00000000..d2ec0dc9 --- /dev/null +++ b/documentation/_site_rebuild_20260317/adddailyreport.html @@ -0,0 +1,38 @@ + +Add daily report | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Add daily report

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /departments/daily-reports

Operation

Operation ID: addDailyReport

Add daily report

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "date": { + "type": "string" + }, + "department_id": { + "type": "integer" + }, + "report": { + "type": "string" + } + }, + "required": [ + "department_id", + "date", + "report" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/adddepartmentcategory.html b/documentation/_site_rebuild_20260317/adddepartmentcategory.html new file mode 100644 index 00000000..e28190ad --- /dev/null +++ b/documentation/_site_rebuild_20260317/adddepartmentcategory.html @@ -0,0 +1,30 @@ + +Add category to department | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Add category to department

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /departments/categories

Operation

Operation ID: addDepartmentCategory

Associate a product category with a department

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "category_id": { + "type": "integer" + }, + "department_id": { + "type": "integer" + } + }, + "type": "object" +} +

Responses

Status

Description

Content Types

201

Category added to department successfully

application/json

Schema for response 201 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/addorderitem.html b/documentation/_site_rebuild_20260317/addorderitem.html new file mode 100644 index 00000000..d8ca9264 --- /dev/null +++ b/documentation/_site_rebuild_20260317/addorderitem.html @@ -0,0 +1,22 @@ + +Add item to order | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Add item to order

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /order/items

Operation

Operation ID: addOrderItem

Add a new item to an existing order

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/OrderItemCreate" +} +

Responses

Status

Description

Content Types

201

Order item added successfully

application/json

400

Schema for response 201 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/addplatescanner.html b/documentation/_site_rebuild_20260317/addplatescanner.html new file mode 100644 index 00000000..54430ebb --- /dev/null +++ b/documentation/_site_rebuild_20260317/addplatescanner.html @@ -0,0 +1,38 @@ + +Add plate scanner | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Add plate scanner

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /numberplatescanners

Operation

Operation ID: addPlateScanner

Add plate scanner

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "department_id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "notes": { + "type": "string" + } + }, + "required": [ + "department_id", + "name", + "notes" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

201

Plate scanner added successfully

application/json

Schema for response 201 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/addrole.html b/documentation/_site_rebuild_20260317/addrole.html new file mode 100644 index 00000000..9b0821ce --- /dev/null +++ b/documentation/_site_rebuild_20260317/addrole.html @@ -0,0 +1,30 @@ + +Add role | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Add role

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /roles

Operation

Operation ID: addRole

Add role

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/addrolepermission.html b/documentation/_site_rebuild_20260317/addrolepermission.html new file mode 100644 index 00000000..2d0ab52b --- /dev/null +++ b/documentation/_site_rebuild_20260317/addrolepermission.html @@ -0,0 +1,34 @@ + +Add permission to role | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Add permission to role

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /roles/permissions

Operation

Operation ID: addRolePermission

Add permission to role

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "permission": { + "type": "string" + }, + "role_id": { + "type": "integer" + } + }, + "required": [ + "role_id", + "permission" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/addselfservecondition.html b/documentation/_site_rebuild_20260317/addselfservecondition.html new file mode 100644 index 00000000..8b92d25c --- /dev/null +++ b/documentation/_site_rebuild_20260317/addselfservecondition.html @@ -0,0 +1,56 @@ + +Add self-serve condition | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Add self-serve condition

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /department/selfserve/conditions

Operation

Operation ID: addSelfserveCondition

Add a new self-serve condition. Either provide a reusable machine_type_id or a legacy department/lane/product scope.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "condition_id": { + "nullable": true, + "type": "integer" + }, + "department": { + "default": 0, + "type": "integer" + }, + "description": { + "type": "string" + }, + "lane": { + "default": 0, + "type": "integer" + }, + "machine_type_id": { + "nullable": true, + "type": "integer" + }, + "name": { + "type": "string" + }, + "product": { + "default": 0, + "type": "integer" + } + }, + "required": [ + "name", + "description" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Successfully added condition

application/json

400

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/DepartmentSelfserveCondition" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/addselfserveconditionrule.html b/documentation/_site_rebuild_20260317/addselfserveconditionrule.html new file mode 100644 index 00000000..908e5a61 --- /dev/null +++ b/documentation/_site_rebuild_20260317/addselfserveconditionrule.html @@ -0,0 +1,52 @@ + +Add self-serve condition rule | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Add self-serve condition rule

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /department/selfserve/condition/rules

Operation

Operation ID: addSelfserveConditionRule

Add a new self-serve condition rule.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "condition_id": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "object_id": { + "type": "integer" + }, + "object_type": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "condition_id", + "type", + "object_type", + "object_id", + "name", + "description" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Successfully added condition rule

application/json

400

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/DepartmentSelfserveConditionRule" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/addselfservemachinetype.html b/documentation/_site_rebuild_20260317/addselfservemachinetype.html new file mode 100644 index 00000000..84c85588 --- /dev/null +++ b/documentation/_site_rebuild_20260317/addselfservemachinetype.html @@ -0,0 +1,36 @@ + +Add reusable self-serve machine type | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Add reusable self-serve machine type

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /department/selfserve/machine-types

Operation

Operation ID: addSelfserveMachineType

Add reusable self-serve machine type

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "description": { + "nullable": true, + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Successfully added machine type

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/SelfserveMachineType" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/addselfservequestion.html b/documentation/_site_rebuild_20260317/addselfservequestion.html new file mode 100644 index 00000000..bc80811a --- /dev/null +++ b/documentation/_site_rebuild_20260317/addselfservequestion.html @@ -0,0 +1,56 @@ + +Add self-serve question | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Add self-serve question

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /department/selfserve/questions

Operation

Operation ID: addSelfserveQuestion

Add a new self-serve question. Questions are typically shared across departments and lanes by omitting department, lane, and product, which default to 0.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "condition_id": { + "nullable": true, + "type": "integer" + }, + "department": { + "default": 0, + "type": "integer" + }, + "description": { + "type": "string" + }, + "lane": { + "default": 0, + "type": "integer" + }, + "order_priority": { + "default": 0, + "type": "integer" + }, + "product": { + "default": 0, + "type": "integer" + }, + "question": { + "type": "string" + } + }, + "required": [ + "question", + "description" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Successfully added question

application/json

400

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/DepartmentSelfserveQuestion" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/addselfservetask.html b/documentation/_site_rebuild_20260317/addselfservetask.html new file mode 100644 index 00000000..569a6189 --- /dev/null +++ b/documentation/_site_rebuild_20260317/addselfservetask.html @@ -0,0 +1,80 @@ + +Add self-serve task | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Add self-serve task

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /department/selfserve/tasks

Operation

Operation ID: addSelfserveTask

Add a new self-serve task. Either provide a reusable machine_type_id or a legacy department/lane/product scope.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "buttons": { + "default": [], + "description": "Optional dynamic image button IDs enabled by this task.", + "items": { + "type": "integer" + }, + "type": "array" + }, + "condition_id": { + "nullable": true, + "type": "integer" + }, + "department": { + "default": 0, + "type": "integer" + }, + "description": { + "type": "string" + }, + "dynamic_images_vehicle_type": { + "description": "Optional vehicle type selection override for the machine UI. Integer >= 0 or null.", + "nullable": true, + "type": "integer" + }, + "lane": { + "default": 0, + "type": "integer" + }, + "machine_type_id": { + "nullable": true, + "type": "integer" + }, + "order_priority": { + "default": 0, + "type": "integer" + }, + "product": { + "default": 0, + "type": "integer" + }, + "services": { + "description": "Optional services enabled by this task. Items must be valid service enum names.", + "items": { + "$ref": "#/components/schemas/SelfserveLaneService" + }, + "type": "array" + }, + "task": { + "type": "string" + } + }, + "required": [ + "task", + "description" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Successfully added task

application/json

400

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/DepartmentSelfserveTask" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/addselfservevehiclecondition.html b/documentation/_site_rebuild_20260317/addselfservevehiclecondition.html new file mode 100644 index 00000000..18dd6545 --- /dev/null +++ b/documentation/_site_rebuild_20260317/addselfservevehiclecondition.html @@ -0,0 +1,51 @@ + +Add vehicle condition | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Add vehicle condition

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /department/selfserve/vehicle/conditions

Operation

Operation ID: addSelfserveVehicleCondition

Add a new vehicle condition (answer to a question). Customers can only add conditions for their own vehicles.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "customer_id": { + "nullable": true, + "type": "integer" + }, + "department": { + "type": "integer" + }, + "lane": { + "type": "integer" + }, + "question": { + "type": "integer" + }, + "reg": { + "type": "string" + }, + "value": { + "type": "boolean" + } + }, + "required": [ + "department", + "lane", + "reg", + "question" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Successfully added vehicle condition

application/json

400

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/DepartmentSelfserveVehicleConditionMutationResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/addvehicle.html b/documentation/_site_rebuild_20260317/addvehicle.html new file mode 100644 index 00000000..b382d68b --- /dev/null +++ b/documentation/_site_rebuild_20260317/addvehicle.html @@ -0,0 +1,51 @@ + +Add vehicle | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Add vehicle

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /vehicles

Operation

Operation ID: addVehicle

Create a new vehicle for a customer. Permissions: - Own scope: `add_vehicle` (linked to subuser node `VEHICLES_ADD`). - Broader scope: `add_vehicle_other`.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "customer_id": { + "description": "Optional explicit target customer. Defaults to the effective customer context.", + "type": "integer" + }, + "reference": { + "maxLength": 255, + "nullable": true, + "type": "string" + }, + "reg": { + "description": "Vehicle registration number", + "maxLength": 12, + "minLength": 2, + "type": "string" + }, + "type": { + "description": "Product ID representing the vehicle wash type", + "type": "integer" + }, + "wash_subscription": { + "type": "boolean" + } + }, + "required": [ + "reg", + "type", + "wash_subscription" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Vehicle created

application/json

400

403

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/admindeletebooking.html b/documentation/_site_rebuild_20260317/admindeletebooking.html new file mode 100644 index 00000000..8ae841b4 --- /dev/null +++ b/documentation/_site_rebuild_20260317/admindeletebooking.html @@ -0,0 +1,30 @@ + +Delete booking (admin) | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete booking (admin)

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /admin/bookings/delete

Operation

Operation ID: adminDeleteBooking

Delete booking (admin)

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "id": { + "type": "integer" + } + }, + "required": [ + "id" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/api-object-digest.json b/documentation/_site_rebuild_20260317/api-object-digest.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/documentation/_site_rebuild_20260317/api-object-digest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/api-overview.html b/documentation/_site_rebuild_20260317/api-overview.html new file mode 100644 index 00000000..4b7ff565 --- /dev/null +++ b/documentation/_site_rebuild_20260317/api-overview.html @@ -0,0 +1,20 @@ + +API Overview | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

API Overview

This section provides a high-level overview of how to interact with the API based on openapi.yaml.

Base URLs

The API currently defines the following servers:

+https://api.truckwash.dk +https://api.truckwash.io +http://localhost/api +

Common Headers

Header

Description

Authorization

Use Bearer authentication for protected endpoints: Authorization: Bearer <JWT>.

Accept

Use application/json.

Content-Type

Use application/json for request bodies.

X-Customer-Number

Required for many customer-scoped requests when authenticated as a subuser.

17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/api-reference.html b/documentation/_site_rebuild_20260317/api-reference.html new file mode 100644 index 00000000..8a6255c9 --- /dev/null +++ b/documentation/_site_rebuild_20260317/api-reference.html @@ -0,0 +1,16 @@ + +API Reference | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/authentication.html b/documentation/_site_rebuild_20260317/authentication.html new file mode 100644 index 00000000..a5506554 --- /dev/null +++ b/documentation/_site_rebuild_20260317/authentication.html @@ -0,0 +1,20 @@ + +Authentication | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Authentication

The API uses the BearerAuth security scheme (HTTP Bearer, JWT).

Bearer JWT Header

Get a token from /auth/login or /auth/employee/login, then send:

+ Authorization: Bearer YOUR_API_TOKEN +

Subuser Customer Targeting

When authenticated as a subuser, include a target customer header for customer-scoped endpoints:

+ X-Customer-Number: 123456 +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/birdcreateflashcall.html b/documentation/_site_rebuild_20260317/birdcreateflashcall.html new file mode 100644 index 00000000..eb674276 --- /dev/null +++ b/documentation/_site_rebuild_20260317/birdcreateflashcall.html @@ -0,0 +1,26 @@ + +Create/place a flash call via Bird | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create/place a flash call via Bird

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /bird/voice/flash-calls

Operation

Operation ID: birdCreateFlashCall

Create/place a flash call via Bird

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

workspaceId

query

no

string

Bird Workspace identifier (falls back to module configuration if omitted)

channelId

query

no

string

Bird Channel identifier (falls back to module configuration if omitted)

Request Body

Required: yes.

Content type: application/json

+{ + "additionalProperties": true, + "type": "object" +} +

Responses

Status

Description

Content Types

200

Flash call created

application/json

Schema for response 200 (application/json):

+{ + "additionalProperties": true, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/birdcreatevoicecall.html b/documentation/_site_rebuild_20260317/birdcreatevoicecall.html new file mode 100644 index 00000000..a51b5555 --- /dev/null +++ b/documentation/_site_rebuild_20260317/birdcreatevoicecall.html @@ -0,0 +1,37 @@ + +Create/place a voice call via Bird | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create/place a voice call via Bird

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /bird/voice/calls

Operation

Operation ID: birdCreateVoiceCall

Create/place a voice call via Bird

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

workspaceId

query

no

string

Bird Workspace identifier (falls back to module configuration if omitted)

channelId

query

no

string

Bird Channel identifier (falls back to module configuration if omitted)

Request Body

Required: yes.

Content type: application/json

+{ + "additionalProperties": true, + "properties": { + "from": { + "description": "E.164 phone number of the caller (sender)", + "example": "+4599988877", + "type": "string" + }, + "to": { + "description": "E.164 phone number of the callee", + "example": "+4511122233", + "type": "string" + } + }, + "type": "object" +} +

Responses

Status

Description

Content Types

200

Call created

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/BirdVoiceCallSingleResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/birddeletenumber.html b/documentation/_site_rebuild_20260317/birddeletenumber.html new file mode 100644 index 00000000..72fa7728 --- /dev/null +++ b/documentation/_site_rebuild_20260317/birddeletenumber.html @@ -0,0 +1,21 @@ + +Delete/release a number by ID | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete/release a number by ID

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /bird/numbers/{id}

Operation

Operation ID: birdDeleteNumber

Delete/release a number by ID

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

workspaceId

query

no

string

Bird Workspace identifier (optional if configured)

id

path

yes

string

Responses

Status

Description

Content Types

200

Number deletion/release accepted

application/json

Schema for response 200 (application/json):

+{ + "additionalProperties": true, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/birdendflashcall.html b/documentation/_site_rebuild_20260317/birdendflashcall.html new file mode 100644 index 00000000..ef28b583 --- /dev/null +++ b/documentation/_site_rebuild_20260317/birdendflashcall.html @@ -0,0 +1,26 @@ + +Complete/end a flash call by ID | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Complete/end a flash call by ID

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /bird/voice/flash-calls/{id}

Operation

Operation ID: birdEndFlashCall

Posts a completion/update payload to the flash call resource to finalize verification.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

workspaceId

query

no

string

Bird Workspace identifier (falls back to module configuration if omitted)

channelId

query

no

string

Bird Channel identifier (falls back to module configuration if omitted)

id

path

yes

string

Request Body

Required: no.

Content type: application/json

+{ + "additionalProperties": true, + "type": "object" +} +

Responses

Status

Description

Content Types

200

Flash call completed

application/json

Schema for response 200 (application/json):

+{ + "additionalProperties": true, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/birdendflashcallbynumbers.html b/documentation/_site_rebuild_20260317/birdendflashcallbynumbers.html new file mode 100644 index 00000000..7edf6e7b --- /dev/null +++ b/documentation/_site_rebuild_20260317/birdendflashcallbynumbers.html @@ -0,0 +1,38 @@ + +Complete/end a flash call using from/to numbers | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Complete/end a flash call using from/to numbers

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /bird/voice/flash-calls/end

Operation

Operation ID: birdEndFlashCallByNumbers

Ends an ongoing flash call by specifying the originating and destination numbers.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

workspaceId

query

no

string

Bird Workspace identifier (falls back to module configuration if omitted)

channelId

query

no

string

Bird Channel identifier (falls back to module configuration if omitted)

Request Body

Required: yes.

Content type: application/json

+{ + "additionalProperties": true, + "properties": { + "from": { + "description": "E.164 formatted caller number", + "example": "+4599988877", + "type": "string" + }, + "to": { + "description": "E.164 formatted callee number", + "example": "+4511122233", + "type": "string" + } + }, + "type": "object" +} +

Responses

Status

Description

Content Types

200

Flash call completed (by numbers)

application/json

Schema for response 200 (application/json):

+{ + "additionalProperties": true, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/birdgetflashcall.html b/documentation/_site_rebuild_20260317/birdgetflashcall.html new file mode 100644 index 00000000..53ae7f62 --- /dev/null +++ b/documentation/_site_rebuild_20260317/birdgetflashcall.html @@ -0,0 +1,21 @@ + +Get a flash call by ID | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get a flash call by ID

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /bird/voice/flash-calls/{id}

Operation

Operation ID: birdGetFlashCall

Get a flash call by ID

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

workspaceId

query

no

string

Bird Workspace identifier (falls back to module configuration if omitted)

channelId

query

no

string

Bird Channel identifier (falls back to module configuration if omitted)

id

path

yes

string

Responses

Status

Description

Content Types

200

Flash call details

application/json

Schema for response 200 (application/json):

+{ + "additionalProperties": true, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/birdgetnumber.html b/documentation/_site_rebuild_20260317/birdgetnumber.html new file mode 100644 index 00000000..cdc33c81 --- /dev/null +++ b/documentation/_site_rebuild_20260317/birdgetnumber.html @@ -0,0 +1,20 @@ + +Get a number by ID | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get a number by ID

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /bird/numbers/{id}

Operation

Operation ID: birdGetNumber

Get a number by ID

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

workspaceId

query

no

string

Bird Workspace identifier (optional if configured)

id

path

yes

string

Responses

Status

Description

Content Types

200

Number details

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/BirdNumberSingleResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/birdgetvoicecall.html b/documentation/_site_rebuild_20260317/birdgetvoicecall.html new file mode 100644 index 00000000..2d217598 --- /dev/null +++ b/documentation/_site_rebuild_20260317/birdgetvoicecall.html @@ -0,0 +1,20 @@ + +Get a voice call by ID | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get a voice call by ID

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /bird/voice/calls/{id}

Operation

Operation ID: birdGetVoiceCall

Get a voice call by ID

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

workspaceId

query

no

string

Bird Workspace identifier (falls back to module configuration if omitted)

channelId

query

no

string

Bird Channel identifier (falls back to module configuration if omitted)

id

path

yes

string

Responses

Status

Description

Content Types

200

Call details

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/BirdVoiceCallSingleResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/birdhangupvoicecall.html b/documentation/_site_rebuild_20260317/birdhangupvoicecall.html new file mode 100644 index 00000000..4bf6fb5b --- /dev/null +++ b/documentation/_site_rebuild_20260317/birdhangupvoicecall.html @@ -0,0 +1,20 @@ + +Hang up a voice call by ID | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Hang up a voice call by ID

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /bird/voice/calls/{id}/hangup

Operation

Operation ID: birdHangupVoiceCall

Hang up a voice call by ID

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

workspaceId

query

no

string

Bird Workspace identifier (falls back to module configuration if omitted)

channelId

query

no

string

Bird Channel identifier (falls back to module configuration if omitted)

id

path

yes

string

Responses

Status

Description

Content Types

200

Hangup requested

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/BirdVoiceCallSingleResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/birdlistflashcalls.html b/documentation/_site_rebuild_20260317/birdlistflashcalls.html new file mode 100644 index 00000000..a4d9750f --- /dev/null +++ b/documentation/_site_rebuild_20260317/birdlistflashcalls.html @@ -0,0 +1,21 @@ + +List flash calls | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List flash calls

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /bird/voice/flash-calls

Operation

Operation ID: birdListFlashCalls

List flash calls

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

workspaceId

query

no

string

Bird Workspace identifier (falls back to module configuration if omitted)

channelId

query

no

string

Bird Channel identifier (falls back to module configuration if omitted)

page

query

no

integer

Responses

Status

Description

Content Types

200

A list of flash calls

application/json

Schema for response 200 (application/json):

+{ + "additionalProperties": true, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/birdlistnumbers.html b/documentation/_site_rebuild_20260317/birdlistnumbers.html new file mode 100644 index 00000000..4f05c044 --- /dev/null +++ b/documentation/_site_rebuild_20260317/birdlistnumbers.html @@ -0,0 +1,20 @@ + +List your numbers | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List your numbers

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /bird/numbers

Operation

Operation ID: birdListNumbers

List your numbers

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

workspaceId

query

no

string

Bird Workspace identifier (optional if configured)

page

query

no

integer

limit

query

no

integer

Responses

Status

Description

Content Types

200

A list of numbers

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/BirdNumberListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/birdlistvoicecalls.html b/documentation/_site_rebuild_20260317/birdlistvoicecalls.html new file mode 100644 index 00000000..7e0bfbd9 --- /dev/null +++ b/documentation/_site_rebuild_20260317/birdlistvoicecalls.html @@ -0,0 +1,20 @@ + +List voice calls | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List voice calls

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /bird/voice/calls

Operation

Operation ID: birdListVoiceCalls

List voice calls

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

workspaceId

query

no

string

Bird Workspace identifier (falls back to module configuration if omitted)

channelId

query

no

string

Bird Channel identifier (falls back to module configuration if omitted)

page

query

no

integer

Responses

Status

Description

Content Types

200

A list of calls

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/BirdVoiceCallListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/birdsayonvoicecall.html b/documentation/_site_rebuild_20260317/birdsayonvoicecall.html new file mode 100644 index 00000000..ff1cf1fa --- /dev/null +++ b/documentation/_site_rebuild_20260317/birdsayonvoicecall.html @@ -0,0 +1,59 @@ + +Say a message on an active voice call and hang up afterwards | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Say a message on an active voice call and hang up afterwards

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /bird/voice/calls/{id}/say

Operation

Operation ID: birdSayOnVoiceCall

Say a message on an active voice call and hang up afterwards

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

workspaceId

query

no

string

Bird Workspace identifier (falls back to module configuration if omitted)

channelId

query

no

string

Bird Channel identifier (falls back to module configuration if omitted)

id

path

yes

string

Call identifier

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "hangup": { + "description": "Whether to hang up the call after the message finishes playing (defaults to true)", + "example": true, + "type": "boolean" + }, + "locale": { + "description": "The locale to use for the TTS voice (e.g. en-US)", + "example": "en-US", + "type": "string" + }, + "loop": { + "description": "Number of times to loop the message", + "example": 1, + "type": "integer" + }, + "text": { + "description": "The text message to play via TTS", + "example": "The gate will open shortly.", + "type": "string" + }, + "timeout": { + "description": "Timeout in seconds for the TTS action", + "example": 1, + "type": "integer" + }, + "voice": { + "description": "The voice identifier to use", + "example": "male", + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

TTS action requested

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/BirdVoiceCallSingleResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/birdtestoutboundvoicecall.html b/documentation/_site_rebuild_20260317/birdtestoutboundvoicecall.html new file mode 100644 index 00000000..e6d9b84a --- /dev/null +++ b/documentation/_site_rebuild_20260317/birdtestoutboundvoicecall.html @@ -0,0 +1,48 @@ + +Place a test outbound call and hang up when accepted | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Place a test outbound call and hang up when accepted

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /bird/voice/calls/test-outbound

Operation

Operation ID: birdTestOutboundVoiceCall

Calls +45 42 33 11 28 and hangs up when the call reaches accepted/ongoing state.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

workspaceId

query

no

string

Bird Workspace identifier (falls back to module configuration if omitted)

channelId

query

no

string

Bird Channel identifier (falls back to module configuration if omitted)

Request Body

Required: no.

Content type: application/json

+{ + "additionalProperties": true, + "properties": { + "from": { + "description": "Caller E.164 number to use for the test call", + "example": "+4599988877", + "type": "string" + }, + "hangupCause": { + "description": "Optional hangup cause passed through to Bird", + "type": "string" + }, + "maxPollSeconds": { + "description": "Max time to wait before timing out", + "example": 30, + "minimum": 5, + "type": "integer" + }, + "pollIntervalSeconds": { + "description": "Poll interval while waiting for accepted status", + "example": 2, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" +} +

Responses

Status

Description

Content Types

200

Test call created and either hung up or timed out

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/BirdTestOutboundCallResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/capturestripepaymentintent.html b/documentation/_site_rebuild_20260317/capturestripepaymentintent.html new file mode 100644 index 00000000..ff7be88e --- /dev/null +++ b/documentation/_site_rebuild_20260317/capturestripepaymentintent.html @@ -0,0 +1,30 @@ + +Capture Stripe payment intent | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Capture Stripe payment intent

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /orders/module/stripe/payment_intent/capture

Operation

Operation ID: captureStripePaymentIntent

Capture Stripe payment intent

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "id": { + "type": "integer" + } + }, + "required": [ + "id" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/checkeconomiccustomerexists.html b/documentation/_site_rebuild_20260317/checkeconomiccustomerexists.html new file mode 100644 index 00000000..d8b7434c --- /dev/null +++ b/documentation/_site_rebuild_20260317/checkeconomiccustomerexists.html @@ -0,0 +1,18 @@ + +Check if customer exists in e-conomic | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Check if customer exists in e-conomic

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /economic/doesCustomerExist

Operation

Operation ID: checkEconomicCustomerExists

Check if customer exists in e-conomic

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

cvr

query

yes

string

Responses

Status

Description

Content Types

200

Customer check completed

application/json

404

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/clearsystemsearchcache.html b/documentation/_site_rebuild_20260317/clearsystemsearchcache.html new file mode 100644 index 00000000..586515ab --- /dev/null +++ b/documentation/_site_rebuild_20260317/clearsystemsearchcache.html @@ -0,0 +1,20 @@ + +Clear system search caches | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Clear system search caches

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /superuser/search/system/cache

Operation

Operation ID: clearSystemSearchCache

Clears both query-result cache and intent-parser cache namespaces for system-wide search.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Cache cleared successfully

application/json

401

403

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/SystemSearchCacheClearResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/clonerole.html b/documentation/_site_rebuild_20260317/clonerole.html new file mode 100644 index 00000000..cc7d93bd --- /dev/null +++ b/documentation/_site_rebuild_20260317/clonerole.html @@ -0,0 +1,34 @@ + +Clone role | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Clone role

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /roles/clone

Operation

Operation ID: cloneRole

Clone role

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "name": { + "type": "string" + }, + "role_id": { + "type": "integer" + } + }, + "required": [ + "role_id", + "name" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/closedraftinvoice.html b/documentation/_site_rebuild_20260317/closedraftinvoice.html new file mode 100644 index 00000000..88edbd47 --- /dev/null +++ b/documentation/_site_rebuild_20260317/closedraftinvoice.html @@ -0,0 +1,27 @@ + +Close draft invoice | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Close draft invoice

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /invoices/draft/close

Operation

Operation ID: closeDraftInvoice

Close a draft invoice

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "id": { + "type": "integer" + } + }, + "type": "object" +} +

Responses

Status

Description

Content Types

200

Draft invoice closed successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/comparecollectedinvoiceeconomic.html b/documentation/_site_rebuild_20260317/comparecollectedinvoiceeconomic.html new file mode 100644 index 00000000..b80bb03d --- /dev/null +++ b/documentation/_site_rebuild_20260317/comparecollectedinvoiceeconomic.html @@ -0,0 +1,20 @@ + +Compare collected invoice totals with E-conomic | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Compare collected invoice totals with E-conomic

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /collected-invoices/economic/compare

Operation

Operation ID: compareCollectedInvoiceEconomic

Compares a collected invoice in the system with its corresponding invoice in E-conomic. Returns totals from both sources, their difference, and any warnings detected during comparison.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

collected_invoice_id

query

yes

integer

The internal collected invoice ID to compare

Responses

Status

Description

Content Types

200

Comparison completed successfully

application/json

400

401

403

404

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/CollectedInvoiceEconomicCompareResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/comparecollectedinvoiceeconomicv2.html b/documentation/_site_rebuild_20260317/comparecollectedinvoiceeconomicv2.html new file mode 100644 index 00000000..36d4052b --- /dev/null +++ b/documentation/_site_rebuild_20260317/comparecollectedinvoiceeconomicv2.html @@ -0,0 +1,20 @@ + +Compare internal invoice with draft/booked (V2) | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Compare internal invoice with draft/booked (V2)

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /collected-invoices/economic/v2/compare

Operation

Operation ID: compareCollectedInvoiceEconomicV2

Compare internal invoice with draft/booked (V2)

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

collected_invoice_id

query

yes

integer

Responses

Status

Description

Content Types

200

Comparison completed

application/json

400

401

403

404

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/CollectedInvoiceEconomicV2CompareResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/comparecollectedinvoiceeconomicv2bulk.html b/documentation/_site_rebuild_20260317/comparecollectedinvoiceeconomicv2bulk.html new file mode 100644 index 00000000..1ddcb683 --- /dev/null +++ b/documentation/_site_rebuild_20260317/comparecollectedinvoiceeconomicv2bulk.html @@ -0,0 +1,38 @@ + +Bulk compare collected invoices against draft/booked (V2) | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Bulk compare collected invoices against draft/booked (V2)

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /collected-invoices/economic/v2/compare/bulk

Operation

Operation ID: compareCollectedInvoiceEconomicV2Bulk

Bulk compare collected invoices against draft/booked (V2)

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "collected_invoice_ids": { + "items": { + "minimum": 1, + "type": "integer" + }, + "maxItems": 200, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "collected_invoice_ids" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Bulk comparison completed

application/json

400

401

403

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/CollectedInvoiceEconomicV2CompareBulkResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/completeorderbooking.html b/documentation/_site_rebuild_20260317/completeorderbooking.html new file mode 100644 index 00000000..a70e98f6 --- /dev/null +++ b/documentation/_site_rebuild_20260317/completeorderbooking.html @@ -0,0 +1,33 @@ + +Complete order booking | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Complete order booking

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /order-bookings/complete

Operation

Operation ID: completeOrderBooking

Complete order booking

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "id": { + "type": "integer" + }, + "safety_seal": { + "type": "integer" + } + }, + "required": [ + "id" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/completesubusersetup.html b/documentation/_site_rebuild_20260317/completesubusersetup.html new file mode 100644 index 00000000..f4e96ac0 --- /dev/null +++ b/documentation/_site_rebuild_20260317/completesubusersetup.html @@ -0,0 +1,64 @@ + +Complete subuser setup | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Complete subuser setup

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /subusers/setup

Operation

Operation ID: completeSubuserSetup

Completes subuser setup by setting a password and basic profile fields. Accepts optional `username` and `email`.

Authentication

No authentication required.

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "email": { + "format": "email", + "maxLength": 255, + "minLength": 3, + "type": "string" + }, + "name": { + "maxLength": 255, + "minLength": 3, + "type": "string" + }, + "password": { + "description": "Must include at least one uppercase letter, one lowercase letter, and one number", + "format": "password", + "minLength": 8, + "pattern": "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\\\d).+$", + "type": "string" + }, + "token": { + "description": "One-time setup token", + "type": "string" + }, + "username": { + "maxLength": 255, + "minLength": 3, + "type": "string" + } + }, + "required": [ + "token", + "password", + "name" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Setup completed

application/json

400

500

Schema for response 200 (application/json):

+{ + "properties": { + "message": { + "example": "Password set successfully", + "type": "string" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/completewashwithoutwashcertificate.html b/documentation/_site_rebuild_20260317/completewashwithoutwashcertificate.html new file mode 100644 index 00000000..d26b6152 --- /dev/null +++ b/documentation/_site_rebuild_20260317/completewashwithoutwashcertificate.html @@ -0,0 +1,30 @@ + +Complete wash without wash certificate | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Complete wash without wash certificate

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /admin/bookings/completeWashWithoutWashCertificate

Operation

Operation ID: completeWashWithoutWashCertificate

Complete wash without wash certificate

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "id": { + "type": "integer" + } + }, + "required": [ + "id" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-backups-page-1.html b/documentation/_site_rebuild_20260317/config-module-backups-page-1.html new file mode 100644 index 00000000..e6d3735f --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-backups-page-1.html @@ -0,0 +1,16 @@ + +Backups - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-backups.html b/documentation/_site_rebuild_20260317/config-module-backups.html new file mode 100644 index 00000000..f9001265 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-backups.html @@ -0,0 +1,16 @@ + +Backups | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-bird-page-1.html b/documentation/_site_rebuild_20260317/config-module-bird-page-1.html new file mode 100644 index 00000000..8caa9823 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-bird-page-1.html @@ -0,0 +1,16 @@ + +Bird - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Bird - Page 1 of 1

This page groups endpoint topics for this object type.

17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-bird.html b/documentation/_site_rebuild_20260317/config-module-bird.html new file mode 100644 index 00000000..481d5c8f --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-bird.html @@ -0,0 +1,16 @@ + +Bird | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-e-conomic-page-1.html b/documentation/_site_rebuild_20260317/config-module-e-conomic-page-1.html new file mode 100644 index 00000000..7bb2a1b9 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-e-conomic-page-1.html @@ -0,0 +1,16 @@ + +e-conomic - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-e-conomic.html b/documentation/_site_rebuild_20260317/config-module-e-conomic.html new file mode 100644 index 00000000..9feedfcf --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-e-conomic.html @@ -0,0 +1,16 @@ + +e-conomic | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

e-conomic

e-conomic accounting integration configuration.

17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-email-page-1.html b/documentation/_site_rebuild_20260317/config-module-email-page-1.html new file mode 100644 index 00000000..5a9b0fc8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-email-page-1.html @@ -0,0 +1,16 @@ + +Email - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-email.html b/documentation/_site_rebuild_20260317/config-module-email.html new file mode 100644 index 00000000..cc8625f8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-email.html @@ -0,0 +1,16 @@ + +Email | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-entra-page-1.html b/documentation/_site_rebuild_20260317/config-module-entra-page-1.html new file mode 100644 index 00000000..eecbd3f8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-entra-page-1.html @@ -0,0 +1,16 @@ + +Entra - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-entra.html b/documentation/_site_rebuild_20260317/config-module-entra.html new file mode 100644 index 00000000..356c28f3 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-entra.html @@ -0,0 +1,16 @@ + +Entra | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-fxratesapi-page-1.html b/documentation/_site_rebuild_20260317/config-module-fxratesapi-page-1.html new file mode 100644 index 00000000..38d1742b --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-fxratesapi-page-1.html @@ -0,0 +1,16 @@ + +FXRatesAPI - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-fxratesapi.html b/documentation/_site_rebuild_20260317/config-module-fxratesapi.html new file mode 100644 index 00000000..14670655 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-fxratesapi.html @@ -0,0 +1,16 @@ + +FXRatesAPI | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-gatewayapi-page-1.html b/documentation/_site_rebuild_20260317/config-module-gatewayapi-page-1.html new file mode 100644 index 00000000..f48498b8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-gatewayapi-page-1.html @@ -0,0 +1,16 @@ + +GatewayAPI - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-gatewayapi.html b/documentation/_site_rebuild_20260317/config-module-gatewayapi.html new file mode 100644 index 00000000..c6d40f45 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-gatewayapi.html @@ -0,0 +1,16 @@ + +GatewayAPI | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-licenseplaterecognizer-page-1.html b/documentation/_site_rebuild_20260317/config-module-licenseplaterecognizer-page-1.html new file mode 100644 index 00000000..511ab0e8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-licenseplaterecognizer-page-1.html @@ -0,0 +1,16 @@ + +LicensePlateRecognizer - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

LicensePlateRecognizer - Page 1 of 1

This page groups endpoint topics for this object type.

17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-licenseplaterecognizer.html b/documentation/_site_rebuild_20260317/config-module-licenseplaterecognizer.html new file mode 100644 index 00000000..15d76da6 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-licenseplaterecognizer.html @@ -0,0 +1,16 @@ + +LicensePlateRecognizer | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-limble-page-1.html b/documentation/_site_rebuild_20260317/config-module-limble-page-1.html new file mode 100644 index 00000000..82cb159f --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-limble-page-1.html @@ -0,0 +1,16 @@ + +Limble - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Limble - Page 1 of 1

This page groups endpoint topics for this object type.

17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-limble.html b/documentation/_site_rebuild_20260317/config-module-limble.html new file mode 100644 index 00000000..8f513878 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-limble.html @@ -0,0 +1,16 @@ + +Limble | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-motorapi-page-1.html b/documentation/_site_rebuild_20260317/config-module-motorapi-page-1.html new file mode 100644 index 00000000..1e617d65 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-motorapi-page-1.html @@ -0,0 +1,16 @@ + +MotorAPI - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-motorapi.html b/documentation/_site_rebuild_20260317/config-module-motorapi.html new file mode 100644 index 00000000..1535ee30 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-motorapi.html @@ -0,0 +1,16 @@ + +MotorAPI | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-ocrspace-page-1.html b/documentation/_site_rebuild_20260317/config-module-ocrspace-page-1.html new file mode 100644 index 00000000..ce03d44b --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-ocrspace-page-1.html @@ -0,0 +1,16 @@ + +OcrSpace - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-ocrspace.html b/documentation/_site_rebuild_20260317/config-module-ocrspace.html new file mode 100644 index 00000000..31649da9 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-ocrspace.html @@ -0,0 +1,16 @@ + +OcrSpace | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-openai-page-1.html b/documentation/_site_rebuild_20260317/config-module-openai-page-1.html new file mode 100644 index 00000000..afb7e66a --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-openai-page-1.html @@ -0,0 +1,16 @@ + +OpenAI - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

OpenAI - Page 1 of 1

This page groups endpoint topics for this object type.

17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-openai.html b/documentation/_site_rebuild_20260317/config-module-openai.html new file mode 100644 index 00000000..a4512c9e --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-openai.html @@ -0,0 +1,16 @@ + +OpenAI | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-recaptcha-page-1.html b/documentation/_site_rebuild_20260317/config-module-recaptcha-page-1.html new file mode 100644 index 00000000..2048bff8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-recaptcha-page-1.html @@ -0,0 +1,16 @@ + +reCAPTCHA - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-recaptcha.html b/documentation/_site_rebuild_20260317/config-module-recaptcha.html new file mode 100644 index 00000000..3f2b91a5 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-recaptcha.html @@ -0,0 +1,16 @@ + +reCAPTCHA | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-self-serve-page-1.html b/documentation/_site_rebuild_20260317/config-module-self-serve-page-1.html new file mode 100644 index 00000000..e28631fb --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-self-serve-page-1.html @@ -0,0 +1,16 @@ + +Self-Serve - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-self-serve.html b/documentation/_site_rebuild_20260317/config-module-self-serve.html new file mode 100644 index 00000000..ac2596fb --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-self-serve.html @@ -0,0 +1,16 @@ + +Self-Serve | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-shelly-page-1.html b/documentation/_site_rebuild_20260317/config-module-shelly-page-1.html new file mode 100644 index 00000000..c90de826 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-shelly-page-1.html @@ -0,0 +1,16 @@ + +Shelly - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Shelly - Page 1 of 1

This page groups endpoint topics for this object type.

17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-shelly.html b/documentation/_site_rebuild_20260317/config-module-shelly.html new file mode 100644 index 00000000..17fe79d8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-shelly.html @@ -0,0 +1,16 @@ + +Shelly | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-stripe-page-1.html b/documentation/_site_rebuild_20260317/config-module-stripe-page-1.html new file mode 100644 index 00000000..211f7390 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-stripe-page-1.html @@ -0,0 +1,16 @@ + +Stripe - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-stripe.html b/documentation/_site_rebuild_20260317/config-module-stripe.html new file mode 100644 index 00000000..e0ebefdb --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-stripe.html @@ -0,0 +1,16 @@ + +Stripe | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-virkdata-page-1.html b/documentation/_site_rebuild_20260317/config-module-virkdata-page-1.html new file mode 100644 index 00000000..529905dc --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-virkdata-page-1.html @@ -0,0 +1,16 @@ + +VirkData - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-virkdata.html b/documentation/_site_rebuild_20260317/config-module-virkdata.html new file mode 100644 index 00000000..e241e8cf --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-virkdata.html @@ -0,0 +1,16 @@ + +VirkData | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-weatherapi-page-1.html b/documentation/_site_rebuild_20260317/config-module-weatherapi-page-1.html new file mode 100644 index 00000000..14e832f2 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-weatherapi-page-1.html @@ -0,0 +1,16 @@ + +WeatherAPI - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-weatherapi.html b/documentation/_site_rebuild_20260317/config-module-weatherapi.html new file mode 100644 index 00000000..ba31f1e8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-weatherapi.html @@ -0,0 +1,16 @@ + +WeatherAPI | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-xlvask-page-1.html b/documentation/_site_rebuild_20260317/config-module-xlvask-page-1.html new file mode 100644 index 00000000..5ea2554c --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-xlvask-page-1.html @@ -0,0 +1,16 @@ + +XLVask - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config-module-xlvask.html b/documentation/_site_rebuild_20260317/config-module-xlvask.html new file mode 100644 index 00000000..d5f90abf --- /dev/null +++ b/documentation/_site_rebuild_20260317/config-module-xlvask.html @@ -0,0 +1,16 @@ + +XLVask | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/config.json b/documentation/_site_rebuild_20260317/config.json new file mode 100644 index 00000000..e48c6aa7 --- /dev/null +++ b/documentation/_site_rebuild_20260317/config.json @@ -0,0 +1 @@ +{"primary-color":"#307FFF","productWebUrl":"./introduction.html","productId":"ctw","keymaps":{},"productName":"Copenhagen Truck Wash API","productVersion":"","stage":"release","downloadTitle":"Get Copenhagen Truck Wash API","searchMaxHits":75,"color-preset":"contrast"} \ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/createbackupmodule.html b/documentation/_site_rebuild_20260317/createbackupmodule.html new file mode 100644 index 00000000..faaed287 --- /dev/null +++ b/documentation/_site_rebuild_20260317/createbackupmodule.html @@ -0,0 +1,34 @@ + +Create backup module | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create backup module

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /modules/backup/backups

Operation

Operation ID: createBackupModule

Create backup module

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "description": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name", + "description" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/createcategory.html b/documentation/_site_rebuild_20260317/createcategory.html new file mode 100644 index 00000000..07054b95 --- /dev/null +++ b/documentation/_site_rebuild_20260317/createcategory.html @@ -0,0 +1,22 @@ + +Create category | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create category

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /categories

Operation

Operation ID: createCategory

Create a new product category

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/CategoryCreate" +} +

Responses

Status

Description

Content Types

201

Category created successfully

application/json

Schema for response 201 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/createcollectedinvoice.html b/documentation/_site_rebuild_20260317/createcollectedinvoice.html new file mode 100644 index 00000000..e933b394 --- /dev/null +++ b/documentation/_site_rebuild_20260317/createcollectedinvoice.html @@ -0,0 +1,20 @@ + +Create collected invoice | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create collected invoice

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /collected-invoices

Operation

Operation ID: createCollectedInvoice

Create a new collected invoice

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

201

Collected invoice created successfully

application/json

Schema for response 201 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/createdepartment.html b/documentation/_site_rebuild_20260317/createdepartment.html new file mode 100644 index 00000000..81e54c10 --- /dev/null +++ b/documentation/_site_rebuild_20260317/createdepartment.html @@ -0,0 +1,22 @@ + +Create department | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create department

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /departments

Operation

Operation ID: createDepartment

Create a new department

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/DepartmentCreate" +} +

Responses

Status

Description

Content Types

201

Department created successfully

application/json

400

Schema for response 201 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/createdepartmentgate.html b/documentation/_site_rebuild_20260317/createdepartmentgate.html new file mode 100644 index 00000000..6f27655c --- /dev/null +++ b/documentation/_site_rebuild_20260317/createdepartmentgate.html @@ -0,0 +1,24 @@ + +Create department gate | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create department gate

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /department/gates

Operation

Operation ID: createDepartmentGate

Create department gate

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/DepartmentGateCreate" +} +

Responses

Status

Description

Content Types

201

Department gate created successfully

application/json

Schema for response 201 (application/json):

+{ + "$ref": "#/components/schemas/DepartmentGate" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/createdepartmentgoal.html b/documentation/_site_rebuild_20260317/createdepartmentgoal.html new file mode 100644 index 00000000..524b8e34 --- /dev/null +++ b/documentation/_site_rebuild_20260317/createdepartmentgoal.html @@ -0,0 +1,24 @@ + +Create department goal | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create department goal

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /goals/department

Operation

Operation ID: createDepartmentGoal

Create a new department goal. Access control: - The provided `departments` must be a subset of the user&#x27;s departments unless the user has `superuser`.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/DepartmentGoalCreate" +} +

Responses

Status

Description

Content Types

201

Department goal created successfully

application/json

400

401

403

Schema for response 201 (application/json):

+{ + "$ref": "#/components/schemas/DepartmentGoal" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/createdepartmentlane.html b/documentation/_site_rebuild_20260317/createdepartmentlane.html new file mode 100644 index 00000000..eee112fe --- /dev/null +++ b/documentation/_site_rebuild_20260317/createdepartmentlane.html @@ -0,0 +1,22 @@ + +Create department lane | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create department lane

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /department/lanes

Operation

Operation ID: createDepartmentLane

Create a new department lane

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/DepartmentLaneCreate" +} +

Responses

Status

Description

Content Types

201

Department lane created successfully

application/json

400

Schema for response 201 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/createdepartmentrelay.html b/documentation/_site_rebuild_20260317/createdepartmentrelay.html new file mode 100644 index 00000000..42373cb9 --- /dev/null +++ b/documentation/_site_rebuild_20260317/createdepartmentrelay.html @@ -0,0 +1,24 @@ + +Create department relay | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create department relay

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /department/relays

Operation

Operation ID: createDepartmentRelay

Create department relay

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/DepartmentRelayCreate" +} +

Responses

Status

Description

Content Types

201

Department relay created successfully

application/json

Schema for response 201 (application/json):

+{ + "$ref": "#/components/schemas/DepartmentRelay" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/createeconomiccustomer.html b/documentation/_site_rebuild_20260317/createeconomiccustomer.html new file mode 100644 index 00000000..815b9def --- /dev/null +++ b/documentation/_site_rebuild_20260317/createeconomiccustomer.html @@ -0,0 +1,46 @@ + +Create e-conomic customer | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create e-conomic customer

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /modules/economic/customer

Operation

Operation ID: createEconomicCustomer

Create e-conomic customer

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "customer_number": { + "type": "integer" + }, + "cvr": { + "type": "integer" + }, + "email": { + "type": "string" + }, + "name": { + "type": "string" + }, + "phone": { + "type": "integer" + } + }, + "required": [ + "customer_number", + "cvr", + "email", + "phone", + "name" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/createnotification.html b/documentation/_site_rebuild_20260317/createnotification.html new file mode 100644 index 00000000..50befa79 --- /dev/null +++ b/documentation/_site_rebuild_20260317/createnotification.html @@ -0,0 +1,22 @@ + +Create notification | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create notification

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /notifications

Operation

Operation ID: createNotification

Create a new notification

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/NotificationCreate" +} +

Responses

Status

Description

Content Types

201

Notification created successfully

application/json

Schema for response 201 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/createorder.html b/documentation/_site_rebuild_20260317/createorder.html new file mode 100644 index 00000000..ba495ecb --- /dev/null +++ b/documentation/_site_rebuild_20260317/createorder.html @@ -0,0 +1,24 @@ + +Create new order | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create new order

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /orders

Operation

Operation ID: createOrder

Create a new wash order

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/OrderCreate" +} +

Responses

Status

Description

Content Types

201

Order created successfully

application/json

400

401

Schema for response 201 (application/json):

+{ + "$ref": "#/components/schemas/Order" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/createpasskey.html b/documentation/_site_rebuild_20260317/createpasskey.html new file mode 100644 index 00000000..019cc7f4 --- /dev/null +++ b/documentation/_site_rebuild_20260317/createpasskey.html @@ -0,0 +1,33 @@ + +Create/add a passkey for the authenticated user | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create/add a passkey for the authenticated user

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /account/security/passkeys

Operation

Operation ID: createPasskey

Create/add a passkey for the authenticated user

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/PasskeyCreateRequest" +} +

Responses

Status

Description

Content Types

200

Passkey created

application/json

400

Invalid session or request

application/json

Schema for response 200 (application/json):

+{ + "properties": { + "id": { + "type": "integer" + } + }, + "type": "object" +} +

Schema for response 400 (application/json):

+{ + "$ref": "#/components/schemas/Error" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/createproduct.html b/documentation/_site_rebuild_20260317/createproduct.html new file mode 100644 index 00000000..415260ab --- /dev/null +++ b/documentation/_site_rebuild_20260317/createproduct.html @@ -0,0 +1,22 @@ + +Create product | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create product

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /products

Operation

Operation ID: createProduct

Create a new product

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/ProductCreate" +} +

Responses

Status

Description

Content Types

201

Product created successfully

application/json

400

Schema for response 201 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/createstripeinvoice.html b/documentation/_site_rebuild_20260317/createstripeinvoice.html new file mode 100644 index 00000000..71ecbf79 --- /dev/null +++ b/documentation/_site_rebuild_20260317/createstripeinvoice.html @@ -0,0 +1,20 @@ + +Create Stripe invoice | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create Stripe invoice

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /modules/stripe/invoice

Operation

Operation ID: createStripeInvoice

Create an invoice in Stripe

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

201

Stripe invoice created successfully

application/json

Schema for response 201 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/createstripepaymentintent.html b/documentation/_site_rebuild_20260317/createstripepaymentintent.html new file mode 100644 index 00000000..0fa4c9fa --- /dev/null +++ b/documentation/_site_rebuild_20260317/createstripepaymentintent.html @@ -0,0 +1,37 @@ + +Create Stripe payment intent | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create Stripe payment intent

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /orders/module/stripe/payment_intent

Operation

Operation ID: createStripePaymentIntent

Create Stripe payment intent

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "id": { + "type": "integer" + }, + "reader": { + "type": "string" + }, + "tax_percentage": { + "type": "integer" + } + }, + "required": [ + "id", + "reader" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/createsubuser.html b/documentation/_site_rebuild_20260317/createsubuser.html new file mode 100644 index 00000000..4906ead7 --- /dev/null +++ b/documentation/_site_rebuild_20260317/createsubuser.html @@ -0,0 +1,57 @@ + +Create a subuser registration | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create a subuser registration

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /subusers/me

Operation

Operation ID: createSubuser

Creates a subuser (driver) account using a company&#x27;s CVR and a phone number. Validates the CVR via e-conomic, ensures the phone number is not already in use, and if SMS is enabled sends a setup link by SMS for the user to complete registration.

Authentication

No authentication required.

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "cvr": { + "description": "Danish CVR (8 digits)", + "example": 12345678, + "type": "integer" + }, + "phone": { + "description": "Phone number (4–15 digits, no leading +)", + "example": 12345678, + "type": "integer" + }, + "phone_country_code": { + "description": "Phone country code (1–3 digits)", + "example": 45, + "type": "integer" + } + }, + "required": [ + "cvr", + "phone_country_code", + "phone" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Subuser created (or pending setup) and company identified

application/json

400

404

500

Schema for response 200 (application/json):

+{ + "properties": { + "customer_number": { + "description": "Matched e-conomic customer number", + "example": 1000, + "type": "integer" + }, + "cvr": { + "example": 12345678, + "type": "integer" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/createsubusergrant.html b/documentation/_site_rebuild_20260317/createsubusergrant.html new file mode 100644 index 00000000..ffb893a1 --- /dev/null +++ b/documentation/_site_rebuild_20260317/createsubusergrant.html @@ -0,0 +1,29 @@ + +Create subuser grant | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create subuser grant

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /subusers/grants

Operation

Operation ID: createSubuserGrant

Create subuser grant

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/SubuserGrantCreateRequest" +} +

Responses

Status

Description

Content Types

200

Grant created

application/json

400

401

500

Schema for response 200 (application/json):

+{ + "properties": { + "grant": { + "$ref": "#/components/schemas/SubuserGrant" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/createuser.html b/documentation/_site_rebuild_20260317/createuser.html new file mode 100644 index 00000000..4cdc1f22 --- /dev/null +++ b/documentation/_site_rebuild_20260317/createuser.html @@ -0,0 +1,24 @@ + +Create new user | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Create new user

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /users

Operation

Operation ID: createUser

Create a new user account

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/UserCreate" +} +

Responses

Status

Description

Content Types

201

User created successfully

application/json

400

401

Schema for response 201 (application/json):

+{ + "$ref": "#/components/schemas/User" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/current.help.version b/documentation/_site_rebuild_20260317/current.help.version new file mode 100644 index 00000000..e69de29b diff --git a/documentation/_site_rebuild_20260317/customerlogin.html b/documentation/_site_rebuild_20260317/customerlogin.html new file mode 100644 index 00000000..cf285b51 --- /dev/null +++ b/documentation/_site_rebuild_20260317/customerlogin.html @@ -0,0 +1,78 @@ + +Customer login | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Customer login

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /auth/login

Operation

Operation ID: customerLogin

Authenticate a customer using customer number and password

Authentication

No authentication required.

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "customer_number": { + "description": "Customer's e-conomic customer number", + "example": 12345, + "type": "integer" + }, + "g_recaptcha_response": { + "description": "reCAPTCHA verification token", + "type": "string" + }, + "password": { + "description": "Customer password", + "format": "password", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "customer_number", + "password", + "g_recaptcha_response" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Login successful

application/json

400

401

Schema for response 200 (application/json):

+{ + "oneOf": [ + { + "properties": { + "token": { + "description": "Bearer authentication token", + "example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", + "type": "string" + } + }, + "required": [ + "token" + ], + "type": "object" + }, + { + "properties": { + "2fa_required": { + "example": true, + "type": "boolean" + }, + "2fa_token": { + "description": "Temporary 2FA verification token", + "example": "557a3e7b1a2b...", + "type": "string" + } + }, + "required": [ + "2fa_required", + "2fa_token" + ], + "type": "object" + } + ] +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/debugworker.html b/documentation/_site_rebuild_20260317/debugworker.html new file mode 100644 index 00000000..964920e6 --- /dev/null +++ b/documentation/_site_rebuild_20260317/debugworker.html @@ -0,0 +1,18 @@ + +Debug worker | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Debug worker

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /worker/debug

Operation

Operation ID: debugWorker

Execute debug commands on the worker (often restricted)

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Debug information retrieved successfully

application/json

403

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deletecustomerattribute.html b/documentation/_site_rebuild_20260317/deletecustomerattribute.html new file mode 100644 index 00000000..9becd466 --- /dev/null +++ b/documentation/_site_rebuild_20260317/deletecustomerattribute.html @@ -0,0 +1,20 @@ + +Delete customer attribute | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete customer attribute

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /customer/attributes

Operation

Operation ID: deleteCustomerAttribute

Remove a custom attribute from a customer

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

Customer attribute deleted successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deletecustomerdefaultdepartment.html b/documentation/_site_rebuild_20260317/deletecustomerdefaultdepartment.html new file mode 100644 index 00000000..d7337468 --- /dev/null +++ b/documentation/_site_rebuild_20260317/deletecustomerdefaultdepartment.html @@ -0,0 +1,18 @@ + +Delete customer default department | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete customer default department

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /customer/department/default

Operation

Operation ID: deleteCustomerDefaultDepartment

Delete customer default department

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

customer_number

query

no

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deletecustomerfixedpricing.html b/documentation/_site_rebuild_20260317/deletecustomerfixedpricing.html new file mode 100644 index 00000000..34558229 --- /dev/null +++ b/documentation/_site_rebuild_20260317/deletecustomerfixedpricing.html @@ -0,0 +1,18 @@ + +Delete customer fixed pricing | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete customer fixed pricing

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /customer/pricing/fixed

Operation

Operation ID: deleteCustomerFixedPricing

Delete customer fixed pricing

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

customer_number

query

yes

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deletecustomernote.html b/documentation/_site_rebuild_20260317/deletecustomernote.html new file mode 100644 index 00000000..961acd73 --- /dev/null +++ b/documentation/_site_rebuild_20260317/deletecustomernote.html @@ -0,0 +1,20 @@ + +Delete customer note | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete customer note

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /customer/notes

Operation

Operation ID: deleteCustomerNote

Remove a note from a customer

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

Customer note deleted successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deletedepartmentgate.html b/documentation/_site_rebuild_20260317/deletedepartmentgate.html new file mode 100644 index 00000000..2a0bc6c4 --- /dev/null +++ b/documentation/_site_rebuild_20260317/deletedepartmentgate.html @@ -0,0 +1,18 @@ + +Delete department gate | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete department gate

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /department/gates

Operation

Operation ID: deleteDepartmentGate

Delete department gate

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Responses

Status

Description

Content Types

200

Department gate deleted

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deletedepartmentgoal.html b/documentation/_site_rebuild_20260317/deletedepartmentgoal.html new file mode 100644 index 00000000..0de36a5c --- /dev/null +++ b/documentation/_site_rebuild_20260317/deletedepartmentgoal.html @@ -0,0 +1,18 @@ + +Delete department goal | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete department goal

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /goals/department/progress-alert/test

Operation

Operation ID: deleteDepartmentGoal

Delete a department goal by `id`. Access control: - The creator (`created_by`) may delete regardless of department membership. - Otherwise the user must satisfy the subset rule or have `superuser`.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

ID of the goal to delete

Responses

Status

Description

Content Types

200

Department goal deleted successfully

application/json

400

401

403

404

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deletedepartmentrelay.html b/documentation/_site_rebuild_20260317/deletedepartmentrelay.html new file mode 100644 index 00000000..a15d51ad --- /dev/null +++ b/documentation/_site_rebuild_20260317/deletedepartmentrelay.html @@ -0,0 +1,18 @@ + +Delete department relay | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete department relay

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /department/relays

Operation

Operation ID: deleteDepartmentRelay

Delete department relay

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Responses

Status

Description

Content Types

200

Department relay deleted

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deletenotification.html b/documentation/_site_rebuild_20260317/deletenotification.html new file mode 100644 index 00000000..c13ba4f8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/deletenotification.html @@ -0,0 +1,18 @@ + +Delete notification | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete notification

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /notifications

Operation

Operation ID: deleteNotification

Delete a notification

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Responses

Status

Description

Content Types

200

Notification deleted successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deleteorder.html b/documentation/_site_rebuild_20260317/deleteorder.html new file mode 100644 index 00000000..8a6ea01c --- /dev/null +++ b/documentation/_site_rebuild_20260317/deleteorder.html @@ -0,0 +1,18 @@ + +Delete order | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete order

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /orders

Operation

Operation ID: deleteOrder

Delete an existing order

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Responses

Status

Description

Content Types

200

Order deleted successfully

application/json

401

404

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deleteorderitem.html b/documentation/_site_rebuild_20260317/deleteorderitem.html new file mode 100644 index 00000000..518894f4 --- /dev/null +++ b/documentation/_site_rebuild_20260317/deleteorderitem.html @@ -0,0 +1,18 @@ + +Delete order item | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete order item

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /order/items

Operation

Operation ID: deleteOrderItem

Remove an item from an order

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Responses

Status

Description

Content Types

200

Order item deleted successfully

application/json

404

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deleteownbooking.html b/documentation/_site_rebuild_20260317/deleteownbooking.html new file mode 100644 index 00000000..da4002e8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/deleteownbooking.html @@ -0,0 +1,30 @@ + +Delete own booking | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete own booking

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /user/bookings/delete

Operation

Operation ID: deleteOwnBooking

Delete own booking

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "id": { + "type": "integer" + } + }, + "required": [ + "id" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deletepasskey.html b/documentation/_site_rebuild_20260317/deletepasskey.html new file mode 100644 index 00000000..2f82b552 --- /dev/null +++ b/documentation/_site_rebuild_20260317/deletepasskey.html @@ -0,0 +1,22 @@ + +Delete a passkey | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete a passkey

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /account/security/passkeys/{id}

Operation

Operation ID: deletePasskey

Delete a passkey

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

path

yes

integer

Responses

Status

Description

Content Types

200

Passkey deleted

application/json

404

Not found

application/json

Schema for response 200 (application/json):

+{} +

Schema for response 404 (application/json):

+{ + "$ref": "#/components/schemas/Error" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deleteselfservecondition.html b/documentation/_site_rebuild_20260317/deleteselfservecondition.html new file mode 100644 index 00000000..6fcd27c1 --- /dev/null +++ b/documentation/_site_rebuild_20260317/deleteselfservecondition.html @@ -0,0 +1,21 @@ + +Delete self-serve condition | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete self-serve condition

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /department/selfserve/conditions

Operation

Operation ID: deleteSelfserveCondition

Delete a self-serve condition.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Condition ID

Responses

Status

Description

Content Types

200

Successfully deleted condition

application/json

400

404

Schema for response 200 (application/json):

+{ + "example": "Condition deleted", + "type": "string" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deleteselfserveconditionrule.html b/documentation/_site_rebuild_20260317/deleteselfserveconditionrule.html new file mode 100644 index 00000000..cb2cfa86 --- /dev/null +++ b/documentation/_site_rebuild_20260317/deleteselfserveconditionrule.html @@ -0,0 +1,21 @@ + +Delete self-serve condition rule | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete self-serve condition rule

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /department/selfserve/condition/rules

Operation

Operation ID: deleteSelfserveConditionRule

Delete a self-serve condition rule.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Rule ID

Responses

Status

Description

Content Types

200

Successfully deleted condition rule

application/json

400

404

Schema for response 200 (application/json):

+{ + "example": "Rule deleted", + "type": "string" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deleteselfservemachinetype.html b/documentation/_site_rebuild_20260317/deleteselfservemachinetype.html new file mode 100644 index 00000000..fdf2704b --- /dev/null +++ b/documentation/_site_rebuild_20260317/deleteselfservemachinetype.html @@ -0,0 +1,21 @@ + +Delete reusable self-serve machine type | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete reusable self-serve machine type

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /department/selfserve/machine-types

Operation

Operation ID: deleteSelfserveMachineType

Delete reusable self-serve machine type

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Responses

Status

Description

Content Types

200

Successfully deleted machine type

application/json

404

Schema for response 200 (application/json):

+{ + "example": "Machine type deleted", + "type": "string" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deleteselfservequestion.html b/documentation/_site_rebuild_20260317/deleteselfservequestion.html new file mode 100644 index 00000000..98477d31 --- /dev/null +++ b/documentation/_site_rebuild_20260317/deleteselfservequestion.html @@ -0,0 +1,21 @@ + +Delete self-serve question | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete self-serve question

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /department/selfserve/questions

Operation

Operation ID: deleteSelfserveQuestion

Delete a self-serve question by ID.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Question ID

Responses

Status

Description

Content Types

200

Successfully deleted question

application/json

400

404

Schema for response 200 (application/json):

+{ + "example": "Question deleted", + "type": "string" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deleteselfservetask.html b/documentation/_site_rebuild_20260317/deleteselfservetask.html new file mode 100644 index 00000000..4ef7a450 --- /dev/null +++ b/documentation/_site_rebuild_20260317/deleteselfservetask.html @@ -0,0 +1,21 @@ + +Delete self-serve task | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete self-serve task

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /department/selfserve/tasks

Operation

Operation ID: deleteSelfserveTask

Delete a self-serve task by ID.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Task ID

Responses

Status

Description

Content Types

200

Successfully deleted task

application/json

400

404

Schema for response 200 (application/json):

+{ + "example": "Task deleted", + "type": "string" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deleteselfservetaskattachment.html b/documentation/_site_rebuild_20260317/deleteselfservetaskattachment.html new file mode 100644 index 00000000..04b76374 --- /dev/null +++ b/documentation/_site_rebuild_20260317/deleteselfservetaskattachment.html @@ -0,0 +1,26 @@ + +Delete task attachment | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete task attachment

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /department/selfserve/tasks/attachments

Operation

Operation ID: deleteSelfserveTaskAttachment

Remove an attachment from a specific self-serve task.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

task_id

query

yes

integer

Task ID

attachment_id

query

yes

integer

Attachment ID

Responses

Status

Description

Content Types

200

Attachment deleted successfully

application/json

400

404

Schema for response 200 (application/json):

+{ + "properties": { + "message": { + "example": "Attachment deleted successfully", + "type": "string" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deleteselfservevehiclecondition.html b/documentation/_site_rebuild_20260317/deleteselfservevehiclecondition.html new file mode 100644 index 00000000..b2f4881f --- /dev/null +++ b/documentation/_site_rebuild_20260317/deleteselfservevehiclecondition.html @@ -0,0 +1,34 @@ + +Delete vehicle condition | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete vehicle condition

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /department/selfserve/vehicle/conditions

Operation

Operation ID: deleteSelfserveVehicleCondition

Delete a vehicle condition. Customers can only delete conditions for their own vehicles.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Condition ID

Responses

Status

Description

Content Types

200

Successfully deleted vehicle condition

application/json

400

404

Schema for response 200 (application/json):

+{ + "properties": { + "message": { + "example": "Condition deleted", + "type": "string" + }, + "selfserve": { + "allOf": [ + { + "$ref": "#/components/schemas/SelfserveWashSummary" + } + ], + "nullable": true + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deletestripepaymentintent.html b/documentation/_site_rebuild_20260317/deletestripepaymentintent.html new file mode 100644 index 00000000..42b53915 --- /dev/null +++ b/documentation/_site_rebuild_20260317/deletestripepaymentintent.html @@ -0,0 +1,18 @@ + +Delete Stripe payment intent | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete Stripe payment intent

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /orders/module/stripe/payment_intent

Operation

Operation ID: deleteStripePaymentIntent

Delete Stripe payment intent

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deletesubusergrant.html b/documentation/_site_rebuild_20260317/deletesubusergrant.html new file mode 100644 index 00000000..8760a905 --- /dev/null +++ b/documentation/_site_rebuild_20260317/deletesubusergrant.html @@ -0,0 +1,26 @@ + +Delete subuser grant | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete subuser grant

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /subusers/grants/{id}

Operation

Operation ID: deleteSubuserGrant

Delete subuser grant

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

path

yes

integer

Responses

Status

Description

Content Types

200

Grant deleted

application/json

401

404

500

Schema for response 200 (application/json):

+{ + "properties": { + "message": { + "example": "Grant deleted", + "type": "string" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/deletevehicle.html b/documentation/_site_rebuild_20260317/deletevehicle.html new file mode 100644 index 00000000..7219078d --- /dev/null +++ b/documentation/_site_rebuild_20260317/deletevehicle.html @@ -0,0 +1,18 @@ + +Delete vehicle | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Delete vehicle

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /vehicles

Operation

Operation ID: deleteVehicle

Delete an existing vehicle. Permissions: - Own scope: `delete_vehicle` (linked to subuser node `VEHICLES_DELETE`). - Broader scope: `delete_vehicle_other`.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

id

query

yes

integer

Responses

Status

Description

Content Types

200

Vehicle deleted

application/json

403

404

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/disable2fa.html b/documentation/_site_rebuild_20260317/disable2fa.html new file mode 100644 index 00000000..91fc6a5f --- /dev/null +++ b/documentation/_site_rebuild_20260317/disable2fa.html @@ -0,0 +1,31 @@ + +Disable 2FA | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Disable 2FA

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /auth/2fa/disable

Operation

Operation ID: disable2fa

Verify a code and disable 2FA for the authenticated user/subuser

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "code": { + "description": "The 6-digit TOTP code", + "type": "string" + } + }, + "required": [ + "code" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

2FA disabled successfully

application/json

400

401

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/disableworkerdebug.html b/documentation/_site_rebuild_20260317/disableworkerdebug.html new file mode 100644 index 00000000..a0d4df07 --- /dev/null +++ b/documentation/_site_rebuild_20260317/disableworkerdebug.html @@ -0,0 +1,18 @@ + +Disable worker debug | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Disable worker debug

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /worker/debug/off

Operation

Operation ID: disableWorkerDebug

Disable worker debug

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Worker debug disabled

application/json

403

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/downloadbookingpdf.html b/documentation/_site_rebuild_20260317/downloadbookingpdf.html new file mode 100644 index 00000000..08b603c2 --- /dev/null +++ b/documentation/_site_rebuild_20260317/downloadbookingpdf.html @@ -0,0 +1,18 @@ + +Download booking PDF | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Download booking PDF

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /bookings/download_pdf

Operation

Operation ID: downloadBookingPdf

Download booking PDF

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/downloadorderattachment.html b/documentation/_site_rebuild_20260317/downloadorderattachment.html new file mode 100644 index 00000000..6338456c --- /dev/null +++ b/documentation/_site_rebuild_20260317/downloadorderattachment.html @@ -0,0 +1,21 @@ + +Download order attachment | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Download order attachment

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /orders/attachments/download

Operation

Operation ID: downloadOrderAttachment

Download a specific order attachment

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Responses

Status

Description

Content Types

200

Attachment downloaded successfully

application/octet-stream

Schema for response 200 (application/octet-stream):

+{ + "format": "binary", + "type": "string" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/downloadownwashcertificate.html b/documentation/_site_rebuild_20260317/downloadownwashcertificate.html new file mode 100644 index 00000000..5e0cd4de --- /dev/null +++ b/documentation/_site_rebuild_20260317/downloadownwashcertificate.html @@ -0,0 +1,30 @@ + +Get download link for own wash certificate | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get download link for own wash certificate

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /user/bookings/washcertificate/download

Operation

Operation ID: downloadOwnWashCertificate

Get download link for own wash certificate

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "id": { + "type": "integer" + } + }, + "required": [ + "id" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/downloadselfservetaskattachment.html b/documentation/_site_rebuild_20260317/downloadselfservetaskattachment.html new file mode 100644 index 00000000..3dbc2859 --- /dev/null +++ b/documentation/_site_rebuild_20260317/downloadselfservetaskattachment.html @@ -0,0 +1,26 @@ + +Download task attachment | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Download task attachment

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /department/selfserve/tasks/attachments/download

Operation

Operation ID: downloadSelfserveTaskAttachment

Generate a download link for a specific self-serve task attachment.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

task_id

query

yes

integer

Task ID

attachment_id

query

yes

integer

Attachment ID

Responses

Status

Description

Content Types

200

Successfully generated download link

application/json

400

404

Schema for response 200 (application/json):

+{ + "properties": { + "download_link": { + "format": "uri", + "type": "string" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/editbrandingoption.html b/documentation/_site_rebuild_20260317/editbrandingoption.html new file mode 100644 index 00000000..3c2948fa --- /dev/null +++ b/documentation/_site_rebuild_20260317/editbrandingoption.html @@ -0,0 +1,39 @@ + +Edit branding option | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Edit branding option

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /branding

Operation

Operation ID: editBrandingOption

Update an existing branding option

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "cvr": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Branding option updated successfully

application/json

403

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/editdailyreport.html b/documentation/_site_rebuild_20260317/editdailyreport.html new file mode 100644 index 00000000..30b082c8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/editdailyreport.html @@ -0,0 +1,34 @@ + +Edit daily report | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Edit daily report

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /departments/daily-reports

Operation

Operation ID: editDailyReport

Edit daily report

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "id": { + "type": "integer" + }, + "report": { + "type": "string" + } + }, + "required": [ + "id", + "report" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/editrole.html b/documentation/_site_rebuild_20260317/editrole.html new file mode 100644 index 00000000..853a8597 --- /dev/null +++ b/documentation/_site_rebuild_20260317/editrole.html @@ -0,0 +1,34 @@ + +Edit role | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Edit role

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /roles

Operation

Operation ID: editRole

Edit role

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/editvehicle.html b/documentation/_site_rebuild_20260317/editvehicle.html new file mode 100644 index 00000000..fb127546 --- /dev/null +++ b/documentation/_site_rebuild_20260317/editvehicle.html @@ -0,0 +1,46 @@ + +Edit vehicle | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Edit vehicle

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /vehicles

Operation

Operation ID: editVehicle

Update fields on an existing vehicle. Permissions: - Own scope: `edit_vehicle` (linked to subuser node `VEHICLES_EDIT`). - Broader scope: `edit_vehicle_other`.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "id": { + "type": "integer" + }, + "reference": { + "maxLength": 255, + "nullable": true, + "type": "string" + }, + "reg": { + "maxLength": 12, + "minLength": 2, + "type": "string" + }, + "type": { + "type": "integer" + }, + "wash_subscription": { + "type": "boolean" + } + }, + "required": [ + "id" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Vehicle updated

application/json

400

403

404

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/employeelogin.html b/documentation/_site_rebuild_20260317/employeelogin.html new file mode 100644 index 00000000..6b547fa7 --- /dev/null +++ b/documentation/_site_rebuild_20260317/employeelogin.html @@ -0,0 +1,75 @@ + +Employee login | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Employee login

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /auth/employee/login

Operation

Operation ID: employeeLogin

Authenticate an employee using user ID and password

Authentication

No authentication required.

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "g_recaptcha_response": { + "description": "reCAPTCHA verification token", + "type": "string" + }, + "password": { + "description": "Employee password", + "format": "password", + "type": "string" + }, + "user_id": { + "description": "Employee user ID", + "example": 1, + "type": "integer" + } + }, + "required": [ + "user_id", + "password", + "g_recaptcha_response" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Login successful

application/json

400

401

Schema for response 200 (application/json):

+{ + "oneOf": [ + { + "properties": { + "token": { + "description": "Bearer authentication token", + "type": "string" + } + }, + "required": [ + "token" + ], + "type": "object" + }, + { + "properties": { + "2fa_required": { + "example": true, + "type": "boolean" + }, + "2fa_token": { + "description": "Temporary 2FA verification token", + "type": "string" + } + }, + "required": [ + "2fa_required", + "2fa_token" + ], + "type": "object" + } + ] +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/enable2fa.html b/documentation/_site_rebuild_20260317/enable2fa.html new file mode 100644 index 00000000..20dd3a8d --- /dev/null +++ b/documentation/_site_rebuild_20260317/enable2fa.html @@ -0,0 +1,31 @@ + +Enable 2FA | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Enable 2FA

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /auth/2fa/enable

Operation

Operation ID: enable2fa

Verify a code and enable 2FA for the authenticated user/subuser

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "code": { + "description": "The 6-digit TOTP code", + "type": "string" + } + }, + "required": [ + "code" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

2FA enabled successfully

application/json

400

401

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/enableselfservelanemachinerelay.html b/documentation/_site_rebuild_20260317/enableselfservelanemachinerelay.html new file mode 100644 index 00000000..4e762ce9 --- /dev/null +++ b/documentation/_site_rebuild_20260317/enableselfservelanemachinerelay.html @@ -0,0 +1,55 @@ + +Manually enable MACHINE relay for a lane | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Manually enable MACHINE relay for a lane

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /modules/self-serve/lane/relay/machine/enable

Operation

Operation ID: enableSelfServeLaneMachineRelay

Manually turns on the MACHINE relay for a self-serve lane if and only if the current allowed services include `MACHINE` (set via `/modules/self-serve/lane/services/allowed`). The relay is never automatically enabled; an explicit call to this endpoint is required.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "duration": { + "description": "Optional number of seconds after which the relay should automatically turn off", + "type": "integer" + }, + "lane_id": { + "type": "integer" + } + }, + "required": [ + "lane_id" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

MACHINE relay enabled

application/json

401

403

Not allowed to enable MACHINE relay (no matching task currently shown)

application/json

Schema for response 200 (application/json):

+{ + "properties": { + "duration": { + "nullable": true, + "type": "integer" + }, + "enabled": { + "type": "boolean" + }, + "lane_id": { + "type": "integer" + }, + "relay": { + "type": "string" + } + }, + "type": "object" +} +

Schema for response 403 (application/json):

+{ + "$ref": "#/components/schemas/Error" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/enableworkerdebug.html b/documentation/_site_rebuild_20260317/enableworkerdebug.html new file mode 100644 index 00000000..3a049556 --- /dev/null +++ b/documentation/_site_rebuild_20260317/enableworkerdebug.html @@ -0,0 +1,18 @@ + +Enable worker debug | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Enable worker debug

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /worker/debug/on

Operation

Operation ID: enableWorkerDebug

Enable worker debug

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Worker debug enabled

application/json

403

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/error-handling.html b/documentation/_site_rebuild_20260317/error-handling.html new file mode 100644 index 00000000..f9acfa21 --- /dev/null +++ b/documentation/_site_rebuild_20260317/error-handling.html @@ -0,0 +1,21 @@ + +Error Handling | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Error Handling

This section describes error responses defined in openapi.yaml.

Error Schema

The shared Error schema is:

+{ + "error": "Invalid API token", + "code": 401 +} +

HTTP Status Codes

Common error status codes used across endpoints:

Code

Meaning

400

Bad Request

401

Unauthorized

403

Forbidden

404

Not Found

409

Conflict

422

Unprocessable Entity

500

Internal Server Error

17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/exportdraftinvoicetoeconomic.html b/documentation/_site_rebuild_20260317/exportdraftinvoicetoeconomic.html new file mode 100644 index 00000000..7cc64f57 --- /dev/null +++ b/documentation/_site_rebuild_20260317/exportdraftinvoicetoeconomic.html @@ -0,0 +1,20 @@ + +Export draft invoice to e-conomic | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Export draft invoice to e-conomic

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /economic/invoice/draft/export

Operation

Operation ID: exportDraftInvoiceToEconomic

Export a draft invoice to e-conomic

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

Draft invoice exported successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/exportinvoicetoeconomic.html b/documentation/_site_rebuild_20260317/exportinvoicetoeconomic.html new file mode 100644 index 00000000..93fb00fb --- /dev/null +++ b/documentation/_site_rebuild_20260317/exportinvoicetoeconomic.html @@ -0,0 +1,20 @@ + +Export invoice to e-conomic | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Export invoice to e-conomic

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /economic/invoice/export

Operation

Operation ID: exportInvoiceToEconomic

Export a booked invoice to e-conomic

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

Invoice exported successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/forcedisableselfservelanemachine.html b/documentation/_site_rebuild_20260317/forcedisableselfservelanemachine.html new file mode 100644 index 00000000..8dff9c0f --- /dev/null +++ b/documentation/_site_rebuild_20260317/forcedisableselfservelanemachine.html @@ -0,0 +1,59 @@ + +Force disable MACHINE relay but keep lane as in-wash (superusers only) | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Force disable MACHINE relay but keep lane as in-wash (superusers only)

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /modules/self-serve/lane/force/machine/disable

Operation

Operation ID: forceDisableSelfServeLaneMachine

Superuser/emergency endpoint. Turns off the MACHINE relay while ensuring the lane remains in an IN_WASH state (simulating a started wash without machine assistance).

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "lane_id": { + "type": "integer" + }, + "license_plate": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "lane_id" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

MACHINE relay force-disabled and lane ensured in-wash

application/json

401

403

Schema for response 200 (application/json):

+{ + "properties": { + "forced": { + "type": "boolean" + }, + "lane_id": { + "type": "integer" + }, + "machine": { + "enum": [ + "DISABLED" + ], + "type": "string" + }, + "state": { + "type": "string" + }, + "status": { + "type": "string" + }, + "wash_start_time": { + "type": "integer" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/forceenableselfservelanemachine.html b/documentation/_site_rebuild_20260317/forceenableselfservelanemachine.html new file mode 100644 index 00000000..af654768 --- /dev/null +++ b/documentation/_site_rebuild_20260317/forceenableselfservelanemachine.html @@ -0,0 +1,69 @@ + +Force enable MACHINE relay and mark lane as in-wash (superusers only) | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Force enable MACHINE relay and mark lane as in-wash (superusers only)

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /modules/self-serve/lane/force/machine/enable

Operation

Operation ID: forceEnableSelfServeLaneMachine

Superuser/emergency endpoint. Bypasses the allowed services gating and directly turns on the MACHINE relay. Also ensures the lane is marked as OCCUPIED and IN_WASH with a wash start timestamp if not already set.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "duration": { + "description": "Optional number of seconds after which the relay should automatically turn off", + "nullable": true, + "type": "integer" + }, + "lane_id": { + "type": "integer" + }, + "license_plate": { + "description": "Optional license plate to associate with the lane", + "nullable": true, + "type": "string" + } + }, + "required": [ + "lane_id" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

MACHINE relay force-enabled and lane marked in-wash

application/json

401

403

Schema for response 200 (application/json):

+{ + "properties": { + "duration": { + "nullable": true, + "type": "integer" + }, + "forced": { + "type": "boolean" + }, + "lane_id": { + "type": "integer" + }, + "machine": { + "enum": [ + "ENABLED" + ], + "type": "string" + }, + "state": { + "type": "string" + }, + "status": { + "type": "string" + }, + "wash_start_time": { + "type": "integer" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/generatewashcertificate.html b/documentation/_site_rebuild_20260317/generatewashcertificate.html new file mode 100644 index 00000000..801f027b --- /dev/null +++ b/documentation/_site_rebuild_20260317/generatewashcertificate.html @@ -0,0 +1,27 @@ + +Generate wash certificate | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Generate wash certificate

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /order/wash-certificate

Operation

Operation ID: generateWashCertificate

Generate a wash certificate for an order

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "order_id": { + "type": "integer" + } + }, + "type": "object" +} +

Responses

Status

Description

Content Types

200

Wash certificate generated successfully

application/json

400

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getallexchangerates.html b/documentation/_site_rebuild_20260317/getallexchangerates.html new file mode 100644 index 00000000..fc85c566 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getallexchangerates.html @@ -0,0 +1,18 @@ + +Get all exchange rates | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get all exchange rates

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/fxratesapi/rates

Operation

Operation ID: getAllExchangeRates

Get all available exchange rates

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Exchange rates retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getavailablevehicleaddons.html b/documentation/_site_rebuild_20260317/getavailablevehicleaddons.html new file mode 100644 index 00000000..b0b7b202 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getavailablevehicleaddons.html @@ -0,0 +1,18 @@ + +Get available vehicle addons | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get available vehicle addons

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /vehicles/addons/available

Operation

Operation ID: getAvailableVehicleAddons

Get list of available addons for a vehicle. Permissions: - Own scope: `list_vehicle_addon_own` (linked to subuser node `VEHICLES_LIST`). - Broader scope: `list_vehicles_addon_other`.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

id

query

yes

integer

Responses

Status

Description

Content Types

200

Available addons retrieved successfully

application/json

403

404

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getbackupsconfig.html b/documentation/_site_rebuild_20260317/getbackupsconfig.html new file mode 100644 index 00000000..44b215d2 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getbackupsconfig.html @@ -0,0 +1,20 @@ + +Get backups config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get backups config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /backups/config

Operation

Operation ID: getBackupsConfig

Get backups config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Backups configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/BackupsConfigListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getbirdconfig.html b/documentation/_site_rebuild_20260317/getbirdconfig.html new file mode 100644 index 00000000..01f99970 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getbirdconfig.html @@ -0,0 +1,20 @@ + +Get Bird config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get Bird config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /bird/config

Operation

Operation ID: getBirdConfig

Get Bird config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Bird configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/BirdConfigListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getcollectedinvoiceeconomicv2details.html b/documentation/_site_rebuild_20260317/getcollectedinvoiceeconomicv2details.html new file mode 100644 index 00000000..fe48991e --- /dev/null +++ b/documentation/_site_rebuild_20260317/getcollectedinvoiceeconomicv2details.html @@ -0,0 +1,20 @@ + +Get deep V2 e-conomic invoice details | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get deep V2 e-conomic invoice details

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /collected-invoices/economic/v2/details

Operation

Operation ID: getCollectedInvoiceEconomicV2Details

Returns normalized internal lines and best-effort fetched draft/booked e-conomic lines for a collected invoice, including department distributions and warnings.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

collected_invoice_id

query

yes

integer

Responses

Status

Description

Content Types

200

Details resolved successfully

application/json

400

401

403

404

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/CollectedInvoiceEconomicV2DetailsResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getcollectedinvoiceeconomicv2revenuestatistics.html b/documentation/_site_rebuild_20260317/getcollectedinvoiceeconomicv2revenuestatistics.html new file mode 100644 index 00000000..6746b7fb --- /dev/null +++ b/documentation/_site_rebuild_20260317/getcollectedinvoiceeconomicv2revenuestatistics.html @@ -0,0 +1,20 @@ + +Get overall booked revenue statistics from e-conomic (V2) | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get overall booked revenue statistics from e-conomic (V2)

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /collected-invoices/economic/v2/revenue-statistics

Operation

Operation ID: getCollectedInvoiceEconomicV2RevenueStatistics

Aggregates booked e-conomic revenue across invoices and lines, with optional filters for date range, customer(s), department(s), currency, and barred-customer status.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

dateFrom

query

no

string

Start date (inclusive), defaults to first day of current month.

dateTo

query

no

string

End date (inclusive), defaults to today.

customer_numbers

query

no

string

Comma-separated customer numbers to include.

department_numbers

query

no

string

Comma-separated department numbers to include.

currency

query

no

string

Restrict to a specific invoice currency.

barred

query

no

string

Filter by e-conomic customer barred status.

max_pages

query

no

integer

Safety cap for paginated e-conomic reads.

Responses

Status

Description

Content Types

200

Revenue statistics resolved successfully

application/json

400

401

403

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/CollectedInvoiceEconomicV2RevenueStatisticsResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getcurrentsubuser.html b/documentation/_site_rebuild_20260317/getcurrentsubuser.html new file mode 100644 index 00000000..6664920b --- /dev/null +++ b/documentation/_site_rebuild_20260317/getcurrentsubuser.html @@ -0,0 +1,20 @@ + +Get current subuser profile | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get current subuser profile

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /subusers/me

Operation

Operation ID: getCurrentSubuser

Returns the authenticated subuser (driver) profile and their enabled grants grouped by `billing_customer_number`. Notes: - This endpoint is available only to authenticated subuser sessions. - It does not require the `X-Customer-Number` header; all enabled, non-deleted grants for the subuser are included in the response.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Current subuser details

application/json

401

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/SubuserSelf" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getcustomer.html b/documentation/_site_rebuild_20260317/getcustomer.html new file mode 100644 index 00000000..be4b7095 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getcustomer.html @@ -0,0 +1,20 @@ + +Get customer details | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get customer details

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /users/customer

Operation

Operation ID: getCustomer

Get details about a specific customer

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

customer_number

query

no

integer

Responses

Status

Description

Content Types

200

Customer retrieved successfully

application/json

404

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/User" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getcustomerattributes.html b/documentation/_site_rebuild_20260317/getcustomerattributes.html new file mode 100644 index 00000000..c7595c45 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getcustomerattributes.html @@ -0,0 +1,18 @@ + +Get customer attributes | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get customer attributes

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /customer/attributes

Operation

Operation ID: getCustomerAttributes

Get custom attributes for a customer

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

customer_id

query

no

integer

Responses

Status

Description

Content Types

200

Customer attributes retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getcustomercode.html b/documentation/_site_rebuild_20260317/getcustomercode.html new file mode 100644 index 00000000..1bc79b0c --- /dev/null +++ b/documentation/_site_rebuild_20260317/getcustomercode.html @@ -0,0 +1,18 @@ + +Get customer code | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get customer code

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /admin/customer/code

Operation

Operation ID: getCustomerCode

Get customer code

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

customer_number

query

no

integer

user_id

query

no

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getcustomerdefaultdepartment.html b/documentation/_site_rebuild_20260317/getcustomerdefaultdepartment.html new file mode 100644 index 00000000..c99b2b4b --- /dev/null +++ b/documentation/_site_rebuild_20260317/getcustomerdefaultdepartment.html @@ -0,0 +1,18 @@ + +Get customer default department | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get customer default department

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /customer/department/default

Operation

Operation ID: getCustomerDefaultDepartment

Get customer default department

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

customer_number

query

no

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getcustomerfixedpricing.html b/documentation/_site_rebuild_20260317/getcustomerfixedpricing.html new file mode 100644 index 00000000..b5daa31c --- /dev/null +++ b/documentation/_site_rebuild_20260317/getcustomerfixedpricing.html @@ -0,0 +1,18 @@ + +Get customer fixed pricing | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get customer fixed pricing

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /customer/pricing/fixed

Operation

Operation ID: getCustomerFixedPricing

Get customer fixed pricing

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

customer_number

query

yes

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getcustomername.html b/documentation/_site_rebuild_20260317/getcustomername.html new file mode 100644 index 00000000..3326605f --- /dev/null +++ b/documentation/_site_rebuild_20260317/getcustomername.html @@ -0,0 +1,25 @@ + +Get customer name | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get customer name

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /admin/customer/name

Operation

Operation ID: getCustomerName

Get the full name of a customer

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

user_id

query

no

integer

Responses

Status

Description

Content Types

200

Customer name retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getcustomernotes.html b/documentation/_site_rebuild_20260317/getcustomernotes.html new file mode 100644 index 00000000..dc832eb9 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getcustomernotes.html @@ -0,0 +1,18 @@ + +Get customer notes | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get customer notes

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /customer/notes

Operation

Operation ID: getCustomerNotes

Get notes for a customer

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

customer_id

query

no

integer

Responses

Status

Description

Content Types

200

Customer notes retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getcustomerpricinghistoryv2.html b/documentation/_site_rebuild_20260317/getcustomerpricinghistoryv2.html new file mode 100644 index 00000000..dba856a6 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getcustomerpricinghistoryv2.html @@ -0,0 +1,20 @@ + +Get customer versioned pricing/subscription/discount timeline | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get customer versioned pricing/subscription/discount timeline

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /superuser/customers/pricing-history

Operation

Operation ID: getCustomerPricingHistoryV2

Get customer versioned pricing/subscription/discount timeline

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

customer_number

query

yes

integer

dateFrom

query

yes

string

dateTo

query

yes

string

Responses

Status

Description

Content Types

200

Customer timeline resolved

application/json

400

401

403

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/CustomerPricingHistoryResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getdailyreport.html b/documentation/_site_rebuild_20260317/getdailyreport.html new file mode 100644 index 00000000..7e0315c1 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getdailyreport.html @@ -0,0 +1,18 @@ + +Get daily report | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get daily report

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /departments/daily-reports/get

Operation

Operation ID: getDailyReport

Get daily report

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

department_id

query

yes

integer

date

query

yes

string

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getdailyreportbookingscount.html b/documentation/_site_rebuild_20260317/getdailyreportbookingscount.html new file mode 100644 index 00000000..d9bc559d --- /dev/null +++ b/documentation/_site_rebuild_20260317/getdailyreportbookingscount.html @@ -0,0 +1,18 @@ + +Get bookings count for daily reports | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get bookings count for daily reports

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /departments/daily-reports/bookings-count

Operation

Operation ID: getDailyReportBookingsCount

Get bookings count for daily reports

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

date

query

yes

string

department_id

query

yes

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getdailyreportproductcount.html b/documentation/_site_rebuild_20260317/getdailyreportproductcount.html new file mode 100644 index 00000000..38a40cda --- /dev/null +++ b/documentation/_site_rebuild_20260317/getdailyreportproductcount.html @@ -0,0 +1,18 @@ + +Get product count for daily reports | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get product count for daily reports

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /departments/daily-reports/product-count

Operation

Operation ID: getDailyReportProductCount

Get product count for daily reports

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

date

query

yes

string

date_to

query

no

string

department_id

query

yes

integer

product_id

query

yes

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getdailyreporttransactioncount.html b/documentation/_site_rebuild_20260317/getdailyreporttransactioncount.html new file mode 100644 index 00000000..aaa6ade1 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getdailyreporttransactioncount.html @@ -0,0 +1,18 @@ + +Get transaction count for daily reports | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get transaction count for daily reports

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /departments/daily-reports/transaction-count

Operation

Operation ID: getDailyReportTransactionCount

Get transaction count for daily reports

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

date

query

yes

string

date_to

query

no

string

department_id

query

yes

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getdepartmentbookingcount.html b/documentation/_site_rebuild_20260317/getdepartmentbookingcount.html new file mode 100644 index 00000000..d1da9273 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getdepartmentbookingcount.html @@ -0,0 +1,18 @@ + +Get department unfulfilled bookings count | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get department unfulfilled bookings count

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /admin/bookings/department/count

Operation

Operation ID: getDepartmentBookingCount

Get department unfulfilled bookings count

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

department_id

query

yes

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getdepartmentcategories.html b/documentation/_site_rebuild_20260317/getdepartmentcategories.html new file mode 100644 index 00000000..4e9d6ea2 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getdepartmentcategories.html @@ -0,0 +1,18 @@ + +Get department categories | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get department categories

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /departments/categories

Operation

Operation ID: getDepartmentCategories

Get product categories available in a department

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

department_id

query

yes

integer

Responses

Status

Description

Content Types

200

Department categories retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getdepartmentdraftinvoicetotals.html b/documentation/_site_rebuild_20260317/getdepartmentdraftinvoicetotals.html new file mode 100644 index 00000000..000a5531 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getdepartmentdraftinvoicetotals.html @@ -0,0 +1,18 @@ + +Get department draft invoice totals | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get department draft invoice totals

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /statistics/economic/totals/department_draft_invoice_totals

Operation

Operation ID: getDepartmentDraftInvoiceTotals

Get department draft invoice totals

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getdepartmentlanedynamicimage.html b/documentation/_site_rebuild_20260317/getdepartmentlanedynamicimage.html new file mode 100644 index 00000000..c97c95a3 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getdepartmentlanedynamicimage.html @@ -0,0 +1,21 @@ + +Generate dynamic image for a department lane | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Generate dynamic image for a department lane

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /department/lanes/dynamic-image

Operation

Operation ID: getDepartmentLaneDynamicImage

Returns a composed machine UI image for the specified department lane. You can optionally highlight button indices, set the current step indicator, and toggle only-current-step mode.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

department

query

yes

integer

Department ID

lane

query

yes

integer

Lane ID

buttons

query

no

oneOf

Highlighted button IDs (0-indexed). Accepts CSV, JSON array, or repeated query params.

current_step

query

no

integer

Current step indicator (non-negative integer)

only_current_step

query

no

boolean

If true, only draw the current step highlight

vehicle_type

query

no

integer

Vehicle type selection override (nullable non-negative integer)

Responses

Status

Description

Content Types

200

Dynamic image rendered successfully

image/png

400

401

403

404

Schema for response 200 (image/png):

+{ + "format": "binary", + "type": "string" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getdepartmentprices.html b/documentation/_site_rebuild_20260317/getdepartmentprices.html new file mode 100644 index 00000000..b274b7b9 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getdepartmentprices.html @@ -0,0 +1,18 @@ + +Get department prices | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get department prices

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /superuser/department/prices

Operation

Operation ID: getDepartmentPrices

Get department prices

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

department_id

query

yes

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getdepartmentrecommendedorder.html b/documentation/_site_rebuild_20260317/getdepartmentrecommendedorder.html new file mode 100644 index 00000000..5594ab9c --- /dev/null +++ b/documentation/_site_rebuild_20260317/getdepartmentrecommendedorder.html @@ -0,0 +1,18 @@ + +Get recommended order for department | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get recommended order for department

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /departments/order/recommended

Operation

Operation ID: getDepartmentRecommendedOrder

Get recommended order for department

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

department_id

query

yes

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getdepartmentselfserveenabled.html b/documentation/_site_rebuild_20260317/getdepartmentselfserveenabled.html new file mode 100644 index 00000000..bc0b97b2 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getdepartmentselfserveenabled.html @@ -0,0 +1,25 @@ + +Get department self-serve status | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get department self-serve status

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /departments/self-serve/enabled

Operation

Operation ID: getDepartmentSelfServeEnabled

Check if self-serve is enabled for a specific department

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Department ID

Responses

Status

Description

Content Types

200

Successfully retrieved status

application/json

404

Schema for response 200 (application/json):

+{ + "properties": { + "enabled": { + "type": "boolean" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getdepartmentsentinvoicetotals.html b/documentation/_site_rebuild_20260317/getdepartmentsentinvoicetotals.html new file mode 100644 index 00000000..53a0fadc --- /dev/null +++ b/documentation/_site_rebuild_20260317/getdepartmentsentinvoicetotals.html @@ -0,0 +1,18 @@ + +Get department sent invoice totals | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get department sent invoice totals

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /statistics/economic/totals/department_sent_invoice_totals

Operation

Operation ID: getDepartmentSentInvoiceTotals

Get department sent invoice totals

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getdepartmentterminallocation.html b/documentation/_site_rebuild_20260317/getdepartmentterminallocation.html new file mode 100644 index 00000000..162804dc --- /dev/null +++ b/documentation/_site_rebuild_20260317/getdepartmentterminallocation.html @@ -0,0 +1,18 @@ + +Get department terminal location | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get department terminal location

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/stripe/department/terminal/location

Operation

Operation ID: getDepartmentTerminalLocation

Get department terminal location

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getdepartmentterminalreaders.html b/documentation/_site_rebuild_20260317/getdepartmentterminalreaders.html new file mode 100644 index 00000000..250124b4 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getdepartmentterminalreaders.html @@ -0,0 +1,18 @@ + +Get department terminal readers | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get department terminal readers

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/stripe/department/terminal/readers

Operation

Operation ID: getDepartmentTerminalReaders

Get department terminal readers

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getdepartmentvariables.html b/documentation/_site_rebuild_20260317/getdepartmentvariables.html new file mode 100644 index 00000000..b19253b0 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getdepartmentvariables.html @@ -0,0 +1,18 @@ + +Get department variables | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get department variables

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /superuser/department/variables

Operation

Operation ID: getDepartmentVariables

Get department variables

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

department_id

query

yes

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getdepartmentweathertimeline.html b/documentation/_site_rebuild_20260317/getdepartmentweathertimeline.html new file mode 100644 index 00000000..12153b09 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getdepartmentweathertimeline.html @@ -0,0 +1,36 @@ + +Get department weather timeline | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get department weather timeline

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /departments/weather

Operation

Operation ID: getDepartmentWeatherTimeline

Returns hourly weather, washes, hours and productivity status for a department

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Department ID

Responses

Status

Description

Content Types

200

Department weather timeline retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/DepartmentWeatherTimelineResponse", + "allOf": [ + { + "$ref": "#/components/schemas/SuccessResponse" + }, + { + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/DepartmentWeatherTimelineEntry" + }, + "type": "array" + } + }, + "type": "object" + } + ] +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/geteconomicconfig.html b/documentation/_site_rebuild_20260317/geteconomicconfig.html new file mode 100644 index 00000000..3fda2945 --- /dev/null +++ b/documentation/_site_rebuild_20260317/geteconomicconfig.html @@ -0,0 +1,20 @@ + +Get e-conomic config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get e-conomic config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /economic/config

Operation

Operation ID: getEconomicConfig

Get e-conomic config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

e-conomic configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/EconomicConfigListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/geteconomiccustomer.html b/documentation/_site_rebuild_20260317/geteconomiccustomer.html new file mode 100644 index 00000000..53241ba8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/geteconomiccustomer.html @@ -0,0 +1,18 @@ + +Get e-conomic customer details | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get e-conomic customer details

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/economic/customer

Operation

Operation ID: getEconomicCustomer

Get e-conomic customer details

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

customer_number

query

yes

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/geteconomicdepartments.html b/documentation/_site_rebuild_20260317/geteconomicdepartments.html new file mode 100644 index 00000000..f37b072b --- /dev/null +++ b/documentation/_site_rebuild_20260317/geteconomicdepartments.html @@ -0,0 +1,18 @@ + +Get e-conomic departments | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get e-conomic departments

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /economic/departments

Operation

Operation ID: getEconomicDepartments

Get e-conomic departments

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/geteconomiclayouts.html b/documentation/_site_rebuild_20260317/geteconomiclayouts.html new file mode 100644 index 00000000..6204e008 --- /dev/null +++ b/documentation/_site_rebuild_20260317/geteconomiclayouts.html @@ -0,0 +1,18 @@ + +Get e-conomic layouts | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get e-conomic layouts

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /economic/layouts

Operation

Operation ID: getEconomicLayouts

Get available invoice layouts from e-conomic

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Layouts retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/geteconomicpaymentterms.html b/documentation/_site_rebuild_20260317/geteconomicpaymentterms.html new file mode 100644 index 00000000..28e8a276 --- /dev/null +++ b/documentation/_site_rebuild_20260317/geteconomicpaymentterms.html @@ -0,0 +1,18 @@ + +Get e-conomic payment terms | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get e-conomic payment terms

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /economic/payment-terms

Operation

Operation ID: getEconomicPaymentTerms

Get available payment terms from e-conomic

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Payment terms retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/geteconomicproducts.html b/documentation/_site_rebuild_20260317/geteconomicproducts.html new file mode 100644 index 00000000..349d7a65 --- /dev/null +++ b/documentation/_site_rebuild_20260317/geteconomicproducts.html @@ -0,0 +1,18 @@ + +Get e-conomic products | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get e-conomic products

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /economic/products

Operation

Operation ID: getEconomicProducts

Get e-conomic products

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/geteconomictotals.html b/documentation/_site_rebuild_20260317/geteconomictotals.html new file mode 100644 index 00000000..ceae5004 --- /dev/null +++ b/documentation/_site_rebuild_20260317/geteconomictotals.html @@ -0,0 +1,18 @@ + +Get total economic statistics | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get total economic statistics

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /statistics/economic/totals

Operation

Operation ID: getEconomicTotals

Get total economic statistics

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getemailconfig.html b/documentation/_site_rebuild_20260317/getemailconfig.html new file mode 100644 index 00000000..74113afc --- /dev/null +++ b/documentation/_site_rebuild_20260317/getemailconfig.html @@ -0,0 +1,20 @@ + +Get email config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get email config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /email/config

Operation

Operation ID: getEmailConfig

Get email config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Email configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/EmailConfigListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getentraconfig.html b/documentation/_site_rebuild_20260317/getentraconfig.html new file mode 100644 index 00000000..dc27428f --- /dev/null +++ b/documentation/_site_rebuild_20260317/getentraconfig.html @@ -0,0 +1,20 @@ + +Get Entra config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get Entra config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /entra/config

Operation

Operation ID: getEntraConfig

Get Entra config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Entra configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/EntraConfigListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getexchangerate.html b/documentation/_site_rebuild_20260317/getexchangerate.html new file mode 100644 index 00000000..085cbe57 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getexchangerate.html @@ -0,0 +1,18 @@ + +Get exchange rate | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get exchange rate

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/fxratesapi/rate

Operation

Operation ID: getExchangeRate

Get current exchange rate

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

from

query

yes

string

to

query

yes

string

Responses

Status

Description

Content Types

200

Exchange rate retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getform.html b/documentation/_site_rebuild_20260317/getform.html new file mode 100644 index 00000000..a872bb12 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getform.html @@ -0,0 +1,18 @@ + +Get form | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get form

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /form

Operation

Operation ID: getForm

Retrieve a form definition

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

no

integer

Responses

Status

Description

Content Types

200

Form retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getfxratesapiconfig.html b/documentation/_site_rebuild_20260317/getfxratesapiconfig.html new file mode 100644 index 00000000..ee34929a --- /dev/null +++ b/documentation/_site_rebuild_20260317/getfxratesapiconfig.html @@ -0,0 +1,20 @@ + +Get FXRatesAPI config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get FXRatesAPI config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /fxratesapi/config

Operation

Operation ID: getFxRatesApiConfig

Get FXRatesAPI config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

FXRatesAPI configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/FxRatesApiConfigListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getgatewayapiconfig.html b/documentation/_site_rebuild_20260317/getgatewayapiconfig.html new file mode 100644 index 00000000..3584d3b3 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getgatewayapiconfig.html @@ -0,0 +1,20 @@ + +Get GatewayAPI config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get GatewayAPI config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /gatewayapi/config

Operation

Operation ID: getGatewayApiConfig

Get GatewayAPI config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

GatewayAPI configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/GatewayApiConfigListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getinvoicepdf.html b/documentation/_site_rebuild_20260317/getinvoicepdf.html new file mode 100644 index 00000000..04c2bc25 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getinvoicepdf.html @@ -0,0 +1,21 @@ + +Get invoice PDF | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get invoice PDF

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /invoices/pdf

Operation

Operation ID: getInvoicePdf

Download an invoice as PDF

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Responses

Status

Description

Content Types

200

PDF retrieved successfully

application/pdf

Schema for response 200 (application/pdf):

+{ + "format": "binary", + "type": "string" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getinvoicingfixedpricingdistribution.html b/documentation/_site_rebuild_20260317/getinvoicingfixedpricingdistribution.html new file mode 100644 index 00000000..7c4face8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getinvoicingfixedpricingdistribution.html @@ -0,0 +1,20 @@ + +Get fixed pricing distribution | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get fixed pricing distribution

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /superuser/invoicing/period/distribution/fixed-pricing

Operation

Operation ID: getInvoicingFixedPricingDistribution

Get invoicing distribution for fixed pricing items

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

dateFrom

query

yes

string

dateTo

query

yes

string

Responses

Status

Description

Content Types

200

Fixed pricing distribution retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getinvoicingperioddistributionv2all.html b/documentation/_site_rebuild_20260317/getinvoicingperioddistributionv2all.html new file mode 100644 index 00000000..40db707e --- /dev/null +++ b/documentation/_site_rebuild_20260317/getinvoicingperioddistributionv2all.html @@ -0,0 +1,20 @@ + +Get version-aware historical distribution (all) | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get version-aware historical distribution (all)

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /superuser/invoicing/period/distribution/v2/all

Operation

Operation ID: getInvoicingPeriodDistributionV2All

Get version-aware historical distribution (all)

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

dateFrom

query

yes

string

dateTo

query

yes

string

Responses

Status

Description

Content Types

200

Version-aware historical distribution (all categories)

application/json

400

401

403

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/InvoicingDistributionV2AllResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getinvoicingperioddistributionv2bookeddepartment75.html b/documentation/_site_rebuild_20260317/getinvoicingperioddistributionv2bookeddepartment75.html new file mode 100644 index 00000000..38a442eb --- /dev/null +++ b/documentation/_site_rebuild_20260317/getinvoicingperioddistributionv2bookeddepartment75.html @@ -0,0 +1,20 @@ + +Get booked e-conomic department 75 redistribution | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get booked e-conomic department 75 redistribution

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /superuser/invoicing/period/distribution/v2/booked-department-75

Operation

Operation ID: getInvoicingPeriodDistributionV2BookedDepartment75

Get booked e-conomic department 75 redistribution

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

dateFrom

query

yes

string

dateTo

query

yes

string

Responses

Status

Description

Content Types

200

Actual booked e-conomic department 75 net amounts redistributed to internal departments

application/json

400

401

403

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/InvoicingDistributionV2BookedDepartment75Response" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getinvoicingperioddistributionv2customerprices.html b/documentation/_site_rebuild_20260317/getinvoicingperioddistributionv2customerprices.html new file mode 100644 index 00000000..2a55cc32 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getinvoicingperioddistributionv2customerprices.html @@ -0,0 +1,20 @@ + +Get version-aware historical customer-price discount distribution | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get version-aware historical customer-price discount distribution

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /superuser/invoicing/period/distribution/v2/customer-prices

Operation

Operation ID: getInvoicingPeriodDistributionV2CustomerPrices

Get version-aware historical customer-price discount distribution

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

dateFrom

query

yes

string

dateTo

query

yes

string

Responses

Status

Description

Content Types

200

Version-aware customer-price discount distribution

application/json

400

401

403

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/InvoicingDistributionV2CustomerPricesResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getinvoicingperioddistributionv2fixedpricing.html b/documentation/_site_rebuild_20260317/getinvoicingperioddistributionv2fixedpricing.html new file mode 100644 index 00000000..42199b66 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getinvoicingperioddistributionv2fixedpricing.html @@ -0,0 +1,20 @@ + +Get version-aware historical fixed pricing distribution | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get version-aware historical fixed pricing distribution

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /superuser/invoicing/period/distribution/v2/fixed-pricing

Operation

Operation ID: getInvoicingPeriodDistributionV2FixedPricing

Get version-aware historical fixed pricing distribution

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

dateFrom

query

yes

string

dateTo

query

yes

string

Responses

Status

Description

Content Types

200

Version-aware fixed pricing distribution

application/json

400

401

403

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/InvoicingDistributionV2FixedPricingResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getinvoicingperioddistributionv2washsubscriptions.html b/documentation/_site_rebuild_20260317/getinvoicingperioddistributionv2washsubscriptions.html new file mode 100644 index 00000000..85e18028 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getinvoicingperioddistributionv2washsubscriptions.html @@ -0,0 +1,20 @@ + +Get version-aware historical wash subscription distribution | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get version-aware historical wash subscription distribution

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /superuser/invoicing/period/distribution/v2/wash-subscriptions

Operation

Operation ID: getInvoicingPeriodDistributionV2WashSubscriptions

Get version-aware historical wash subscription distribution

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

dateFrom

query

yes

string

dateTo

query

yes

string

Responses

Status

Description

Content Types

200

Version-aware wash subscription distribution

application/json

400

401

403

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/InvoicingDistributionV2WashSubscriptionsResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getinvoicingperiods.html b/documentation/_site_rebuild_20260317/getinvoicingperiods.html new file mode 100644 index 00000000..32f0a979 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getinvoicingperiods.html @@ -0,0 +1,18 @@ + +Get invoicing periods | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get invoicing periods

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /superuser/invoicing/period

Operation

Operation ID: getInvoicingPeriods

Retrieve invoicing periods for superusers

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

dateFrom

query

yes

string

dateTo

query

yes

string

Responses

Status

Description

Content Types

200

Invoicing periods retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getinvoicingwashsubscriptionsdistribution.html b/documentation/_site_rebuild_20260317/getinvoicingwashsubscriptionsdistribution.html new file mode 100644 index 00000000..9864b346 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getinvoicingwashsubscriptionsdistribution.html @@ -0,0 +1,20 @@ + +Get wash subscriptions distribution | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get wash subscriptions distribution

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /superuser/invoicing/period/distribution/wash-subscriptions

Operation

Operation ID: getInvoicingWashSubscriptionsDistribution

Get invoicing distribution for wash subscriptions

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

dateFrom

query

yes

string

dateTo

query

yes

string

Responses

Status

Description

Content Types

200

Wash subscriptions distribution retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/InvoicingWashSubscriptionsDistributionResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getlastmonthincome.html b/documentation/_site_rebuild_20260317/getlastmonthincome.html new file mode 100644 index 00000000..c6324a4c --- /dev/null +++ b/documentation/_site_rebuild_20260317/getlastmonthincome.html @@ -0,0 +1,18 @@ + +Get last month's income | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get last month's income

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /statistics/income/last-month

Operation

Operation ID: getLastMonthIncome

Get income statistics for the previous month

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Last month&#x27;s income statistics retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getlicenseplaterecognizerconfig.html b/documentation/_site_rebuild_20260317/getlicenseplaterecognizerconfig.html new file mode 100644 index 00000000..aa10ba2b --- /dev/null +++ b/documentation/_site_rebuild_20260317/getlicenseplaterecognizerconfig.html @@ -0,0 +1,20 @@ + +Get LicensePlateRecognizer config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get LicensePlateRecognizer config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /licenseplaterecognizer/config

Operation

Operation ID: getLicensePlateRecognizerConfig

Get LicensePlateRecognizer config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

LicensePlateRecognizer configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/LicensePlateRecognizerConfigListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getlimbleconfig.html b/documentation/_site_rebuild_20260317/getlimbleconfig.html new file mode 100644 index 00000000..f20c0983 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getlimbleconfig.html @@ -0,0 +1,20 @@ + +Get Limble config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get Limble config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /limble/config

Operation

Operation ID: getLimbleConfig

Get Limble config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Limble configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/LimbleConfigListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getmotorapiconfig.html b/documentation/_site_rebuild_20260317/getmotorapiconfig.html new file mode 100644 index 00000000..51879ec1 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getmotorapiconfig.html @@ -0,0 +1,20 @@ + +Get MotorAPI config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get MotorAPI config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /motorapi/config

Operation

Operation ID: getMotorApiConfig

Get MotorAPI config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

MotorAPI configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/MotorApiConfigListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getnewbookingsstats.html b/documentation/_site_rebuild_20260317/getnewbookingsstats.html new file mode 100644 index 00000000..4e625bc4 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getnewbookingsstats.html @@ -0,0 +1,18 @@ + +Get new bookings statistics | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get new bookings statistics

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /statistics/bookings/new

Operation

Operation ID: getNewBookingsStats

Get statistics for new bookings

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

New bookings statistics retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getnewordersstats.html b/documentation/_site_rebuild_20260317/getnewordersstats.html new file mode 100644 index 00000000..747a35d9 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getnewordersstats.html @@ -0,0 +1,18 @@ + +Get new orders statistics | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get new orders statistics

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /statistics/orders/new

Operation

Operation ID: getNewOrdersStats

Get statistics for new orders

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

New orders statistics retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getocrspaceconfig.html b/documentation/_site_rebuild_20260317/getocrspaceconfig.html new file mode 100644 index 00000000..d80cdf49 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getocrspaceconfig.html @@ -0,0 +1,20 @@ + +Get OcrSpace config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get OcrSpace config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /ocrspace/config

Operation

Operation ID: getOcrSpaceConfig

Get OcrSpace config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

OcrSpace configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/OcrSpaceConfigListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getopenaiconfig.html b/documentation/_site_rebuild_20260317/getopenaiconfig.html new file mode 100644 index 00000000..57986956 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getopenaiconfig.html @@ -0,0 +1,20 @@ + +Get OpenAI config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get OpenAI config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /openai/config

Operation

Operation ID: getOpenAiConfig

Get OpenAI config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

OpenAI configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/OpenAiConfigListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getorder.html b/documentation/_site_rebuild_20260317/getorder.html new file mode 100644 index 00000000..5a6abeb1 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getorder.html @@ -0,0 +1,20 @@ + +Get order details | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get order details

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /order

Operation

Operation ID: getOrder

Get detailed information about a specific order

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Responses

Status

Description

Content Types

200

Order retrieved successfully

application/json

404

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/Order" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getplatescanpostresults.html b/documentation/_site_rebuild_20260317/getplatescanpostresults.html new file mode 100644 index 00000000..c12e3c4b --- /dev/null +++ b/documentation/_site_rebuild_20260317/getplatescanpostresults.html @@ -0,0 +1,18 @@ + +Get post-scan results | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get post-scan results

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /numberplatescans/post

Operation

Operation ID: getPlateScanPostResults

Get post-scan results

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Post-scan results retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getreadytoinvoice.html b/documentation/_site_rebuild_20260317/getreadytoinvoice.html new file mode 100644 index 00000000..23063abe --- /dev/null +++ b/documentation/_site_rebuild_20260317/getreadytoinvoice.html @@ -0,0 +1,18 @@ + +Get invoices ready to process | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get invoices ready to process

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /collected-invoices/ready-to-invoice

Operation

Operation ID: getReadyToInvoice

Get collected invoices that are ready to be processed

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Ready invoices retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getrecaptchaconfig.html b/documentation/_site_rebuild_20260317/getrecaptchaconfig.html new file mode 100644 index 00000000..b42097c0 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getrecaptchaconfig.html @@ -0,0 +1,46 @@ + +Get reCAPTCHA configuration | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get reCAPTCHA configuration

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /auth/reCAPTCHA/public

Operation

Operation ID: getRecaptchaConfig

Retrieve public reCAPTCHA configuration for login forms

Authentication

No authentication required.

Responses

Status

Description

Content Types

200

reCAPTCHA configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "properties": { + "rate_limit": { + "properties": { + "enabled": { + "type": "boolean" + }, + "limit": { + "type": "integer" + }, + "remaining": { + "type": "integer" + }, + "reset": { + "type": "integer" + }, + "warning": { + "nullable": true, + "type": "string" + } + }, + "type": "object" + }, + "recaptcha": { + "type": "object" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getrecaptchamoduleconfig.html b/documentation/_site_rebuild_20260317/getrecaptchamoduleconfig.html new file mode 100644 index 00000000..b103f4a4 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getrecaptchamoduleconfig.html @@ -0,0 +1,20 @@ + +Get reCAPTCHA config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get reCAPTCHA config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /reCAPTCHA/config

Operation

Operation ID: getRecaptchaModuleConfig

Get reCAPTCHA config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

reCAPTCHA configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/RecaptchaConfigListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getselfserveconfig.html b/documentation/_site_rebuild_20260317/getselfserveconfig.html new file mode 100644 index 00000000..354fa983 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getselfserveconfig.html @@ -0,0 +1,20 @@ + +Get Self-Serve config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get Self-Serve config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /selfserve/config

Operation

Operation ID: getSelfServeConfig

Get Self-Serve config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Self-serve configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/SelfServeConfigListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getselfservelanestatus.html b/documentation/_site_rebuild_20260317/getselfservelanestatus.html new file mode 100644 index 00000000..073aa985 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getselfservelanestatus.html @@ -0,0 +1,20 @@ + +Get self-serve lane status | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get self-serve lane status

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/self-serve/lane/status

Operation

Operation ID: getSelfServeLaneStatus

Retrieve the current status of a self-serve lane

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

lane_id

query

yes

integer

Responses

Status

Description

Content Types

200

Lane status retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/SelfServeLaneStatus" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getselfservevehicleallowed.html b/documentation/_site_rebuild_20260317/getselfservevehicleallowed.html new file mode 100644 index 00000000..18e71a61 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getselfservevehicleallowed.html @@ -0,0 +1,20 @@ + +Check whether self-serve is allowed for a vehicle on a lane | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Check whether self-serve is allowed for a vehicle on a lane

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /department/selfserve/vehicle/allowed

Operation

Operation ID: getSelfserveVehicleAllowed

Check whether self-serve is allowed for a vehicle on a lane

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

lane_id

query

yes

integer

reg

query

yes

string

Responses

Status

Description

Content Types

200

Successfully evaluated self-serve eligibility

application/json

403

404

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/SelfserveVehicleAllowedResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getselfservewashsummary.html b/documentation/_site_rebuild_20260317/getselfservewashsummary.html new file mode 100644 index 00000000..b8811e8d --- /dev/null +++ b/documentation/_site_rebuild_20260317/getselfservewashsummary.html @@ -0,0 +1,20 @@ + +Get self-serve wash summary | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get self-serve wash summary

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /department/selfserve/washes/summary

Operation

Operation ID: getSelfserveWashSummary

Get self-serve wash summary

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

session_id

query

no

integer

lane_id

query

no

integer

reg

query

no

string

Responses

Status

Description

Content Types

200

Successfully retrieved self-serve wash summary

application/json

403

404

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/SelfserveWashSummary" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getsession.html b/documentation/_site_rebuild_20260317/getsession.html new file mode 100644 index 00000000..6ca997cc --- /dev/null +++ b/documentation/_site_rebuild_20260317/getsession.html @@ -0,0 +1,33 @@ + +Get current session | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get current session

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /auth/session

Operation

Operation ID: getSession

Retrieve information about the current authenticated user session

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Session information retrieved successfully

application/json

400

401

Schema for response 200 (application/json):

+{ + "allOf": [ + { + "$ref": "#/components/schemas/User" + }, + { + "properties": { + "two_factor_enabled": { + "description": "Indicates if 2FA is enabled for this account", + "type": "boolean" + } + }, + "type": "object" + } + ] +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getshellyconfig.html b/documentation/_site_rebuild_20260317/getshellyconfig.html new file mode 100644 index 00000000..6cda9b18 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getshellyconfig.html @@ -0,0 +1,20 @@ + +Get Shelly config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get Shelly config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /shelly/config

Operation

Operation ID: getShellyConfig

Get Shelly config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Shelly configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ShellyConfigListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getstripeconfig.html b/documentation/_site_rebuild_20260317/getstripeconfig.html new file mode 100644 index 00000000..61457133 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getstripeconfig.html @@ -0,0 +1,20 @@ + +Get Stripe config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get Stripe config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /stripe/config

Operation

Operation ID: getStripeConfig

Get Stripe config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Stripe configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/StripeConfigListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getstripepaymentintent.html b/documentation/_site_rebuild_20260317/getstripepaymentintent.html new file mode 100644 index 00000000..6fbe59f1 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getstripepaymentintent.html @@ -0,0 +1,18 @@ + +Get Stripe payment intent | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get Stripe payment intent

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /orders/module/stripe/payment_intent

Operation

Operation ID: getStripePaymentIntent

Get Stripe payment intent

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getsubuser.html b/documentation/_site_rebuild_20260317/getsubuser.html new file mode 100644 index 00000000..9511e717 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getsubuser.html @@ -0,0 +1,68 @@ + +Get a subuser by ID (visible by grant) | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get a subuser by ID (visible by grant)

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /subusers/{id}

Operation

Operation ID: getSubuser

Returns the subuser if the authenticated user has at least one enabled, non-deleted grant for their customer number to this subuser. Otherwise returns 404.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

path

yes

integer

Responses

Status

Description

Content Types

200

Subuser details

application/json

401

404

500

Schema for response 200 (application/json):

+{ + "properties": { + "created_at": { + "format": "date-time", + "nullable": true, + "type": "string" + }, + "email": { + "format": "email", + "nullable": true, + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "nullable": true, + "type": "string" + }, + "permissions": { + "description": "Aggregated permission keys granted for the caller's customer", + "items": { + "type": "string" + }, + "type": "array" + }, + "phone": { + "nullable": true, + "type": "integer" + }, + "phone_country_code": { + "nullable": true, + "type": "integer" + }, + "suspended_at": { + "format": "date-time", + "nullable": true, + "type": "string" + }, + "updated_at": { + "format": "date-time", + "nullable": true, + "type": "string" + }, + "username": { + "nullable": true, + "type": "string" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getsuperuseruser.html b/documentation/_site_rebuild_20260317/getsuperuseruser.html new file mode 100644 index 00000000..ac948dc0 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getsuperuseruser.html @@ -0,0 +1,20 @@ + +Get user by ID (superuser) | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get user by ID (superuser)

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /superuser/user

Operation

Operation ID: getSuperuserUser

Get detailed user information by user ID

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

user_id

query

no

integer

Responses

Status

Description

Content Types

200

User retrieved successfully

application/json

404

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/User" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getthismonthincome.html b/documentation/_site_rebuild_20260317/getthismonthincome.html new file mode 100644 index 00000000..749767ea --- /dev/null +++ b/documentation/_site_rebuild_20260317/getthismonthincome.html @@ -0,0 +1,18 @@ + +Get this month's income | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get this month's income

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /statistics/income/this-month

Operation

Operation ID: getThisMonthIncome

Get income statistics for the current month

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

This month&#x27;s income statistics retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getthisyearincome.html b/documentation/_site_rebuild_20260317/getthisyearincome.html new file mode 100644 index 00000000..5323aa67 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getthisyearincome.html @@ -0,0 +1,18 @@ + +Get this year's income | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get this year's income

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /statistics/income/this-year

Operation

Operation ID: getThisYearIncome

Get income statistics for the current year

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

This year&#x27;s income statistics retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/gettodayincome.html b/documentation/_site_rebuild_20260317/gettodayincome.html new file mode 100644 index 00000000..fbfba4dd --- /dev/null +++ b/documentation/_site_rebuild_20260317/gettodayincome.html @@ -0,0 +1,18 @@ + +Get today's income | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get today's income

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /statistics/income/today

Operation

Operation ID: getTodayIncome

Get income statistics for today

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Today&#x27;s income statistics retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/gettotalincometodaybydepartments.html b/documentation/_site_rebuild_20260317/gettotalincometodaybydepartments.html new file mode 100644 index 00000000..04c00afa --- /dev/null +++ b/documentation/_site_rebuild_20260317/gettotalincometodaybydepartments.html @@ -0,0 +1,18 @@ + +Get total income today by departments | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get total income today by departments

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /statistics/income/departments

Operation

Operation ID: getTotalIncomeTodayByDepartments

Get total income today by departments

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getunknowncustomervehicles.html b/documentation/_site_rebuild_20260317/getunknowncustomervehicles.html new file mode 100644 index 00000000..7fc49a5a --- /dev/null +++ b/documentation/_site_rebuild_20260317/getunknowncustomervehicles.html @@ -0,0 +1,18 @@ + +Get unknown customer vehicles in department | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get unknown customer vehicles in department

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /department/vehicles/unknown-customer

Operation

Operation ID: getUnknownCustomerVehicles

Get unknown customer vehicles in department

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getuserbookings.html b/documentation/_site_rebuild_20260317/getuserbookings.html new file mode 100644 index 00000000..fe0a06fb --- /dev/null +++ b/documentation/_site_rebuild_20260317/getuserbookings.html @@ -0,0 +1,23 @@ + +Get user bookings | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get user bookings

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /user/bookings

Operation

Operation ID: getUserBookings

Retrieve bookings for the authenticated user

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

User bookings retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/Booking" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getuserdiscounts.html b/documentation/_site_rebuild_20260317/getuserdiscounts.html new file mode 100644 index 00000000..99cd2a37 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getuserdiscounts.html @@ -0,0 +1,18 @@ + +Get user discounts | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get user discounts

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /superuser/user/discounts

Operation

Operation ID: getUserDiscounts

Get user discounts

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

user_id

query

yes

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getuseridfromcustomernumber.html b/documentation/_site_rebuild_20260317/getuseridfromcustomernumber.html new file mode 100644 index 00000000..771e2d21 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getuseridfromcustomernumber.html @@ -0,0 +1,25 @@ + +Get user ID from customer number | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get user ID from customer number

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /admin/customer/getUserId

Operation

Operation ID: getUserIdFromCustomerNumber

Convert e-conomic customer number to internal user ID

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

customer_number

query

yes

integer

Responses

Status

Description

Content Types

200

User ID retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "properties": { + "user_id": { + "type": "integer" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getuserinvoices.html b/documentation/_site_rebuild_20260317/getuserinvoices.html new file mode 100644 index 00000000..357c5ae3 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getuserinvoices.html @@ -0,0 +1,18 @@ + +Get user invoices | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get user invoices

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /user/invoices

Operation

Operation ID: getUserInvoices

Retrieve invoices for the authenticated user

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

User invoices retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getuserkeys.html b/documentation/_site_rebuild_20260317/getuserkeys.html new file mode 100644 index 00000000..baf34618 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getuserkeys.html @@ -0,0 +1,18 @@ + +Get user keys | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get user keys

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /superuser/user/keys

Operation

Operation ID: getUserKeys

Get user keys

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

user_id

query

yes

integer

key

query

no

string

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getuserorder.html b/documentation/_site_rebuild_20260317/getuserorder.html new file mode 100644 index 00000000..40c6c3fb --- /dev/null +++ b/documentation/_site_rebuild_20260317/getuserorder.html @@ -0,0 +1,20 @@ + +Get user's specific order | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get user's specific order

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /user/order

Operation

Operation ID: getUserOrder

Get details of a specific order for the authenticated user

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Responses

Status

Description

Content Types

200

Order retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/Order" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getuserorders.html b/documentation/_site_rebuild_20260317/getuserorders.html new file mode 100644 index 00000000..dbadf122 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getuserorders.html @@ -0,0 +1,23 @@ + +Get current user's orders | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get current user's orders

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /user/orders

Operation

Operation ID: getUserOrders

Retrieve orders for the authenticated user

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

Responses

Status

Description

Content Types

200

Orders retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/Order" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getuserpermissions.html b/documentation/_site_rebuild_20260317/getuserpermissions.html new file mode 100644 index 00000000..039acf78 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getuserpermissions.html @@ -0,0 +1,18 @@ + +Get user permissions | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get user permissions

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /user/permissions

Operation

Operation ID: getUserPermissions

Get user permissions

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getuserswithvehiclesubscriptions.html b/documentation/_site_rebuild_20260317/getuserswithvehiclesubscriptions.html new file mode 100644 index 00000000..7316ea5f --- /dev/null +++ b/documentation/_site_rebuild_20260317/getuserswithvehiclesubscriptions.html @@ -0,0 +1,18 @@ + +Get users with vehicle subscriptions | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get users with vehicle subscriptions

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /superuser/users-with-vehicle-subscriptions

Operation

Operation ID: getUsersWithVehicleSubscriptions

Get users with vehicle subscriptions

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getvehiclecustomersuggestions.html b/documentation/_site_rebuild_20260317/getvehiclecustomersuggestions.html new file mode 100644 index 00000000..c6c04a94 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getvehiclecustomersuggestions.html @@ -0,0 +1,18 @@ + +Get vehicle customer suggestions | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get vehicle customer suggestions

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /department/vehicle/customer-suggestions

Operation

Operation ID: getVehicleCustomerSuggestions

Get vehicle customer suggestions

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

reg

query

yes

string

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getvehiclestatus.html b/documentation/_site_rebuild_20260317/getvehiclestatus.html new file mode 100644 index 00000000..3e5414a1 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getvehiclestatus.html @@ -0,0 +1,18 @@ + +Get vehicle status | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get vehicle status

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /vehicles/status

Operation

Operation ID: getVehicleStatus

Get vehicle status

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

reg

query

yes

string

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getvirkdataconfig.html b/documentation/_site_rebuild_20260317/getvirkdataconfig.html new file mode 100644 index 00000000..5a846a96 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getvirkdataconfig.html @@ -0,0 +1,20 @@ + +Get Virkdata config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get Virkdata config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /virkdata/config

Operation

Operation ID: getVirkdataConfig

Get Virkdata config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Virkdata configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/VirkdataConfigListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getweatherapiconfig.html b/documentation/_site_rebuild_20260317/getweatherapiconfig.html new file mode 100644 index 00000000..02109b19 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getweatherapiconfig.html @@ -0,0 +1,20 @@ + +Get WeatherAPI config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get WeatherAPI config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /weatherapi/config

Operation

Operation ID: getWeatherApiConfig

Get WeatherAPI config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

WeatherAPI configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/WeatherApiConfigListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getworkerlicenseplates.html b/documentation/_site_rebuild_20260317/getworkerlicenseplates.html new file mode 100644 index 00000000..3b82a498 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getworkerlicenseplates.html @@ -0,0 +1,18 @@ + +Get unique license plates | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get unique license plates

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /worker/licenseplates

Operation

Operation ID: getWorkerLicensePlates

Fetch all unique license plates from various database tables

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

License plates retrieved successfully

application/json

403

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getworkerstatus.html b/documentation/_site_rebuild_20260317/getworkerstatus.html new file mode 100644 index 00000000..0c5abaaa --- /dev/null +++ b/documentation/_site_rebuild_20260317/getworkerstatus.html @@ -0,0 +1,18 @@ + +Get worker status | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get worker status

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /worker/status

Operation

Operation ID: getWorkerStatus

Get detailed status of the system worker

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Worker status retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getworkerversion.html b/documentation/_site_rebuild_20260317/getworkerversion.html new file mode 100644 index 00000000..42d4f1c0 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getworkerversion.html @@ -0,0 +1,18 @@ + +Get worker version | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get worker version

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /worker/version

Operation

Operation ID: getWorkerVersion

Get the current version of the system worker

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Worker version retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getxlvaskconfig.html b/documentation/_site_rebuild_20260317/getxlvaskconfig.html new file mode 100644 index 00000000..e8d0dc7c --- /dev/null +++ b/documentation/_site_rebuild_20260317/getxlvaskconfig.html @@ -0,0 +1,20 @@ + +Get XLVask config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get XLVask config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /xlvask/config

Operation

Operation ID: getXlvaskConfig

Get XLVask config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

XLVask configuration retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/XlvaskConfigListResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getxlvaskusagelogs.html b/documentation/_site_rebuild_20260317/getxlvaskusagelogs.html new file mode 100644 index 00000000..8674186f --- /dev/null +++ b/documentation/_site_rebuild_20260317/getxlvaskusagelogs.html @@ -0,0 +1,18 @@ + +Get XLVask usage logs | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get XLVask usage logs

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/xlvask/usageLog

Operation

Operation ID: getXlvaskUsageLogs

Retrieve usage logs from XLVask system

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

Responses

Status

Description

Content Types

200

Usage logs retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getxlvaskusageorders.html b/documentation/_site_rebuild_20260317/getxlvaskusageorders.html new file mode 100644 index 00000000..de4cdf10 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getxlvaskusageorders.html @@ -0,0 +1,18 @@ + +Get XLVask usage orders | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get XLVask usage orders

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/xlvask/services/usage/orders

Operation

Operation ID: getXlvaskUsageOrders

Get XLVask usage orders

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getxlvaskusageordersfastlink.html b/documentation/_site_rebuild_20260317/getxlvaskusageordersfastlink.html new file mode 100644 index 00000000..64ba9a49 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getxlvaskusageordersfastlink.html @@ -0,0 +1,18 @@ + +Get XLVask usage orders fast link | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get XLVask usage orders fast link

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/xlvask/services/usage/orders/fast-link

Operation

Operation ID: getXlvaskUsageOrdersFastLink

Get XLVask usage orders fast link

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/getyesterdayincome.html b/documentation/_site_rebuild_20260317/getyesterdayincome.html new file mode 100644 index 00000000..c6b2a2e8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/getyesterdayincome.html @@ -0,0 +1,18 @@ + +Get yesterday's income | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get yesterday's income

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /statistics/income/yesterday

Operation

Operation ID: getYesterdayIncome

Get income statistics for yesterday

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Yesterday&#x27;s income statistics retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/importeconomiccustomers.html b/documentation/_site_rebuild_20260317/importeconomiccustomers.html new file mode 100644 index 00000000..34c0f989 --- /dev/null +++ b/documentation/_site_rebuild_20260317/importeconomiccustomers.html @@ -0,0 +1,20 @@ + +Import e-conomic customers | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Import e-conomic customers

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /economic/customers/import

Operation

Operation ID: importEconomicCustomers

Import customers from e-conomic

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

Customers imported successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/index.html b/documentation/_site_rebuild_20260317/index.html new file mode 100644 index 00000000..a56f03b7 --- /dev/null +++ b/documentation/_site_rebuild_20260317/index.html @@ -0,0 +1,11 @@ + + + + +You will be redirected shortly + +

Redirecting…

+Click here if you are not redirected. + + + diff --git a/documentation/_site_rebuild_20260317/introduction.html b/documentation/_site_rebuild_20260317/introduction.html new file mode 100644 index 00000000..58f47b9c --- /dev/null +++ b/documentation/_site_rebuild_20260317/introduction.html @@ -0,0 +1,16 @@ + +Introduction | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Introduction

Welcome to the Copenhagen Truck Wash API documentation.

This API provides access to the Copenhagen Truck Wash system, allowing you to manage wash bookings, vehicle data, and customer information.

Overview

The API is built on REST principles and returns JSON-encoded responses.

17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listbackupmodules.html b/documentation/_site_rebuild_20260317/listbackupmodules.html new file mode 100644 index 00000000..eab5b451 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listbackupmodules.html @@ -0,0 +1,18 @@ + +List backup modules | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List backup modules

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/backup/backups

Operation

Operation ID: listBackupModules

List backup modules

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listbookings.html b/documentation/_site_rebuild_20260317/listbookings.html new file mode 100644 index 00000000..b58aa859 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listbookings.html @@ -0,0 +1,23 @@ + +List bookings | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List bookings

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /bookings

Operation

Operation ID: listBookings

Retrieve a list of bookings

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

Responses

Status

Description

Content Types

200

Bookings retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/Booking" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listbrandingoptions.html b/documentation/_site_rebuild_20260317/listbrandingoptions.html new file mode 100644 index 00000000..d1757d4e --- /dev/null +++ b/documentation/_site_rebuild_20260317/listbrandingoptions.html @@ -0,0 +1,18 @@ + +List branding options | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List branding options

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /branding

Operation

Operation ID: listBrandingOptions

Retrieve a list of branding options or a specific branding option if ID is provided

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

no

integer

no

object

Responses

Status

Description

Content Types

200

Branding options retrieved successfully

application/json

400

403

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listcategories.html b/documentation/_site_rebuild_20260317/listcategories.html new file mode 100644 index 00000000..535367c8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listcategories.html @@ -0,0 +1,23 @@ + +List categories | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List categories

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /categories

Operation

Operation ID: listCategories

Retrieve a list of product categories

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

Responses

Status

Description

Content Types

200

Categories retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/Category" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listcollectedinvoices.html b/documentation/_site_rebuild_20260317/listcollectedinvoices.html new file mode 100644 index 00000000..613ed867 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listcollectedinvoices.html @@ -0,0 +1,18 @@ + +List collected invoices | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List collected invoices

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /collected-invoices

Operation

Operation ID: listCollectedInvoices

Get list of collected invoices

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

Responses

Status

Description

Content Types

200

Collected invoices retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listcustomers.html b/documentation/_site_rebuild_20260317/listcustomers.html new file mode 100644 index 00000000..fadb85cb --- /dev/null +++ b/documentation/_site_rebuild_20260317/listcustomers.html @@ -0,0 +1,18 @@ + +List customers | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List customers

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /customers

Operation

Operation ID: listCustomers

List customers

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

barred

query

no

string

Optional e-conomic barred customer filter.

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listdailyreports.html b/documentation/_site_rebuild_20260317/listdailyreports.html new file mode 100644 index 00000000..30fc7d01 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listdailyreports.html @@ -0,0 +1,18 @@ + +List daily reports | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List daily reports

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /departments/daily-reports

Operation

Operation ID: listDailyReports

List daily reports

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listdepartmentgates.html b/documentation/_site_rebuild_20260317/listdepartmentgates.html new file mode 100644 index 00000000..9ccbe785 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listdepartmentgates.html @@ -0,0 +1,30 @@ + +List department gates | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List department gates

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /department/gates

Operation

Operation ID: listDepartmentGates

Retrieve department gates, optionally filtered by id

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

no

integer

no

object

Responses

Status

Description

Content Types

200

Department gates retrieved successfully

application/json

401

Schema for response 200 (application/json):

+{ + "oneOf": [ + { + "$ref": "#/components/schemas/DepartmentGate" + }, + { + "items": { + "$ref": "#/components/schemas/DepartmentGate" + }, + "type": "array" + } + ] +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listdepartmentgoals.html b/documentation/_site_rebuild_20260317/listdepartmentgoals.html new file mode 100644 index 00000000..eb9b786c --- /dev/null +++ b/documentation/_site_rebuild_20260317/listdepartmentgoals.html @@ -0,0 +1,23 @@ + +List or get department goals | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List or get department goals

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /goals/department

Operation

Operation ID: listDepartmentGoals

Retrieve a list of department goals or a single goal when `id` is provided. Access control: - A user may only access goals where the goal&#x27;s `departments` set is a subset of the user&#x27;s departments. - Users with the `superuser` permission may access all goals.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

no

integer

When provided, returns the single goal with this id (if accessible)

no

object

Responses

Status

Description

Content Types

200

Goals retrieved successfully

application/json

400

401

403

404

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/DepartmentGoal" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listdepartmentlanes.html b/documentation/_site_rebuild_20260317/listdepartmentlanes.html new file mode 100644 index 00000000..c3ccf5d7 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listdepartmentlanes.html @@ -0,0 +1,23 @@ + +List department lanes | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List department lanes

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /department/lanes

Operation

Operation ID: listDepartmentLanes

Retrieve a list of all department lanes

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

Responses

Status

Description

Content Types

200

Department lanes retrieved successfully

application/json

401

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/DepartmentLane" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listdepartmentplatescanners.html b/documentation/_site_rebuild_20260317/listdepartmentplatescanners.html new file mode 100644 index 00000000..1f887fc8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listdepartmentplatescanners.html @@ -0,0 +1,18 @@ + +List department plate scanners | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List department plate scanners

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /department/numberplatescanners

Operation

Operation ID: listDepartmentPlateScanners

List department plate scanners

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Responses

Status

Description

Content Types

200

Department plate scanners retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listdepartmentrelays.html b/documentation/_site_rebuild_20260317/listdepartmentrelays.html new file mode 100644 index 00000000..1a67efee --- /dev/null +++ b/documentation/_site_rebuild_20260317/listdepartmentrelays.html @@ -0,0 +1,30 @@ + +List department relays | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List department relays

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /department/relays

Operation

Operation ID: listDepartmentRelays

Retrieve department relays, optionally filtered by id

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

no

integer

no

object

Responses

Status

Description

Content Types

200

Department relays retrieved successfully

application/json

401

Schema for response 200 (application/json):

+{ + "oneOf": [ + { + "$ref": "#/components/schemas/DepartmentRelay" + }, + { + "items": { + "$ref": "#/components/schemas/DepartmentRelay" + }, + "type": "array" + } + ] +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listdepartments.html b/documentation/_site_rebuild_20260317/listdepartments.html new file mode 100644 index 00000000..1ae2ee22 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listdepartments.html @@ -0,0 +1,23 @@ + +List departments | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List departments

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /departments

Operation

Operation ID: listDepartments

Retrieve a list of all visible departments

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

no

integer

Filter by specific department ID

no

object

Responses

Status

Description

Content Types

200

Departments retrieved successfully

application/json

401

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/Department" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listdraftinvoices.html b/documentation/_site_rebuild_20260317/listdraftinvoices.html new file mode 100644 index 00000000..c17f4f95 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listdraftinvoices.html @@ -0,0 +1,18 @@ + +List draft invoices | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List draft invoices

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /invoices/draft

Operation

Operation ID: listDraftInvoices

Retrieve a list of draft invoices

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

Responses

Status

Description

Content Types

200

Draft invoices retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listentrausers.html b/documentation/_site_rebuild_20260317/listentrausers.html new file mode 100644 index 00000000..5f7306ce --- /dev/null +++ b/documentation/_site_rebuild_20260317/listentrausers.html @@ -0,0 +1,18 @@ + +List Microsoft Entra users | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List Microsoft Entra users

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/entra/users

Operation

Operation ID: listEntraUsers

Get list of users from Microsoft Entra (Azure AD)

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Entra users retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listguestdepartments.html b/documentation/_site_rebuild_20260317/listguestdepartments.html new file mode 100644 index 00000000..06a15ba1 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listguestdepartments.html @@ -0,0 +1,23 @@ + +List public departments | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List public departments

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /guest/departments

Operation

Operation ID: listGuestDepartments

Get list of departments without authentication

Authentication

No authentication required.

Parameters

Name

In

Required

Type

Description

include_lanes

query

no

boolean

Whether to include lane status and self-serve information

Responses

Status

Description

Content Types

200

Departments retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/DepartmentGuest" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listmoduleactionlogs.html b/documentation/_site_rebuild_20260317/listmoduleactionlogs.html new file mode 100644 index 00000000..e53b9721 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listmoduleactionlogs.html @@ -0,0 +1,23 @@ + +List module action logs | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List module action logs

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/action-logs

Operation

Operation ID: listModuleActionLogs

Retrieve a paginated list of module action logs with searching and filtering

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

Responses

Status

Description

Content Types

200

Module action logs retrieved successfully

application/json

401

403

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/ModuleActionLog" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listnotifications.html b/documentation/_site_rebuild_20260317/listnotifications.html new file mode 100644 index 00000000..514456d2 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listnotifications.html @@ -0,0 +1,23 @@ + +List notifications | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List notifications

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /notifications

Operation

Operation ID: listNotifications

Get list of notifications

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

Responses

Status

Description

Content Types

200

Notifications retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/Notification" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listorderattachments.html b/documentation/_site_rebuild_20260317/listorderattachments.html new file mode 100644 index 00000000..07d4cfaa --- /dev/null +++ b/documentation/_site_rebuild_20260317/listorderattachments.html @@ -0,0 +1,18 @@ + +List order attachments | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List order attachments

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /orders/attachments

Operation

Operation ID: listOrderAttachments

Get attachments for an order

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

order_id

query

yes

integer

Responses

Status

Description

Content Types

200

Order attachments retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listorderbookings.html b/documentation/_site_rebuild_20260317/listorderbookings.html new file mode 100644 index 00000000..1abe46dd --- /dev/null +++ b/documentation/_site_rebuild_20260317/listorderbookings.html @@ -0,0 +1,18 @@ + +List order bookings | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List order bookings

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /order-bookings

Operation

Operation ID: listOrderBookings

List order bookings

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

no

integer

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listorderitems.html b/documentation/_site_rebuild_20260317/listorderitems.html new file mode 100644 index 00000000..d958b8e1 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listorderitems.html @@ -0,0 +1,23 @@ + +List order items | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List order items

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /order/items

Operation

Operation ID: listOrderItems

Get all items for a specific order

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

order_id

query

yes

integer

Responses

Status

Description

Content Types

200

Order items retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/OrderItem" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listorders.html b/documentation/_site_rebuild_20260317/listorders.html new file mode 100644 index 00000000..345b110c --- /dev/null +++ b/documentation/_site_rebuild_20260317/listorders.html @@ -0,0 +1,23 @@ + +List orders | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List orders

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /orders

Operation

Operation ID: listOrders

Retrieve a paginated list of orders

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

show_wash_subscription

query

no

string

Responses

Status

Description

Content Types

200

Orders retrieved successfully

application/json

401

403

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/Order" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listpasskeys.html b/documentation/_site_rebuild_20260317/listpasskeys.html new file mode 100644 index 00000000..34745d14 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listpasskeys.html @@ -0,0 +1,27 @@ + +List passkeys for the authenticated user | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List passkeys for the authenticated user

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /account/security/passkeys

Operation

Operation ID: listPasskeys

List passkeys for the authenticated user

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

A list of passkeys

application/json

400

Invalid session or request

application/json

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/Passkey" + }, + "type": "array" +} +

Schema for response 400 (application/json):

+{ + "$ref": "#/components/schemas/Error" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listpermissions.html b/documentation/_site_rebuild_20260317/listpermissions.html new file mode 100644 index 00000000..df7871ab --- /dev/null +++ b/documentation/_site_rebuild_20260317/listpermissions.html @@ -0,0 +1,23 @@ + +List permissions | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List permissions

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /permissions

Operation

Operation ID: listPermissions

Get list of all available permissions

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Permissions retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/Permission" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listplatescanners.html b/documentation/_site_rebuild_20260317/listplatescanners.html new file mode 100644 index 00000000..37adf877 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listplatescanners.html @@ -0,0 +1,18 @@ + +List plate scanners | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List plate scanners

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /numberplatescanners

Operation

Operation ID: listPlateScanners

Get a list of all number plate scanners

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

Responses

Status

Description

Content Types

200

Plate scanners retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listplatescans.html b/documentation/_site_rebuild_20260317/listplatescans.html new file mode 100644 index 00000000..0df93fb7 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listplatescans.html @@ -0,0 +1,18 @@ + +List plate scans | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List plate scans

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /numberplatescans

Operation

Operation ID: listPlateScans

Get a list of license plate scans

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

Responses

Status

Description

Content Types

200

Plate scans retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listproducts.html b/documentation/_site_rebuild_20260317/listproducts.html new file mode 100644 index 00000000..183fbb02 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listproducts.html @@ -0,0 +1,23 @@ + +List products | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List products

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /products

Operation

Operation ID: listProducts

Retrieve a list of products with optional filters for customer pricing and department

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

customer_id

query

no

integer

Customer ID for custom pricing

department_id

query

no

integer

Department ID for department-specific pricing

category

query

no

integer

Filter by category ID

id

query

no

integer

Get specific product by ID

final_price

query

no

boolean

Whether to return final prices including discounts

no

object

Responses

Status

Description

Content Types

200

Products retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/Product" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listroles.html b/documentation/_site_rebuild_20260317/listroles.html new file mode 100644 index 00000000..e9c21d2d --- /dev/null +++ b/documentation/_site_rebuild_20260317/listroles.html @@ -0,0 +1,18 @@ + +List roles | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List roles

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /roles

Operation

Operation ID: listRoles

List roles

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listselfserveconditionrules.html b/documentation/_site_rebuild_20260317/listselfserveconditionrules.html new file mode 100644 index 00000000..7fad9ed6 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listselfserveconditionrules.html @@ -0,0 +1,23 @@ + +List self-serve condition rules | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List self-serve condition rules

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /department/selfserve/condition/rules

Operation

Operation ID: listSelfserveConditionRules

Retrieve a list of self-serve condition rules.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

no

integer

Filter by rule ID

condition_id

query

no

integer

Filter by condition ID

type

query

no

string

Filter by rule type

object_type

query

no

string

Filter by object type

object_id

query

no

integer

Filter by object ID

no

object

Responses

Status

Description

Content Types

200

Successfully retrieved condition rules

application/json

400

404

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/DepartmentSelfserveConditionRule" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listselfserveconditions.html b/documentation/_site_rebuild_20260317/listselfserveconditions.html new file mode 100644 index 00000000..c2c5b23a --- /dev/null +++ b/documentation/_site_rebuild_20260317/listselfserveconditions.html @@ -0,0 +1,23 @@ + +List self-serve conditions | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List self-serve conditions

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /department/selfserve/conditions

Operation

Operation ID: listSelfserveConditions

Retrieve a list of self-serve conditions for a department, lane, or product.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

no

integer

Filter by condition ID

department

query

no

integer

Filter by department ID

lane

query

no

integer

Filter by lane ID

product

query

no

integer

Filter by product ID

condition_id

query

no

integer

Filter by condition ID

machine_type_id

query

no

integer

Filter by reusable machine type ID

no

object

Responses

Status

Description

Content Types

200

Successfully retrieved conditions

application/json

400

404

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/DepartmentSelfserveCondition" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listselfservemachinetypes.html b/documentation/_site_rebuild_20260317/listselfservemachinetypes.html new file mode 100644 index 00000000..4ae248cd --- /dev/null +++ b/documentation/_site_rebuild_20260317/listselfservemachinetypes.html @@ -0,0 +1,30 @@ + +List reusable self-serve machine types | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List reusable self-serve machine types

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /department/selfserve/machine-types

Operation

Operation ID: listSelfserveMachineTypes

List reusable self-serve machine types

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

no

integer

no

object

Responses

Status

Description

Content Types

200

Successfully retrieved machine types

application/json

404

Schema for response 200 (application/json):

+{ + "oneOf": [ + { + "$ref": "#/components/schemas/SelfserveMachineType" + }, + { + "items": { + "$ref": "#/components/schemas/SelfserveMachineType" + }, + "type": "array" + } + ] +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listselfservequestions.html b/documentation/_site_rebuild_20260317/listselfservequestions.html new file mode 100644 index 00000000..227c7b82 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listselfservequestions.html @@ -0,0 +1,23 @@ + +List self-serve questions | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List self-serve questions

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /department/selfserve/questions

Operation

Operation ID: listSelfserveQuestions

Retrieve a list of self-serve questions for a department, lane, or product.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

no

integer

Filter by question ID

department

query

no

integer

Filter by department ID

lane

query

no

integer

Filter by lane ID

product

query

no

integer

Filter by product ID

no

object

Responses

Status

Description

Content Types

200

Successfully retrieved questions

application/json

400

404

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/DepartmentSelfserveQuestion" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listselfservetaskattachments.html b/documentation/_site_rebuild_20260317/listselfservetaskattachments.html new file mode 100644 index 00000000..9e393e57 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listselfservetaskattachments.html @@ -0,0 +1,18 @@ + +List task attachments | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List task attachments

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /department/selfserve/tasks/attachments

Operation

Operation ID: listSelfserveTaskAttachments

Retrieve a list of attachments for a specific self-serve task.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Task ID

Responses

Status

Description

Content Types

200

Successfully retrieved task attachments

application/json

400

404

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listselfservetasks.html b/documentation/_site_rebuild_20260317/listselfservetasks.html new file mode 100644 index 00000000..ee0cae72 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listselfservetasks.html @@ -0,0 +1,23 @@ + +List self-serve tasks | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List self-serve tasks

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /department/selfserve/tasks

Operation

Operation ID: listSelfserveTasks

Retrieve a list of self-serve tasks for a department, lane, product, or condition_id.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

no

integer

Filter by task ID

department

query

no

integer

Filter by department ID

lane

query

no

integer

Filter by lane ID

product

query

no

integer

Filter by product ID

condition_id

query

no

integer

Filter by condition ID

no

object

Responses

Status

Description

Content Types

200

Successfully retrieved tasks

application/json

400

404

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/DepartmentSelfserveTask" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listselfservevehicleconditions.html b/documentation/_site_rebuild_20260317/listselfservevehicleconditions.html new file mode 100644 index 00000000..731ec357 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listselfservevehicleconditions.html @@ -0,0 +1,23 @@ + +List vehicle conditions | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List vehicle conditions

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /department/selfserve/vehicle/conditions

Operation

Operation ID: listSelfserveVehicleConditions

Retrieve a list of vehicle conditions for a department, lane, reg, or question. Customers will only see their own vehicle conditions.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

no

integer

Filter by condition ID

department

query

no

integer

Filter by department ID

lane

query

no

integer

Filter by lane ID

reg

query

no

string

Filter by vehicle registration number

question

query

no

integer

Filter by question ID

customer_id

query

no

integer

Filter by customer ID

no

object

Responses

Status

Description

Content Types

200

Successfully retrieved vehicle conditions

application/json

400

404

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/DepartmentSelfserveVehicleCondition" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/liststripecustomers.html b/documentation/_site_rebuild_20260317/liststripecustomers.html new file mode 100644 index 00000000..d2157a85 --- /dev/null +++ b/documentation/_site_rebuild_20260317/liststripecustomers.html @@ -0,0 +1,18 @@ + +List Stripe customers | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List Stripe customers

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/stripe/customers

Operation

Operation ID: listStripeCustomers

Get list of Stripe customers

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Stripe customers retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/liststripeprices.html b/documentation/_site_rebuild_20260317/liststripeprices.html new file mode 100644 index 00000000..b4af8595 --- /dev/null +++ b/documentation/_site_rebuild_20260317/liststripeprices.html @@ -0,0 +1,18 @@ + +List Stripe prices | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List Stripe prices

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/stripe/prices

Operation

Operation ID: listStripePrices

Get list of Stripe prices

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Stripe prices retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/liststripeproducts.html b/documentation/_site_rebuild_20260317/liststripeproducts.html new file mode 100644 index 00000000..722c5cf1 --- /dev/null +++ b/documentation/_site_rebuild_20260317/liststripeproducts.html @@ -0,0 +1,18 @@ + +List Stripe products | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List Stripe products

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/stripe/products

Operation

Operation ID: listStripeProducts

Get list of Stripe products

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Stripe products retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/liststripeterminallocations.html b/documentation/_site_rebuild_20260317/liststripeterminallocations.html new file mode 100644 index 00000000..00a4599c --- /dev/null +++ b/documentation/_site_rebuild_20260317/liststripeterminallocations.html @@ -0,0 +1,18 @@ + +List Stripe terminal locations | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List Stripe terminal locations

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/stripe/terminal/locations

Operation

Operation ID: listStripeTerminalLocations

List Stripe terminal locations

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/liststripeterminalreaders.html b/documentation/_site_rebuild_20260317/liststripeterminalreaders.html new file mode 100644 index 00000000..0e67ce6f --- /dev/null +++ b/documentation/_site_rebuild_20260317/liststripeterminalreaders.html @@ -0,0 +1,18 @@ + +List Stripe terminal readers | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List Stripe terminal readers

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/stripe/terminal/readers

Operation

Operation ID: listStripeTerminalReaders

List Stripe terminal readers

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listsubusergrants.html b/documentation/_site_rebuild_20260317/listsubusergrants.html new file mode 100644 index 00000000..b4b4511d --- /dev/null +++ b/documentation/_site_rebuild_20260317/listsubusergrants.html @@ -0,0 +1,28 @@ + +List subuser grants | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List subuser grants

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /subusers/grants

Operation

Operation ID: listSubuserGrants

Returns subuser grant records filtered by `customer_number` and/or `subuser_id`.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

customer_number

query

no

integer

e-conomic customer number to filter by

subuser_id

query

no

integer

Subuser ID to filter by

Responses

Status

Description

Content Types

200

Grants fetched

application/json

400

401

500

Schema for response 200 (application/json):

+{ + "properties": { + "grants": { + "items": { + "$ref": "#/components/schemas/SubuserGrant" + }, + "type": "array" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listsubuserpermissionnodes.html b/documentation/_site_rebuild_20260317/listsubuserpermissionnodes.html new file mode 100644 index 00000000..aadb2248 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listsubuserpermissionnodes.html @@ -0,0 +1,28 @@ + +List available subuser permission nodes | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List available subuser permission nodes

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /subusers/permission-nodes

Operation

Operation ID: listSubuserPermissionNodes

Returns grouped permission nodes available for subuser grants.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Permission nodes fetched

application/json

401

500

Schema for response 200 (application/json):

+{ + "properties": { + "permission_nodes": { + "items": { + "$ref": "#/components/schemas/PermissionNodeGroup" + }, + "type": "array" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listsubusers.html b/documentation/_site_rebuild_20260317/listsubusers.html new file mode 100644 index 00000000..10ea5d29 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listsubusers.html @@ -0,0 +1,75 @@ + +List subusers visible to the authenticated user | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List subusers visible to the authenticated user

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /subusers

Operation

Operation ID: listSubusers

Returns a paginated list of subusers (drivers) that have enabled grants tied to the authenticated user&#x27;s customer number. Only subusers with at least one enabled, non-deleted grant for the caller&#x27;s customer are returned.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

page

query

no

integer

limit

query

no

integer

search

query

no

string

include_non_enabled

query

no

boolean

Include subusers that only have non-enabled grants (default false)

Responses

Status

Description

Content Types

200

List of visible subusers

application/json

401

500

Schema for response 200 (application/json):

+{ + "items": { + "properties": { + "created_at": { + "format": "date-time", + "nullable": true, + "type": "string" + }, + "email": { + "format": "email", + "nullable": true, + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "nullable": true, + "type": "string" + }, + "permissions": { + "description": "Aggregated permission keys granted for the caller's customer", + "items": { + "type": "string" + }, + "type": "array" + }, + "phone": { + "nullable": true, + "type": "integer" + }, + "phone_country_code": { + "nullable": true, + "type": "integer" + }, + "suspended_at": { + "format": "date-time", + "nullable": true, + "type": "string" + }, + "two_factor_enabled": { + "description": "Indicates if 2FA is enabled for this account", + "type": "boolean" + }, + "updated_at": { + "format": "date-time", + "nullable": true, + "type": "string" + }, + "username": { + "nullable": true, + "type": "string" + } + }, + "type": "object" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listsuperuserdepartments.html b/documentation/_site_rebuild_20260317/listsuperuserdepartments.html new file mode 100644 index 00000000..69e3472e --- /dev/null +++ b/documentation/_site_rebuild_20260317/listsuperuserdepartments.html @@ -0,0 +1,18 @@ + +List departments (superuser) | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List departments (superuser)

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /superuser/department

Operation

Operation ID: listSuperuserDepartments

List departments (superuser)

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listusers.html b/documentation/_site_rebuild_20260317/listusers.html new file mode 100644 index 00000000..8642c8d6 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listusers.html @@ -0,0 +1,23 @@ + +List users | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List users

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /users

Operation

Operation ID: listUsers

Retrieve a paginated list of users

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

Responses

Status

Description

Content Types

200

Users retrieved successfully

application/json

400

401

Schema for response 200 (application/json):

+{ + "items": { + "$ref": "#/components/schemas/User" + }, + "type": "array" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listvehicles.html b/documentation/_site_rebuild_20260317/listvehicles.html new file mode 100644 index 00000000..a4efe4cc --- /dev/null +++ b/documentation/_site_rebuild_20260317/listvehicles.html @@ -0,0 +1,30 @@ + +List vehicles | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List vehicles

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /vehicles

Operation

Operation ID: listVehicles

List vehicles or fetch a specific vehicle when `id` is provided. - When `id` is present, returns a single vehicle object (404 if not found). - Otherwise returns a paginated list of vehicles. Permissions: - Own scope: `list_own_vehicles` (linked to subuser node `VEHICLES_LIST`). - Broader scope: `list_vehicles_other`. Subusers may specify header `X-Customer-Number` to target a specific customer. If the broader permission is missing, the list will automatically be restricted to the effective customer context.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

id

query

no

integer

reg

query

no

string

customer_id

query

no

integer

Responses

Status

Description

Content Types

200

Vehicle(s) retrieved successfully

application/json

403

404

Schema for response 200 (application/json):

+{ + "oneOf": [ + { + "$ref": "#/components/schemas/Vehicle" + }, + { + "items": { + "$ref": "#/components/schemas/Vehicle" + }, + "type": "array" + } + ] +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listwashcertificates.html b/documentation/_site_rebuild_20260317/listwashcertificates.html new file mode 100644 index 00000000..16035dba --- /dev/null +++ b/documentation/_site_rebuild_20260317/listwashcertificates.html @@ -0,0 +1,18 @@ + +List wash certificates | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List wash certificates

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/washcertificates

Operation

Operation ID: listWashCertificates

List wash certificates

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listxlvaskcustomers.html b/documentation/_site_rebuild_20260317/listxlvaskcustomers.html new file mode 100644 index 00000000..b27ac4d8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/listxlvaskcustomers.html @@ -0,0 +1,18 @@ + +List XLVask customers | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List XLVask customers

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/xlvask/customers

Operation

Operation ID: listXlvaskCustomers

Get list of customers from XLVask

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

XLVask customers retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/listxlvaskvehicles.html b/documentation/_site_rebuild_20260317/listxlvaskvehicles.html new file mode 100644 index 00000000..d7d3234b --- /dev/null +++ b/documentation/_site_rebuild_20260317/listxlvaskvehicles.html @@ -0,0 +1,18 @@ + +List XLVask vehicles | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

List XLVask vehicles

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/xlvask/vehicles

Operation

Operation ID: listXlvaskVehicles

Get list of vehicles from XLVask

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

XLVask vehicles retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/logout.html b/documentation/_site_rebuild_20260317/logout.html new file mode 100644 index 00000000..18160664 --- /dev/null +++ b/documentation/_site_rebuild_20260317/logout.html @@ -0,0 +1,26 @@ + +Logout | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Logout

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /auth/logout

Operation

Operation ID: logout

Invalidate the current authentication token

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Responses

Status

Description

Content Types

200

Logout successful

application/json

401

Schema for response 200 (application/json):

+{ + "properties": { + "message": { + "example": "Logged out", + "type": "string" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/lookupcvr.html b/documentation/_site_rebuild_20260317/lookupcvr.html new file mode 100644 index 00000000..ee883da4 --- /dev/null +++ b/documentation/_site_rebuild_20260317/lookupcvr.html @@ -0,0 +1,18 @@ + +Lookup CVR information | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Lookup CVR information

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /cvr/lookup

Operation

Operation ID: lookupCvr

Get detailed information for a CVR number

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

cvr

query

yes

string

Responses

Status

Description

Content Types

200

CVR information retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/markordercompleted.html b/documentation/_site_rebuild_20260317/markordercompleted.html new file mode 100644 index 00000000..458d30d9 --- /dev/null +++ b/documentation/_site_rebuild_20260317/markordercompleted.html @@ -0,0 +1,30 @@ + +Mark order as completed | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Mark order as completed

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /orders/mark_as_completed

Operation

Operation ID: markOrderCompleted

Mark an order as completed

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "id": { + "type": "integer" + } + }, + "required": [ + "id" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Order marked as completed successfully

application/json

400

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-action-logs-page-1.html b/documentation/_site_rebuild_20260317/modules-module-action-logs-page-1.html new file mode 100644 index 00000000..cd4eb0e2 --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-action-logs-page-1.html @@ -0,0 +1,16 @@ + +Action Logs - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-action-logs.html b/documentation/_site_rebuild_20260317/modules-module-action-logs.html new file mode 100644 index 00000000..560a1377 --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-action-logs.html @@ -0,0 +1,16 @@ + +Action Logs | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-backup-page-1.html b/documentation/_site_rebuild_20260317/modules-module-backup-page-1.html new file mode 100644 index 00000000..94bd95df --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-backup-page-1.html @@ -0,0 +1,16 @@ + +Backup - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-backup.html b/documentation/_site_rebuild_20260317/modules-module-backup.html new file mode 100644 index 00000000..479731c6 --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-backup.html @@ -0,0 +1,16 @@ + +Backup | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-cvr-page-1.html b/documentation/_site_rebuild_20260317/modules-module-cvr-page-1.html new file mode 100644 index 00000000..91d79158 --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-cvr-page-1.html @@ -0,0 +1,16 @@ + +CVR - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-cvr.html b/documentation/_site_rebuild_20260317/modules-module-cvr.html new file mode 100644 index 00000000..5cb67425 --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-cvr.html @@ -0,0 +1,16 @@ + +CVR | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-e-conomic-page-1.html b/documentation/_site_rebuild_20260317/modules-module-e-conomic-page-1.html new file mode 100644 index 00000000..6af702fc --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-e-conomic-page-1.html @@ -0,0 +1,16 @@ + +e-conomic - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-e-conomic.html b/documentation/_site_rebuild_20260317/modules-module-e-conomic.html new file mode 100644 index 00000000..4fdae646 --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-e-conomic.html @@ -0,0 +1,16 @@ + +e-conomic | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

e-conomic

Accounting and invoicing integration with e-conomic.

17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-entra-page-1.html b/documentation/_site_rebuild_20260317/modules-module-entra-page-1.html new file mode 100644 index 00000000..9213660e --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-entra-page-1.html @@ -0,0 +1,16 @@ + +Entra - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-entra.html b/documentation/_site_rebuild_20260317/modules-module-entra.html new file mode 100644 index 00000000..f00df5de --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-entra.html @@ -0,0 +1,16 @@ + +Entra | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-fxratesapi-page-1.html b/documentation/_site_rebuild_20260317/modules-module-fxratesapi-page-1.html new file mode 100644 index 00000000..c47295df --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-fxratesapi-page-1.html @@ -0,0 +1,16 @@ + +FXRatesAPI - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-fxratesapi.html b/documentation/_site_rebuild_20260317/modules-module-fxratesapi.html new file mode 100644 index 00000000..74906509 --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-fxratesapi.html @@ -0,0 +1,16 @@ + +FXRatesAPI | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-motorapi-page-1.html b/documentation/_site_rebuild_20260317/modules-module-motorapi-page-1.html new file mode 100644 index 00000000..296f3063 --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-motorapi-page-1.html @@ -0,0 +1,16 @@ + +MotorAPI - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-motorapi.html b/documentation/_site_rebuild_20260317/modules-module-motorapi.html new file mode 100644 index 00000000..9093ab95 --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-motorapi.html @@ -0,0 +1,16 @@ + +MotorAPI | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-self-serve-page-1.html b/documentation/_site_rebuild_20260317/modules-module-self-serve-page-1.html new file mode 100644 index 00000000..e87c3930 --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-self-serve-page-1.html @@ -0,0 +1,16 @@ + +Self-Serve - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Self-Serve - Page 1 of 1

This page groups endpoint topics for this object type.

17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-self-serve.html b/documentation/_site_rebuild_20260317/modules-module-self-serve.html new file mode 100644 index 00000000..03a57f1b --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-self-serve.html @@ -0,0 +1,16 @@ + +Self-Serve | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Self-Serve

Self-serve lane control and machine command endpoints.

17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-stripe-page-1.html b/documentation/_site_rebuild_20260317/modules-module-stripe-page-1.html new file mode 100644 index 00000000..8c3cc0c3 --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-stripe-page-1.html @@ -0,0 +1,16 @@ + +Stripe - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-stripe.html b/documentation/_site_rebuild_20260317/modules-module-stripe.html new file mode 100644 index 00000000..8ccd9e93 --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-stripe.html @@ -0,0 +1,16 @@ + +Stripe | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-virkdata-page-1.html b/documentation/_site_rebuild_20260317/modules-module-virkdata-page-1.html new file mode 100644 index 00000000..53fa1cbe --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-virkdata-page-1.html @@ -0,0 +1,16 @@ + +VirkData - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-virkdata.html b/documentation/_site_rebuild_20260317/modules-module-virkdata.html new file mode 100644 index 00000000..529783b6 --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-virkdata.html @@ -0,0 +1,16 @@ + +VirkData | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-wash-certificates-page-1.html b/documentation/_site_rebuild_20260317/modules-module-wash-certificates-page-1.html new file mode 100644 index 00000000..153afd8e --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-wash-certificates-page-1.html @@ -0,0 +1,16 @@ + +Wash Certificates - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-wash-certificates.html b/documentation/_site_rebuild_20260317/modules-module-wash-certificates.html new file mode 100644 index 00000000..bde99709 --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-wash-certificates.html @@ -0,0 +1,16 @@ + +Wash Certificates | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-weatherapi-page-1.html b/documentation/_site_rebuild_20260317/modules-module-weatherapi-page-1.html new file mode 100644 index 00000000..94e9349f --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-weatherapi-page-1.html @@ -0,0 +1,16 @@ + +WeatherAPI - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-weatherapi.html b/documentation/_site_rebuild_20260317/modules-module-weatherapi.html new file mode 100644 index 00000000..74a5c69c --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-weatherapi.html @@ -0,0 +1,16 @@ + +WeatherAPI | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-xlvask-page-1.html b/documentation/_site_rebuild_20260317/modules-module-xlvask-page-1.html new file mode 100644 index 00000000..1ad99025 --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-xlvask-page-1.html @@ -0,0 +1,16 @@ + +XLVask - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/modules-module-xlvask.html b/documentation/_site_rebuild_20260317/modules-module-xlvask.html new file mode 100644 index 00000000..0f63bc31 --- /dev/null +++ b/documentation/_site_rebuild_20260317/modules-module-xlvask.html @@ -0,0 +1,16 @@ + +XLVask | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/motorapilookup.html b/documentation/_site_rebuild_20260317/motorapilookup.html new file mode 100644 index 00000000..86ca3e84 --- /dev/null +++ b/documentation/_site_rebuild_20260317/motorapilookup.html @@ -0,0 +1,18 @@ + +Lookup vehicle via MotorAPI | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Lookup vehicle via MotorAPI

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/motorapi/lookup

Operation

Operation ID: motorApiLookup

Look up vehicle information using license plate

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

plate

query

yes

string

Responses

Status

Description

Content Types

200

Vehicle information retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/passkeychallenge.html b/documentation/_site_rebuild_20260317/passkeychallenge.html new file mode 100644 index 00000000..d08305ee --- /dev/null +++ b/documentation/_site_rebuild_20260317/passkeychallenge.html @@ -0,0 +1,92 @@ + +Initiate passkey authentication challenge | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Initiate passkey authentication challenge

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /auth/passkey/challenge

Operation

Operation ID: passkeyChallenge

Generates a WebAuthn PublicKeyCredentialRequestOptions payload. If customer_number is provided, allowCredentials will be populated with existing passkeys for that account. Otherwise, a challenge is issued for discoverable credentials.

Authentication

No authentication required.

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "customer_number": { + "description": "Optional customer's e-conomic customer number", + "example": 12345, + "type": "integer" + }, + "g_recaptcha_response": { + "description": "reCAPTCHA verification token", + "type": "string" + } + }, + "required": [ + "g_recaptcha_response" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Challenge generated

application/json

400

Schema for response 200 (application/json):

+{ + "properties": { + "challenge_token": { + "description": "Temporary token binding the challenge to the login attempt", + "type": "string" + }, + "publicKey": { + "properties": { + "allowCredentials": { + "items": { + "properties": { + "id": { + "description": "Base64URL-encoded credential ID", + "type": "string" + }, + "transports": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": { + "example": "public-key", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "challenge": { + "description": "Base64URL-encoded challenge", + "type": "string" + }, + "rpId": { + "description": "Relying party ID (truckwash.io or localhost)", + "example": "truckwash.io", + "type": "string" + }, + "timeout": { + "description": "Timeout in milliseconds", + "type": "integer" + }, + "userVerification": { + "enum": [ + "required", + "preferred", + "discouraged" + ], + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/passkeyverify.html b/documentation/_site_rebuild_20260317/passkeyverify.html new file mode 100644 index 00000000..c7e0773a --- /dev/null +++ b/documentation/_site_rebuild_20260317/passkeyverify.html @@ -0,0 +1,118 @@ + +Verify passkey authentication and start session | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Verify passkey authentication and start session

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /auth/passkey/verify

Operation

Operation ID: passkeyVerify

Verifies the WebAuthn assertion and challenge token. Returns a session token on success.

Authentication

No authentication required.

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "challenge_token": { + "description": "The token returned by the challenge endpoint", + "type": "string" + }, + "credential": { + "description": "The WebAuthn PublicKeyCredential object (assertion)", + "properties": { + "clientExtensionResults": { + "type": "object" + }, + "id": { + "description": "The credential ID (base64url)", + "type": "string" + }, + "rawId": { + "description": "The raw credential ID (base64url)", + "type": "string" + }, + "response": { + "properties": { + "authenticatorData": { + "description": "Base64URL-encoded authenticator data", + "type": "string" + }, + "clientDataJSON": { + "description": "Base64URL-encoded client data", + "type": "string" + }, + "signature": { + "description": "Base64URL-encoded signature", + "type": "string" + }, + "userHandle": { + "description": "Base64URL-encoded user handle", + "nullable": true, + "type": "string" + } + }, + "required": [ + "clientDataJSON", + "authenticatorData", + "signature" + ], + "type": "object" + }, + "type": { + "example": "public-key", + "type": "string" + } + }, + "required": [ + "id", + "rawId", + "type", + "response" + ], + "type": "object" + }, + "g_recaptcha_response": { + "description": "reCAPTCHA verification token", + "type": "string" + } + }, + "required": [ + "challenge_token", + "credential", + "g_recaptcha_response" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Verification successful, session started

application/json

400

401

Schema for response 200 (application/json):

+{ + "oneOf": [ + { + "properties": { + "token": { + "description": "Bearer token for customer", + "type": "string" + } + }, + "required": [ + "token" + ], + "type": "object" + }, + { + "properties": { + "session": { + "description": "Session token for subuser", + "type": "string" + } + }, + "required": [ + "session" + ], + "type": "object" + } + ] +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/rebuildsystemsearchcache.html b/documentation/_site_rebuild_20260317/rebuildsystemsearchcache.html new file mode 100644 index 00000000..8902c4a5 --- /dev/null +++ b/documentation/_site_rebuild_20260317/rebuildsystemsearchcache.html @@ -0,0 +1,24 @@ + +Queue system search cache rebuild | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Queue system search cache rebuild

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /superuser/search/system/cache/rebuild

Operation

Operation ID: rebuildSystemSearchCache

Queues a cache rebuild request and clears active query/intent cache namespaces immediately.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{ + "$ref": "#/components/schemas/SystemSearchCacheRebuildRequest" +} +

Responses

Status

Description

Content Types

200

Cache rebuild queued successfully

application/json

401

403

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/SystemSearchCacheRebuildResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/recorddepartmentplatescan.html b/documentation/_site_rebuild_20260317/recorddepartmentplatescan.html new file mode 100644 index 00000000..7e08615e --- /dev/null +++ b/documentation/_site_rebuild_20260317/recorddepartmentplatescan.html @@ -0,0 +1,34 @@ + +Record plate scan for department | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Record plate scan for department

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /numberplatescans/department

Operation

Operation ID: recordDepartmentPlateScan

Record plate scan for department

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "department_id": { + "type": "integer" + }, + "plate": { + "type": "string" + } + }, + "required": [ + "plate", + "department_id" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

201

Plate scan recorded successfully

application/json

Schema for response 201 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/recordplatescan.html b/documentation/_site_rebuild_20260317/recordplatescan.html new file mode 100644 index 00000000..10fa5c36 --- /dev/null +++ b/documentation/_site_rebuild_20260317/recordplatescan.html @@ -0,0 +1,34 @@ + +Record plate scan | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Record plate scan

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /numberplatescans

Operation

Operation ID: recordPlateScan

Record a new license plate scan

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "lane_id": { + "type": "integer" + }, + "plate": { + "type": "string" + } + }, + "required": [ + "plate", + "lane_id" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

201

Plate scan recorded successfully

application/json

Schema for response 201 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/registercustomerbycvr.html b/documentation/_site_rebuild_20260317/registercustomerbycvr.html new file mode 100644 index 00000000..8e79b18f --- /dev/null +++ b/documentation/_site_rebuild_20260317/registercustomerbycvr.html @@ -0,0 +1,79 @@ + +Register new customer by CVR | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Register new customer by CVR

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /auth/register/cvr

Operation

Operation ID: registerCustomerByCvr

Register a new customer account using Danish CVR number

Authentication

No authentication required.

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "companyPhone": { + "description": "Company phone number", + "example": 21754690, + "maximum": 9999999999, + "minimum": 10000000, + "type": "integer" + }, + "contactEmail": { + "description": "Contact email", + "example": "contact@company.dk", + "format": "email", + "maxLength": 255, + "minLength": 5, + "type": "string" + }, + "contactName": { + "description": "Contact person name", + "example": "Mikkel", + "type": "string" + }, + "contactPhone": { + "description": "Contact phone number", + "example": 21754690, + "maximum": 9999999999, + "minimum": 10000000, + "type": "integer" + }, + "cvr": { + "description": "Danish CVR number", + "example": "44794780", + "maxLength": 20, + "minLength": 8, + "type": "string" + }, + "g_recaptcha_response": { + "description": "reCAPTCHA verification token", + "type": "string" + }, + "invoiceEmail": { + "description": "Email for invoices", + "example": "invoice@company.dk", + "format": "email", + "maxLength": 255, + "minLength": 5, + "type": "string" + } + }, + "required": [ + "cvr", + "companyPhone", + "invoiceEmail", + "contactEmail", + "contactPhone", + "contactName", + "g_recaptcha_response" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

201

Customer registered successfully

application/json

400

Schema for response 201 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/removedepartmentcategory.html b/documentation/_site_rebuild_20260317/removedepartmentcategory.html new file mode 100644 index 00000000..a99df114 --- /dev/null +++ b/documentation/_site_rebuild_20260317/removedepartmentcategory.html @@ -0,0 +1,20 @@ + +Remove category from department | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Remove category from department

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /departments/categories

Operation

Operation ID: removeDepartmentCategory

Remove category from department

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/removerolepermission.html b/documentation/_site_rebuild_20260317/removerolepermission.html new file mode 100644 index 00000000..6d423d01 --- /dev/null +++ b/documentation/_site_rebuild_20260317/removerolepermission.html @@ -0,0 +1,18 @@ + +Remove permission from role | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Remove permission from role

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

DELETE /roles/permissions

Operation

Operation ID: removeRolePermission

Remove permission from role

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

role_id

query

yes

integer

permission

query

yes

string

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/renamepasskey.html b/documentation/_site_rebuild_20260317/renamepasskey.html new file mode 100644 index 00000000..b4eb7b3d --- /dev/null +++ b/documentation/_site_rebuild_20260317/renamepasskey.html @@ -0,0 +1,26 @@ + +Rename a passkey | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Rename a passkey

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PATCH /account/security/passkeys/{id}

Operation

Operation ID: renamePasskey

Rename a passkey

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

path

yes

integer

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/PasskeyRenameRequest" +} +

Responses

Status

Description

Content Types

200

Passkey renamed

application/json

404

Not found

application/json

Schema for response 200 (application/json):

+{} +

Schema for response 404 (application/json):

+{ + "$ref": "#/components/schemas/Error" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/requestpasswordreset.html b/documentation/_site_rebuild_20260317/requestpasswordreset.html new file mode 100644 index 00000000..5174010c --- /dev/null +++ b/documentation/_site_rebuild_20260317/requestpasswordreset.html @@ -0,0 +1,44 @@ + +Request a customer password reset email | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Request a customer password reset email

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /auth/password-reset/request

Operation

Operation ID: requestPasswordReset

Send an email with a password reset token to the customer&#x27;s email address

Authentication

No authentication required.

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "customer_number": { + "description": "The customer number", + "example": 123456, + "type": "integer" + }, + "g_recaptcha_response": { + "description": "reCAPTCHA verification token", + "type": "string" + } + }, + "required": [ + "customer_number", + "g_recaptcha_response" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Request processed

application/json

400

Schema for response 200 (application/json):

+{ + "properties": { + "message": { + "type": "string" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/searchcustomers.html b/documentation/_site_rebuild_20260317/searchcustomers.html new file mode 100644 index 00000000..d4f3b6e6 --- /dev/null +++ b/documentation/_site_rebuild_20260317/searchcustomers.html @@ -0,0 +1,27 @@ + +Search customers | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Search customers

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /customers/search

Operation

Operation ID: searchCustomers

Search for customers using various criteria

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "query": { + "type": "string" + } + }, + "type": "object" +} +

Responses

Status

Description

Content Types

200

Customers found successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/searchcvr.html b/documentation/_site_rebuild_20260317/searchcvr.html new file mode 100644 index 00000000..0bb033a5 --- /dev/null +++ b/documentation/_site_rebuild_20260317/searchcvr.html @@ -0,0 +1,18 @@ + +Search CVR | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Search CVR

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /cvr/search

Operation

Operation ID: searchCvr

Search for companies by name or CVR

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

query

query

yes

string

Responses

Status

Description

Content Types

200

Search results retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/searchvehicles.html b/documentation/_site_rebuild_20260317/searchvehicles.html new file mode 100644 index 00000000..6d0ec6a7 --- /dev/null +++ b/documentation/_site_rebuild_20260317/searchvehicles.html @@ -0,0 +1,18 @@ + +Search vehicles | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Search vehicles

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /vehicles/search

Operation

Operation ID: searchVehicles

Search vehicles

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

search

query

yes

string

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/senddepartmentgoalprogressalerttest.html b/documentation/_site_rebuild_20260317/senddepartmentgoalprogressalerttest.html new file mode 100644 index 00000000..e938ce93 --- /dev/null +++ b/documentation/_site_rebuild_20260317/senddepartmentgoalprogressalerttest.html @@ -0,0 +1,112 @@ + +Send a test progress alert for a department goal | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Send a test progress alert for a department goal

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /goals/department/progress-alert/test

Operation

Operation ID: sendDepartmentGoalProgressAlertTest

Sends a progress alert for a department goal to the destination defined in the goal&#x27;s criteria. Permission required: `goals_department_progress_alert_test`. Access control: - The caller must be a superuser or belong to all departments targeted by the goal. Behavior: - Looks up the goal by `id`. - Rebuilds the criteria from stored JSON and attaches the goal&#x27;s departments. - Renders the alert using the server-side renderer (respecting progress type/style/format and destination limits). - Sends the alert to Slack, Email, or SMS depending on `progress_alert_destination`, unless overridden.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "department_id": { + "description": "Department id to use that department's Slack webhook when destination is SLACK", + "example": 3, + "type": "integer" + }, + "email_to": { + "description": "Email recipient when destination is EMAIL", + "example": "tester@example.com", + "format": "email", + "type": "string" + }, + "id": { + "description": "The department goal id", + "example": 42, + "type": "integer" + }, + "overrideDestination": { + "description": "Override the destination for this test", + "enum": [ + "SLACK", + "EMAIL", + "SMS", + "NONE" + ], + "example": "SLACK", + "type": "string" + }, + "slack_webhook": { + "description": "Slack webhook URL when destination is SLACK", + "example": "https://hooks.slack.com/services/T000/B000/XXX", + "type": "string" + }, + "sms_to": { + "description": "One or more MSISDN recipients when destination is SMS", + "oneOf": [ + { + "description": "Comma or semicolon separated list", + "example": "+4512345678, +4598765432", + "type": "string" + }, + { + "example": [ + "+4512345678", + "+4598765432" + ], + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "subject": { + "description": "Optional email subject when destination is EMAIL", + "example": "Dept Goal Progress Test", + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Alert sent successfully

application/json

400

401

403

404

500

Schema for response 200 (application/json):

+{ + "properties": { + "destination": { + "description": "Final destination used", + "enum": [ + "SLACK", + "EMAIL", + "SMS", + "NONE" + ], + "type": "string" + }, + "id": { + "description": "Goal id", + "type": "integer" + }, + "message_preview": { + "description": "Rendered message preview", + "type": "string" + }, + "provider_response": { + "description": "Provider-specific response or status message" + }, + "target": { + "description": "The target used for delivery (email address, phone numbers, department id, or webhook)" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/sendselfservelanecommand.html b/documentation/_site_rebuild_20260317/sendselfservelanecommand.html new file mode 100644 index 00000000..1c961638 --- /dev/null +++ b/documentation/_site_rebuild_20260317/sendselfservelanecommand.html @@ -0,0 +1,47 @@ + +Send self-serve lane command | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Send self-serve lane command

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /modules/self-serve/lane/command

Operation

Operation ID: sendSelfServeLaneCommand

Send a command (e.g., start, stop, reset) to a self-serve lane

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "command": { + "enum": [ + "START", + "STOP", + "RESET", + "RESERVE", + "RELEASE" + ], + "type": "string" + }, + "lane_id": { + "type": "integer" + }, + "license_plate": { + "description": "Required for START command", + "type": "string" + } + }, + "required": [ + "lane_id", + "command" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Command sent successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/SelfServeLaneStatus" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/setdepartmentprice.html b/documentation/_site_rebuild_20260317/setdepartmentprice.html new file mode 100644 index 00000000..cec82721 --- /dev/null +++ b/documentation/_site_rebuild_20260317/setdepartmentprice.html @@ -0,0 +1,38 @@ + +Set department price | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Set department price

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /superuser/department/prices

Operation

Operation ID: setDepartmentPrice

Set department price

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "department_id": { + "type": "integer" + }, + "price": { + "type": "integer" + }, + "product_id": { + "type": "integer" + } + }, + "required": [ + "department_id", + "product_id", + "price" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/setdepartmentterminallocation.html b/documentation/_site_rebuild_20260317/setdepartmentterminallocation.html new file mode 100644 index 00000000..deef89c8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/setdepartmentterminallocation.html @@ -0,0 +1,34 @@ + +Set department terminal location | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Set department terminal location

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /modules/stripe/department/terminal/location

Operation

Operation ID: setDepartmentTerminalLocation

Set department terminal location

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "id": { + "type": "integer" + }, + "location": { + "type": "string" + } + }, + "required": [ + "id", + "location" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/setdepartmentvariable.html b/documentation/_site_rebuild_20260317/setdepartmentvariable.html new file mode 100644 index 00000000..f7847908 --- /dev/null +++ b/documentation/_site_rebuild_20260317/setdepartmentvariable.html @@ -0,0 +1,38 @@ + +Set department variable | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Set department variable

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /superuser/department/variables

Operation

Operation ID: setDepartmentVariable

Set department variable

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "department_id": { + "type": "integer" + }, + "value": { + "type": "string" + }, + "variable": { + "type": "string" + } + }, + "required": [ + "department_id", + "variable", + "value" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/setpasswordusingresettoken.html b/documentation/_site_rebuild_20260317/setpasswordusingresettoken.html new file mode 100644 index 00000000..28a7759e --- /dev/null +++ b/documentation/_site_rebuild_20260317/setpasswordusingresettoken.html @@ -0,0 +1,52 @@ + +Set a customer password using a reset key | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Set a customer password using a reset key

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /auth/password-reset/set

Operation

Operation ID: setPasswordUsingResetToken

Update the customer password using a valid reset token

Authentication

No authentication required.

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "g_recaptcha_response": { + "description": "reCAPTCHA verification token", + "type": "string" + }, + "password": { + "description": "The new password", + "type": "string" + }, + "token": { + "description": "The password reset token", + "type": "string" + } + }, + "required": [ + "token", + "password", + "g_recaptcha_response" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Password updated successfully

application/json

400

404

Invalid or expired token

application/json

Schema for response 200 (application/json):

+{ + "properties": { + "message": { + "type": "string" + } + }, + "type": "object" +} +

Schema for response 404 (application/json):

+{ + "$ref": "#/components/schemas/Error" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/setselfservelaneallowedservices.html b/documentation/_site_rebuild_20260317/setselfservelaneallowedservices.html new file mode 100644 index 00000000..a950fe57 --- /dev/null +++ b/documentation/_site_rebuild_20260317/setselfservelaneallowedservices.html @@ -0,0 +1,50 @@ + +Set allowed services for a lane based on shown tasks | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Set allowed services for a lane based on shown tasks

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /modules/self-serve/lane/services/allowed

Operation

Operation ID: setSelfServeLaneAllowedServices

Updates the set of services that are allowed to be manually activated for a given self-serve lane, derived from the tasks currently shown to the user after answering the self-serve questions. This endpoint does not activate anything by itself; it only sets what is allowed to be activated.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "lane_id": { + "type": "integer" + }, + "task_ids": { + "description": "List of task IDs that are currently shown to the user", + "items": { + "type": "integer" + }, + "type": "array" + } + }, + "required": [ + "lane_id" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Allowed services updated

application/json

401

403

Schema for response 200 (application/json):

+{ + "properties": { + "allowed_services": { + "items": { + "type": "string" + }, + "type": "array" + }, + "lane_id": { + "type": "integer" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/setup2fa.html b/documentation/_site_rebuild_20260317/setup2fa.html new file mode 100644 index 00000000..3e8169d5 --- /dev/null +++ b/documentation/_site_rebuild_20260317/setup2fa.html @@ -0,0 +1,32 @@ + +Generate 2FA secret | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Generate 2FA secret

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /auth/2fa/setup

Operation

Operation ID: setup2fa

Generate a new TOTP secret for the authenticated user/subuser

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

2FA secret generated successfully

application/json

401

Schema for response 200 (application/json):

+{ + "properties": { + "qr_code_url": { + "description": "An otpauth URL for generating a QR code", + "type": "string" + }, + "secret": { + "description": "The base32 encoded TOTP secret", + "type": "string" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/setuserdiscount.html b/documentation/_site_rebuild_20260317/setuserdiscount.html new file mode 100644 index 00000000..e0912b29 --- /dev/null +++ b/documentation/_site_rebuild_20260317/setuserdiscount.html @@ -0,0 +1,41 @@ + +Set user discount | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Set user discount

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /superuser/user/discounts

Operation

Operation ID: setUserDiscount

Set user discount

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "discount": { + "type": "integer" + }, + "is_category": { + "type": "boolean" + }, + "object_id": { + "type": "string" + }, + "user_id": { + "type": "integer" + } + }, + "required": [ + "discount", + "object_id", + "is_category" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/setuserkey.html b/documentation/_site_rebuild_20260317/setuserkey.html new file mode 100644 index 00000000..317d957d --- /dev/null +++ b/documentation/_site_rebuild_20260317/setuserkey.html @@ -0,0 +1,37 @@ + +Set user key | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Set user key

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /superuser/user/keys

Operation

Operation ID: setUserKey

Set user key

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "key": { + "type": "string" + }, + "user_id": { + "type": "integer" + }, + "value": { + "type": "string" + } + }, + "required": [ + "key", + "value" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/setuserpassword.html b/documentation/_site_rebuild_20260317/setuserpassword.html new file mode 100644 index 00000000..2cb24430 --- /dev/null +++ b/documentation/_site_rebuild_20260317/setuserpassword.html @@ -0,0 +1,33 @@ + +Set user password | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Set user password

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /superuser/user/password

Operation

Operation ID: setUserPassword

Set user password

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "password": { + "type": "string" + }, + "user_id": { + "type": "integer" + } + }, + "required": [ + "password" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/setvehicleautostartonlpr.html b/documentation/_site_rebuild_20260317/setvehicleautostartonlpr.html new file mode 100644 index 00000000..8024aec1 --- /dev/null +++ b/documentation/_site_rebuild_20260317/setvehicleautostartonlpr.html @@ -0,0 +1,34 @@ + +Set auto start on LPR | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Set auto start on LPR

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /vehicles/set-auto-start-on-lpr

Operation

Operation ID: setVehicleAutoStartOnLpr

Enable or disable automatic start on LPR for a vehicle in XL Vask. Permissions: - Own scope: `set_auto_start_on_lpr` (linked to subuser node `VEHICLES_EDIT`). - Broader scope: `set_auto_start_on_lpr_other`.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "active": { + "type": "boolean" + }, + "id": { + "type": "integer" + } + }, + "required": [ + "id", + "active" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

403

404

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/setvehicletypeid.html b/documentation/_site_rebuild_20260317/setvehicletypeid.html new file mode 100644 index 00000000..dc4cebd7 --- /dev/null +++ b/documentation/_site_rebuild_20260317/setvehicletypeid.html @@ -0,0 +1,36 @@ + +Set vehicle type ID | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Set vehicle type ID

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /vehicles/set-vehicle-type-id

Operation

Operation ID: setVehicleTypeId

Set or change the XL Vask `vehicleTypeId` for a vehicle. Permissions: - Own scope: `set_vehicle_type_id` (linked to subuser node `VEHICLES_EDIT`). - Broader scope: `set_vehicle_type_id_other`.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "id": { + "type": "integer" + }, + "vehicleTypeId": { + "maxLength": 50, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "id", + "vehicleTypeId" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

400

403

404

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/simulatestripepayment.html b/documentation/_site_rebuild_20260317/simulatestripepayment.html new file mode 100644 index 00000000..82afb330 --- /dev/null +++ b/documentation/_site_rebuild_20260317/simulatestripepayment.html @@ -0,0 +1,30 @@ + +Simulate Stripe payment | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Simulate Stripe payment

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /orders/module/stripe/debug/simulate_payment

Operation

Operation ID: simulateStripePayment

Simulate Stripe payment

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "id": { + "type": "integer" + } + }, + "required": [ + "id" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/submitform.html b/documentation/_site_rebuild_20260317/submitform.html new file mode 100644 index 00000000..d6187f02 --- /dev/null +++ b/documentation/_site_rebuild_20260317/submitform.html @@ -0,0 +1,40 @@ + +Submit form | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Submit form

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /form

Operation

Operation ID: submitForm

Submit a form

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "data": { + "description": "Form submission data", + "type": "object" + }, + "g_recaptcha_response": { + "description": "reCAPTCHA verification token (required if not authenticated)", + "type": "string" + }, + "id": { + "description": "Form identifier", + "type": "string" + } + }, + "required": [ + "id", + "data" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

201

Form submitted successfully

application/json

Schema for response 201 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/subuserpasswordauth.html b/documentation/_site_rebuild_20260317/subuserpasswordauth.html new file mode 100644 index 00000000..c92f60f4 --- /dev/null +++ b/documentation/_site_rebuild_20260317/subuserpasswordauth.html @@ -0,0 +1,128 @@ + +Authenticate subuser with password | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Authenticate subuser with password

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /subusers/auth/password

Operation

Operation ID: subuserPasswordAuth

Authenticates a subuser (driver) using a password together with one of the supported identifiers: `phone_country_code` + `phone`, `subuser_id`, or `username`. On success, returns a newly generated session token for the subuser.

Authentication

No authentication required.

Request Body

Required: yes.

Content type: application/json

+{ + "oneOf": [ + { + "properties": { + "password": { + "format": "password", + "maxLength": 255, + "minLength": 8, + "type": "string" + }, + "phone": { + "description": "Phone number (4–15 digits, no leading +)", + "example": 12345678, + "maximum": 999999999999999, + "minimum": 1000, + "type": "integer" + }, + "phone_country_code": { + "description": "Phone country code (1–3 digits)", + "example": 45, + "maximum": 999, + "minimum": 1, + "type": "integer" + } + }, + "required": [ + "phone_country_code", + "phone", + "password" + ], + "type": "object" + }, + { + "properties": { + "password": { + "format": "password", + "maxLength": 255, + "minLength": 8, + "type": "string" + }, + "subuser_id": { + "description": "Subuser ID", + "example": 42, + "type": "integer" + } + }, + "required": [ + "subuser_id", + "password" + ], + "type": "object" + }, + { + "properties": { + "password": { + "format": "password", + "maxLength": 255, + "minLength": 8, + "type": "string" + }, + "username": { + "example": "jdoe", + "maxLength": 255, + "minLength": 3, + "type": "string" + } + }, + "required": [ + "username", + "password" + ], + "type": "object" + } + ] +} +

Responses

Status

Description

Content Types

200

Authentication successful

application/json

400

404

500

Schema for response 200 (application/json):

+{ + "oneOf": [ + { + "properties": { + "session": { + "description": "Newly generated subuser session token", + "example": "2f7a8c0e-9b1d-4c6a-91a9-1a2b3c4d5e6f", + "type": "string" + } + }, + "required": [ + "session" + ], + "type": "object" + }, + { + "properties": { + "2fa_required": { + "example": true, + "type": "boolean" + }, + "2fa_token": { + "description": "Temporary 2FA verification token", + "example": "557a3e7b1a2b...", + "type": "string" + } + }, + "required": [ + "2fa_required", + "2fa_token" + ], + "type": "object" + } + ] +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/suintimidate.html b/documentation/_site_rebuild_20260317/suintimidate.html new file mode 100644 index 00000000..1c1ba6a3 --- /dev/null +++ b/documentation/_site_rebuild_20260317/suintimidate.html @@ -0,0 +1,37 @@ + +Intimidate a user | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Intimidate a user

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /su/intimidate

Operation

Operation ID: suIntimidate

Create an authentication token for another user (Superuser only)

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "user_id": { + "type": "integer" + } + }, + "required": [ + "user_id" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{ + "properties": { + "token": { + "type": "string" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/syncallbookings.html b/documentation/_site_rebuild_20260317/syncallbookings.html new file mode 100644 index 00000000..ad971bc6 --- /dev/null +++ b/documentation/_site_rebuild_20260317/syncallbookings.html @@ -0,0 +1,20 @@ + +Sync all bookings from external system | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Sync all bookings from external system

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /superuser/bookings/sync/all

Operation

Operation ID: syncAllBookings

Sync all bookings from external system

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/syncbooking.html b/documentation/_site_rebuild_20260317/syncbooking.html new file mode 100644 index 00000000..ed079619 --- /dev/null +++ b/documentation/_site_rebuild_20260317/syncbooking.html @@ -0,0 +1,20 @@ + +Sync booking from external system | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Sync booking from external system

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /admin/bookings/sync

Operation

Operation ID: syncBooking

Sync booking from external system

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/systemwidesearchget.html b/documentation/_site_rebuild_20260317/systemwidesearchget.html new file mode 100644 index 00000000..f186e022 --- /dev/null +++ b/documentation/_site_rebuild_20260317/systemwidesearchget.html @@ -0,0 +1,20 @@ + +System-wide search | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

System-wide search

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /search/system

Operation

Operation ID: systemWideSearchGet

Search across all supported entities with permission-aware filtering and optional intent parsing debug metadata. Customer records and customer-related entities are matched against a local e-conomic customer index (name/address/email/CVR) that is refreshed by cron. Intent parsing is invoked adaptively when lexical confidence is low or when the query looks intent-driven. Results are ordered by relevance, with recent records preferred when relevance is comparable.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

query

query

yes

string

Free-text query to search for. Supports natural-language intent fallback and domain synonyms such as `rabat` -> `discount`.

include_types

query

no

array<SystemSearchEntityType>

Comma-separated list of entity types to include. Defaults to all allowed types.

exclude_types

query

no

array<SystemSearchEntityType>

Comma-separated list of entity types to exclude.

include_associations

query

no

boolean

Include associated objects when matching a primary entity such as a customer.

debug_intent

query

no

boolean

Include intent parser diagnostics in `meta.intent_parser`.

limit

query

no

integer

offset

query

no

integer

Responses

Status

Description

Content Types

200

Search results returned successfully

application/json

400

401

403

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/SystemSearchResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/systemwidesearchpost.html b/documentation/_site_rebuild_20260317/systemwidesearchpost.html new file mode 100644 index 00000000..ead63ebc --- /dev/null +++ b/documentation/_site_rebuild_20260317/systemwidesearchpost.html @@ -0,0 +1,24 @@ + +System-wide search | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

System-wide search

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /search/system

Operation

Operation ID: systemWideSearchPost

Search across all supported entities using JSON request payload. Customer-related matches include local e-conomic customer index fields. Intent parsing may run adaptively for intent-driven natural-language queries. Results are ordered by relevance, with recent records preferred when relevance is comparable.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/SystemSearchRequest" +} +

Responses

Status

Description

Content Types

200

Search results returned successfully

application/json

400

401

403

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/SystemSearchResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-attachments-page-1.html b/documentation/_site_rebuild_20260317/tag-attachments-page-1.html new file mode 100644 index 00000000..d4d0e910 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-attachments-page-1.html @@ -0,0 +1,16 @@ + +Attachments - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-attachments.html b/documentation/_site_rebuild_20260317/tag-attachments.html new file mode 100644 index 00000000..325d1f1f --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-attachments.html @@ -0,0 +1,16 @@ + +Attachments | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-authentication-page-1.html b/documentation/_site_rebuild_20260317/tag-authentication-page-1.html new file mode 100644 index 00000000..8791ceaf --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-authentication-page-1.html @@ -0,0 +1,16 @@ + +Authentication - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-authentication.html b/documentation/_site_rebuild_20260317/tag-authentication.html new file mode 100644 index 00000000..6cf1d155 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-authentication.html @@ -0,0 +1,16 @@ + +Authentication | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-bird-page-1.html b/documentation/_site_rebuild_20260317/tag-bird-page-1.html new file mode 100644 index 00000000..83d6c49d --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-bird-page-1.html @@ -0,0 +1,16 @@ + +Bird - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Bird - Page 1 of 1

This page groups endpoint topics for this object type.

17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-bird.html b/documentation/_site_rebuild_20260317/tag-bird.html new file mode 100644 index 00000000..cdc12ac4 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-bird.html @@ -0,0 +1,16 @@ + +Bird | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-bookings-page-1.html b/documentation/_site_rebuild_20260317/tag-bookings-page-1.html new file mode 100644 index 00000000..3c42d5e7 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-bookings-page-1.html @@ -0,0 +1,16 @@ + +Bookings - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-bookings.html b/documentation/_site_rebuild_20260317/tag-bookings.html new file mode 100644 index 00000000..63b4c11e --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-bookings.html @@ -0,0 +1,16 @@ + +Bookings | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-branding-page-1.html b/documentation/_site_rebuild_20260317/tag-branding-page-1.html new file mode 100644 index 00000000..41e78f4b --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-branding-page-1.html @@ -0,0 +1,16 @@ + +Branding - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-branding.html b/documentation/_site_rebuild_20260317/tag-branding.html new file mode 100644 index 00000000..a64f650e --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-branding.html @@ -0,0 +1,16 @@ + +Branding | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-categories-page-1.html b/documentation/_site_rebuild_20260317/tag-categories-page-1.html new file mode 100644 index 00000000..57aab718 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-categories-page-1.html @@ -0,0 +1,16 @@ + +Categories - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-categories.html b/documentation/_site_rebuild_20260317/tag-categories.html new file mode 100644 index 00000000..b45feb2c --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-categories.html @@ -0,0 +1,16 @@ + +Categories | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-config.html b/documentation/_site_rebuild_20260317/tag-config.html new file mode 100644 index 00000000..d88cc031 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-config.html @@ -0,0 +1,16 @@ + +Config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Config

Configuration endpoints grouped by module name.

Configuration Module Catalog

Module

Description

Backups

Backup configuration for backup module behavior.

Bird

Bird communication integration configuration.

e-conomic

e-conomic accounting integration configuration.

Email

Email provider and SMTP/MailerSend configuration.

Entra

Microsoft Entra identity integration configuration.

FXRatesAPI

FXRatesAPI exchange-rate integration configuration.

GatewayAPI

GatewayAPI integration configuration.

LicensePlateRecognizer

License plate recognizer integration configuration.

Limble

Limble integration configuration.

MotorAPI

MotorAPI vehicle lookup integration configuration.

OcrSpace

OCR Space integration configuration.

OpenAI

OpenAI integration configuration.

reCAPTCHA

reCAPTCHA protection configuration.

Self-Serve

Self-serve module runtime configuration.

Shelly

Shelly integration configuration.

Stripe

Stripe integration configuration.

VirkData

VirkData integration configuration.

WeatherAPI

WeatherAPI integration configuration.

XLVask

XLVask integration configuration.

17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-departments-page-1.html b/documentation/_site_rebuild_20260317/tag-departments-page-1.html new file mode 100644 index 00000000..c1bde4d7 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-departments-page-1.html @@ -0,0 +1,16 @@ + +Departments - Page 1 of 2 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-departments-page-2.html b/documentation/_site_rebuild_20260317/tag-departments-page-2.html new file mode 100644 index 00000000..f7232839 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-departments-page-2.html @@ -0,0 +1,16 @@ + +Departments - Page 2 of 2 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-departments.html b/documentation/_site_rebuild_20260317/tag-departments.html new file mode 100644 index 00000000..06d640a3 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-departments.html @@ -0,0 +1,16 @@ + +Departments | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-forms-page-1.html b/documentation/_site_rebuild_20260317/tag-forms-page-1.html new file mode 100644 index 00000000..203188dc --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-forms-page-1.html @@ -0,0 +1,16 @@ + +Forms - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Forms - Page 1 of 1

This page groups endpoint topics for this object type.

17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-forms.html b/documentation/_site_rebuild_20260317/tag-forms.html new file mode 100644 index 00000000..365c05fb --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-forms.html @@ -0,0 +1,16 @@ + +Forms | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-goals-page-1.html b/documentation/_site_rebuild_20260317/tag-goals-page-1.html new file mode 100644 index 00000000..522abeb2 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-goals-page-1.html @@ -0,0 +1,16 @@ + +Goals - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-goals.html b/documentation/_site_rebuild_20260317/tag-goals.html new file mode 100644 index 00000000..8aae5ab7 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-goals.html @@ -0,0 +1,16 @@ + +Goals | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-invoices-page-1.html b/documentation/_site_rebuild_20260317/tag-invoices-page-1.html new file mode 100644 index 00000000..7e2f8ea8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-invoices-page-1.html @@ -0,0 +1,16 @@ + +Invoices - Page 1 of 2 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-invoices-page-2.html b/documentation/_site_rebuild_20260317/tag-invoices-page-2.html new file mode 100644 index 00000000..e2549fec --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-invoices-page-2.html @@ -0,0 +1,16 @@ + +Invoices - Page 2 of 2 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-invoices.html b/documentation/_site_rebuild_20260317/tag-invoices.html new file mode 100644 index 00000000..d88ad1c0 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-invoices.html @@ -0,0 +1,16 @@ + +Invoices | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-modules.html b/documentation/_site_rebuild_20260317/tag-modules.html new file mode 100644 index 00000000..7bd62d23 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-modules.html @@ -0,0 +1,16 @@ + +Modules | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Modules

Module integrations sorted by module name.

Module Catalog

Module

Description

Action Logs

Audit and operational logs for integration module activity.

Backup

Backup integrations and backup module orchestration.

CVR

Danish company registry (CVR) lookup and search integration.

e-conomic

Accounting and invoicing integration with e-conomic.

Entra

Microsoft Entra directory integration endpoints.

FXRatesAPI

Currency exchange-rate lookup integration.

MotorAPI

Vehicle lookup integration via MotorAPI.

Self-Serve

Self-serve lane control and machine command endpoints.

Stripe

Stripe payments, invoices, terminals, products, and customers.

VirkData

VirkData company information integration.

Wash Certificates

Wash certificate retrieval and listing integration.

WeatherAPI

Weather provider integration for current, forecast, and search.

XLVask

XLVask synchronization, usage logs, vehicles, and customers.

17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-notifications-page-1.html b/documentation/_site_rebuild_20260317/tag-notifications-page-1.html new file mode 100644 index 00000000..3f2f7340 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-notifications-page-1.html @@ -0,0 +1,16 @@ + +Notifications - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-notifications.html b/documentation/_site_rebuild_20260317/tag-notifications.html new file mode 100644 index 00000000..06780524 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-notifications.html @@ -0,0 +1,16 @@ + +Notifications | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-order-items-page-1.html b/documentation/_site_rebuild_20260317/tag-order-items-page-1.html new file mode 100644 index 00000000..3e5040c1 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-order-items-page-1.html @@ -0,0 +1,16 @@ + +Order Items - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-order-items.html b/documentation/_site_rebuild_20260317/tag-order-items.html new file mode 100644 index 00000000..20eb3673 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-order-items.html @@ -0,0 +1,16 @@ + +Order Items | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-orders-page-1.html b/documentation/_site_rebuild_20260317/tag-orders-page-1.html new file mode 100644 index 00000000..28556784 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-orders-page-1.html @@ -0,0 +1,16 @@ + +Orders - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-orders.html b/documentation/_site_rebuild_20260317/tag-orders.html new file mode 100644 index 00000000..00f01795 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-orders.html @@ -0,0 +1,16 @@ + +Orders | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-plate-scans-page-1.html b/documentation/_site_rebuild_20260317/tag-plate-scans-page-1.html new file mode 100644 index 00000000..69f9baaf --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-plate-scans-page-1.html @@ -0,0 +1,16 @@ + +Plate Scans - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-plate-scans.html b/documentation/_site_rebuild_20260317/tag-plate-scans.html new file mode 100644 index 00000000..bc29ffbd --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-plate-scans.html @@ -0,0 +1,16 @@ + +Plate Scans | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-products-page-1.html b/documentation/_site_rebuild_20260317/tag-products-page-1.html new file mode 100644 index 00000000..55cfb6b5 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-products-page-1.html @@ -0,0 +1,16 @@ + +Products - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Products - Page 1 of 1

This page groups endpoint topics for this object type.

17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-products.html b/documentation/_site_rebuild_20260317/tag-products.html new file mode 100644 index 00000000..2190783c --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-products.html @@ -0,0 +1,16 @@ + +Products | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-roles-page-1.html b/documentation/_site_rebuild_20260317/tag-roles-page-1.html new file mode 100644 index 00000000..e122bf81 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-roles-page-1.html @@ -0,0 +1,16 @@ + +Roles - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Roles - Page 1 of 1

This page groups endpoint topics for this object type.

17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-roles.html b/documentation/_site_rebuild_20260317/tag-roles.html new file mode 100644 index 00000000..338f20d9 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-roles.html @@ -0,0 +1,16 @@ + +Roles | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-search-page-1.html b/documentation/_site_rebuild_20260317/tag-search-page-1.html new file mode 100644 index 00000000..7e3ec142 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-search-page-1.html @@ -0,0 +1,16 @@ + +Search - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-search.html b/documentation/_site_rebuild_20260317/tag-search.html new file mode 100644 index 00000000..b3c05dd6 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-search.html @@ -0,0 +1,16 @@ + +Search | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-security-page-1.html b/documentation/_site_rebuild_20260317/tag-security-page-1.html new file mode 100644 index 00000000..5172c3b6 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-security-page-1.html @@ -0,0 +1,16 @@ + +Security - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-security.html b/documentation/_site_rebuild_20260317/tag-security.html new file mode 100644 index 00000000..bf8b68df --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-security.html @@ -0,0 +1,16 @@ + +Security | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-self-serve-page-1.html b/documentation/_site_rebuild_20260317/tag-self-serve-page-1.html new file mode 100644 index 00000000..265849db --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-self-serve-page-1.html @@ -0,0 +1,16 @@ + +Self-Serve - Page 1 of 2 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-self-serve-page-2.html b/documentation/_site_rebuild_20260317/tag-self-serve-page-2.html new file mode 100644 index 00000000..6989ccbe --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-self-serve-page-2.html @@ -0,0 +1,16 @@ + +Self-Serve - Page 2 of 2 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-self-serve.html b/documentation/_site_rebuild_20260317/tag-self-serve.html new file mode 100644 index 00000000..7582cd83 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-self-serve.html @@ -0,0 +1,16 @@ + +Self-Serve | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-statistics-page-1.html b/documentation/_site_rebuild_20260317/tag-statistics-page-1.html new file mode 100644 index 00000000..e05b327f --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-statistics-page-1.html @@ -0,0 +1,16 @@ + +Statistics - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-statistics.html b/documentation/_site_rebuild_20260317/tag-statistics.html new file mode 100644 index 00000000..bedb9dfd --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-statistics.html @@ -0,0 +1,16 @@ + +Statistics | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-subusers-page-1.html b/documentation/_site_rebuild_20260317/tag-subusers-page-1.html new file mode 100644 index 00000000..fecc94a3 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-subusers-page-1.html @@ -0,0 +1,16 @@ + +Subusers - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-subusers.html b/documentation/_site_rebuild_20260317/tag-subusers.html new file mode 100644 index 00000000..5a8df7e3 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-subusers.html @@ -0,0 +1,16 @@ + +Subusers | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-users-page-1.html b/documentation/_site_rebuild_20260317/tag-users-page-1.html new file mode 100644 index 00000000..b8918c46 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-users-page-1.html @@ -0,0 +1,16 @@ + +Users - Page 1 of 2 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-users-page-2.html b/documentation/_site_rebuild_20260317/tag-users-page-2.html new file mode 100644 index 00000000..aa5c08e2 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-users-page-2.html @@ -0,0 +1,16 @@ + +Users - Page 2 of 2 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-users.html b/documentation/_site_rebuild_20260317/tag-users.html new file mode 100644 index 00000000..7894393c --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-users.html @@ -0,0 +1,16 @@ + +Users | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-vehicles-page-1.html b/documentation/_site_rebuild_20260317/tag-vehicles-page-1.html new file mode 100644 index 00000000..8550e3e1 --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-vehicles-page-1.html @@ -0,0 +1,16 @@ + +Vehicles - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-vehicles.html b/documentation/_site_rebuild_20260317/tag-vehicles.html new file mode 100644 index 00000000..fcbabf3b --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-vehicles.html @@ -0,0 +1,16 @@ + +Vehicles | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-worker-page-1.html b/documentation/_site_rebuild_20260317/tag-worker-page-1.html new file mode 100644 index 00000000..a11445fc --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-worker-page-1.html @@ -0,0 +1,16 @@ + +Worker - Page 1 of 1 | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Worker - Page 1 of 1

This page groups endpoint topics for this object type.

17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/tag-worker.html b/documentation/_site_rebuild_20260317/tag-worker.html new file mode 100644 index 00000000..b506354f --- /dev/null +++ b/documentation/_site_rebuild_20260317/tag-worker.html @@ -0,0 +1,16 @@ + +Worker | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/testemailconfig.html b/documentation/_site_rebuild_20260317/testemailconfig.html new file mode 100644 index 00000000..91c96147 --- /dev/null +++ b/documentation/_site_rebuild_20260317/testemailconfig.html @@ -0,0 +1,22 @@ + +Test email config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Test email config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /email/config/test

Operation

Operation ID: testEmailConfig

Test email config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

Email configuration test completed

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigTestResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/togglevehicleaddon.html b/documentation/_site_rebuild_20260317/togglevehicleaddon.html new file mode 100644 index 00000000..eafe8ae0 --- /dev/null +++ b/documentation/_site_rebuild_20260317/togglevehicleaddon.html @@ -0,0 +1,34 @@ + +Toggle vehicle addon | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Toggle vehicle addon

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /vehicles/addons/toggle

Operation

Operation ID: toggleVehicleAddon

Enable or disable a vehicle addon for a vehicle. Permissions: - Own scope: `toggle_vehicle_addon_own` (linked to subuser node `VEHICLES_EDIT`). - Broader scope: `toggle_vehicle_addon_other`.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

no

object

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "addon_id": { + "type": "integer" + }, + "vehicle_id": { + "type": "integer" + } + }, + "required": [ + "vehicle_id", + "addon_id" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Vehicle addon toggled successfully

application/json

403

404

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updatebackupsconfig.html b/documentation/_site_rebuild_20260317/updatebackupsconfig.html new file mode 100644 index 00000000..3ea83bad --- /dev/null +++ b/documentation/_site_rebuild_20260317/updatebackupsconfig.html @@ -0,0 +1,22 @@ + +Update backups config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update backups config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /backups/config

Operation

Operation ID: updateBackupsConfig

Update backups config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

Backups configuration updated successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updatebirdconfig.html b/documentation/_site_rebuild_20260317/updatebirdconfig.html new file mode 100644 index 00000000..f35ecc51 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updatebirdconfig.html @@ -0,0 +1,22 @@ + +Update Bird config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update Bird config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /bird/config

Operation

Operation ID: updateBirdConfig

Update Bird config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

Bird configuration updated successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updatebooking.html b/documentation/_site_rebuild_20260317/updatebooking.html new file mode 100644 index 00000000..55be6730 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updatebooking.html @@ -0,0 +1,22 @@ + +Update booking | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update booking

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /bookings

Operation

Operation ID: updateBooking

Update an existing booking

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/BookingUpdate" +} +

Responses

Status

Description

Content Types

200

Booking updated successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updatecategory.html b/documentation/_site_rebuild_20260317/updatecategory.html new file mode 100644 index 00000000..65128b84 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updatecategory.html @@ -0,0 +1,22 @@ + +Update category | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update category

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /categories

Operation

Operation ID: updateCategory

Update an existing category

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/CategoryUpdate" +} +

Responses

Status

Description

Content Types

200

Category updated successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updatecollectedinvoice.html b/documentation/_site_rebuild_20260317/updatecollectedinvoice.html new file mode 100644 index 00000000..851258d0 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updatecollectedinvoice.html @@ -0,0 +1,20 @@ + +Update collected invoice | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update collected invoice

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /collected-invoices

Operation

Operation ID: updateCollectedInvoice

Update a collected invoice

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

Collected invoice updated successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updatedepartment.html b/documentation/_site_rebuild_20260317/updatedepartment.html new file mode 100644 index 00000000..e1ec3150 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updatedepartment.html @@ -0,0 +1,22 @@ + +Update department | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update department

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /departments

Operation

Operation ID: updateDepartment

Update an existing department

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/DepartmentUpdate" +} +

Responses

Status

Description

Content Types

200

Department updated successfully

application/json

400

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updatedepartmentgate.html b/documentation/_site_rebuild_20260317/updatedepartmentgate.html new file mode 100644 index 00000000..4d49c713 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updatedepartmentgate.html @@ -0,0 +1,24 @@ + +Update department gate | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update department gate

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /department/gates

Operation

Operation ID: updateDepartmentGate

Update department gate

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/DepartmentGateUpdate" +} +

Responses

Status

Description

Content Types

200

Department gate updated successfully

application/json

404

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/DepartmentGate" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updatedepartmentgoal.html b/documentation/_site_rebuild_20260317/updatedepartmentgoal.html new file mode 100644 index 00000000..9b1ee45e --- /dev/null +++ b/documentation/_site_rebuild_20260317/updatedepartmentgoal.html @@ -0,0 +1,24 @@ + +Update department goal | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update department goal

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /goals/department

Operation

Operation ID: updateDepartmentGoal

Update an existing department goal by `id`. Access control: - The creator (`created_by`) may update regardless of department membership. - Otherwise the user must satisfy the same subset rule as for read access, and any new `departments` provided must also be a subset unless the user has `superuser`.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/DepartmentGoalUpdate" +} +

Responses

Status

Description

Content Types

200

Department goal updated successfully

application/json

400

401

403

404

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/DepartmentGoal" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updatedepartmentlane.html b/documentation/_site_rebuild_20260317/updatedepartmentlane.html new file mode 100644 index 00000000..fdaeca52 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updatedepartmentlane.html @@ -0,0 +1,22 @@ + +Update department lane | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update department lane

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /department/lanes

Operation

Operation ID: updateDepartmentLane

Update an existing department lane

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/DepartmentLaneUpdate" +} +

Responses

Status

Description

Content Types

200

Department lane updated successfully

application/json

400

404

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updatedepartmentrelay.html b/documentation/_site_rebuild_20260317/updatedepartmentrelay.html new file mode 100644 index 00000000..e264f2e1 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updatedepartmentrelay.html @@ -0,0 +1,24 @@ + +Update department relay | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update department relay

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /department/relays

Operation

Operation ID: updateDepartmentRelay

Update department relay

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/DepartmentRelayUpdate" +} +

Responses

Status

Description

Content Types

200

Department relay updated successfully

application/json

404

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/DepartmentRelay" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updatedepartmentselfserveenabled.html b/documentation/_site_rebuild_20260317/updatedepartmentselfserveenabled.html new file mode 100644 index 00000000..add0275d --- /dev/null +++ b/documentation/_site_rebuild_20260317/updatedepartmentselfserveenabled.html @@ -0,0 +1,25 @@ + +Update department self-serve status | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update department self-serve status

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /departments/self-serve/enabled

Operation

Operation ID: updateDepartmentSelfServeEnabled

Enable or disable self-serve for a specific department

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Department ID

enabled

query

yes

string

Enabled status (true/false)

Responses

Status

Description

Content Types

200

Status updated successfully

application/json

404

Schema for response 200 (application/json):

+{ + "properties": { + "message": { + "type": "string" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateeconomicconfig.html b/documentation/_site_rebuild_20260317/updateeconomicconfig.html new file mode 100644 index 00000000..554e3526 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateeconomicconfig.html @@ -0,0 +1,22 @@ + +Update e-conomic config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update e-conomic config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /economic/config

Operation

Operation ID: updateEconomicConfig

Update e-conomic config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

e-conomic configuration updated successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateemailconfig.html b/documentation/_site_rebuild_20260317/updateemailconfig.html new file mode 100644 index 00000000..6fe11d35 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateemailconfig.html @@ -0,0 +1,22 @@ + +Update email config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update email config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /email/config

Operation

Operation ID: updateEmailConfig

Update email config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

Email configuration updated successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateentraconfig.html b/documentation/_site_rebuild_20260317/updateentraconfig.html new file mode 100644 index 00000000..a7e70d11 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateentraconfig.html @@ -0,0 +1,22 @@ + +Update Entra config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update Entra config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /entra/config

Operation

Operation ID: updateEntraConfig

Update Entra config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

Entra configuration updated successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updatefxratesapiconfig.html b/documentation/_site_rebuild_20260317/updatefxratesapiconfig.html new file mode 100644 index 00000000..d276adcd --- /dev/null +++ b/documentation/_site_rebuild_20260317/updatefxratesapiconfig.html @@ -0,0 +1,22 @@ + +Update FXRatesAPI config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update FXRatesAPI config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /fxratesapi/config

Operation

Operation ID: updateFxRatesApiConfig

Update FXRatesAPI config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

FXRatesAPI configuration updated successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updategatewayapiconfig.html b/documentation/_site_rebuild_20260317/updategatewayapiconfig.html new file mode 100644 index 00000000..af474b6a --- /dev/null +++ b/documentation/_site_rebuild_20260317/updategatewayapiconfig.html @@ -0,0 +1,22 @@ + +Update GatewayAPI config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update GatewayAPI config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /gatewayapi/config

Operation

Operation ID: updateGatewayApiConfig

Update GatewayAPI config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

GatewayAPI configuration updated successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updatelicenseplaterecognizerconfig.html b/documentation/_site_rebuild_20260317/updatelicenseplaterecognizerconfig.html new file mode 100644 index 00000000..337a90ca --- /dev/null +++ b/documentation/_site_rebuild_20260317/updatelicenseplaterecognizerconfig.html @@ -0,0 +1,22 @@ + +Update LicensePlateRecognizer config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update LicensePlateRecognizer config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /licenseplaterecognizer/config

Operation

Operation ID: updateLicensePlateRecognizerConfig

Update LicensePlateRecognizer config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

LicensePlateRecognizer configuration updated successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updatelimbleconfig.html b/documentation/_site_rebuild_20260317/updatelimbleconfig.html new file mode 100644 index 00000000..111d003f --- /dev/null +++ b/documentation/_site_rebuild_20260317/updatelimbleconfig.html @@ -0,0 +1,22 @@ + +Update Limble config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update Limble config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /limble/config

Operation

Operation ID: updateLimbleConfig

Update Limble config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

Limble configuration updated successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updatemotorapiconfig.html b/documentation/_site_rebuild_20260317/updatemotorapiconfig.html new file mode 100644 index 00000000..eb18452b --- /dev/null +++ b/documentation/_site_rebuild_20260317/updatemotorapiconfig.html @@ -0,0 +1,22 @@ + +Update MotorAPI config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update MotorAPI config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /motorapi/config

Operation

Operation ID: updateMotorApiConfig

Update MotorAPI config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

MotorAPI configuration updated successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateocrspaceconfig.html b/documentation/_site_rebuild_20260317/updateocrspaceconfig.html new file mode 100644 index 00000000..8c0e7852 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateocrspaceconfig.html @@ -0,0 +1,22 @@ + +Update OcrSpace config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update OcrSpace config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /ocrspace/config

Operation

Operation ID: updateOcrSpaceConfig

Update OcrSpace config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

OcrSpace configuration updated successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateopenaiconfig.html b/documentation/_site_rebuild_20260317/updateopenaiconfig.html new file mode 100644 index 00000000..30080c8a --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateopenaiconfig.html @@ -0,0 +1,22 @@ + +Update OpenAI config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update OpenAI config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /openai/config

Operation

Operation ID: updateOpenAiConfig

Update OpenAI config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

OpenAI configuration updated successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateorder.html b/documentation/_site_rebuild_20260317/updateorder.html new file mode 100644 index 00000000..7d4c05af --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateorder.html @@ -0,0 +1,22 @@ + +Update order | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update order

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /order

Operation

Operation ID: updateOrder

Update an existing order

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/OrderUpdate" +} +

Responses

Status

Description

Content Types

200

Order updated successfully

application/json

400

401

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateorderitem.html b/documentation/_site_rebuild_20260317/updateorderitem.html new file mode 100644 index 00000000..aca85da5 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateorderitem.html @@ -0,0 +1,22 @@ + +Update order item | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update order item

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /order/items

Operation

Operation ID: updateOrderItem

Update an existing order item

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/OrderItemUpdate" +} +

Responses

Status

Description

Content Types

200

Order item updated successfully

application/json

400

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateorders.html b/documentation/_site_rebuild_20260317/updateorders.html new file mode 100644 index 00000000..240d64fe --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateorders.html @@ -0,0 +1,22 @@ + +Update order (alias) | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update order (alias)

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /orders

Operation

Operation ID: updateOrders

Update an existing order

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/OrderUpdate" +} +

Responses

Status

Description

Content Types

200

Order updated successfully

application/json

400

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateplatescanner.html b/documentation/_site_rebuild_20260317/updateplatescanner.html new file mode 100644 index 00000000..99edf496 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateplatescanner.html @@ -0,0 +1,42 @@ + +Update plate scanner | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update plate scanner

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /numberplatescanners

Operation

Operation ID: updatePlateScanner

Update plate scanner

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "department_id": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "notes": { + "type": "string" + } + }, + "required": [ + "id", + "department_id", + "name", + "notes" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Plate scanner updated successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateproduct.html b/documentation/_site_rebuild_20260317/updateproduct.html new file mode 100644 index 00000000..566aec29 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateproduct.html @@ -0,0 +1,22 @@ + +Update product | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update product

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /products

Operation

Operation ID: updateProduct

Update an existing product

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/ProductUpdate" +} +

Responses

Status

Description

Content Types

200

Product updated successfully

application/json

400

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updaterecaptchaconfig.html b/documentation/_site_rebuild_20260317/updaterecaptchaconfig.html new file mode 100644 index 00000000..20810df3 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updaterecaptchaconfig.html @@ -0,0 +1,22 @@ + +Update reCAPTCHA config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update reCAPTCHA config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /reCAPTCHA/config

Operation

Operation ID: updateRecaptchaConfig

Update reCAPTCHA config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

reCAPTCHA configuration updated successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateselfservecondition.html b/documentation/_site_rebuild_20260317/updateselfservecondition.html new file mode 100644 index 00000000..7e355639 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateselfservecondition.html @@ -0,0 +1,49 @@ + +Update self-serve condition | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update self-serve condition

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /department/selfserve/conditions

Operation

Operation ID: updateSelfserveCondition

Update an existing self-serve condition.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Condition ID

Request Body

Required: no.

Content type: application/json

+{ + "properties": { + "condition_id": { + "nullable": true, + "type": "integer" + }, + "department": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "lane": { + "type": "integer" + }, + "machine_type_id": { + "nullable": true, + "type": "integer" + }, + "name": { + "type": "string" + }, + "product": { + "type": "integer" + } + }, + "type": "object" +} +

Responses

Status

Description

Content Types

200

Successfully updated condition

application/json

400

404

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/DepartmentSelfserveCondition" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateselfserveconditionrule.html b/documentation/_site_rebuild_20260317/updateselfserveconditionrule.html new file mode 100644 index 00000000..dde91999 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateselfserveconditionrule.html @@ -0,0 +1,44 @@ + +Update self-serve condition rule | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update self-serve condition rule

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /department/selfserve/condition/rules

Operation

Operation ID: updateSelfserveConditionRule

Update an existing self-serve condition rule.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Rule ID

Request Body

Required: no.

Content type: application/json

+{ + "properties": { + "condition_id": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "object_id": { + "type": "integer" + }, + "object_type": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" +} +

Responses

Status

Description

Content Types

200

Successfully updated condition rule

application/json

400

404

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/DepartmentSelfserveConditionRule" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateselfserveconfig.html b/documentation/_site_rebuild_20260317/updateselfserveconfig.html new file mode 100644 index 00000000..e741073c --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateselfserveconfig.html @@ -0,0 +1,24 @@ + +Update Self-Serve config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update Self-Serve config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /selfserve/config

Operation

Operation ID: updateSelfServeConfig

Update Self-Serve config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/SelfServeConfig" +} +

Responses

Status

Description

Content Types

200

Self-serve configuration updated successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateselfservemachinetype.html b/documentation/_site_rebuild_20260317/updateselfservemachinetype.html new file mode 100644 index 00000000..9374aaa8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateselfservemachinetype.html @@ -0,0 +1,33 @@ + +Update reusable self-serve machine type | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update reusable self-serve machine type

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /department/selfserve/machine-types

Operation

Operation ID: updateSelfserveMachineType

Update reusable self-serve machine type

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Request Body

Required: no.

Content type: application/json

+{ + "properties": { + "description": { + "nullable": true, + "type": "string" + }, + "name": { + "type": "string" + } + }, + "type": "object" +} +

Responses

Status

Description

Content Types

200

Successfully updated machine type

application/json

404

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/SelfserveMachineType" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateselfservequestion.html b/documentation/_site_rebuild_20260317/updateselfservequestion.html new file mode 100644 index 00000000..608d5c1b --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateselfservequestion.html @@ -0,0 +1,48 @@ + +Update self-serve question | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update self-serve question

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /department/selfserve/questions

Operation

Operation ID: updateSelfserveQuestion

Update an existing self-serve question.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Question ID

Request Body

Required: no.

Content type: application/json

+{ + "properties": { + "condition_id": { + "nullable": true, + "type": "integer" + }, + "department": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "lane": { + "type": "integer" + }, + "order_priority": { + "type": "integer" + }, + "product": { + "type": "integer" + }, + "question": { + "type": "string" + } + }, + "type": "object" +} +

Responses

Status

Description

Content Types

200

Successfully updated question

application/json

400

404

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/DepartmentSelfserveQuestion" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateselfservetask.html b/documentation/_site_rebuild_20260317/updateselfservetask.html new file mode 100644 index 00000000..6ef176b5 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateselfservetask.html @@ -0,0 +1,73 @@ + +Update self-serve task | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update self-serve task

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /department/selfserve/tasks

Operation

Operation ID: updateSelfserveTask

Update an existing self-serve task.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Task ID

Request Body

Required: no.

Content type: application/json

+{ + "properties": { + "buttons": { + "description": "Button IDs enabled by this task. Set to null to clear all buttons.", + "items": { + "type": "integer" + }, + "nullable": true, + "type": "array" + }, + "condition_id": { + "nullable": true, + "type": "integer" + }, + "department": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "dynamic_images_vehicle_type": { + "description": "Vehicle type selection override. Set to null to clear.", + "nullable": true, + "type": "integer" + }, + "lane": { + "type": "integer" + }, + "machine_type_id": { + "nullable": true, + "type": "integer" + }, + "order_priority": { + "type": "integer" + }, + "product": { + "type": "integer" + }, + "services": { + "description": "Services enabled by this task. Set to null to clear all services.", + "items": { + "$ref": "#/components/schemas/SelfserveLaneService" + }, + "nullable": true, + "type": "array" + }, + "task": { + "type": "string" + } + }, + "type": "object" +} +

Responses

Status

Description

Content Types

200

Successfully updated task

application/json

400

404

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/DepartmentSelfserveTask" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateselfservevehiclecondition.html b/documentation/_site_rebuild_20260317/updateselfservevehiclecondition.html new file mode 100644 index 00000000..c03d6f54 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateselfservevehiclecondition.html @@ -0,0 +1,45 @@ + +Update vehicle condition | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update vehicle condition

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /department/selfserve/vehicle/conditions

Operation

Operation ID: updateSelfserveVehicleCondition

Update an existing vehicle condition. Customers can only update conditions for their own vehicles.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

query

yes

integer

Condition ID

Request Body

Required: no.

Content type: application/json

+{ + "properties": { + "customer_id": { + "nullable": true, + "type": "integer" + }, + "department": { + "type": "integer" + }, + "lane": { + "type": "integer" + }, + "question": { + "type": "integer" + }, + "reg": { + "type": "string" + }, + "value": { + "type": "boolean" + } + }, + "type": "object" +} +

Responses

Status

Description

Content Types

200

Successfully updated vehicle condition

application/json

400

404

500

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/DepartmentSelfserveVehicleConditionMutationResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateshellyconfig.html b/documentation/_site_rebuild_20260317/updateshellyconfig.html new file mode 100644 index 00000000..fc750b95 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateshellyconfig.html @@ -0,0 +1,22 @@ + +Update Shelly config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update Shelly config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /shelly/config

Operation

Operation ID: updateShellyConfig

Update Shelly config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

Shelly configuration updated successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updatestripeconfig.html b/documentation/_site_rebuild_20260317/updatestripeconfig.html new file mode 100644 index 00000000..a4bf6653 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updatestripeconfig.html @@ -0,0 +1,22 @@ + +Update Stripe config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update Stripe config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /stripe/config

Operation

Operation ID: updateStripeConfig

Update Stripe config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

Stripe configuration updated successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updatesubusergrant.html b/documentation/_site_rebuild_20260317/updatesubusergrant.html new file mode 100644 index 00000000..b4e46f3f --- /dev/null +++ b/documentation/_site_rebuild_20260317/updatesubusergrant.html @@ -0,0 +1,29 @@ + +Update subuser grant | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update subuser grant

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PATCH /subusers/grants/{id}

Operation

Operation ID: updateSubuserGrant

Update subuser grant

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

id

path

yes

integer

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/SubuserGrantUpdateRequest" +} +

Responses

Status

Description

Content Types

200

Grant updated

application/json

400

401

404

500

Schema for response 200 (application/json):

+{ + "properties": { + "grant": { + "$ref": "#/components/schemas/SubuserGrant" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateuser.html b/documentation/_site_rebuild_20260317/updateuser.html new file mode 100644 index 00000000..237aa6c8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateuser.html @@ -0,0 +1,22 @@ + +Update user | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update user

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /users

Operation

Operation ID: updateUser

Update an existing user

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "$ref": "#/components/schemas/UserUpdate" +} +

Responses

Status

Description

Content Types

200

User updated successfully

application/json

400

401

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateusernotifications.html b/documentation/_site_rebuild_20260317/updateusernotifications.html new file mode 100644 index 00000000..44a60e99 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateusernotifications.html @@ -0,0 +1,33 @@ + +Update user notification settings | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update user notification settings

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

PUT /account/notifications

Operation

Operation ID: updateUserNotifications

Update user notification settings

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "email_notifications_enabled": { + "type": "boolean" + }, + "sms_notifications_enabled": { + "type": "boolean" + }, + "wash_certificate_email": { + "type": "string" + } + }, + "type": "object" +} +

Responses

Status

Description

Content Types

200

Success

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updatevirkdataconfig.html b/documentation/_site_rebuild_20260317/updatevirkdataconfig.html new file mode 100644 index 00000000..c34986b1 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updatevirkdataconfig.html @@ -0,0 +1,22 @@ + +Update Virkdata config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update Virkdata config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /virkdata/config

Operation

Operation ID: updateVirkdataConfig

Update Virkdata config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

Virkdata configuration updated successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateweatherapiconfig.html b/documentation/_site_rebuild_20260317/updateweatherapiconfig.html new file mode 100644 index 00000000..6c420bcc --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateweatherapiconfig.html @@ -0,0 +1,22 @@ + +Update WeatherAPI config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update WeatherAPI config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /weatherapi/config

Operation

Operation ID: updateWeatherApiConfig

Update WeatherAPI config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

WeatherAPI configuration updated successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updateworkerversion.html b/documentation/_site_rebuild_20260317/updateworkerversion.html new file mode 100644 index 00000000..b83883e1 --- /dev/null +++ b/documentation/_site_rebuild_20260317/updateworkerversion.html @@ -0,0 +1,18 @@ + +Update worker version | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update worker version

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /worker/update-version

Operation

Operation ID: updateWorkerVersion

Set the target version for the worker update

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

version

query

yes

string

Responses

Status

Description

Content Types

200

Version update target set successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/updatexlvaskconfig.html b/documentation/_site_rebuild_20260317/updatexlvaskconfig.html new file mode 100644 index 00000000..cf6603aa --- /dev/null +++ b/documentation/_site_rebuild_20260317/updatexlvaskconfig.html @@ -0,0 +1,22 @@ + +Update XLVask config | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Update XLVask config

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /xlvask/config

Operation

Operation ID: updateXlvaskConfig

Update XLVask config

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: no.

Content type: application/json

+{} +

Responses

Status

Description

Content Types

200

XLVask configuration updated successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/uploadattachment.html b/documentation/_site_rebuild_20260317/uploadattachment.html new file mode 100644 index 00000000..aa1a2fcd --- /dev/null +++ b/documentation/_site_rebuild_20260317/uploadattachment.html @@ -0,0 +1,28 @@ + +Upload attachment | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Upload attachment

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /attachments/upload

Operation

Operation ID: uploadAttachment

Upload a file attachment

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: multipart/form-data

+{ + "properties": { + "file": { + "format": "binary", + "type": "string" + } + }, + "type": "object" +} +

Responses

Status

Description

Content Types

201

Attachment uploaded successfully

application/json

400

Schema for response 201 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/uploadorderattachment.html b/documentation/_site_rebuild_20260317/uploadorderattachment.html new file mode 100644 index 00000000..dc4e921e --- /dev/null +++ b/documentation/_site_rebuild_20260317/uploadorderattachment.html @@ -0,0 +1,31 @@ + +Upload order attachment | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Upload order attachment

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /orders/attachments/upload

Operation

Operation ID: uploadOrderAttachment

Upload an attachment to an order

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: multipart/form-data

+{ + "properties": { + "file": { + "format": "binary", + "type": "string" + }, + "order_id": { + "type": "integer" + } + }, + "type": "object" +} +

Responses

Status

Description

Content Types

201

Order attachment uploaded successfully

application/json

Schema for response 201 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/uploadselfservetaskattachment.html b/documentation/_site_rebuild_20260317/uploadselfservetaskattachment.html new file mode 100644 index 00000000..62292783 --- /dev/null +++ b/documentation/_site_rebuild_20260317/uploadselfservetaskattachment.html @@ -0,0 +1,40 @@ + +Upload task attachment | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Upload task attachment

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /department/selfserve/tasks/attachments/upload

Operation

Operation ID: uploadSelfserveTaskAttachment

Upload a new attachment to a specific self-serve task using base64 encoding.

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "base64_file": { + "description": "Base64 encoded file content", + "type": "string" + }, + "file_name": { + "description": "Name of the file including extension", + "type": "string" + }, + "task_id": { + "type": "integer" + } + }, + "required": [ + "task_id", + "base64_file", + "file_name" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Attachment uploaded successfully

application/json

400

404

500

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/validatecustomernumber.html b/documentation/_site_rebuild_20260317/validatecustomernumber.html new file mode 100644 index 00000000..896e92bc --- /dev/null +++ b/documentation/_site_rebuild_20260317/validatecustomernumber.html @@ -0,0 +1,30 @@ + +Validate customer number | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Validate customer number

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /guest/validation/customer-number

Operation

Operation ID: validateCustomerNumber

Check if a customer number is valid and exists

Authentication

No authentication required.

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "customer_number": { + "type": "integer" + } + }, + "required": [ + "customer_number" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Customer number validation successful

application/json

400

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/validatepasswordresettoken.html b/documentation/_site_rebuild_20260317/validatepasswordresettoken.html new file mode 100644 index 00000000..e681c00d --- /dev/null +++ b/documentation/_site_rebuild_20260317/validatepasswordresettoken.html @@ -0,0 +1,32 @@ + +Validate a customer password reset key | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Validate a customer password reset key

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /auth/password-reset/validate

Operation

Operation ID: validatePasswordResetToken

Check if a password reset token is valid and hasn&#x27;t expired

Authentication

No authentication required.

Parameters

Name

In

Required

Type

Description

token

query

yes

string

The password reset token

Responses

Status

Description

Content Types

200

Token is valid

application/json

404

Invalid or expired token

application/json

Schema for response 200 (application/json):

+{ + "properties": { + "customer_id": { + "type": "integer" + }, + "valid": { + "type": "boolean" + } + }, + "type": "object" +} +

Schema for response 404 (application/json):

+{ + "$ref": "#/components/schemas/Error" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/validatesubusersetuptoken.html b/documentation/_site_rebuild_20260317/validatesubusersetuptoken.html new file mode 100644 index 00000000..ac1db6e8 --- /dev/null +++ b/documentation/_site_rebuild_20260317/validatesubusersetuptoken.html @@ -0,0 +1,30 @@ + +Validate setup token | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Validate setup token

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /subusers/setup

Operation

Operation ID: validateSubuserSetupToken

Validates a subuser setup token generated during registration.

Authentication

No authentication required.

Parameters

Name

In

Required

Type

Description

token

query

yes

string

One-time setup token received via SMS

Responses

Status

Description

Content Types

200

Token is valid

application/json

400

500

Schema for response 200 (application/json):

+{ + "properties": { + "message": { + "example": "Token is valid", + "type": "string" + }, + "subuser_id": { + "example": 42, + "type": "integer" + } + }, + "type": "object" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/verify2fa.html b/documentation/_site_rebuild_20260317/verify2fa.html new file mode 100644 index 00000000..0de320cc --- /dev/null +++ b/documentation/_site_rebuild_20260317/verify2fa.html @@ -0,0 +1,63 @@ + +Verify 2FA code during login | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Verify 2FA code during login

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

POST /auth/2fa/verify

Operation

Operation ID: verify2fa

Complete the login process by verifying the 2FA code

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Request Body

Required: yes.

Content type: application/json

+{ + "properties": { + "2fa_token": { + "description": "The temporary 2FA verification token", + "type": "string" + }, + "code": { + "description": "The 6-digit TOTP code", + "type": "string" + } + }, + "required": [ + "2fa_token", + "code" + ], + "type": "object" +} +

Responses

Status

Description

Content Types

200

Login successful

application/json

400

401

Schema for response 200 (application/json):

+{ + "oneOf": [ + { + "properties": { + "token": { + "description": "Bearer authentication token (for users/employees)", + "type": "string" + } + }, + "required": [ + "token" + ], + "type": "object" + }, + { + "properties": { + "session": { + "description": "Session token (for subusers)", + "type": "string" + } + }, + "required": [ + "session" + ], + "type": "object" + } + ] +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/virkdatasearch.html b/documentation/_site_rebuild_20260317/virkdatasearch.html new file mode 100644 index 00000000..971824d0 --- /dev/null +++ b/documentation/_site_rebuild_20260317/virkdatasearch.html @@ -0,0 +1,18 @@ + +Search VirkData | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Search VirkData

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/virkdata/search

Operation

Operation ID: virkdataSearch

Search for company information in VirkData

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

search

query

yes

string

Responses

Status

Description

Content Types

200

Company information retrieved successfully

application/json

Schema for response 200 (application/json):

+{} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/weatherapicurrent.html b/documentation/_site_rebuild_20260317/weatherapicurrent.html new file mode 100644 index 00000000..2b46cc99 --- /dev/null +++ b/documentation/_site_rebuild_20260317/weatherapicurrent.html @@ -0,0 +1,20 @@ + +Get current weather | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get current weather

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/weatherapi/current

Operation

Operation ID: weatherApiCurrent

Get current weather data from WeatherAPI for a location query

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

q

query

yes

string

Location query (e.g. city, postal code, or latitude,longitude)

Responses

Status

Description

Content Types

200

Current weather retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/WeatherApiObjectResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/weatherapiforecast.html b/documentation/_site_rebuild_20260317/weatherapiforecast.html new file mode 100644 index 00000000..675b1baf --- /dev/null +++ b/documentation/_site_rebuild_20260317/weatherapiforecast.html @@ -0,0 +1,20 @@ + +Get weather forecast | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Get weather forecast

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/weatherapi/forecast

Operation

Operation ID: weatherApiForecast

Get forecast weather data from WeatherAPI

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

q

query

yes

string

Location query (e.g. city, postal code, or latitude,longitude)

days

query

no

integer

Number of forecast days

Responses

Status

Description

Content Types

200

Forecast weather retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/WeatherApiObjectResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/_site_rebuild_20260317/weatherapisearch.html b/documentation/_site_rebuild_20260317/weatherapisearch.html new file mode 100644 index 00000000..f9328fb2 --- /dev/null +++ b/documentation/_site_rebuild_20260317/weatherapisearch.html @@ -0,0 +1,20 @@ + +Search weather locations | Copenhagen Truck Wash API

Copenhagen Truck Wash API Help

Search weather locations

This endpoint documentation is generated directly from openapi.yaml.

Endpoint

GET /modules/weatherapi/search

Operation

Operation ID: weatherApiSearch

Search location suggestions from WeatherAPI

Authentication

Security requirements:

Scheme

Scopes

BearerAuth

-

Parameters

Name

In

Required

Type

Description

q

query

yes

string

Search text

Responses

Status

Description

Content Types

200

Location search results retrieved successfully

application/json

Schema for response 200 (application/json):

+{ + "$ref": "#/components/schemas/WeatherApiObjectResponse" +} +
17 March 2026
\ No newline at end of file diff --git a/documentation/ctw.tree b/documentation/ctw.tree index 43c479b3..ebf53a1a 100644 --- a/documentation/ctw.tree +++ b/documentation/ctw.tree @@ -10,4 +10,599 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/generated/api-reference.toc.xml b/documentation/generated/api-reference.toc.xml new file mode 100644 index 00000000..f27dd0de --- /dev/null +++ b/documentation/generated/api-reference.toc.xml @@ -0,0 +1,592 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/generated/openapi.json b/documentation/generated/openapi.json new file mode 100644 index 00000000..2e65bb0f --- /dev/null +++ b/documentation/generated/openapi.json @@ -0,0 +1,21288 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "Copenhagen Truck Wash API", + "description": "This API provides access to the Copenhagen Truck Wash system, managing orders, bookings, \ndepartments, products, customers, and various integrations including e-conomic, Stripe, \nXLVask, and more.\n\n## Authentication\nMost endpoints require authentication using a Bearer token obtained from the `/auth/login` \nor `/auth/employee/login` endpoints.\n\n## Permissions\nMany endpoints require specific permissions that are assigned to user groups/roles.\n\n## Subusers and customer targeting\nWhen authenticated as a subuser, most customer-scoped endpoints require an explicit target\ncustomer context. Provide the header `X-Customer-Number: ` to target a\nspecific customer. If omitted, the API attempts to infer the customer from the authenticated\nuser context when possible. Classic user sessions ignore this header.\n", + "version": "1.0.0", + "contact": { + "name": "Copenhagen Truck Wash", + "email": "support@truckwash.dk" + } + }, + "servers": [ + { + "url": "https://api.truckwash.dk", + "description": "Production server (.dk)" + }, + { + "url": "https://api.truckwash.io", + "description": "Production server (.io)" + }, + { + "url": "http://localhost/api", + "description": "Local development server" + } + ], + "security": [ + { + "BearerAuth": [] + } + ], + "tags": [ + { + "name": "Authentication", + "description": "User and employee authentication endpoints" + }, + { + "name": "Security", + "description": "Account security and passkey management endpoints" + }, + { + "name": "Users", + "description": "User management and customer operations" + }, + { + "name": "Search", + "description": "System-wide search endpoints" + }, + { + "name": "Orders", + "description": "Order creation, management, and retrieval" + }, + { + "name": "Order Items", + "description": "Managing items within orders" + }, + { + "name": "Bookings", + "description": "Booking management for wash services" + }, + { + "name": "Departments", + "description": "Department and location management" + }, + { + "name": "Products", + "description": "Product catalog and pricing" + }, + { + "name": "Categories", + "description": "Product category management" + }, + { + "name": "Invoices", + "description": "Invoice generation and management" + }, + { + "name": "Payments", + "description": "Payment processing and collection" + }, + { + "name": "Vehicles", + "description": "Vehicle registration and management" + }, + { + "name": "Notifications", + "description": "System notifications and alerts" + }, + { + "name": "Statistics", + "description": "Business analytics and reporting" + }, + { + "name": "Modules", + "description": "Third-party integrations and modules" + }, + { + "name": "Attachments", + "description": "File upload and attachment management" + }, + { + "name": "Forms", + "description": "Form submissions and management" + }, + { + "name": "Worker", + "description": "System worker status and maintenance" + }, + { + "name": "Plate Scans", + "description": "License plate scanning operations" + }, + { + "name": "Config", + "description": "Module configuration management" + }, + { + "name": "Branding", + "description": "Branding options management" + }, + { + "name": "Roles", + "description": "Role and permission management" + }, + { + "name": "Self-Serve", + "description": "Self-serve lane operations and questions" + }, + { + "name": "Goals", + "description": "Department goals management" + }, + { + "name": "Subusers", + "description": "Subuser registration and setup" + }, + { + "name": "Bird", + "description": "Voice Calls via Bird" + } + ], + "paths": { + "/bird/voice/calls": { + "post": { + "tags": [ + "Bird" + ], + "summary": "Create/place a voice call via Bird", + "operationId": "birdCreateVoiceCall", + "parameters": [ + { + "in": "query", + "name": "workspaceId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Workspace identifier (falls back to module configuration if omitted)" + }, + { + "in": "query", + "name": "channelId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Channel identifier (falls back to module configuration if omitted)" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": true, + "properties": { + "to": { + "type": "string", + "description": "E.164 phone number of the callee", + "example": "+4511122233" + }, + "from": { + "type": "string", + "description": "E.164 phone number of the caller (sender)", + "example": "+4599988877" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Call created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BirdVoiceCallSingleResponse" + } + } + } + } + } + }, + "get": { + "tags": [ + "Bird" + ], + "summary": "List voice calls", + "operationId": "birdListVoiceCalls", + "parameters": [ + { + "in": "query", + "name": "workspaceId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Workspace identifier (falls back to module configuration if omitted)" + }, + { + "in": "query", + "name": "channelId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Channel identifier (falls back to module configuration if omitted)" + }, + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + }, + "required": false + } + ], + "responses": { + "200": { + "description": "A list of calls", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BirdVoiceCallListResponse" + } + } + } + } + } + } + }, + "/bird/voice/calls/{id}": { + "get": { + "tags": [ + "Bird" + ], + "summary": "Get a voice call by ID", + "operationId": "birdGetVoiceCall", + "parameters": [ + { + "in": "query", + "name": "workspaceId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Workspace identifier (falls back to module configuration if omitted)" + }, + { + "in": "query", + "name": "channelId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Channel identifier (falls back to module configuration if omitted)" + }, + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Call details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BirdVoiceCallSingleResponse" + } + } + } + } + } + } + }, + "/bird/voice/calls/{id}/hangup": { + "post": { + "tags": [ + "Bird" + ], + "summary": "Hang up a voice call by ID", + "operationId": "birdHangupVoiceCall", + "parameters": [ + { + "in": "query", + "name": "workspaceId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Workspace identifier (falls back to module configuration if omitted)" + }, + { + "in": "query", + "name": "channelId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Channel identifier (falls back to module configuration if omitted)" + }, + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Hangup requested", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BirdVoiceCallSingleResponse" + } + } + } + } + } + } + }, + "/bird/voice/calls/{id}/say": { + "post": { + "tags": [ + "Bird" + ], + "summary": "Say a message on an active voice call and hang up afterwards", + "operationId": "birdSayOnVoiceCall", + "parameters": [ + { + "in": "query", + "name": "workspaceId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Workspace identifier (falls back to module configuration if omitted)" + }, + { + "in": "query", + "name": "channelId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Channel identifier (falls back to module configuration if omitted)" + }, + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + }, + "description": "Call identifier" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "text" + ], + "properties": { + "text": { + "type": "string", + "description": "The text message to play via TTS", + "example": "The gate will open shortly." + }, + "locale": { + "type": "string", + "description": "The locale to use for the TTS voice (e.g. en-US)", + "example": "en-US" + }, + "voice": { + "type": "string", + "description": "The voice identifier to use", + "example": "male" + }, + "loop": { + "type": "integer", + "description": "Number of times to loop the message", + "example": 1 + }, + "timeout": { + "type": "integer", + "description": "Timeout in seconds for the TTS action", + "example": 1 + }, + "hangup": { + "type": "boolean", + "description": "Whether to hang up the call after the message finishes playing (defaults to true)", + "example": true + } + } + } + } + } + }, + "responses": { + "200": { + "description": "TTS action requested", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BirdVoiceCallSingleResponse" + } + } + } + } + } + } + }, + "/bird/voice/calls/test-outbound": { + "post": { + "tags": [ + "Bird" + ], + "summary": "Place a test outbound call and hang up when accepted", + "operationId": "birdTestOutboundVoiceCall", + "description": "Calls +45 42 33 11 28 and hangs up when the call reaches accepted/ongoing state.", + "parameters": [ + { + "in": "query", + "name": "workspaceId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Workspace identifier (falls back to module configuration if omitted)" + }, + { + "in": "query", + "name": "channelId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Channel identifier (falls back to module configuration if omitted)" + } + ], + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": true, + "properties": { + "from": { + "type": "string", + "description": "Caller E.164 number to use for the test call", + "example": "+4599988877" + }, + "pollIntervalSeconds": { + "type": "integer", + "minimum": 1, + "description": "Poll interval while waiting for accepted status", + "example": 2 + }, + "maxPollSeconds": { + "type": "integer", + "minimum": 5, + "description": "Max time to wait before timing out", + "example": 30 + }, + "hangupCause": { + "type": "string", + "description": "Optional hangup cause passed through to Bird" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Test call created and either hung up or timed out", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BirdTestOutboundCallResponse" + } + } + } + } + } + } + }, + "/bird/numbers": { + "get": { + "tags": [ + "Bird" + ], + "summary": "List your numbers", + "operationId": "birdListNumbers", + "parameters": [ + { + "in": "query", + "name": "workspaceId", + "required": false, + "schema": { + "type": "string" + }, + "description": "Bird Workspace identifier (optional if configured)" + }, + { + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "A list of numbers", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BirdNumberListResponse" + } + } + } + } + } + } + }, + "/bird/numbers/{id}": { + "get": { + "tags": [ + "Bird" + ], + "summary": "Get a number by ID", + "operationId": "birdGetNumber", + "parameters": [ + { + "in": "query", + "name": "workspaceId", + "required": false, + "schema": { + "type": "string" + }, + "description": "Bird Workspace identifier (optional if configured)" + }, + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Number details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BirdNumberSingleResponse" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Bird" + ], + "summary": "Delete/release a number by ID", + "operationId": "birdDeleteNumber", + "parameters": [ + { + "in": "query", + "name": "workspaceId", + "required": false, + "schema": { + "type": "string" + }, + "description": "Bird Workspace identifier (optional if configured)" + }, + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Number deletion/release accepted", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": true + } + } + } + } + } + } + }, + "/bird/voice/flash-calls": { + "post": { + "tags": [ + "Bird" + ], + "summary": "Create/place a flash call via Bird", + "operationId": "birdCreateFlashCall", + "parameters": [ + { + "in": "query", + "name": "workspaceId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Workspace identifier (falls back to module configuration if omitted)" + }, + { + "in": "query", + "name": "channelId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Channel identifier (falls back to module configuration if omitted)" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": true + } + } + } + }, + "responses": { + "200": { + "description": "Flash call created", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": true + } + } + } + } + } + }, + "get": { + "tags": [ + "Bird" + ], + "summary": "List flash calls", + "operationId": "birdListFlashCalls", + "parameters": [ + { + "in": "query", + "name": "workspaceId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Workspace identifier (falls back to module configuration if omitted)" + }, + { + "in": "query", + "name": "channelId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Channel identifier (falls back to module configuration if omitted)" + }, + { + "in": "query", + "name": "page", + "schema": { + "type": "integer" + }, + "required": false + } + ], + "responses": { + "200": { + "description": "A list of flash calls", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": true + } + } + } + } + } + } + }, + "/bird/voice/flash-calls/{id}": { + "get": { + "tags": [ + "Bird" + ], + "summary": "Get a flash call by ID", + "operationId": "birdGetFlashCall", + "parameters": [ + { + "in": "query", + "name": "workspaceId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Workspace identifier (falls back to module configuration if omitted)" + }, + { + "in": "query", + "name": "channelId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Channel identifier (falls back to module configuration if omitted)" + }, + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Flash call details", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": true + } + } + } + } + } + }, + "post": { + "tags": [ + "Bird" + ], + "summary": "Complete/end a flash call by ID", + "description": "Posts a completion/update payload to the flash call resource to finalize verification.", + "operationId": "birdEndFlashCall", + "parameters": [ + { + "in": "query", + "name": "workspaceId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Workspace identifier (falls back to module configuration if omitted)" + }, + { + "in": "query", + "name": "channelId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Channel identifier (falls back to module configuration if omitted)" + }, + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": true + } + } + } + }, + "responses": { + "200": { + "description": "Flash call completed", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": true + } + } + } + } + } + } + }, + "/bird/voice/flash-calls/end": { + "post": { + "tags": [ + "Bird" + ], + "summary": "Complete/end a flash call using from/to numbers", + "description": "Ends an ongoing flash call by specifying the originating and destination numbers.", + "operationId": "birdEndFlashCallByNumbers", + "parameters": [ + { + "in": "query", + "name": "workspaceId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Workspace identifier (falls back to module configuration if omitted)" + }, + { + "in": "query", + "name": "channelId", + "schema": { + "type": "string" + }, + "required": false, + "description": "Bird Channel identifier (falls back to module configuration if omitted)" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": true, + "properties": { + "from": { + "type": "string", + "description": "E.164 formatted caller number", + "example": "+4599988877" + }, + "to": { + "type": "string", + "description": "E.164 formatted callee number", + "example": "+4511122233" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Flash call completed (by numbers)", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": true + } + } + } + } + } + } + }, + "/subusers": { + "get": { + "tags": [ + "Subusers" + ], + "summary": "List subusers visible to the authenticated user", + "description": "Returns a paginated list of subusers (drivers) that have enabled grants tied to the\nauthenticated user's customer number. Only subusers with at least one enabled, non-deleted\ngrant for the caller's customer are returned.\n", + "operationId": "listSubusers", + "parameters": [ + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1 + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 1000 + } + }, + { + "name": "search", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "include_non_enabled", + "in": "query", + "required": false, + "description": "Include subusers that only have non-enabled grants (default false)", + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "List of visible subusers", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string", + "nullable": true + }, + "name": { + "type": "string", + "nullable": true + }, + "email": { + "type": "string", + "format": "email", + "nullable": true + }, + "phone_country_code": { + "type": "integer", + "nullable": true + }, + "phone": { + "type": "integer", + "nullable": true + }, + "created_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "updated_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "suspended_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "two_factor_enabled": { + "type": "boolean", + "description": "Indicates if 2FA is enabled for this account" + }, + "permissions": { + "type": "array", + "description": "Aggregated permission keys granted for the caller's customer", + "items": { + "type": "string" + } + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/subusers/me": { + "get": { + "tags": [ + "Subusers" + ], + "summary": "Get current subuser profile", + "description": "Returns the authenticated subuser (driver) profile and their enabled grants grouped by\n`billing_customer_number`.\n\nNotes:\n- This endpoint is available only to authenticated subuser sessions.\n- It does not require the `X-Customer-Number` header; all enabled, non-deleted grants for the\n subuser are included in the response.\n", + "operationId": "getCurrentSubuser", + "responses": { + "200": { + "description": "Current subuser details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SubuserSelf" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "post": { + "tags": [ + "Subusers" + ], + "summary": "Create a subuser registration", + "description": "Creates a subuser (driver) account using a company's CVR and a phone number. Validates the\nCVR via e-conomic, ensures the phone number is not already in use, and if SMS is enabled\nsends a setup link by SMS for the user to complete registration.\n", + "operationId": "createSubuser", + "security": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "cvr", + "phone_country_code", + "phone" + ], + "properties": { + "cvr": { + "type": "integer", + "description": "Danish CVR (8 digits)", + "example": 12345678 + }, + "phone_country_code": { + "type": "integer", + "description": "Phone country code (1–3 digits)", + "example": 45 + }, + "phone": { + "type": "integer", + "description": "Phone number (4–15 digits, no leading +)", + "example": 12345678 + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Subuser created (or pending setup) and company identified", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "cvr": { + "type": "integer", + "example": 12345678 + }, + "customer_number": { + "type": "integer", + "description": "Matched e-conomic customer number", + "example": 1000 + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/subusers/{id}": { + "get": { + "tags": [ + "Subusers" + ], + "summary": "Get a subuser by ID (visible by grant)", + "description": "Returns the subuser if the authenticated user has at least one enabled, non-deleted grant\nfor their customer number to this subuser. Otherwise returns 404.\n", + "operationId": "getSubuser", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Subuser details", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string", + "nullable": true + }, + "name": { + "type": "string", + "nullable": true + }, + "email": { + "type": "string", + "format": "email", + "nullable": true + }, + "phone_country_code": { + "type": "integer", + "nullable": true + }, + "phone": { + "type": "integer", + "nullable": true + }, + "created_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "updated_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "suspended_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "permissions": { + "type": "array", + "description": "Aggregated permission keys granted for the caller's customer", + "items": { + "type": "string" + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/subusers/setup": { + "get": { + "tags": [ + "Subusers" + ], + "summary": "Validate setup token", + "description": "Validates a subuser setup token generated during registration.", + "operationId": "validateSubuserSetupToken", + "security": [], + "parameters": [ + { + "name": "token", + "in": "query", + "required": true, + "schema": { + "type": "string" + }, + "description": "One-time setup token received via SMS" + } + ], + "responses": { + "200": { + "description": "Token is valid", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "example": "Token is valid" + }, + "subuser_id": { + "type": "integer", + "example": 42 + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "post": { + "tags": [ + "Subusers" + ], + "summary": "Complete subuser setup", + "description": "Completes subuser setup by setting a password and basic profile fields. Accepts optional\n`username` and `email`.\n", + "operationId": "completeSubuserSetup", + "security": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "token", + "password", + "name" + ], + "properties": { + "token": { + "type": "string", + "description": "One-time setup token" + }, + "password": { + "type": "string", + "format": "password", + "minLength": 8, + "description": "Must include at least one uppercase letter, one lowercase letter, and one number", + "pattern": "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\\\d).+$" + }, + "name": { + "type": "string", + "minLength": 3, + "maxLength": 255 + }, + "username": { + "type": "string", + "minLength": 3, + "maxLength": 255 + }, + "email": { + "type": "string", + "format": "email", + "minLength": 3, + "maxLength": 255 + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Setup completed", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "example": "Password set successfully" + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/subusers/auth/password": { + "post": { + "tags": [ + "Subusers" + ], + "summary": "Authenticate subuser with password", + "description": "Authenticates a subuser (driver) using a password together with one of the supported\nidentifiers: `phone_country_code` + `phone`, `subuser_id`, or `username`.\n\nOn success, returns a newly generated session token for the subuser.\n", + "operationId": "subuserPasswordAuth", + "security": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object", + "required": [ + "phone_country_code", + "phone", + "password" + ], + "properties": { + "phone_country_code": { + "type": "integer", + "description": "Phone country code (1–3 digits)", + "minimum": 1, + "maximum": 999, + "example": 45 + }, + "phone": { + "type": "integer", + "description": "Phone number (4–15 digits, no leading +)", + "minimum": 1000, + "maximum": 999999999999999, + "example": 12345678 + }, + "password": { + "type": "string", + "format": "password", + "minLength": 8, + "maxLength": 255 + } + } + }, + { + "type": "object", + "required": [ + "subuser_id", + "password" + ], + "properties": { + "subuser_id": { + "type": "integer", + "description": "Subuser ID", + "example": 42 + }, + "password": { + "type": "string", + "format": "password", + "minLength": 8, + "maxLength": 255 + } + } + }, + { + "type": "object", + "required": [ + "username", + "password" + ], + "properties": { + "username": { + "type": "string", + "minLength": 3, + "maxLength": 255, + "example": "jdoe" + }, + "password": { + "type": "string", + "format": "password", + "minLength": 8, + "maxLength": 255 + } + } + } + ] + }, + "examples": { + "withPhone": { + "summary": "Authenticate with phone", + "value": { + "phone_country_code": 45, + "phone": 12345678, + "password": "MySecureP@ssw0rd" + } + }, + "withSubuserId": { + "summary": "Authenticate with subuser_id", + "value": { + "subuser_id": 42, + "password": "MySecureP@ssw0rd" + } + }, + "withUsername": { + "summary": "Authenticate with username", + "value": { + "username": "jdoe", + "password": "MySecureP@ssw0rd" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Authentication successful", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object", + "required": [ + "session" + ], + "properties": { + "session": { + "type": "string", + "description": "Newly generated subuser session token", + "example": "2f7a8c0e-9b1d-4c6a-91a9-1a2b3c4d5e6f" + } + } + }, + { + "type": "object", + "required": [ + "2fa_required", + "2fa_token" + ], + "properties": { + "2fa_required": { + "type": "boolean", + "example": true + }, + "2fa_token": { + "type": "string", + "description": "Temporary 2FA verification token", + "example": "557a3e7b1a2b..." + } + } + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/subusers/grants": { + "get": { + "tags": [ + "Subusers" + ], + "summary": "List subuser grants", + "description": "Returns subuser grant records filtered by `customer_number` and/or `subuser_id`.", + "operationId": "listSubuserGrants", + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "customer_number", + "in": "query", + "required": false, + "schema": { + "type": "integer" + }, + "description": "e-conomic customer number to filter by" + }, + { + "name": "subuser_id", + "in": "query", + "required": false, + "schema": { + "type": "integer" + }, + "description": "Subuser ID to filter by" + } + ], + "responses": { + "200": { + "description": "Grants fetched", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "grants": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SubuserGrant" + } + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "post": { + "tags": [ + "Subusers" + ], + "summary": "Create subuser grant", + "operationId": "createSubuserGrant", + "security": [ + { + "BearerAuth": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SubuserGrantCreateRequest" + }, + "examples": { + "default": { + "value": { + "customer_number": 1000, + "subuser_id": 42, + "enabled": true, + "note": "Grant for bookings access", + "permissions": [ + "BOOKINGS_LIST", + "BOOKINGS_ADD", + "BOOKINGS_EDIT" + ] + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Grant created", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "grant": { + "$ref": "#/components/schemas/SubuserGrant" + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/subusers/grants/{id}": { + "patch": { + "tags": [ + "Subusers" + ], + "summary": "Update subuser grant", + "operationId": "updateSubuserGrant", + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SubuserGrantUpdateRequest" + }, + "examples": { + "enableOnly": { + "value": { + "enabled": true + } + }, + "updatePermissions": { + "value": { + "permissions": [ + "VEHICLES_LIST", + "SELFSERVE_ADD" + ] + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Grant updated", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "grant": { + "$ref": "#/components/schemas/SubuserGrant" + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "delete": { + "tags": [ + "Subusers" + ], + "summary": "Delete subuser grant", + "operationId": "deleteSubuserGrant", + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Grant deleted", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "example": "Grant deleted" + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/subusers/permission-nodes": { + "get": { + "tags": [ + "Subusers" + ], + "summary": "List available subuser permission nodes", + "description": "Returns grouped permission nodes available for subuser grants.", + "operationId": "listSubuserPermissionNodes", + "security": [ + { + "BearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Permission nodes fetched", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "permission_nodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PermissionNodeGroup" + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/auth/login": { + "post": { + "tags": [ + "Authentication" + ], + "summary": "Customer login", + "description": "Authenticate a customer using customer number and password", + "operationId": "customerLogin", + "security": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "customer_number", + "password", + "g_recaptcha_response" + ], + "properties": { + "customer_number": { + "type": "integer", + "description": "Customer's e-conomic customer number", + "example": 12345 + }, + "password": { + "type": "string", + "format": "password", + "description": "Customer password", + "minLength": 1 + }, + "g_recaptcha_response": { + "type": "string", + "description": "reCAPTCHA verification token" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Login successful", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object", + "required": [ + "token" + ], + "properties": { + "token": { + "type": "string", + "description": "Bearer authentication token", + "example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." + } + } + }, + { + "type": "object", + "required": [ + "2fa_required", + "2fa_token" + ], + "properties": { + "2fa_required": { + "type": "boolean", + "example": true + }, + "2fa_token": { + "type": "string", + "description": "Temporary 2FA verification token", + "example": "557a3e7b1a2b..." + } + } + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/auth/employee/login": { + "post": { + "tags": [ + "Authentication" + ], + "summary": "Employee login", + "description": "Authenticate an employee using user ID and password", + "operationId": "employeeLogin", + "security": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "user_id", + "password", + "g_recaptcha_response" + ], + "properties": { + "user_id": { + "type": "integer", + "description": "Employee user ID", + "example": 1 + }, + "password": { + "type": "string", + "format": "password", + "description": "Employee password" + }, + "g_recaptcha_response": { + "type": "string", + "description": "reCAPTCHA verification token" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Login successful", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object", + "required": [ + "token" + ], + "properties": { + "token": { + "type": "string", + "description": "Bearer authentication token" + } + } + }, + { + "type": "object", + "required": [ + "2fa_required", + "2fa_token" + ], + "properties": { + "2fa_required": { + "type": "boolean", + "example": true + }, + "2fa_token": { + "type": "string", + "description": "Temporary 2FA verification token" + } + } + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/auth/passkey/challenge": { + "post": { + "tags": [ + "Authentication" + ], + "summary": "Initiate passkey authentication challenge", + "description": "Generates a WebAuthn PublicKeyCredentialRequestOptions payload. If customer_number is provided, allowCredentials will be populated with existing passkeys for that account. Otherwise, a challenge is issued for discoverable credentials.", + "operationId": "passkeyChallenge", + "security": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "g_recaptcha_response" + ], + "properties": { + "customer_number": { + "type": "integer", + "description": "Optional customer's e-conomic customer number", + "example": 12345 + }, + "g_recaptcha_response": { + "type": "string", + "description": "reCAPTCHA verification token" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Challenge generated", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "challenge_token": { + "type": "string", + "description": "Temporary token binding the challenge to the login attempt" + }, + "publicKey": { + "type": "object", + "properties": { + "challenge": { + "type": "string", + "description": "Base64URL-encoded challenge" + }, + "rpId": { + "type": "string", + "description": "Relying party ID (truckwash.io or localhost)", + "example": "truckwash.io" + }, + "timeout": { + "type": "integer", + "description": "Timeout in milliseconds" + }, + "userVerification": { + "type": "string", + "enum": [ + "required", + "preferred", + "discouraged" + ] + }, + "allowCredentials": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "example": "public-key" + }, + "id": { + "type": "string", + "description": "Base64URL-encoded credential ID" + }, + "transports": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + } + } + } + }, + "/auth/passkey/verify": { + "post": { + "tags": [ + "Authentication" + ], + "summary": "Verify passkey authentication and start session", + "description": "Verifies the WebAuthn assertion and challenge token. Returns a session token on success.", + "operationId": "passkeyVerify", + "security": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "challenge_token", + "credential", + "g_recaptcha_response" + ], + "properties": { + "challenge_token": { + "type": "string", + "description": "The token returned by the challenge endpoint" + }, + "g_recaptcha_response": { + "type": "string", + "description": "reCAPTCHA verification token" + }, + "credential": { + "type": "object", + "description": "The WebAuthn PublicKeyCredential object (assertion)", + "required": [ + "id", + "rawId", + "type", + "response" + ], + "properties": { + "id": { + "type": "string", + "description": "The credential ID (base64url)" + }, + "rawId": { + "type": "string", + "description": "The raw credential ID (base64url)" + }, + "type": { + "type": "string", + "example": "public-key" + }, + "clientExtensionResults": { + "type": "object" + }, + "response": { + "type": "object", + "required": [ + "clientDataJSON", + "authenticatorData", + "signature" + ], + "properties": { + "clientDataJSON": { + "type": "string", + "description": "Base64URL-encoded client data" + }, + "authenticatorData": { + "type": "string", + "description": "Base64URL-encoded authenticator data" + }, + "signature": { + "type": "string", + "description": "Base64URL-encoded signature" + }, + "userHandle": { + "type": "string", + "nullable": true, + "description": "Base64URL-encoded user handle" + } + } + } + } + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Verification successful, session started", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object", + "required": [ + "token" + ], + "properties": { + "token": { + "type": "string", + "description": "Bearer token for customer" + } + } + }, + { + "type": "object", + "required": [ + "session" + ], + "properties": { + "session": { + "type": "string", + "description": "Session token for subuser" + } + } + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/auth/logout": { + "get": { + "tags": [ + "Authentication" + ], + "summary": "Logout", + "description": "Invalidate the current authentication token", + "operationId": "logout", + "responses": { + "200": { + "description": "Logout successful", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "example": "Logged out" + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/auth/session": { + "get": { + "tags": [ + "Authentication" + ], + "summary": "Get current session", + "description": "Retrieve information about the current authenticated user session", + "operationId": "getSession", + "responses": { + "200": { + "description": "Session information retrieved successfully", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/User" + }, + { + "type": "object", + "properties": { + "two_factor_enabled": { + "type": "boolean", + "description": "Indicates if 2FA is enabled for this account" + } + } + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/auth/2fa/setup": { + "post": { + "tags": [ + "Authentication" + ], + "summary": "Generate 2FA secret", + "description": "Generate a new TOTP secret for the authenticated user/subuser", + "operationId": "setup2fa", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "2FA secret generated successfully", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "secret": { + "type": "string", + "description": "The base32 encoded TOTP secret" + }, + "qr_code_url": { + "type": "string", + "description": "An otpauth URL for generating a QR code" + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/auth/2fa/enable": { + "post": { + "tags": [ + "Authentication" + ], + "summary": "Enable 2FA", + "description": "Verify a code and enable 2FA for the authenticated user/subuser", + "operationId": "enable2fa", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "description": "The 6-digit TOTP code" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "2FA enabled successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/auth/2fa/disable": { + "post": { + "tags": [ + "Authentication" + ], + "summary": "Disable 2FA", + "description": "Verify a code and disable 2FA for the authenticated user/subuser", + "operationId": "disable2fa", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "description": "The 6-digit TOTP code" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "2FA disabled successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/auth/2fa/verify": { + "post": { + "tags": [ + "Authentication" + ], + "summary": "Verify 2FA code during login", + "description": "Complete the login process by verifying the 2FA code", + "operationId": "verify2fa", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "2fa_token", + "code" + ], + "properties": { + "2fa_token": { + "type": "string", + "description": "The temporary 2FA verification token" + }, + "code": { + "type": "string", + "description": "The 6-digit TOTP code" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Login successful", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object", + "required": [ + "token" + ], + "properties": { + "token": { + "type": "string", + "description": "Bearer authentication token (for users/employees)" + } + } + }, + { + "type": "object", + "required": [ + "session" + ], + "properties": { + "session": { + "type": "string", + "description": "Session token (for subusers)" + } + } + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/auth/reCAPTCHA/public": { + "get": { + "tags": [ + "Authentication" + ], + "summary": "Get reCAPTCHA configuration", + "description": "Retrieve public reCAPTCHA configuration for login forms", + "operationId": "getRecaptchaConfig", + "security": [], + "responses": { + "200": { + "description": "reCAPTCHA configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "rate_limit": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "limit": { + "type": "integer" + }, + "remaining": { + "type": "integer" + }, + "reset": { + "type": "integer" + }, + "warning": { + "type": "string", + "nullable": true + } + } + }, + "recaptcha": { + "type": "object" + } + } + } + } + } + } + } + } + }, + "/auth/register/cvr": { + "post": { + "tags": [ + "Authentication" + ], + "summary": "Register new customer by CVR", + "description": "Register a new customer account using Danish CVR number", + "operationId": "registerCustomerByCvr", + "security": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "cvr", + "companyPhone", + "invoiceEmail", + "contactEmail", + "contactPhone", + "contactName", + "g_recaptcha_response" + ], + "properties": { + "cvr": { + "type": "string", + "description": "Danish CVR number", + "minLength": 8, + "maxLength": 20, + "example": "44794780" + }, + "companyPhone": { + "type": "integer", + "description": "Company phone number", + "minimum": 10000000, + "maximum": 9999999999, + "example": 21754690 + }, + "invoiceEmail": { + "type": "string", + "format": "email", + "description": "Email for invoices", + "minLength": 5, + "maxLength": 255, + "example": "invoice@company.dk" + }, + "contactEmail": { + "type": "string", + "format": "email", + "description": "Contact email", + "minLength": 5, + "maxLength": 255, + "example": "contact@company.dk" + }, + "contactPhone": { + "type": "integer", + "description": "Contact phone number", + "minimum": 10000000, + "maximum": 9999999999, + "example": 21754690 + }, + "contactName": { + "type": "string", + "description": "Contact person name", + "example": "Mikkel" + }, + "g_recaptcha_response": { + "type": "string", + "description": "reCAPTCHA verification token" + } + } + } + } + } + }, + "responses": { + "201": { + "description": "Customer registered successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + } + } + } + }, + "/auth/password-reset/request": { + "post": { + "tags": [ + "Authentication" + ], + "summary": "Request a customer password reset email", + "description": "Send an email with a password reset token to the customer's email address", + "operationId": "requestPasswordReset", + "security": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "customer_number", + "g_recaptcha_response" + ], + "properties": { + "customer_number": { + "type": "integer", + "description": "The customer number", + "example": 123456 + }, + "g_recaptcha_response": { + "type": "string", + "description": "reCAPTCHA verification token" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Request processed", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + } + } + } + }, + "/auth/password-reset/validate": { + "get": { + "tags": [ + "Authentication" + ], + "summary": "Validate a customer password reset key", + "description": "Check if a password reset token is valid and hasn't expired", + "operationId": "validatePasswordResetToken", + "security": [], + "parameters": [ + { + "name": "token", + "in": "query", + "required": true, + "schema": { + "type": "string" + }, + "description": "The password reset token" + } + ], + "responses": { + "200": { + "description": "Token is valid", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "valid": { + "type": "boolean" + }, + "customer_id": { + "type": "integer" + } + } + } + } + } + }, + "404": { + "description": "Invalid or expired token", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/auth/password-reset/set": { + "post": { + "tags": [ + "Authentication" + ], + "summary": "Set a customer password using a reset key", + "description": "Update the customer password using a valid reset token", + "operationId": "setPasswordUsingResetToken", + "security": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "token", + "password", + "g_recaptcha_response" + ], + "properties": { + "token": { + "type": "string", + "description": "The password reset token" + }, + "password": { + "type": "string", + "description": "The new password" + }, + "g_recaptcha_response": { + "type": "string", + "description": "reCAPTCHA verification token" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Password updated successfully", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "description": "Invalid or expired token", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/su/intimidate": { + "post": { + "tags": [ + "Authentication" + ], + "summary": "Intimidate a user", + "description": "Create an authentication token for another user (Superuser only)", + "operationId": "suIntimidate", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "user_id" + ], + "properties": { + "user_id": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "token": { + "type": "string" + } + } + } + } + } + } + } + } + }, + "/users": { + "get": { + "tags": [ + "Users" + ], + "summary": "List users", + "description": "Retrieve a paginated list of users", + "operationId": "listUsers", + "parameters": [ + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + }, + { + "$ref": "#/components/parameters/SearchParam" + } + ], + "responses": { + "200": { + "description": "Users retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "post": { + "tags": [ + "Users" + ], + "summary": "Create new user", + "description": "Create a new user account", + "operationId": "createUser", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserCreate" + } + } + } + }, + "responses": { + "201": { + "description": "User created successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "put": { + "tags": [ + "Users" + ], + "summary": "Update user", + "description": "Update an existing user", + "operationId": "updateUser", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "User updated successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/users/customer": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get customer details", + "description": "Get details about a specific customer", + "operationId": "getCustomer", + "parameters": [ + { + "name": "customer_number", + "in": "query", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Customer retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/superuser/user": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get user by ID (superuser)", + "description": "Get detailed user information by user ID", + "operationId": "getSuperuserUser", + "parameters": [ + { + "name": "user_id", + "in": "query", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "User retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/admin/customer/code": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get customer code", + "operationId": "getCustomerCode", + "parameters": [ + { + "name": "customer_number", + "in": "query", + "schema": { + "type": "integer" + } + }, + { + "name": "user_id", + "in": "query", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Users" + ], + "summary": "Add customer code", + "operationId": "addCustomerCode", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "customer_number": { + "type": "integer" + }, + "user_id": { + "type": "integer" + }, + "code": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/customer/department/default": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get customer default department", + "operationId": "getCustomerDefaultDepartment", + "parameters": [ + { + "name": "customer_number", + "in": "query", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Users" + ], + "summary": "Add customer default department", + "operationId": "addCustomerDefaultDepartment", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "department" + ], + "properties": { + "customer_number": { + "type": "integer" + }, + "department": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "delete": { + "tags": [ + "Users" + ], + "summary": "Delete customer default department", + "operationId": "deleteCustomerDefaultDepartment", + "parameters": [ + { + "name": "customer_number", + "in": "query", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/customer/pricing/fixed": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get customer fixed pricing", + "operationId": "getCustomerFixedPricing", + "parameters": [ + { + "name": "customer_number", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Users" + ], + "summary": "Add customer fixed pricing", + "operationId": "addCustomerFixedPricing", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "customer_number", + "price", + "description" + ], + "properties": { + "customer_number": { + "type": "integer" + }, + "price": { + "type": "integer" + }, + "description": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "delete": { + "tags": [ + "Users" + ], + "summary": "Delete customer fixed pricing", + "operationId": "deleteCustomerFixedPricing", + "parameters": [ + { + "name": "customer_number", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/account/notifications": { + "put": { + "tags": [ + "Users" + ], + "summary": "Update user notification settings", + "operationId": "updateUserNotifications", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "wash_certificate_email": { + "type": "string" + }, + "sms_notifications_enabled": { + "type": "boolean" + }, + "email_notifications_enabled": { + "type": "boolean" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/user/permissions": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get user permissions", + "operationId": "getUserPermissions", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/customers": { + "get": { + "tags": [ + "Users" + ], + "summary": "List customers", + "operationId": "listCustomers", + "parameters": [ + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + }, + { + "$ref": "#/components/parameters/SearchParam" + }, + { + "name": "barred", + "in": "query", + "required": false, + "description": "Optional e-conomic barred customer filter.", + "schema": { + "type": "string", + "enum": [ + "true", + "false", + "barred", + "active", + "1", + "0" + ] + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/superuser/user/discounts": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get user discounts", + "operationId": "getUserDiscounts", + "parameters": [ + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Users" + ], + "summary": "Set user discount", + "operationId": "setUserDiscount", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "discount", + "object_id", + "is_category" + ], + "properties": { + "user_id": { + "type": "integer" + }, + "discount": { + "type": "integer" + }, + "object_id": { + "type": "string" + }, + "is_category": { + "type": "boolean" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/superuser/user/keys": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get user keys", + "operationId": "getUserKeys", + "parameters": [ + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "name": "key", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Users" + ], + "summary": "Set user key", + "operationId": "setUserKey", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "key", + "value" + ], + "properties": { + "user_id": { + "type": "integer" + }, + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/superuser/user/password": { + "post": { + "tags": [ + "Users" + ], + "summary": "Set user password", + "operationId": "setUserPassword", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "password" + ], + "properties": { + "user_id": { + "type": "integer" + }, + "password": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/admin/customer/getUserId": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get user ID from customer number", + "description": "Convert e-conomic customer number to internal user ID", + "operationId": "getUserIdFromCustomerNumber", + "parameters": [ + { + "name": "customer_number", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "User ID retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "user_id": { + "type": "integer" + } + } + } + } + } + } + } + } + }, + "/admin/customer/name": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get customer name", + "description": "Get the full name of a customer", + "operationId": "getCustomerName", + "parameters": [ + { + "name": "user_id", + "in": "query", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Customer name retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + } + } + } + } + } + } + } + }, + "/orders": { + "get": { + "tags": [ + "Orders" + ], + "summary": "List orders", + "description": "Retrieve a paginated list of orders", + "operationId": "listOrders", + "parameters": [ + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + }, + { + "$ref": "#/components/parameters/SearchParam" + }, + { + "name": "show_wash_subscription", + "in": "query", + "schema": { + "type": "string", + "enum": [ + true, + false + ] + } + } + ], + "responses": { + "200": { + "description": "Orders retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Order" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + } + }, + "post": { + "tags": [ + "Orders" + ], + "summary": "Create new order", + "description": "Create a new wash order", + "operationId": "createOrder", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrderCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Order created successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "delete": { + "tags": [ + "Orders" + ], + "summary": "Delete order", + "description": "Delete an existing order", + "operationId": "deleteOrder", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Order deleted successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "put": { + "tags": [ + "Orders" + ], + "summary": "Update order (alias)", + "description": "Update an existing order", + "operationId": "updateOrders", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrderUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Order updated successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + } + } + } + }, + "/order": { + "get": { + "tags": [ + "Orders" + ], + "summary": "Get order details", + "description": "Get detailed information about a specific order", + "operationId": "getOrder", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Order retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + } + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "put": { + "tags": [ + "Orders" + ], + "summary": "Update order", + "description": "Update an existing order", + "operationId": "updateOrder", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrderUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Order updated successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/user/orders": { + "get": { + "tags": [ + "Orders" + ], + "summary": "Get current user's orders", + "description": "Retrieve orders for the authenticated user", + "operationId": "getUserOrders", + "parameters": [ + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + } + ], + "responses": { + "200": { + "description": "Orders retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Order" + } + } + } + } + } + } + } + }, + "/user/order": { + "get": { + "tags": [ + "Orders" + ], + "summary": "Get user's specific order", + "description": "Get details of a specific order for the authenticated user", + "operationId": "getUserOrder", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Order retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + } + } + } + } + }, + "/orders/mark_as_completed": { + "post": { + "tags": [ + "Orders" + ], + "summary": "Mark order as completed", + "description": "Mark an order as completed", + "operationId": "markOrderCompleted", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Order marked as completed successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + } + } + } + }, + "/order/wash-certificate": { + "post": { + "tags": [ + "Orders" + ], + "summary": "Generate wash certificate", + "description": "Generate a wash certificate for an order", + "operationId": "generateWashCertificate", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "order_id": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Wash certificate generated successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + } + } + } + }, + "/order/items": { + "get": { + "tags": [ + "Order Items" + ], + "summary": "List order items", + "description": "Get all items for a specific order", + "operationId": "listOrderItems", + "parameters": [ + { + "name": "order_id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Order items retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OrderItem" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "Order Items" + ], + "summary": "Add item to order", + "description": "Add a new item to an existing order", + "operationId": "addOrderItem", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrderItemCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Order item added successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + } + } + }, + "put": { + "tags": [ + "Order Items" + ], + "summary": "Update order item", + "description": "Update an existing order item", + "operationId": "updateOrderItem", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrderItemUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Order item updated successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + } + } + }, + "delete": { + "tags": [ + "Order Items" + ], + "summary": "Delete order item", + "description": "Remove an item from an order", + "operationId": "deleteOrderItem", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Order item deleted successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/departments": { + "get": { + "tags": [ + "Departments" + ], + "summary": "List departments", + "description": "Retrieve a list of all visible departments", + "operationId": "listDepartments", + "parameters": [ + { + "name": "id", + "in": "query", + "schema": { + "type": "integer" + }, + "description": "Filter by specific department ID" + }, + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + }, + { + "$ref": "#/components/parameters/SearchParam" + } + ], + "responses": { + "200": { + "description": "Departments retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Department" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "post": { + "tags": [ + "Departments" + ], + "summary": "Create department", + "description": "Create a new department", + "operationId": "createDepartment", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Department created successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + } + } + }, + "put": { + "tags": [ + "Departments" + ], + "summary": "Update department", + "description": "Update an existing department", + "operationId": "updateDepartment", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Department updated successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + } + } + } + }, + "/departments/categories": { + "get": { + "tags": [ + "Departments" + ], + "summary": "Get department categories", + "description": "Get product categories available in a department", + "operationId": "getDepartmentCategories", + "parameters": [ + { + "name": "department_id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Department categories retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Departments" + ], + "summary": "Add category to department", + "description": "Associate a product category with a department", + "operationId": "addDepartmentCategory", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "department_id": { + "type": "integer" + }, + "category_id": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "201": { + "description": "Category added to department successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "delete": { + "tags": [ + "Departments" + ], + "summary": "Remove category from department", + "operationId": "removeDepartmentCategory", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/departments/self-serve/enabled": { + "get": { + "tags": [ + "Departments" + ], + "summary": "Get department self-serve status", + "description": "Check if self-serve is enabled for a specific department", + "operationId": "getDepartmentSelfServeEnabled", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "description": "Department ID", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Successfully retrieved status", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + } + } + } + } + } + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "put": { + "tags": [ + "Departments" + ], + "summary": "Update department self-serve status", + "description": "Enable or disable self-serve for a specific department", + "operationId": "updateDepartmentSelfServeEnabled", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "description": "Department ID", + "schema": { + "type": "integer" + } + }, + { + "name": "enabled", + "in": "query", + "required": true, + "description": "Enabled status (true/false)", + "schema": { + "type": "string", + "enum": [ + "true", + "false" + ] + } + } + ], + "responses": { + "200": { + "description": "Status updated successfully", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + } + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/departments/order/recommended": { + "get": { + "tags": [ + "Departments" + ], + "summary": "Get recommended order for department", + "operationId": "getDepartmentRecommendedOrder", + "parameters": [ + { + "name": "department_id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/department/lanes": { + "get": { + "tags": [ + "Departments" + ], + "summary": "List department lanes", + "description": "Retrieve a list of all department lanes", + "operationId": "listDepartmentLanes", + "parameters": [ + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + }, + { + "$ref": "#/components/parameters/SearchParam" + } + ], + "responses": { + "200": { + "description": "Department lanes retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DepartmentLane" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "post": { + "tags": [ + "Departments" + ], + "summary": "Create department lane", + "description": "Create a new department lane", + "operationId": "createDepartmentLane", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentLaneCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Department lane created successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + } + } + }, + "put": { + "tags": [ + "Departments" + ], + "summary": "Update department lane", + "description": "Update an existing department lane", + "operationId": "updateDepartmentLane", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentLaneUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Department lane updated successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/department/gates": { + "get": { + "tags": [ + "Departments" + ], + "summary": "List department gates", + "description": "Retrieve department gates, optionally filtered by id", + "operationId": "listDepartmentGates", + "parameters": [ + { + "name": "id", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1 + } + }, + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + }, + { + "$ref": "#/components/parameters/SearchParam" + } + ], + "responses": { + "200": { + "description": "Department gates retrieved successfully", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/DepartmentGate" + }, + { + "type": "array", + "items": { + "$ref": "#/components/schemas/DepartmentGate" + } + } + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "post": { + "tags": [ + "Departments" + ], + "summary": "Create department gate", + "operationId": "createDepartmentGate", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentGateCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Department gate created successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentGate" + } + } + } + } + } + }, + "put": { + "tags": [ + "Departments" + ], + "summary": "Update department gate", + "operationId": "updateDepartmentGate", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentGateUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Department gate updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentGate" + } + } + } + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "delete": { + "tags": [ + "Departments" + ], + "summary": "Delete department gate", + "operationId": "deleteDepartmentGate", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "Department gate deleted", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/department/relays": { + "get": { + "tags": [ + "Departments" + ], + "summary": "List department relays", + "description": "Retrieve department relays, optionally filtered by id", + "operationId": "listDepartmentRelays", + "parameters": [ + { + "name": "id", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1 + } + }, + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + }, + { + "$ref": "#/components/parameters/SearchParam" + } + ], + "responses": { + "200": { + "description": "Department relays retrieved successfully", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/DepartmentRelay" + }, + { + "type": "array", + "items": { + "$ref": "#/components/schemas/DepartmentRelay" + } + } + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + }, + "post": { + "tags": [ + "Departments" + ], + "summary": "Create department relay", + "operationId": "createDepartmentRelay", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentRelayCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Department relay created successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentRelay" + } + } + } + } + } + }, + "put": { + "tags": [ + "Departments" + ], + "summary": "Update department relay", + "operationId": "updateDepartmentRelay", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentRelayUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Department relay updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentRelay" + } + } + } + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "delete": { + "tags": [ + "Departments" + ], + "summary": "Delete department relay", + "operationId": "deleteDepartmentRelay", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "Department relay deleted", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/department/lanes/dynamic-image": { + "get": { + "tags": [ + "Departments" + ], + "summary": "Generate dynamic image for a department lane", + "description": "Returns a composed machine UI image for the specified department lane.\nYou can optionally highlight button indices, set the current step indicator, and toggle only-current-step mode.\n", + "operationId": "getDepartmentLaneDynamicImage", + "parameters": [ + { + "name": "department", + "in": "query", + "required": true, + "description": "Department ID", + "schema": { + "type": "integer", + "minimum": 1 + } + }, + { + "name": "lane", + "in": "query", + "required": true, + "description": "Lane ID", + "schema": { + "type": "integer", + "minimum": 1 + } + }, + { + "name": "buttons", + "in": "query", + "required": false, + "description": "Highlighted button IDs (0-indexed). Accepts CSV, JSON array, or repeated query params.", + "schema": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "integer" + } + } + ] + } + }, + { + "name": "current_step", + "in": "query", + "required": false, + "description": "Current step indicator (non-negative integer)", + "schema": { + "type": "integer", + "minimum": 0 + } + }, + { + "name": "only_current_step", + "in": "query", + "required": false, + "description": "If true, only draw the current step highlight", + "schema": { + "type": "boolean" + } + }, + { + "name": "vehicle_type", + "in": "query", + "required": false, + "description": "Vehicle type selection override (nullable non-negative integer)", + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "responses": { + "200": { + "description": "Dynamic image rendered successfully", + "content": { + "image/png": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/guest/validation/customer-number": { + "post": { + "tags": [ + "Users" + ], + "summary": "Validate customer number", + "description": "Check if a customer number is valid and exists", + "operationId": "validateCustomerNumber", + "security": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "customer_number" + ], + "properties": { + "customer_number": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Customer number validation successful", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + } + } + } + }, + "/guest/departments": { + "get": { + "tags": [ + "Departments" + ], + "summary": "List public departments", + "description": "Get list of departments without authentication", + "operationId": "listGuestDepartments", + "security": [], + "parameters": [ + { + "name": "include_lanes", + "in": "query", + "description": "Whether to include lane status and self-serve information", + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "Departments retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DepartmentGuest" + } + } + } + } + } + } + } + }, + "/department/selfserve/machine-types": { + "get": { + "tags": [ + "Self-Serve" + ], + "summary": "List reusable self-serve machine types", + "operationId": "listSelfserveMachineTypes", + "parameters": [ + { + "name": "id", + "in": "query", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + }, + { + "$ref": "#/components/parameters/SearchParam" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved machine types", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/SelfserveMachineType" + }, + { + "type": "array", + "items": { + "$ref": "#/components/schemas/SelfserveMachineType" + } + } + ] + } + } + } + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "post": { + "tags": [ + "Self-Serve" + ], + "summary": "Add reusable self-serve machine type", + "operationId": "addSelfserveMachineType", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string", + "nullable": true + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully added machine type", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SelfserveMachineType" + } + } + } + } + } + }, + "put": { + "tags": [ + "Self-Serve" + ], + "summary": "Update reusable self-serve machine type", + "operationId": "updateSelfserveMachineType", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string", + "nullable": true + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated machine type", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SelfserveMachineType" + } + } + } + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "delete": { + "tags": [ + "Self-Serve" + ], + "summary": "Delete reusable self-serve machine type", + "operationId": "deleteSelfserveMachineType", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Successfully deleted machine type", + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Machine type deleted" + } + } + } + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/department/selfserve/questions": { + "get": { + "tags": [ + "Self-Serve" + ], + "summary": "List self-serve questions", + "description": "Retrieve a list of self-serve questions for a department, lane, or product.", + "operationId": "listSelfserveQuestions", + "parameters": [ + { + "name": "id", + "in": "query", + "description": "Filter by question ID", + "schema": { + "type": "integer" + } + }, + { + "name": "department", + "in": "query", + "description": "Filter by department ID", + "schema": { + "type": "integer" + } + }, + { + "name": "lane", + "in": "query", + "description": "Filter by lane ID", + "schema": { + "type": "integer" + } + }, + { + "name": "product", + "in": "query", + "description": "Filter by product ID", + "schema": { + "type": "integer" + } + }, + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + }, + { + "$ref": "#/components/parameters/SearchParam" + }, + { + "$ref": "#/components/parameters/FiltersParam" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved questions", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DepartmentSelfserveQuestion" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "post": { + "tags": [ + "Self-Serve" + ], + "summary": "Add self-serve question", + "description": "Add a new self-serve question. Questions are typically shared across departments and lanes by omitting department, lane, and product, which default to 0.", + "operationId": "addSelfserveQuestion", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "question", + "description" + ], + "properties": { + "department": { + "type": "integer", + "default": 0 + }, + "lane": { + "type": "integer", + "default": 0 + }, + "product": { + "type": "integer", + "default": 0 + }, + "question": { + "type": "string" + }, + "description": { + "type": "string" + }, + "condition_id": { + "type": "integer", + "nullable": true + }, + "order_priority": { + "type": "integer", + "default": 0 + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully added question", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentSelfserveQuestion" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "put": { + "tags": [ + "Self-Serve" + ], + "summary": "Update self-serve question", + "description": "Update an existing self-serve question.", + "operationId": "updateSelfserveQuestion", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "description": "Question ID", + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "department": { + "type": "integer" + }, + "lane": { + "type": "integer" + }, + "product": { + "type": "integer" + }, + "question": { + "type": "string" + }, + "description": { + "type": "string" + }, + "condition_id": { + "type": "integer", + "nullable": true + }, + "order_priority": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated question", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentSelfserveQuestion" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "delete": { + "tags": [ + "Self-Serve" + ], + "summary": "Delete self-serve question", + "description": "Delete a self-serve question by ID.", + "operationId": "deleteSelfserveQuestion", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "description": "Question ID", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Successfully deleted question", + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Question deleted" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/department/selfserve/conditions": { + "get": { + "tags": [ + "Self-Serve" + ], + "summary": "List self-serve conditions", + "description": "Retrieve a list of self-serve conditions for a department, lane, or product.", + "operationId": "listSelfserveConditions", + "parameters": [ + { + "name": "id", + "in": "query", + "description": "Filter by condition ID", + "schema": { + "type": "integer" + } + }, + { + "name": "department", + "in": "query", + "description": "Filter by department ID", + "schema": { + "type": "integer" + } + }, + { + "name": "lane", + "in": "query", + "description": "Filter by lane ID", + "schema": { + "type": "integer" + } + }, + { + "name": "product", + "in": "query", + "description": "Filter by product ID", + "schema": { + "type": "integer" + } + }, + { + "name": "condition_id", + "in": "query", + "description": "Filter by condition ID", + "schema": { + "type": "integer" + } + }, + { + "name": "machine_type_id", + "in": "query", + "description": "Filter by reusable machine type ID", + "schema": { + "type": "integer" + } + }, + { + "name": "machine_type_id", + "in": "query", + "description": "Filter by reusable machine type ID", + "schema": { + "type": "integer" + } + }, + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + }, + { + "$ref": "#/components/parameters/SearchParam" + }, + { + "$ref": "#/components/parameters/FiltersParam" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved conditions", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DepartmentSelfserveCondition" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "post": { + "tags": [ + "Self-Serve" + ], + "summary": "Add self-serve condition", + "description": "Add a new self-serve condition. Either provide a reusable machine_type_id or a legacy department/lane/product scope.", + "operationId": "addSelfserveCondition", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "name", + "description" + ], + "properties": { + "department": { + "type": "integer", + "default": 0 + }, + "lane": { + "type": "integer", + "default": 0 + }, + "product": { + "type": "integer", + "default": 0 + }, + "machine_type_id": { + "type": "integer", + "nullable": true + }, + "condition_id": { + "type": "integer", + "nullable": true + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully added condition", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentSelfserveCondition" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "put": { + "tags": [ + "Self-Serve" + ], + "summary": "Update self-serve condition", + "description": "Update an existing self-serve condition.", + "operationId": "updateSelfserveCondition", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "description": "Condition ID", + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "department": { + "type": "integer" + }, + "lane": { + "type": "integer" + }, + "product": { + "type": "integer" + }, + "machine_type_id": { + "type": "integer", + "nullable": true + }, + "condition_id": { + "type": "integer", + "nullable": true + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated condition", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentSelfserveCondition" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "delete": { + "tags": [ + "Self-Serve" + ], + "summary": "Delete self-serve condition", + "description": "Delete a self-serve condition.", + "operationId": "deleteSelfserveCondition", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "description": "Condition ID", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Successfully deleted condition", + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Condition deleted" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/department/selfserve/condition/rules": { + "get": { + "tags": [ + "Self-Serve" + ], + "summary": "List self-serve condition rules", + "description": "Retrieve a list of self-serve condition rules.", + "operationId": "listSelfserveConditionRules", + "parameters": [ + { + "name": "id", + "in": "query", + "description": "Filter by rule ID", + "schema": { + "type": "integer" + } + }, + { + "name": "condition_id", + "in": "query", + "description": "Filter by condition ID", + "schema": { + "type": "integer" + } + }, + { + "name": "type", + "in": "query", + "description": "Filter by rule type", + "schema": { + "type": "string" + } + }, + { + "name": "object_type", + "in": "query", + "description": "Filter by object type", + "schema": { + "type": "string" + } + }, + { + "name": "object_id", + "in": "query", + "description": "Filter by object ID", + "schema": { + "type": "integer" + } + }, + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + }, + { + "$ref": "#/components/parameters/SearchParam" + }, + { + "$ref": "#/components/parameters/FiltersParam" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved condition rules", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DepartmentSelfserveConditionRule" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "post": { + "tags": [ + "Self-Serve" + ], + "summary": "Add self-serve condition rule", + "description": "Add a new self-serve condition rule.", + "operationId": "addSelfserveConditionRule", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "condition_id", + "type", + "object_type", + "object_id", + "name", + "description" + ], + "properties": { + "condition_id": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "object_type": { + "type": "string" + }, + "object_id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully added condition rule", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentSelfserveConditionRule" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "put": { + "tags": [ + "Self-Serve" + ], + "summary": "Update self-serve condition rule", + "description": "Update an existing self-serve condition rule.", + "operationId": "updateSelfserveConditionRule", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "description": "Rule ID", + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "condition_id": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "object_type": { + "type": "string" + }, + "object_id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated condition rule", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentSelfserveConditionRule" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "delete": { + "tags": [ + "Self-Serve" + ], + "summary": "Delete self-serve condition rule", + "description": "Delete a self-serve condition rule.", + "operationId": "deleteSelfserveConditionRule", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "description": "Rule ID", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Successfully deleted condition rule", + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Rule deleted" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/department/selfserve/vehicle/conditions": { + "get": { + "tags": [ + "Self-Serve" + ], + "summary": "List vehicle conditions", + "description": "Retrieve a list of vehicle conditions for a department, lane, reg, or question. Customers will only see their own vehicle conditions.", + "operationId": "listSelfserveVehicleConditions", + "parameters": [ + { + "name": "id", + "in": "query", + "description": "Filter by condition ID", + "schema": { + "type": "integer" + } + }, + { + "name": "department", + "in": "query", + "description": "Filter by department ID", + "schema": { + "type": "integer" + } + }, + { + "name": "lane", + "in": "query", + "description": "Filter by lane ID", + "schema": { + "type": "integer" + } + }, + { + "name": "reg", + "in": "query", + "description": "Filter by vehicle registration number", + "schema": { + "type": "string" + } + }, + { + "name": "question", + "in": "query", + "description": "Filter by question ID", + "schema": { + "type": "integer" + } + }, + { + "name": "customer_id", + "in": "query", + "description": "Filter by customer ID", + "schema": { + "type": "integer" + } + }, + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + }, + { + "$ref": "#/components/parameters/SearchParam" + }, + { + "$ref": "#/components/parameters/FiltersParam" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved vehicle conditions", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DepartmentSelfserveVehicleCondition" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "post": { + "tags": [ + "Self-Serve" + ], + "summary": "Add vehicle condition", + "description": "Add a new vehicle condition (answer to a question). Customers can only add conditions for their own vehicles.", + "operationId": "addSelfserveVehicleCondition", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "department", + "lane", + "reg", + "question" + ], + "properties": { + "department": { + "type": "integer" + }, + "lane": { + "type": "integer" + }, + "reg": { + "type": "string" + }, + "question": { + "type": "integer" + }, + "value": { + "type": "boolean" + }, + "customer_id": { + "type": "integer", + "nullable": true + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully added vehicle condition", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentSelfserveVehicleConditionMutationResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "put": { + "tags": [ + "Self-Serve" + ], + "summary": "Update vehicle condition", + "description": "Update an existing vehicle condition. Customers can only update conditions for their own vehicles.", + "operationId": "updateSelfserveVehicleCondition", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "description": "Condition ID", + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "department": { + "type": "integer" + }, + "lane": { + "type": "integer" + }, + "reg": { + "type": "string" + }, + "question": { + "type": "integer" + }, + "value": { + "type": "boolean" + }, + "customer_id": { + "type": "integer", + "nullable": true + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated vehicle condition", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentSelfserveVehicleConditionMutationResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "delete": { + "tags": [ + "Self-Serve" + ], + "summary": "Delete vehicle condition", + "description": "Delete a vehicle condition. Customers can only delete conditions for their own vehicles.", + "operationId": "deleteSelfserveVehicleCondition", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "description": "Condition ID", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Successfully deleted vehicle condition", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "example": "Condition deleted" + }, + "selfserve": { + "allOf": [ + { + "$ref": "#/components/schemas/SelfserveWashSummary" + } + ], + "nullable": true + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/department/selfserve/vehicle/allowed": { + "get": { + "tags": [ + "Self-Serve" + ], + "summary": "Check whether self-serve is allowed for a vehicle on a lane", + "operationId": "getSelfserveVehicleAllowed", + "parameters": [ + { + "name": "lane_id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "name": "reg", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Successfully evaluated self-serve eligibility", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SelfserveVehicleAllowedResponse" + } + } + } + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/department/selfserve/washes/summary": { + "get": { + "tags": [ + "Self-Serve" + ], + "summary": "Get self-serve wash summary", + "operationId": "getSelfserveWashSummary", + "parameters": [ + { + "name": "session_id", + "in": "query", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "lane_id", + "in": "query", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "reg", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Successfully retrieved self-serve wash summary", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SelfserveWashSummary" + } + } + } + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/department/selfserve/tasks": { + "get": { + "tags": [ + "Self-Serve" + ], + "summary": "List self-serve tasks", + "description": "Retrieve a list of self-serve tasks for a department, lane, product, or condition_id.", + "operationId": "listSelfserveTasks", + "parameters": [ + { + "name": "id", + "in": "query", + "description": "Filter by task ID", + "schema": { + "type": "integer" + } + }, + { + "name": "department", + "in": "query", + "description": "Filter by department ID", + "schema": { + "type": "integer" + } + }, + { + "name": "lane", + "in": "query", + "description": "Filter by lane ID", + "schema": { + "type": "integer" + } + }, + { + "name": "product", + "in": "query", + "description": "Filter by product ID", + "schema": { + "type": "integer" + } + }, + { + "name": "condition_id", + "in": "query", + "description": "Filter by condition ID", + "schema": { + "type": "integer" + } + }, + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + }, + { + "$ref": "#/components/parameters/SearchParam" + }, + { + "$ref": "#/components/parameters/FiltersParam" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved tasks", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DepartmentSelfserveTask" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "post": { + "tags": [ + "Self-Serve" + ], + "summary": "Add self-serve task", + "description": "Add a new self-serve task. Either provide a reusable machine_type_id or a legacy department/lane/product scope.", + "operationId": "addSelfserveTask", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "task", + "description" + ], + "properties": { + "department": { + "type": "integer", + "default": 0 + }, + "lane": { + "type": "integer", + "default": 0 + }, + "product": { + "type": "integer", + "default": 0 + }, + "machine_type_id": { + "type": "integer", + "nullable": true + }, + "condition_id": { + "type": "integer", + "nullable": true + }, + "task": { + "type": "string" + }, + "description": { + "type": "string" + }, + "order_priority": { + "type": "integer", + "default": 0 + }, + "services": { + "type": "array", + "description": "Optional services enabled by this task. Items must be valid service enum names.", + "items": { + "$ref": "#/components/schemas/SelfserveLaneService" + } + }, + "buttons": { + "type": "array", + "description": "Optional dynamic image button IDs enabled by this task.", + "items": { + "type": "integer" + }, + "default": [] + }, + "dynamic_images_vehicle_type": { + "type": "integer", + "nullable": true, + "description": "Optional vehicle type selection override for the machine UI. Integer >= 0 or null." + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully added task", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentSelfserveTask" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "put": { + "tags": [ + "Self-Serve" + ], + "summary": "Update self-serve task", + "description": "Update an existing self-serve task.", + "operationId": "updateSelfserveTask", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "description": "Task ID", + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "department": { + "type": "integer" + }, + "lane": { + "type": "integer" + }, + "product": { + "type": "integer" + }, + "machine_type_id": { + "type": "integer", + "nullable": true + }, + "condition_id": { + "type": "integer", + "nullable": true + }, + "task": { + "type": "string" + }, + "description": { + "type": "string" + }, + "order_priority": { + "type": "integer" + }, + "services": { + "type": "array", + "nullable": true, + "description": "Services enabled by this task. Set to null to clear all services.", + "items": { + "$ref": "#/components/schemas/SelfserveLaneService" + } + }, + "buttons": { + "type": "array", + "nullable": true, + "description": "Button IDs enabled by this task. Set to null to clear all buttons.", + "items": { + "type": "integer" + } + }, + "dynamic_images_vehicle_type": { + "type": "integer", + "nullable": true, + "description": "Vehicle type selection override. Set to null to clear." + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Successfully updated task", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentSelfserveTask" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "delete": { + "tags": [ + "Self-Serve" + ], + "summary": "Delete self-serve task", + "description": "Delete a self-serve task by ID.", + "operationId": "deleteSelfserveTask", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "description": "Task ID", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Successfully deleted task", + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Task deleted" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/department/selfserve/tasks/attachments": { + "get": { + "tags": [ + "Self-Serve" + ], + "summary": "List task attachments", + "description": "Retrieve a list of attachments for a specific self-serve task.", + "operationId": "listSelfserveTaskAttachments", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "description": "Task ID", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Successfully retrieved task attachments", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "delete": { + "tags": [ + "Self-Serve" + ], + "summary": "Delete task attachment", + "description": "Remove an attachment from a specific self-serve task.", + "operationId": "deleteSelfserveTaskAttachment", + "parameters": [ + { + "name": "task_id", + "in": "query", + "required": true, + "description": "Task ID", + "schema": { + "type": "integer" + } + }, + { + "name": "attachment_id", + "in": "query", + "required": true, + "description": "Attachment ID", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Attachment deleted successfully", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "example": "Attachment deleted successfully" + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/department/selfserve/tasks/attachments/upload": { + "post": { + "tags": [ + "Self-Serve" + ], + "summary": "Upload task attachment", + "description": "Upload a new attachment to a specific self-serve task using base64 encoding.", + "operationId": "uploadSelfserveTaskAttachment", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "task_id", + "base64_file", + "file_name" + ], + "properties": { + "task_id": { + "type": "integer" + }, + "base64_file": { + "type": "string", + "description": "Base64 encoded file content" + }, + "file_name": { + "type": "string", + "description": "Name of the file including extension" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Attachment uploaded successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/department/selfserve/tasks/attachments/download": { + "get": { + "tags": [ + "Self-Serve" + ], + "summary": "Download task attachment", + "description": "Generate a download link for a specific self-serve task attachment.", + "operationId": "downloadSelfserveTaskAttachment", + "parameters": [ + { + "name": "task_id", + "in": "query", + "required": true, + "description": "Task ID", + "schema": { + "type": "integer" + } + }, + { + "name": "attachment_id", + "in": "query", + "required": true, + "description": "Attachment ID", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Successfully generated download link", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "download_link": { + "type": "string", + "format": "uri" + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/products": { + "get": { + "tags": [ + "Products" + ], + "summary": "List products", + "description": "Retrieve a list of products with optional filters for customer pricing and department", + "operationId": "listProducts", + "parameters": [ + { + "name": "customer_id", + "in": "query", + "schema": { + "type": "integer" + }, + "description": "Customer ID for custom pricing" + }, + { + "name": "department_id", + "in": "query", + "schema": { + "type": "integer" + }, + "description": "Department ID for department-specific pricing" + }, + { + "name": "category", + "in": "query", + "schema": { + "type": "integer" + }, + "description": "Filter by category ID" + }, + { + "name": "id", + "in": "query", + "schema": { + "type": "integer" + }, + "description": "Get specific product by ID" + }, + { + "name": "final_price", + "in": "query", + "schema": { + "type": "boolean" + }, + "description": "Whether to return final prices including discounts" + }, + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + } + ], + "responses": { + "200": { + "description": "Products retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Product" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "Products" + ], + "summary": "Create product", + "description": "Create a new product", + "operationId": "createProduct", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProductCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Product created successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + } + } + }, + "put": { + "tags": [ + "Products" + ], + "summary": "Update product", + "description": "Update an existing product", + "operationId": "updateProduct", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProductUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Product updated successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + } + } + } + }, + "/categories": { + "get": { + "tags": [ + "Categories" + ], + "summary": "List categories", + "description": "Retrieve a list of product categories", + "operationId": "listCategories", + "parameters": [ + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + } + ], + "responses": { + "200": { + "description": "Categories retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Category" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "Categories" + ], + "summary": "Create category", + "description": "Create a new product category", + "operationId": "createCategory", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CategoryCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Category created successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "put": { + "tags": [ + "Categories" + ], + "summary": "Update category", + "description": "Update an existing category", + "operationId": "updateCategory", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CategoryUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Category updated successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/bookings": { + "get": { + "tags": [ + "Bookings" + ], + "summary": "List bookings", + "description": "Retrieve a list of bookings", + "operationId": "listBookings", + "parameters": [ + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + } + ], + "responses": { + "200": { + "description": "Bookings retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Booking" + } + } + } + } + } + } + }, + "put": { + "tags": [ + "Bookings" + ], + "summary": "Update booking", + "description": "Update an existing booking", + "operationId": "updateBooking", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BookingUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Booking updated successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/user/bookings": { + "get": { + "tags": [ + "Bookings" + ], + "summary": "Get user bookings", + "description": "Retrieve bookings for the authenticated user", + "operationId": "getUserBookings", + "responses": { + "200": { + "description": "User bookings retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Booking" + } + } + } + } + } + } + } + }, + "/order-bookings": { + "get": { + "tags": [ + "Bookings" + ], + "summary": "List order bookings", + "operationId": "listOrderBookings", + "parameters": [ + { + "name": "id", + "in": "query", + "required": false, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/goals/department": { + "get": { + "tags": [ + "Goals" + ], + "summary": "List or get department goals", + "description": "Retrieve a list of department goals or a single goal when `id` is provided.\n\nAccess control:\n- A user may only access goals where the goal's `departments` set is a subset of the user's departments.\n- Users with the `superuser` permission may access all goals.\n", + "operationId": "listDepartmentGoals", + "parameters": [ + { + "name": "id", + "in": "query", + "required": false, + "schema": { + "type": "integer" + }, + "description": "When provided, returns the single goal with this id (if accessible)" + }, + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + }, + { + "$ref": "#/components/parameters/SearchParam" + }, + { + "$ref": "#/components/parameters/FiltersParam" + } + ], + "responses": { + "200": { + "description": "Goals retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DepartmentGoal" + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "post": { + "tags": [ + "Goals" + ], + "summary": "Create department goal", + "description": "Create a new department goal.\n\nAccess control:\n- The provided `departments` must be a subset of the user's departments unless the user has `superuser`.\n", + "operationId": "createDepartmentGoal", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentGoalCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Department goal created successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentGoal" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + } + }, + "put": { + "tags": [ + "Goals" + ], + "summary": "Update department goal", + "description": "Update an existing department goal by `id`.\n\nAccess control:\n- The creator (`created_by`) may update regardless of department membership.\n- Otherwise the user must satisfy the same subset rule as for read access, and any new `departments` provided must also be a subset unless the user has `superuser`.\n", + "operationId": "updateDepartmentGoal", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentGoalUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Department goal updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentGoal" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/goals/department/progress-alert/test": { + "post": { + "tags": [ + "Goals" + ], + "summary": "Send a test progress alert for a department goal", + "description": "Sends a progress alert for a department goal to the destination defined in the goal's criteria.\n\nPermission required: `goals_department_progress_alert_test`.\n\nAccess control:\n- The caller must be a superuser or belong to all departments targeted by the goal.\n\nBehavior:\n- Looks up the goal by `id`.\n- Rebuilds the criteria from stored JSON and attaches the goal's departments.\n- Renders the alert using the server-side renderer (respecting progress type/style/format and destination limits).\n- Sends the alert to Slack, Email, or SMS depending on `progress_alert_destination`, unless overridden.\n", + "operationId": "sendDepartmentGoalProgressAlertTest", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer", + "description": "The department goal id", + "example": 42 + }, + "overrideDestination": { + "type": "string", + "description": "Override the destination for this test", + "enum": [ + "SLACK", + "EMAIL", + "SMS", + "NONE" + ], + "example": "SLACK" + }, + "email_to": { + "type": "string", + "format": "email", + "description": "Email recipient when destination is EMAIL", + "example": "tester@example.com" + }, + "subject": { + "type": "string", + "description": "Optional email subject when destination is EMAIL", + "example": "Dept Goal Progress Test" + }, + "sms_to": { + "description": "One or more MSISDN recipients when destination is SMS", + "oneOf": [ + { + "type": "string", + "description": "Comma or semicolon separated list", + "example": "+4512345678, +4598765432" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "+4512345678", + "+4598765432" + ] + } + ] + }, + "slack_webhook": { + "type": "string", + "description": "Slack webhook URL when destination is SLACK", + "example": "https://hooks.slack.com/services/T000/B000/XXX" + }, + "department_id": { + "type": "integer", + "description": "Department id to use that department's Slack webhook when destination is SLACK", + "example": 3 + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Alert sent successfully", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "Goal id" + }, + "destination": { + "type": "string", + "description": "Final destination used", + "enum": [ + "SLACK", + "EMAIL", + "SMS", + "NONE" + ] + }, + "target": { + "description": "The target used for delivery (email address, phone numbers, department id, or webhook)" + }, + "message_preview": { + "type": "string", + "description": "Rendered message preview" + }, + "provider_response": { + "description": "Provider-specific response or status message" + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + }, + "delete": { + "tags": [ + "Goals" + ], + "summary": "Delete department goal", + "description": "Delete a department goal by `id`.\n\nAccess control:\n- The creator (`created_by`) may delete regardless of department membership.\n- Otherwise the user must satisfy the subset rule or have `superuser`.\n", + "operationId": "deleteDepartmentGoal", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + }, + "description": "ID of the goal to delete" + } + ], + "responses": { + "200": { + "description": "Department goal deleted successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "/order-bookings": { + "post": { + "tags": [ + "Bookings" + ], + "summary": "Create order booking", + "operationId": "createOrderBooking", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "department", + "reg_1", + "datetime", + "items" + ], + "properties": { + "customer_number": { + "type": "integer" + }, + "department": { + "type": "integer" + }, + "reg_1": { + "type": "string" + }, + "reg_2": { + "type": "string" + }, + "reg_3": { + "type": "string" + }, + "datetime": { + "type": "string", + "format": "date-time" + }, + "note": { + "type": "string" + }, + "reference": { + "type": "string" + }, + "po": { + "type": "string" + }, + "pickup": { + "type": "boolean" + }, + "items": { + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "quantity" + ], + "properties": { + "id": { + "type": "integer" + }, + "quantity": { + "type": "integer" + } + } + } + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success" + } + } + }, + "put": { + "tags": [ + "Bookings" + ], + "summary": "Update order booking", + "operationId": "updateOrderBooking", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + }, + "customer_number": { + "type": "integer" + }, + "department": { + "type": "integer" + }, + "reg_1": { + "type": "string" + }, + "reg_2": { + "type": "string" + }, + "reg_3": { + "type": "string" + }, + "datetime": { + "type": "string", + "format": "date-time" + }, + "note": { + "type": "string" + }, + "reference": { + "type": "string" + }, + "po": { + "type": "string" + }, + "pickup": { + "type": "boolean" + }, + "order_id": { + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "quantity" + ], + "properties": { + "id": { + "type": "integer" + }, + "quantity": { + "type": "integer" + } + } + } + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success" + } + } + }, + "delete": { + "tags": [ + "Bookings" + ], + "summary": "Delete order booking", + "operationId": "deleteOrderBooking", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + } + }, + "/order-bookings/complete": { + "post": { + "tags": [ + "Bookings" + ], + "summary": "Complete order booking", + "operationId": "completeOrderBooking", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + }, + "safety_seal": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/admin/bookings/sync": { + "post": { + "tags": [ + "Bookings" + ], + "summary": "Sync booking from external system", + "operationId": "syncBooking", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/admin/bookings/department/count": { + "get": { + "tags": [ + "Bookings" + ], + "summary": "Get department unfulfilled bookings count", + "operationId": "getDepartmentBookingCount", + "parameters": [ + { + "name": "department_id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/user/bookings/washcertificate/download": { + "post": { + "tags": [ + "Bookings" + ], + "summary": "Get download link for own wash certificate", + "operationId": "downloadOwnWashCertificate", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/bookings/download_pdf": { + "get": { + "tags": [ + "Bookings" + ], + "summary": "Download booking PDF", + "operationId": "downloadBookingPdf", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/admin/bookings/delete": { + "post": { + "tags": [ + "Bookings" + ], + "summary": "Delete booking (admin)", + "operationId": "adminDeleteBooking", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/superuser/bookings/sync/all": { + "post": { + "tags": [ + "Bookings" + ], + "summary": "Sync all bookings from external system", + "operationId": "syncAllBookings", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/admin/bookings/completeWashWithoutWashCertificate": { + "post": { + "tags": [ + "Bookings" + ], + "summary": "Complete wash without wash certificate", + "operationId": "completeWashWithoutWashCertificate", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/user/bookings/delete": { + "post": { + "tags": [ + "Bookings" + ], + "summary": "Delete own booking", + "operationId": "deleteOwnBooking", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/invoices/draft": { + "get": { + "tags": [ + "Invoices" + ], + "summary": "List draft invoices", + "description": "Retrieve a list of draft invoices", + "operationId": "listDraftInvoices", + "parameters": [ + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + } + ], + "responses": { + "200": { + "description": "Draft invoices retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/invoices/draft/close": { + "post": { + "tags": [ + "Invoices" + ], + "summary": "Close draft invoice", + "description": "Close a draft invoice", + "operationId": "closeDraftInvoice", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "id": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Draft invoice closed successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/invoices/pdf": { + "get": { + "tags": [ + "Invoices" + ], + "summary": "Get invoice PDF", + "description": "Download an invoice as PDF", + "operationId": "getInvoicePdf", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "PDF retrieved successfully", + "content": { + "application/pdf": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + } + } + } + }, + "/user/invoices": { + "get": { + "tags": [ + "Invoices" + ], + "summary": "Get user invoices", + "description": "Retrieve invoices for the authenticated user", + "operationId": "getUserInvoices", + "responses": { + "200": { + "description": "User invoices retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/collected-invoices": { + "get": { + "tags": [ + "Invoices" + ], + "summary": "List collected invoices", + "description": "Get list of collected invoices", + "operationId": "listCollectedInvoices", + "parameters": [ + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + } + ], + "responses": { + "200": { + "description": "Collected invoices retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Invoices" + ], + "summary": "Create collected invoice", + "description": "Create a new collected invoice", + "operationId": "createCollectedInvoice", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "201": { + "description": "Collected invoice created successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "put": { + "tags": [ + "Invoices" + ], + "summary": "Update collected invoice", + "description": "Update a collected invoice", + "operationId": "updateCollectedInvoice", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "Collected invoice updated successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/collected-invoices/ready-to-invoice": { + "get": { + "tags": [ + "Invoices" + ], + "summary": "Get invoices ready to process", + "description": "Get collected invoices that are ready to be processed", + "operationId": "getReadyToInvoice", + "responses": { + "200": { + "description": "Ready invoices retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/collected-invoices/economic/compare": { + "get": { + "tags": [ + "Invoices" + ], + "summary": "Compare collected invoice totals with E-conomic", + "description": "Compares a collected invoice in the system with its corresponding invoice in E-conomic.\nReturns totals from both sources, their difference, and any warnings detected during comparison.\n", + "operationId": "compareCollectedInvoiceEconomic", + "parameters": [ + { + "name": "collected_invoice_id", + "in": "query", + "required": true, + "description": "The internal collected invoice ID to compare", + "schema": { + "type": "integer", + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "Comparison completed successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CollectedInvoiceEconomicCompareResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/collected-invoices/economic/v2/details": { + "get": { + "tags": [ + "Invoices" + ], + "summary": "Get deep V2 e-conomic invoice details", + "description": "Returns normalized internal lines and best-effort fetched draft/booked e-conomic lines\nfor a collected invoice, including department distributions and warnings.\n", + "operationId": "getCollectedInvoiceEconomicV2Details", + "parameters": [ + { + "name": "collected_invoice_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "Details resolved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CollectedInvoiceEconomicV2DetailsResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/collected-invoices/economic/v2/compare": { + "get": { + "tags": [ + "Invoices" + ], + "summary": "Compare internal invoice with draft/booked (V2)", + "operationId": "compareCollectedInvoiceEconomicV2", + "parameters": [ + { + "name": "collected_invoice_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "Comparison completed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CollectedInvoiceEconomicV2CompareResponse" + }, + "examples": { + "exactMatch": { + "summary": "Exact match between internal and draft/booked", + "value": { + "collected_invoice_id": 123, + "warnings": [], + "comparison": { + "totals": { + "internal_net_total": 694 + }, + "targets": { + "draft": { + "target": "draft", + "status": "exact_match", + "overall_match": true + }, + "booked": { + "target": "booked", + "status": "exact_match", + "overall_match": true + } + } + } + } + }, + "partialMismatch": { + "summary": "Partial mismatch with line and department differences", + "value": { + "collected_invoice_id": 123, + "warnings": [ + "Non-billable line count differs" + ], + "comparison": { + "totals": { + "internal_net_total": 694 + }, + "targets": { + "draft": { + "target": "draft", + "status": "partial_mismatch", + "overall_match": false, + "mismatch_reasons": [ + "quantity_mismatch", + "department_total_mismatch" + ] + } + } + } + } + }, + "missingBooked": { + "summary": "Missing booked target", + "value": { + "collected_invoice_id": 123, + "comparison": { + "totals": { + "internal_net_total": 694 + }, + "targets": { + "booked": { + "target": "booked", + "status": "missing_target", + "overall_match": false + } + } + } + } + } + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/collected-invoices/economic/v2/compare/bulk": { + "post": { + "tags": [ + "Invoices" + ], + "summary": "Bulk compare collected invoices against draft/booked (V2)", + "operationId": "compareCollectedInvoiceEconomicV2Bulk", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "collected_invoice_ids" + ], + "properties": { + "collected_invoice_ids": { + "type": "array", + "minItems": 1, + "maxItems": 200, + "items": { + "type": "integer", + "minimum": 1 + } + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Bulk comparison completed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CollectedInvoiceEconomicV2CompareBulkResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/collected-invoices/economic/v2/revenue-statistics": { + "get": { + "tags": [ + "Invoices" + ], + "summary": "Get overall booked revenue statistics from e-conomic (V2)", + "description": "Aggregates booked e-conomic revenue across invoices and lines, with optional filters\nfor date range, customer(s), department(s), currency, and barred-customer status.\n", + "operationId": "getCollectedInvoiceEconomicV2RevenueStatistics", + "parameters": [ + { + "name": "dateFrom", + "in": "query", + "required": false, + "description": "Start date (inclusive), defaults to first day of current month.", + "schema": { + "type": "string", + "format": "date" + } + }, + { + "name": "dateTo", + "in": "query", + "required": false, + "description": "End date (inclusive), defaults to today.", + "schema": { + "type": "string", + "format": "date" + } + }, + { + "name": "customer_numbers", + "in": "query", + "required": false, + "description": "Comma-separated customer numbers to include.", + "schema": { + "type": "string", + "example": "42493959,42493960" + } + }, + { + "name": "department_numbers", + "in": "query", + "required": false, + "description": "Comma-separated department numbers to include.", + "schema": { + "type": "string", + "example": "75,10" + } + }, + { + "name": "currency", + "in": "query", + "required": false, + "description": "Restrict to a specific invoice currency.", + "schema": { + "type": "string", + "example": "DKK" + } + }, + { + "name": "barred", + "in": "query", + "required": false, + "description": "Filter by e-conomic customer barred status.", + "schema": { + "type": "string", + "enum": [ + "all", + "barred", + "active" + ], + "default": "all" + } + }, + { + "name": "max_pages", + "in": "query", + "required": false, + "description": "Safety cap for paginated e-conomic reads.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 200, + "default": 10 + } + } + ], + "responses": { + "200": { + "description": "Revenue statistics resolved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CollectedInvoiceEconomicV2RevenueStatisticsResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/superuser/invoicing/period": { + "get": { + "tags": [ + "Invoices" + ], + "summary": "Get invoicing periods", + "description": "Retrieve invoicing periods for superusers", + "operationId": "getInvoicingPeriods", + "parameters": [ + { + "name": "dateFrom", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + }, + { + "name": "dateTo", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + } + ], + "responses": { + "200": { + "description": "Invoicing periods retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/superuser/invoicing/period/distribution/fixed-pricing": { + "get": { + "tags": [ + "Invoices" + ], + "summary": "Get fixed pricing distribution", + "description": "Get invoicing distribution for fixed pricing items", + "operationId": "getInvoicingFixedPricingDistribution", + "parameters": [ + { + "name": "dateFrom", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + }, + { + "name": "dateTo", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + } + ], + "responses": { + "200": { + "description": "Fixed pricing distribution retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionResponse" + } + } + } + } + } + } + }, + "/superuser/invoicing/period/distribution/wash-subscriptions": { + "get": { + "tags": [ + "Invoices" + ], + "summary": "Get wash subscriptions distribution", + "description": "Get invoicing distribution for wash subscriptions", + "operationId": "getInvoicingWashSubscriptionsDistribution", + "parameters": [ + { + "name": "dateFrom", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + }, + { + "name": "dateTo", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + } + ], + "responses": { + "200": { + "description": "Wash subscriptions distribution retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvoicingWashSubscriptionsDistributionResponse" + } + } + } + } + } + } + }, + "/superuser/invoicing/period/distribution/v2/all": { + "get": { + "tags": [ + "Invoices" + ], + "summary": "Get version-aware historical distribution (all)", + "operationId": "getInvoicingPeriodDistributionV2All", + "parameters": [ + { + "name": "dateFrom", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + }, + { + "name": "dateTo", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + } + ], + "responses": { + "200": { + "description": "Version-aware historical distribution (all categories)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvoicingDistributionV2AllResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/superuser/invoicing/period/distribution/v2/fixed-pricing": { + "get": { + "tags": [ + "Invoices" + ], + "summary": "Get version-aware historical fixed pricing distribution", + "operationId": "getInvoicingPeriodDistributionV2FixedPricing", + "parameters": [ + { + "name": "dateFrom", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + }, + { + "name": "dateTo", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + } + ], + "responses": { + "200": { + "description": "Version-aware fixed pricing distribution", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvoicingDistributionV2FixedPricingResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/superuser/invoicing/period/distribution/v2/wash-subscriptions": { + "get": { + "tags": [ + "Invoices" + ], + "summary": "Get version-aware historical wash subscription distribution", + "operationId": "getInvoicingPeriodDistributionV2WashSubscriptions", + "parameters": [ + { + "name": "dateFrom", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + }, + { + "name": "dateTo", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + } + ], + "responses": { + "200": { + "description": "Version-aware wash subscription distribution", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvoicingDistributionV2WashSubscriptionsResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/superuser/invoicing/period/distribution/v2/customer-prices": { + "get": { + "tags": [ + "Invoices" + ], + "summary": "Get version-aware historical customer-price discount distribution", + "operationId": "getInvoicingPeriodDistributionV2CustomerPrices", + "parameters": [ + { + "name": "dateFrom", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + }, + { + "name": "dateTo", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + } + ], + "responses": { + "200": { + "description": "Version-aware customer-price discount distribution", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvoicingDistributionV2CustomerPricesResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/superuser/invoicing/period/distribution/v2/booked-department-75": { + "get": { + "tags": [ + "Invoices" + ], + "summary": "Get booked e-conomic department 75 redistribution", + "operationId": "getInvoicingPeriodDistributionV2BookedDepartment75", + "parameters": [ + { + "name": "dateFrom", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + }, + { + "name": "dateTo", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + } + ], + "responses": { + "200": { + "description": "Actual booked e-conomic department 75 net amounts redistributed to internal departments", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvoicingDistributionV2BookedDepartment75Response" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/superuser/customers/pricing-history": { + "get": { + "tags": [ + "Invoices" + ], + "summary": "Get customer versioned pricing/subscription/discount timeline", + "operationId": "getCustomerPricingHistoryV2", + "parameters": [ + { + "name": "customer_number", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "minimum": 1 + } + }, + { + "name": "dateFrom", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + }, + { + "name": "dateTo", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + } + ], + "responses": { + "200": { + "description": "Customer timeline resolved", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CustomerPricingHistoryResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "500": { + "$ref": "#/components/responses/InternalServerError" + } + } + } + }, + "/vehicles": { + "get": { + "tags": [ + "Vehicles" + ], + "summary": "List vehicles", + "description": "List vehicles or fetch a specific vehicle when `id` is provided.\n\n- When `id` is present, returns a single vehicle object (404 if not found).\n- Otherwise returns a paginated list of vehicles.\n\nPermissions:\n- Own scope: `list_own_vehicles` (linked to subuser node `VEHICLES_LIST`).\n- Broader scope: `list_vehicles_other`.\n\nSubusers may specify header `X-Customer-Number` to target a specific customer. If the broader\npermission is missing, the list will automatically be restricted to the effective customer context.\n", + "operationId": "listVehicles", + "parameters": [ + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + }, + { + "$ref": "#/components/parameters/XCustomerNumber" + }, + { + "name": "id", + "in": "query", + "schema": { + "type": "integer" + } + }, + { + "name": "reg", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "customer_id", + "in": "query", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Vehicle(s) retrieved successfully", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/Vehicle" + }, + { + "type": "array", + "items": { + "$ref": "#/components/schemas/Vehicle" + } + } + ] + } + } + } + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "post": { + "tags": [ + "Vehicles" + ], + "summary": "Add vehicle", + "operationId": "addVehicle", + "description": "Create a new vehicle for a customer.\n\nPermissions:\n- Own scope: `add_vehicle` (linked to subuser node `VEHICLES_ADD`).\n- Broader scope: `add_vehicle_other`.\n", + "parameters": [ + { + "$ref": "#/components/parameters/XCustomerNumber" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "reg", + "type", + "wash_subscription" + ], + "properties": { + "reg": { + "type": "string", + "minLength": 2, + "maxLength": 12, + "description": "Vehicle registration number" + }, + "type": { + "type": "integer", + "description": "Product ID representing the vehicle wash type" + }, + "wash_subscription": { + "type": "boolean" + }, + "reference": { + "type": "string", + "maxLength": 255, + "nullable": true + }, + "customer_id": { + "type": "integer", + "description": "Optional explicit target customer. Defaults to the effective customer context." + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Vehicle created", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + } + }, + "put": { + "tags": [ + "Vehicles" + ], + "summary": "Edit vehicle", + "operationId": "editVehicle", + "description": "Update fields on an existing vehicle.\n\nPermissions:\n- Own scope: `edit_vehicle` (linked to subuser node `VEHICLES_EDIT`).\n- Broader scope: `edit_vehicle_other`.\n", + "parameters": [ + { + "$ref": "#/components/parameters/XCustomerNumber" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + }, + "reg": { + "type": "string", + "minLength": 2, + "maxLength": 12 + }, + "type": { + "type": "integer" + }, + "wash_subscription": { + "type": "boolean" + }, + "reference": { + "type": "string", + "maxLength": 255, + "nullable": true + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Vehicle updated", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "delete": { + "tags": [ + "Vehicles" + ], + "summary": "Delete vehicle", + "operationId": "deleteVehicle", + "description": "Delete an existing vehicle.\n\nPermissions:\n- Own scope: `delete_vehicle` (linked to subuser node `VEHICLES_DELETE`).\n- Broader scope: `delete_vehicle_other`.\n", + "parameters": [ + { + "$ref": "#/components/parameters/XCustomerNumber" + }, + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Vehicle deleted", + "content": { + "application/json": { + "schema": {} + } + } + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/vehicles/addons/available": { + "get": { + "tags": [ + "Vehicles" + ], + "summary": "Get available vehicle addons", + "description": "Get list of available addons for a vehicle.\n\nPermissions:\n- Own scope: `list_vehicle_addon_own` (linked to subuser node `VEHICLES_LIST`).\n- Broader scope: `list_vehicles_addon_other`.\n", + "operationId": "getAvailableVehicleAddons", + "parameters": [ + { + "$ref": "#/components/parameters/XCustomerNumber" + }, + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Available addons retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/vehicles/addons/toggle": { + "post": { + "tags": [ + "Vehicles" + ], + "summary": "Toggle vehicle addon", + "description": "Enable or disable a vehicle addon for a vehicle.\n\nPermissions:\n- Own scope: `toggle_vehicle_addon_own` (linked to subuser node `VEHICLES_EDIT`).\n- Broader scope: `toggle_vehicle_addon_other`.\n", + "operationId": "toggleVehicleAddon", + "parameters": [ + { + "$ref": "#/components/parameters/XCustomerNumber" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "vehicle_id", + "addon_id" + ], + "properties": { + "vehicle_id": { + "type": "integer" + }, + "addon_id": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Vehicle addon toggled successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/department/vehicles/unknown-customer": { + "get": { + "tags": [ + "Vehicles" + ], + "summary": "Get unknown customer vehicles in department", + "operationId": "getUnknownCustomerVehicles", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/department/vehicle/customer-suggestions": { + "get": { + "tags": [ + "Vehicles" + ], + "summary": "Get vehicle customer suggestions", + "operationId": "getVehicleCustomerSuggestions", + "parameters": [ + { + "name": "reg", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/vehicles/set-auto-start-on-lpr": { + "post": { + "tags": [ + "Vehicles" + ], + "summary": "Set auto start on LPR", + "operationId": "setVehicleAutoStartOnLpr", + "description": "Enable or disable automatic start on LPR for a vehicle in XL Vask.\n\nPermissions:\n- Own scope: `set_auto_start_on_lpr` (linked to subuser node `VEHICLES_EDIT`).\n- Broader scope: `set_auto_start_on_lpr_other`.\n", + "parameters": [ + { + "$ref": "#/components/parameters/XCustomerNumber" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id", + "active" + ], + "properties": { + "id": { + "type": "integer" + }, + "active": { + "type": "boolean" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/vehicles/set-vehicle-type-id": { + "post": { + "tags": [ + "Vehicles" + ], + "summary": "Set vehicle type ID", + "operationId": "setVehicleTypeId", + "description": "Set or change the XL Vask `vehicleTypeId` for a vehicle.\n\nPermissions:\n- Own scope: `set_vehicle_type_id` (linked to subuser node `VEHICLES_EDIT`).\n- Broader scope: `set_vehicle_type_id_other`.\n", + "parameters": [ + { + "$ref": "#/components/parameters/XCustomerNumber" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id", + "vehicleTypeId" + ], + "properties": { + "id": { + "type": "integer" + }, + "vehicleTypeId": { + "type": "string", + "minLength": 1, + "maxLength": 50 + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/superuser/users-with-vehicle-subscriptions": { + "get": { + "tags": [ + "Vehicles" + ], + "summary": "Get users with vehicle subscriptions", + "operationId": "getUsersWithVehicleSubscriptions", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/vehicles/status": { + "get": { + "tags": [ + "Vehicles" + ], + "summary": "Get vehicle status", + "operationId": "getVehicleStatus", + "parameters": [ + { + "name": "reg", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/vehicles/search": { + "get": { + "tags": [ + "Vehicles" + ], + "summary": "Search vehicles", + "operationId": "searchVehicles", + "parameters": [ + { + "name": "search", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/notifications": { + "get": { + "tags": [ + "Notifications" + ], + "summary": "List notifications", + "description": "Get list of notifications", + "operationId": "listNotifications", + "parameters": [ + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + } + ], + "responses": { + "200": { + "description": "Notifications retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Notification" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "Notifications" + ], + "summary": "Create notification", + "description": "Create a new notification", + "operationId": "createNotification", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Notification created successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "delete": { + "tags": [ + "Notifications" + ], + "summary": "Delete notification", + "description": "Delete a notification", + "operationId": "deleteNotification", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Notification deleted successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/statistics/bookings/new": { + "get": { + "tags": [ + "Statistics" + ], + "summary": "Get new bookings statistics", + "description": "Get statistics for new bookings", + "operationId": "getNewBookingsStats", + "responses": { + "200": { + "description": "New bookings statistics retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/orders/module/stripe/payment_intent": { + "get": { + "tags": [ + "Orders" + ], + "summary": "Get Stripe payment intent", + "operationId": "getStripePaymentIntent", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Orders" + ], + "summary": "Create Stripe payment intent", + "operationId": "createStripePaymentIntent", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id", + "reader" + ], + "properties": { + "id": { + "type": "integer" + }, + "reader": { + "type": "string" + }, + "tax_percentage": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "delete": { + "tags": [ + "Orders" + ], + "summary": "Delete Stripe payment intent", + "operationId": "deleteStripePaymentIntent", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/orders/module/stripe/payment_intent/capture": { + "post": { + "tags": [ + "Orders" + ], + "summary": "Capture Stripe payment intent", + "operationId": "captureStripePaymentIntent", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/orders/module/stripe/debug/simulate_payment": { + "post": { + "tags": [ + "Orders" + ], + "summary": "Simulate Stripe payment", + "operationId": "simulateStripePayment", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/statistics/orders/new": { + "get": { + "tags": [ + "Statistics" + ], + "summary": "Get new orders statistics", + "description": "Get statistics for new orders", + "operationId": "getNewOrdersStats", + "responses": { + "200": { + "description": "New orders statistics retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/statistics/income/today": { + "get": { + "tags": [ + "Statistics" + ], + "summary": "Get today's income", + "description": "Get income statistics for today", + "operationId": "getTodayIncome", + "responses": { + "200": { + "description": "Today's income statistics retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/statistics/income/yesterday": { + "get": { + "tags": [ + "Statistics" + ], + "summary": "Get yesterday's income", + "description": "Get income statistics for yesterday", + "operationId": "getYesterdayIncome", + "responses": { + "200": { + "description": "Yesterday's income statistics retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/statistics/income/this-month": { + "get": { + "tags": [ + "Statistics" + ], + "summary": "Get this month's income", + "description": "Get income statistics for the current month", + "operationId": "getThisMonthIncome", + "responses": { + "200": { + "description": "This month's income statistics retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/statistics/income/last-month": { + "get": { + "tags": [ + "Statistics" + ], + "summary": "Get last month's income", + "description": "Get income statistics for the previous month", + "operationId": "getLastMonthIncome", + "responses": { + "200": { + "description": "Last month's income statistics retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/statistics/income/this-year": { + "get": { + "tags": [ + "Statistics" + ], + "summary": "Get this year's income", + "description": "Get income statistics for the current year", + "operationId": "getThisYearIncome", + "responses": { + "200": { + "description": "This year's income statistics retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/statistics/income/departments": { + "get": { + "tags": [ + "Statistics" + ], + "summary": "Get total income today by departments", + "operationId": "getTotalIncomeTodayByDepartments", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/statistics/economic/totals": { + "get": { + "tags": [ + "Statistics" + ], + "summary": "Get total economic statistics", + "operationId": "getEconomicTotals", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/statistics/economic/totals/department_sent_invoice_totals": { + "get": { + "tags": [ + "Statistics" + ], + "summary": "Get department sent invoice totals", + "operationId": "getDepartmentSentInvoiceTotals", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/statistics/economic/totals/department_draft_invoice_totals": { + "get": { + "tags": [ + "Statistics" + ], + "summary": "Get department draft invoice totals", + "operationId": "getDepartmentDraftInvoiceTotals", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/worker/version": { + "get": { + "tags": [ + "Worker" + ], + "summary": "Get worker version", + "description": "Get the current version of the system worker", + "operationId": "getWorkerVersion", + "responses": { + "200": { + "description": "Worker version retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/worker/update-version": { + "get": { + "tags": [ + "Worker" + ], + "summary": "Update worker version", + "description": "Set the target version for the worker update", + "operationId": "updateWorkerVersion", + "parameters": [ + { + "name": "version", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Version update target set successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/worker/status": { + "get": { + "tags": [ + "Worker" + ], + "summary": "Get worker status", + "description": "Get detailed status of the system worker", + "operationId": "getWorkerStatus", + "responses": { + "200": { + "description": "Worker status retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/worker/debug": { + "get": { + "tags": [ + "Worker" + ], + "summary": "Debug worker", + "description": "Execute debug commands on the worker (often restricted)", + "operationId": "debugWorker", + "responses": { + "200": { + "description": "Debug information retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + } + } + }, + "/worker/debug/on": { + "get": { + "tags": [ + "Worker" + ], + "summary": "Enable worker debug", + "operationId": "enableWorkerDebug", + "responses": { + "200": { + "description": "Worker debug enabled", + "content": { + "application/json": { + "schema": {} + } + } + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + } + } + }, + "/worker/debug/off": { + "get": { + "tags": [ + "Worker" + ], + "summary": "Disable worker debug", + "operationId": "disableWorkerDebug", + "responses": { + "200": { + "description": "Worker debug disabled", + "content": { + "application/json": { + "schema": {} + } + } + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + } + } + }, + "/worker/licenseplates": { + "get": { + "tags": [ + "Worker" + ], + "summary": "Get unique license plates", + "description": "Fetch all unique license plates from various database tables", + "operationId": "getWorkerLicensePlates", + "responses": { + "200": { + "description": "License plates retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + } + } + }, + "/economic/doesCustomerExist": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Check if customer exists in e-conomic", + "operationId": "checkEconomicCustomerExists", + "parameters": [ + { + "name": "cvr", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Customer check completed", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/cvr/lookup": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Lookup CVR information", + "description": "Get detailed information for a CVR number", + "operationId": "lookupCvr", + "parameters": [ + { + "name": "cvr", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "CVR information retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/cvr/search": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Search CVR", + "description": "Search for companies by name or CVR", + "operationId": "searchCvr", + "parameters": [ + { + "name": "query", + "in": "query", + "required": true, + "schema": { + "type": "string", + "minLength": 2 + } + } + ], + "responses": { + "200": { + "description": "Search results retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/numberplatescans": { + "get": { + "tags": [ + "Plate Scans" + ], + "summary": "List plate scans", + "description": "Get a list of license plate scans", + "operationId": "listPlateScans", + "parameters": [ + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + }, + { + "$ref": "#/components/parameters/SearchParam" + } + ], + "responses": { + "200": { + "description": "Plate scans retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Plate Scans" + ], + "summary": "Record plate scan", + "description": "Record a new license plate scan", + "operationId": "recordPlateScan", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "plate", + "lane_id" + ], + "properties": { + "plate": { + "type": "string" + }, + "lane_id": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "201": { + "description": "Plate scan recorded successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/numberplatescans/department": { + "post": { + "tags": [ + "Plate Scans" + ], + "summary": "Record plate scan for department", + "operationId": "recordDepartmentPlateScan", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "plate", + "department_id" + ], + "properties": { + "plate": { + "type": "string" + }, + "department_id": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "201": { + "description": "Plate scan recorded successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/numberplatescans/post": { + "get": { + "tags": [ + "Plate Scans" + ], + "summary": "Get post-scan results", + "operationId": "getPlateScanPostResults", + "responses": { + "200": { + "description": "Post-scan results retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/numberplatescanners": { + "get": { + "tags": [ + "Plate Scans" + ], + "summary": "List plate scanners", + "description": "Get a list of all number plate scanners", + "operationId": "listPlateScanners", + "parameters": [ + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + }, + { + "$ref": "#/components/parameters/SearchParam" + } + ], + "responses": { + "200": { + "description": "Plate scanners retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Plate Scans" + ], + "summary": "Add plate scanner", + "operationId": "addPlateScanner", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "department_id", + "name", + "notes" + ], + "properties": { + "department_id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "notes": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "201": { + "description": "Plate scanner added successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "put": { + "tags": [ + "Plate Scans" + ], + "summary": "Update plate scanner", + "operationId": "updatePlateScanner", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id", + "department_id", + "name", + "notes" + ], + "properties": { + "id": { + "type": "integer" + }, + "department_id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "notes": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Plate scanner updated successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/department/numberplatescanners": { + "get": { + "tags": [ + "Plate Scans" + ], + "summary": "List department plate scanners", + "operationId": "listDepartmentPlateScanners", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Department plate scanners retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/relay/button/press/post": { + "get": { + "tags": [ + "Plate Scans" + ], + "summary": "Record machine start button press webhook", + "operationId": "addButtonPress", + "parameters": [ + { + "name": "token", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "lane_id", + "in": "query", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "name": "reg", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "201": { + "description": "Button press recorded and linked to a self-serve wash session", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MachineButtonPressWebhookResponse" + } + } + } + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "post": { + "tags": [ + "Plate Scans" + ], + "summary": "Record machine start button press webhook", + "operationId": "addButtonPressPost", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "token": { + "type": "string" + }, + "lane_id": { + "type": "integer" + }, + "reg": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "201": { + "description": "Button press recorded and linked to a self-serve wash session", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MachineButtonPressWebhookResponse" + } + } + } + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/economic/customers/import": { + "post": { + "tags": [ + "Modules" + ], + "summary": "Import e-conomic customers", + "description": "Import customers from e-conomic", + "operationId": "importEconomicCustomers", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "Customers imported successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/economic/departments": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Get e-conomic departments", + "operationId": "getEconomicDepartments", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/economic/products": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Get e-conomic products", + "operationId": "getEconomicProducts", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/economic/customer": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Get e-conomic customer details", + "operationId": "getEconomicCustomer", + "parameters": [ + { + "name": "customer_number", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Modules" + ], + "summary": "Create e-conomic customer", + "operationId": "createEconomicCustomer", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "customer_number", + "cvr", + "email", + "phone", + "name" + ], + "properties": { + "customer_number": { + "type": "integer" + }, + "cvr": { + "type": "integer" + }, + "email": { + "type": "string" + }, + "phone": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/economic/layouts": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Get e-conomic layouts", + "description": "Get available invoice layouts from e-conomic", + "operationId": "getEconomicLayouts", + "responses": { + "200": { + "description": "Layouts retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/economic/payment-terms": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Get e-conomic payment terms", + "description": "Get available payment terms from e-conomic", + "operationId": "getEconomicPaymentTerms", + "responses": { + "200": { + "description": "Payment terms retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/economic/invoice/draft/export": { + "post": { + "tags": [ + "Modules" + ], + "summary": "Export draft invoice to e-conomic", + "description": "Export a draft invoice to e-conomic", + "operationId": "exportDraftInvoiceToEconomic", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "Draft invoice exported successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/economic/invoice/export": { + "post": { + "tags": [ + "Modules" + ], + "summary": "Export invoice to e-conomic", + "description": "Export a booked invoice to e-conomic", + "operationId": "exportInvoiceToEconomic", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "Invoice exported successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/stripe/customers": { + "get": { + "tags": [ + "Modules" + ], + "summary": "List Stripe customers", + "description": "Get list of Stripe customers", + "operationId": "listStripeCustomers", + "responses": { + "200": { + "description": "Stripe customers retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/stripe/products": { + "get": { + "tags": [ + "Modules" + ], + "summary": "List Stripe products", + "description": "Get list of Stripe products", + "operationId": "listStripeProducts", + "responses": { + "200": { + "description": "Stripe products retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/stripe/prices": { + "get": { + "tags": [ + "Modules" + ], + "summary": "List Stripe prices", + "description": "Get list of Stripe prices", + "operationId": "listStripePrices", + "responses": { + "200": { + "description": "Stripe prices retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/stripe/invoice": { + "post": { + "tags": [ + "Modules" + ], + "summary": "Create Stripe invoice", + "description": "Create an invoice in Stripe", + "operationId": "createStripeInvoice", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "201": { + "description": "Stripe invoice created successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/stripe/terminal/readers": { + "get": { + "tags": [ + "Modules" + ], + "summary": "List Stripe terminal readers", + "operationId": "listStripeTerminalReaders", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/stripe/terminal/locations": { + "get": { + "tags": [ + "Modules" + ], + "summary": "List Stripe terminal locations", + "operationId": "listStripeTerminalLocations", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/stripe/department/terminal/location": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Get department terminal location", + "operationId": "getDepartmentTerminalLocation", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Modules" + ], + "summary": "Set department terminal location", + "operationId": "setDepartmentTerminalLocation", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id", + "location" + ], + "properties": { + "id": { + "type": "integer" + }, + "location": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/stripe/department/terminal/readers": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Get department terminal readers", + "operationId": "getDepartmentTerminalReaders", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/backup/backups": { + "get": { + "tags": [ + "Modules" + ], + "summary": "List backup modules", + "operationId": "listBackupModules", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Modules" + ], + "summary": "Create backup module", + "operationId": "createBackupModule", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "name", + "description" + ], + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/xlvask/usageLog": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Get XLVask usage logs", + "description": "Retrieve usage logs from XLVask system", + "operationId": "getXlvaskUsageLogs", + "parameters": [ + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + } + ], + "responses": { + "200": { + "description": "Usage logs retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/xlvask/vehicles": { + "get": { + "tags": [ + "Modules" + ], + "summary": "List XLVask vehicles", + "description": "Get list of vehicles from XLVask", + "operationId": "listXlvaskVehicles", + "responses": { + "200": { + "description": "XLVask vehicles retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/xlvask/customers": { + "get": { + "tags": [ + "Modules" + ], + "summary": "List XLVask customers", + "description": "Get list of customers from XLVask", + "operationId": "listXlvaskCustomers", + "responses": { + "200": { + "description": "XLVask customers retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/action-logs": { + "get": { + "tags": [ + "Modules" + ], + "summary": "List module action logs", + "description": "Retrieve a paginated list of module action logs with searching and filtering", + "operationId": "listModuleActionLogs", + "parameters": [ + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/LimitParam" + }, + { + "$ref": "#/components/parameters/SearchParam" + }, + { + "$ref": "#/components/parameters/FiltersParam" + } + ], + "responses": { + "200": { + "description": "Module action logs retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModuleActionLog" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + } + } + }, + "/modules/self-serve/lane/status": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Get self-serve lane status", + "description": "Retrieve the current status of a self-serve lane", + "operationId": "getSelfServeLaneStatus", + "parameters": [ + { + "name": "lane_id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Lane status retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SelfServeLaneStatus" + } + } + } + } + } + } + }, + "/modules/self-serve/lane/command": { + "post": { + "tags": [ + "Modules" + ], + "summary": "Send self-serve lane command", + "description": "Send a command (e.g., start, stop, reset) to a self-serve lane", + "operationId": "sendSelfServeLaneCommand", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "lane_id", + "command" + ], + "properties": { + "lane_id": { + "type": "integer" + }, + "command": { + "type": "string", + "enum": [ + "START", + "STOP", + "RESET", + "RESERVE", + "RELEASE" + ] + }, + "license_plate": { + "type": "string", + "description": "Required for START command" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Command sent successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SelfServeLaneStatus" + } + } + } + } + } + } + }, + "/modules/self-serve/lane/services/allowed": { + "post": { + "tags": [ + "Modules" + ], + "summary": "Set allowed services for a lane based on shown tasks", + "description": "Updates the set of services that are allowed to be manually activated for a given self-serve lane,\nderived from the tasks currently shown to the user after answering the self-serve questions.\nThis endpoint does not activate anything by itself; it only sets what is allowed to be activated.\n", + "operationId": "setSelfServeLaneAllowedServices", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "lane_id" + ], + "properties": { + "lane_id": { + "type": "integer" + }, + "task_ids": { + "type": "array", + "description": "List of task IDs that are currently shown to the user", + "items": { + "type": "integer" + } + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Allowed services updated", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "lane_id": { + "type": "integer" + }, + "allowed_services": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + } + } + }, + "/modules/self-serve/lane/relay/machine/enable": { + "post": { + "tags": [ + "Modules" + ], + "summary": "Manually enable MACHINE relay for a lane", + "description": "Manually turns on the MACHINE relay for a self-serve lane if and only if the current allowed services\ninclude `MACHINE` (set via `/modules/self-serve/lane/services/allowed`). The relay is never automatically\nenabled; an explicit call to this endpoint is required.\n", + "operationId": "enableSelfServeLaneMachineRelay", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "lane_id" + ], + "properties": { + "lane_id": { + "type": "integer" + }, + "duration": { + "type": "integer", + "description": "Optional number of seconds after which the relay should automatically turn off" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "MACHINE relay enabled", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "lane_id": { + "type": "integer" + }, + "relay": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "duration": { + "type": "integer", + "nullable": true + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "description": "Not allowed to enable MACHINE relay (no matching task currently shown)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/modules/self-serve/lane/force/machine/enable": { + "post": { + "tags": [ + "Modules" + ], + "summary": "Force enable MACHINE relay and mark lane as in-wash (superusers only)", + "description": "Superuser/emergency endpoint. Bypasses the allowed services gating and directly turns on the MACHINE relay.\nAlso ensures the lane is marked as OCCUPIED and IN_WASH with a wash start timestamp if not already set.\n", + "operationId": "forceEnableSelfServeLaneMachine", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "lane_id" + ], + "properties": { + "lane_id": { + "type": "integer" + }, + "duration": { + "type": "integer", + "nullable": true, + "description": "Optional number of seconds after which the relay should automatically turn off" + }, + "license_plate": { + "type": "string", + "nullable": true, + "description": "Optional license plate to associate with the lane" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "MACHINE relay force-enabled and lane marked in-wash", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "lane_id": { + "type": "integer" + }, + "forced": { + "type": "boolean" + }, + "machine": { + "type": "string", + "enum": [ + "ENABLED" + ] + }, + "duration": { + "type": "integer", + "nullable": true + }, + "status": { + "type": "string" + }, + "state": { + "type": "string" + }, + "wash_start_time": { + "type": "integer" + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + } + } + }, + "/modules/self-serve/lane/force/machine/disable": { + "post": { + "tags": [ + "Modules" + ], + "summary": "Force disable MACHINE relay but keep lane as in-wash (superusers only)", + "description": "Superuser/emergency endpoint. Turns off the MACHINE relay while ensuring the lane remains in an IN_WASH state\n(simulating a started wash without machine assistance).\n", + "operationId": "forceDisableSelfServeLaneMachine", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "lane_id" + ], + "properties": { + "lane_id": { + "type": "integer" + }, + "license_plate": { + "type": "string", + "nullable": true + } + } + } + } + } + }, + "responses": { + "200": { + "description": "MACHINE relay force-disabled and lane ensured in-wash", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "lane_id": { + "type": "integer" + }, + "forced": { + "type": "boolean" + }, + "machine": { + "type": "string", + "enum": [ + "DISABLED" + ] + }, + "status": { + "type": "string" + }, + "state": { + "type": "string" + }, + "wash_start_time": { + "type": "integer" + } + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + } + } + }, + "/modules/motorapi/lookup": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Lookup vehicle via MotorAPI", + "description": "Look up vehicle information using license plate", + "operationId": "motorApiLookup", + "parameters": [ + { + "name": "plate", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Vehicle information retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/virkdata/search": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Search VirkData", + "description": "Search for company information in VirkData", + "operationId": "virkdataSearch", + "parameters": [ + { + "name": "search", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Company information retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/fxratesapi/rate": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Get exchange rate", + "description": "Get current exchange rate", + "operationId": "getExchangeRate", + "parameters": [ + { + "name": "from", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "to", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Exchange rate retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/fxratesapi/rates": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Get all exchange rates", + "description": "Get all available exchange rates", + "operationId": "getAllExchangeRates", + "responses": { + "200": { + "description": "Exchange rates retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/weatherapi/current": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Get current weather", + "description": "Get current weather data from WeatherAPI for a location query", + "operationId": "weatherApiCurrent", + "parameters": [ + { + "name": "q", + "in": "query", + "required": true, + "schema": { + "type": "string" + }, + "description": "Location query (e.g. city, postal code, or latitude,longitude)" + } + ], + "responses": { + "200": { + "description": "Current weather retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WeatherApiObjectResponse" + } + } + } + } + } + } + }, + "/modules/weatherapi/forecast": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Get weather forecast", + "description": "Get forecast weather data from WeatherAPI", + "operationId": "weatherApiForecast", + "parameters": [ + { + "name": "q", + "in": "query", + "required": true, + "schema": { + "type": "string" + }, + "description": "Location query (e.g. city, postal code, or latitude,longitude)" + }, + { + "name": "days", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 14 + }, + "description": "Number of forecast days" + } + ], + "responses": { + "200": { + "description": "Forecast weather retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WeatherApiObjectResponse" + } + } + } + } + } + } + }, + "/modules/weatherapi/search": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Search weather locations", + "description": "Search location suggestions from WeatherAPI", + "operationId": "weatherApiSearch", + "parameters": [ + { + "name": "q", + "in": "query", + "required": true, + "schema": { + "type": "string" + }, + "description": "Search text" + } + ], + "responses": { + "200": { + "description": "Location search results retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WeatherApiObjectResponse" + } + } + } + } + } + } + }, + "/departments/weather": { + "get": { + "tags": [ + "Departments" + ], + "summary": "Get department weather timeline", + "description": "Returns hourly weather, washes, hours and productivity status for a department", + "operationId": "getDepartmentWeatherTimeline", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "minimum": 1 + }, + "description": "Department ID" + } + ], + "responses": { + "200": { + "description": "Department weather timeline retrieved successfully", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/SuccessResponse" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DepartmentWeatherTimelineEntry" + } + } + } + } + ], + "$ref": "#/components/schemas/DepartmentWeatherTimelineResponse" + } + } + } + } + } + } + }, + "/modules/entra/users": { + "get": { + "tags": [ + "Modules" + ], + "summary": "List Microsoft Entra users", + "description": "Get list of users from Microsoft Entra (Azure AD)", + "operationId": "listEntraUsers", + "responses": { + "200": { + "description": "Entra users retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/attachments/upload": { + "post": { + "tags": [ + "Attachments" + ], + "summary": "Upload attachment", + "description": "Upload a file attachment", + "operationId": "uploadAttachment", + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + } + } + } + } + } + }, + "responses": { + "201": { + "description": "Attachment uploaded successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + } + } + } + }, + "/orders/attachments": { + "get": { + "tags": [ + "Attachments" + ], + "summary": "List order attachments", + "description": "Get attachments for an order", + "operationId": "listOrderAttachments", + "parameters": [ + { + "name": "order_id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Order attachments retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/orders/attachments/upload": { + "post": { + "tags": [ + "Attachments" + ], + "summary": "Upload order attachment", + "description": "Upload an attachment to an order", + "operationId": "uploadOrderAttachment", + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "order_id": { + "type": "integer" + }, + "file": { + "type": "string", + "format": "binary" + } + } + } + } + } + }, + "responses": { + "201": { + "description": "Order attachment uploaded successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/orders/attachments/download": { + "get": { + "tags": [ + "Attachments" + ], + "summary": "Download order attachment", + "description": "Download a specific order attachment", + "operationId": "downloadOrderAttachment", + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Attachment downloaded successfully", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + } + } + } + }, + "/form": { + "get": { + "tags": [ + "Forms" + ], + "summary": "Get form", + "description": "Retrieve a form definition", + "operationId": "getForm", + "parameters": [ + { + "name": "id", + "in": "query", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Form retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Forms" + ], + "summary": "Submit form", + "description": "Submit a form", + "operationId": "submitForm", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id", + "data" + ], + "properties": { + "id": { + "type": "string", + "description": "Form identifier" + }, + "data": { + "type": "object", + "description": "Form submission data" + }, + "g_recaptcha_response": { + "type": "string", + "description": "reCAPTCHA verification token (required if not authenticated)" + } + } + } + } + } + }, + "responses": { + "201": { + "description": "Form submitted successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/permissions": { + "get": { + "tags": [ + "Users" + ], + "summary": "List permissions", + "description": "Get list of all available permissions", + "operationId": "listPermissions", + "responses": { + "200": { + "description": "Permissions retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Permission" + } + } + } + } + } + } + } + }, + "/customer/attributes": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get customer attributes", + "description": "Get custom attributes for a customer", + "operationId": "getCustomerAttributes", + "parameters": [ + { + "name": "customer_id", + "in": "query", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Customer attributes retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Users" + ], + "summary": "Add customer attribute", + "description": "Add a custom attribute to a customer", + "operationId": "addCustomerAttribute", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "201": { + "description": "Customer attribute added successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "delete": { + "tags": [ + "Users" + ], + "summary": "Delete customer attribute", + "description": "Remove a custom attribute from a customer", + "operationId": "deleteCustomerAttribute", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "Customer attribute deleted successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/customer/notes": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get customer notes", + "description": "Get notes for a customer", + "operationId": "getCustomerNotes", + "parameters": [ + { + "name": "customer_id", + "in": "query", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Customer notes retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Users" + ], + "summary": "Add customer note", + "description": "Add a note to a customer", + "operationId": "addCustomerNote", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "201": { + "description": "Customer note added successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "delete": { + "tags": [ + "Users" + ], + "summary": "Delete customer note", + "description": "Remove a note from a customer", + "operationId": "deleteCustomerNote", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "Customer note deleted successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/customers/search": { + "post": { + "tags": [ + "Users" + ], + "summary": "Search customers", + "description": "Search for customers using various criteria", + "operationId": "searchCustomers", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "query": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Customers found successfully", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/search/system": { + "get": { + "tags": [ + "Search" + ], + "summary": "System-wide search", + "description": "Search across all supported entities with permission-aware filtering and optional intent parsing debug metadata. Customer records and customer-related entities are matched against a local e-conomic customer index (name/address/email/CVR) that is refreshed by cron. Intent parsing is invoked adaptively when lexical confidence is low or when the query looks intent-driven. Results are ordered by relevance, with recent records preferred when relevance is comparable.", + "operationId": "systemWideSearchGet", + "parameters": [ + { + "in": "query", + "name": "query", + "required": true, + "schema": { + "type": "string" + }, + "description": "Free-text query to search for. Supports natural-language intent fallback and domain synonyms such as `rabat` -> `discount`." + }, + { + "in": "query", + "name": "include_types", + "required": false, + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SystemSearchEntityType" + } + }, + "style": "form", + "explode": false, + "description": "Comma-separated list of entity types to include. Defaults to all allowed types." + }, + { + "in": "query", + "name": "exclude_types", + "required": false, + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SystemSearchEntityType" + } + }, + "style": "form", + "explode": false, + "description": "Comma-separated list of entity types to exclude." + }, + { + "in": "query", + "name": "include_associations", + "required": false, + "schema": { + "type": "boolean", + "default": true + }, + "description": "Include associated objects when matching a primary entity such as a customer." + }, + { + "in": "query", + "name": "debug_intent", + "required": false, + "schema": { + "type": "boolean", + "default": false + }, + "description": "Include intent parser diagnostics in `meta.intent_parser`." + }, + { + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 200, + "default": 50 + } + }, + { + "in": "query", + "name": "offset", + "required": false, + "schema": { + "type": "integer", + "minimum": 0, + "default": 0 + } + } + ], + "responses": { + "200": { + "description": "Search results returned successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SystemSearchResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + } + }, + "post": { + "tags": [ + "Search" + ], + "summary": "System-wide search", + "description": "Search across all supported entities using JSON request payload. Customer-related matches include local e-conomic customer index fields. Intent parsing may run adaptively for intent-driven natural-language queries. Results are ordered by relevance, with recent records preferred when relevance is comparable.", + "operationId": "systemWideSearchPost", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SystemSearchRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Search results returned successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SystemSearchResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + } + } + }, + "/superuser/search/system/cache": { + "delete": { + "tags": [ + "Search" + ], + "summary": "Clear system search caches", + "description": "Clears both query-result cache and intent-parser cache namespaces for system-wide search.", + "operationId": "clearSystemSearchCache", + "responses": { + "200": { + "description": "Cache cleared successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SystemSearchCacheClearResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + } + } + }, + "/superuser/search/system/cache/rebuild": { + "post": { + "tags": [ + "Search" + ], + "summary": "Queue system search cache rebuild", + "description": "Queues a cache rebuild request and clears active query/intent cache namespaces immediately.", + "operationId": "rebuildSystemSearchCache", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SystemSearchCacheRebuildRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Cache rebuild queued successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SystemSearchCacheRebuildResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + } + } + }, + "/economic/config": { + "get": { + "tags": [ + "Config" + ], + "summary": "Get e-conomic config", + "operationId": "getEconomicConfig", + "responses": { + "200": { + "description": "e-conomic configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EconomicConfigListResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Config" + ], + "summary": "Update e-conomic config", + "operationId": "updateEconomicConfig", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "e-conomic configuration updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" + } + } + } + } + } + } + }, + "/reCAPTCHA/config": { + "get": { + "tags": [ + "Config" + ], + "summary": "Get reCAPTCHA config", + "operationId": "getRecaptchaModuleConfig", + "responses": { + "200": { + "description": "reCAPTCHA configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecaptchaConfigListResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Config" + ], + "summary": "Update reCAPTCHA config", + "operationId": "updateRecaptchaConfig", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "reCAPTCHA configuration updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" + } + } + } + } + } + } + }, + "/email/config": { + "get": { + "tags": [ + "Config" + ], + "summary": "Get email config", + "operationId": "getEmailConfig", + "responses": { + "200": { + "description": "Email configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmailConfigListResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Config" + ], + "summary": "Update email config", + "operationId": "updateEmailConfig", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "Email configuration updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" + } + } + } + } + } + } + }, + "/email/config/test": { + "post": { + "tags": [ + "Config" + ], + "summary": "Test email config", + "operationId": "testEmailConfig", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "Email configuration test completed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigTestResponse" + } + } + } + } + } + } + }, + "/backups/config": { + "get": { + "tags": [ + "Config" + ], + "summary": "Get backups config", + "operationId": "getBackupsConfig", + "responses": { + "200": { + "description": "Backups configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BackupsConfigListResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Config" + ], + "summary": "Update backups config", + "operationId": "updateBackupsConfig", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "Backups configuration updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" + } + } + } + } + } + } + }, + "/bird/config": { + "get": { + "tags": [ + "Config" + ], + "summary": "Get Bird config", + "operationId": "getBirdConfig", + "responses": { + "200": { + "description": "Bird configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BirdConfigListResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Config" + ], + "summary": "Update Bird config", + "operationId": "updateBirdConfig", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "Bird configuration updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" + } + } + } + } + } + } + }, + "/motorapi/config": { + "get": { + "tags": [ + "Config" + ], + "summary": "Get MotorAPI config", + "operationId": "getMotorApiConfig", + "responses": { + "200": { + "description": "MotorAPI configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MotorApiConfigListResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Config" + ], + "summary": "Update MotorAPI config", + "operationId": "updateMotorApiConfig", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "MotorAPI configuration updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" + } + } + } + } + } + } + }, + "/stripe/config": { + "get": { + "tags": [ + "Config" + ], + "summary": "Get Stripe config", + "operationId": "getStripeConfig", + "responses": { + "200": { + "description": "Stripe configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StripeConfigListResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Config" + ], + "summary": "Update Stripe config", + "operationId": "updateStripeConfig", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "Stripe configuration updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" + } + } + } + } + } + } + }, + "/fxratesapi/config": { + "get": { + "tags": [ + "Config" + ], + "summary": "Get FXRatesAPI config", + "operationId": "getFxRatesApiConfig", + "responses": { + "200": { + "description": "FXRatesAPI configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FxRatesApiConfigListResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Config" + ], + "summary": "Update FXRatesAPI config", + "operationId": "updateFxRatesApiConfig", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "FXRatesAPI configuration updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" + } + } + } + } + } + } + }, + "/weatherapi/config": { + "get": { + "tags": [ + "Config" + ], + "summary": "Get WeatherAPI config", + "operationId": "getWeatherApiConfig", + "responses": { + "200": { + "description": "WeatherAPI configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WeatherApiConfigListResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Config" + ], + "summary": "Update WeatherAPI config", + "operationId": "updateWeatherApiConfig", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "WeatherAPI configuration updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" + } + } + } + } + } + } + }, + "/gatewayapi/config": { + "get": { + "tags": [ + "Config" + ], + "summary": "Get GatewayAPI config", + "operationId": "getGatewayApiConfig", + "responses": { + "200": { + "description": "GatewayAPI configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GatewayApiConfigListResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Config" + ], + "summary": "Update GatewayAPI config", + "operationId": "updateGatewayApiConfig", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "GatewayAPI configuration updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" + } + } + } + } + } + } + }, + "/xlvask/config": { + "get": { + "tags": [ + "Config" + ], + "summary": "Get XLVask config", + "operationId": "getXlvaskConfig", + "responses": { + "200": { + "description": "XLVask configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/XlvaskConfigListResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Config" + ], + "summary": "Update XLVask config", + "operationId": "updateXlvaskConfig", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "XLVask configuration updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" + } + } + } + } + } + } + }, + "/entra/config": { + "get": { + "tags": [ + "Config" + ], + "summary": "Get Entra config", + "operationId": "getEntraConfig", + "responses": { + "200": { + "description": "Entra configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntraConfigListResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Config" + ], + "summary": "Update Entra config", + "operationId": "updateEntraConfig", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "Entra configuration updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" + } + } + } + } + } + } + }, + "/limble/config": { + "get": { + "tags": [ + "Config" + ], + "summary": "Get Limble config", + "operationId": "getLimbleConfig", + "responses": { + "200": { + "description": "Limble configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LimbleConfigListResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Config" + ], + "summary": "Update Limble config", + "operationId": "updateLimbleConfig", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "Limble configuration updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" + } + } + } + } + } + } + }, + "/ocrspace/config": { + "get": { + "tags": [ + "Config" + ], + "summary": "Get OcrSpace config", + "operationId": "getOcrSpaceConfig", + "responses": { + "200": { + "description": "OcrSpace configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OcrSpaceConfigListResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Config" + ], + "summary": "Update OcrSpace config", + "operationId": "updateOcrSpaceConfig", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "OcrSpace configuration updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" + } + } + } + } + } + } + }, + "/openai/config": { + "get": { + "tags": [ + "Config" + ], + "summary": "Get OpenAI config", + "operationId": "getOpenAiConfig", + "responses": { + "200": { + "description": "OpenAI configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OpenAiConfigListResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Config" + ], + "summary": "Update OpenAI config", + "operationId": "updateOpenAiConfig", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "OpenAI configuration updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" + } + } + } + } + } + } + }, + "/licenseplaterecognizer/config": { + "get": { + "tags": [ + "Config" + ], + "summary": "Get LicensePlateRecognizer config", + "operationId": "getLicensePlateRecognizerConfig", + "responses": { + "200": { + "description": "LicensePlateRecognizer configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LicensePlateRecognizerConfigListResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Config" + ], + "summary": "Update LicensePlateRecognizer config", + "operationId": "updateLicensePlateRecognizerConfig", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "LicensePlateRecognizer configuration updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" + } + } + } + } + } + } + }, + "/virkdata/config": { + "get": { + "tags": [ + "Config" + ], + "summary": "Get Virkdata config", + "operationId": "getVirkdataConfig", + "responses": { + "200": { + "description": "Virkdata configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VirkdataConfigListResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Config" + ], + "summary": "Update Virkdata config", + "operationId": "updateVirkdataConfig", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "Virkdata configuration updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" + } + } + } + } + } + } + }, + "/shelly/config": { + "get": { + "tags": [ + "Config" + ], + "summary": "Get Shelly config", + "operationId": "getShellyConfig", + "responses": { + "200": { + "description": "Shelly configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ShellyConfigListResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Config" + ], + "summary": "Update Shelly config", + "operationId": "updateShellyConfig", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": {} + } + } + }, + "responses": { + "200": { + "description": "Shelly configuration updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" + } + } + } + } + } + } + }, + "/selfserve/config": { + "get": { + "tags": [ + "Config" + ], + "summary": "Get Self-Serve config", + "operationId": "getSelfServeConfig", + "responses": { + "200": { + "description": "Self-serve configuration retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SelfServeConfigListResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Config" + ], + "summary": "Update Self-Serve config", + "operationId": "updateSelfServeConfig", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SelfServeConfig" + } + } + } + }, + "responses": { + "200": { + "description": "Self-serve configuration updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" + } + } + } + } + } + } + }, + "/branding": { + "get": { + "tags": [ + "Branding" + ], + "summary": "List branding options", + "description": "Retrieve a list of branding options or a specific branding option if ID is provided", + "operationId": "listBrandingOptions", + "parameters": [ + { + "name": "id", + "in": "query", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "$ref": "#/components/parameters/PageParam" + }, + { + "$ref": "#/components/parameters/PerPageParam" + } + ], + "responses": { + "200": { + "description": "Branding options retrieved successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + } + }, + "post": { + "tags": [ + "Branding" + ], + "summary": "Add branding option", + "description": "Create a new branding option", + "operationId": "addBrandingOption", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "name", + "description", + "cvr" + ], + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "cvr": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Branding option added successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + } + }, + "put": { + "tags": [ + "Branding" + ], + "summary": "Edit branding option", + "description": "Update an existing branding option", + "operationId": "editBrandingOption", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "cvr": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Branding option updated successfully", + "content": { + "application/json": { + "schema": {} + } + } + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + } + } + }, + "/roles": { + "get": { + "tags": [ + "Roles" + ], + "summary": "List roles", + "operationId": "listRoles", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Roles" + ], + "summary": "Add role", + "operationId": "addRole", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "put": { + "tags": [ + "Roles" + ], + "summary": "Edit role", + "operationId": "editRole", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/roles/permissions": { + "post": { + "tags": [ + "Roles" + ], + "summary": "Add permission to role", + "operationId": "addRolePermission", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "role_id", + "permission" + ], + "properties": { + "role_id": { + "type": "integer" + }, + "permission": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "delete": { + "tags": [ + "Roles" + ], + "summary": "Remove permission from role", + "operationId": "removeRolePermission", + "parameters": [ + { + "name": "role_id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "name": "permission", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/roles/clone": { + "post": { + "tags": [ + "Roles" + ], + "summary": "Clone role", + "operationId": "cloneRole", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "role_id", + "name" + ], + "properties": { + "role_id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/washcertificates": { + "get": { + "tags": [ + "Modules" + ], + "summary": "List wash certificates", + "operationId": "listWashCertificates", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/xlvask/services/usage/orders": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Get XLVask usage orders", + "operationId": "getXlvaskUsageOrders", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/modules/xlvask/services/usage/orders/fast-link": { + "get": { + "tags": [ + "Modules" + ], + "summary": "Get XLVask usage orders fast link", + "operationId": "getXlvaskUsageOrdersFastLink", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/superuser/department": { + "get": { + "tags": [ + "Departments" + ], + "summary": "List departments (superuser)", + "operationId": "listSuperuserDepartments", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/superuser/department/prices": { + "get": { + "tags": [ + "Departments" + ], + "summary": "Get department prices", + "operationId": "getDepartmentPrices", + "parameters": [ + { + "name": "department_id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Departments" + ], + "summary": "Set department price", + "operationId": "setDepartmentPrice", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "department_id", + "product_id", + "price" + ], + "properties": { + "department_id": { + "type": "integer" + }, + "product_id": { + "type": "integer" + }, + "price": { + "type": "integer" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/superuser/department/variables": { + "get": { + "tags": [ + "Departments" + ], + "summary": "Get department variables", + "operationId": "getDepartmentVariables", + "parameters": [ + { + "name": "department_id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Departments" + ], + "summary": "Set department variable", + "operationId": "setDepartmentVariable", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "department_id", + "variable", + "value" + ], + "properties": { + "department_id": { + "type": "integer" + }, + "variable": { + "type": "string" + }, + "value": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/departments/daily-reports": { + "get": { + "tags": [ + "Departments" + ], + "summary": "List daily reports", + "operationId": "listDailyReports", + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "post": { + "tags": [ + "Departments" + ], + "summary": "Add daily report", + "operationId": "addDailyReport", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "department_id", + "date", + "report" + ], + "properties": { + "department_id": { + "type": "integer" + }, + "date": { + "type": "string" + }, + "report": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + }, + "put": { + "tags": [ + "Departments" + ], + "summary": "Edit daily report", + "operationId": "editDailyReport", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id", + "report" + ], + "properties": { + "id": { + "type": "integer" + }, + "report": { + "type": "string" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/departments/daily-reports/get": { + "get": { + "tags": [ + "Departments" + ], + "summary": "Get daily report", + "operationId": "getDailyReport", + "parameters": [ + { + "name": "department_id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "name": "date", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/departments/daily-reports/product-count": { + "get": { + "tags": [ + "Departments" + ], + "summary": "Get product count for daily reports", + "operationId": "getDailyReportProductCount", + "parameters": [ + { + "name": "date", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "date_to", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "department_id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "name": "product_id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/departments/daily-reports/transaction-count": { + "get": { + "tags": [ + "Departments" + ], + "summary": "Get transaction count for daily reports", + "operationId": "getDailyReportTransactionCount", + "parameters": [ + { + "name": "date", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "date_to", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "department_id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/departments/daily-reports/bookings-count": { + "get": { + "tags": [ + "Departments" + ], + "summary": "Get bookings count for daily reports", + "operationId": "getDailyReportBookingsCount", + "parameters": [ + { + "name": "date", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "department_id", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/account/security/passkeys": { + "get": { + "tags": [ + "Security" + ], + "summary": "List passkeys for the authenticated user", + "operationId": "listPasskeys", + "responses": { + "200": { + "description": "A list of passkeys", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Passkey" + } + } + } + } + }, + "400": { + "description": "Invalid session or request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "post": { + "tags": [ + "Security" + ], + "summary": "Create/add a passkey for the authenticated user", + "operationId": "createPasskey", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PasskeyCreateRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Passkey created", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "id": { + "type": "integer" + } + } + } + } + } + }, + "400": { + "description": "Invalid session or request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/account/security/passkeys/{id}": { + "patch": { + "tags": [ + "Security" + ], + "summary": "Rename a passkey", + "operationId": "renamePasskey", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PasskeyRenameRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Passkey renamed", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "Not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Security" + ], + "summary": "Delete a passkey", + "operationId": "deletePasskey", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Passkey deleted", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "Not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + } + }, + "components": { + "securitySchemes": { + "BearerAuth": { + "type": "http", + "scheme": "bearer", + "bearerFormat": "JWT", + "description": "JWT token obtained from /auth/login or /auth/employee/login" + } + }, + "parameters": { + "PageParam": { + "name": "page", + "in": "query", + "description": "Page number for pagination", + "schema": { + "type": "integer", + "minimum": 1, + "default": 1 + } + }, + "PerPageParam": { + "name": "per_page", + "in": "query", + "description": "Number of items per page", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 30 + } + }, + "SearchParam": { + "name": "search", + "in": "query", + "description": "Search query string", + "schema": { + "type": "string" + } + }, + "LimitParam": { + "name": "limit", + "in": "query", + "description": "Number of items per page", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 1000, + "default": 100 + } + }, + "FiltersParam": { + "name": "filters", + "in": "query", + "description": "Filters for the list (e.g., module:selfserve,status_code:200)", + "schema": { + "type": "string" + } + }, + "XCustomerNumber": { + "name": "X-Customer-Number", + "in": "header", + "required": false, + "description": "Target customer number for subuser requests. Ignored for classic user sessions.\nRequired on customer-scoped endpoints when authenticated as a subuser unless\nthe target customer can be inferred from context.\n", + "schema": { + "type": "integer" + } + } + }, + "responses": { + "BadRequest": { + "description": "Bad request - Invalid input parameters", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "Unauthorized": { + "description": "Unauthorized - Invalid or missing authentication token", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "Forbidden": { + "description": "Forbidden - Insufficient permissions", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "NotFound": { + "description": "Not found - Resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "InternalServerError": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "schemas": { + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string", + "description": "Error message" + }, + "code": { + "type": "integer", + "description": "HTTP status code" + } + } + }, + "SystemSearchEntityType": { + "type": "string", + "enum": [ + "objects", + "module_config", + "orders", + "order_items", + "customers", + "employees", + "users", + "subusers", + "customer_discounts", + "customer_fixed_prices", + "departments", + "permissions", + "roles", + "invoices", + "vehicles", + "bookings", + "bookings_new", + "branding", + "categories", + "currency_conversion_rates", + "customer_codes", + "customer_default_department", + "customer_notes", + "customer_vehicles_addons", + "department_categories", + "department_daily_reports", + "department_gates", + "department_goals", + "department_lanes", + "department_notification_sms", + "department_relays", + "department_selfserve_condition_rules", + "department_selfserve_conditions", + "department_selfserve_questions", + "department_selfserve_tasks", + "department_selfserve_vehicle_conditions", + "department_time_bookings_entries", + "department_time_bookings_opening_hours", + "department_time_bookings_types", + "department_variables", + "fxratesapi_conversion_rates", + "module_action_logs", + "motorapi_lookups", + "notifications", + "order_bookings", + "plate_scanners", + "plate_scans", + "product_options", + "products", + "stripe_module_customers", + "stripe_module_orders", + "stripe_payment_intents", + "subuser_grants", + "xlvask_customers", + "xlvask_potential_order_matches", + "xlvask_usage_log_wash_items", + "xlvask_usage_logs", + "xlvask_vehicle_types", + "xlvask_vehicles" + ] + }, + "SystemSearchRequest": { + "type": "object", + "required": [ + "query" + ], + "properties": { + "query": { + "type": "string", + "description": "Free-text query to search for. Customer lookups include local e-conomic index fields and lexical synonym expansion (for example `rabat` -> `discount`)." + }, + "include_types": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SystemSearchEntityType" + }, + "description": "Limit search to these entity types." + }, + "exclude_types": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SystemSearchEntityType" + }, + "description": "Exclude these entity types from search." + }, + "include_associations": { + "type": "boolean", + "default": true, + "description": "Include associated records for matched core entities." + }, + "debug_intent": { + "type": "boolean", + "default": false, + "description": "Include parser diagnostics in `meta.intent_parser`." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 200, + "default": 50 + }, + "offset": { + "type": "integer", + "minimum": 0, + "default": 0 + } + } + }, + "SystemSearchResult": { + "type": "object", + "properties": { + "entity_type": { + "$ref": "#/components/schemas/SystemSearchEntityType" + }, + "entity_id": { + "type": "string" + }, + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "customer_number": { + "type": "integer", + "nullable": true + }, + "department_id": { + "type": "integer", + "nullable": true + }, + "score": { + "type": "integer" + }, + "association_reason": { + "type": "string", + "nullable": true + }, + "payload": { + "type": "object", + "additionalProperties": true + } + }, + "required": [ + "entity_type", + "entity_id", + "title", + "score" + ] + }, + "SystemSearchIntentParserMeta": { + "type": "object", + "properties": { + "invoked": { + "type": "boolean" + }, + "source": { + "type": "string", + "enum": [ + "cache", + "openai", + "none" + ] + }, + "status": { + "type": "string" + }, + "confidence": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "expanded_terms": { + "type": "array", + "items": { + "type": "string" + } + }, + "entity_hints": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SystemSearchEntityType" + } + }, + "fallback_reason": { + "type": "string", + "nullable": true + } + }, + "required": [ + "invoked", + "source", + "status", + "confidence", + "expanded_terms", + "entity_hints" + ] + }, + "SystemSearchMeta": { + "type": "object", + "properties": { + "query": { + "type": "string" + }, + "limit": { + "type": "integer" + }, + "offset": { + "type": "integer" + }, + "total": { + "type": "integer" + }, + "allowed_types": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SystemSearchEntityType" + } + }, + "cache": { + "type": "object", + "properties": { + "hit": { + "type": "boolean" + } + }, + "required": [ + "hit" + ] + }, + "intent_parser": { + "$ref": "#/components/schemas/SystemSearchIntentParserMeta" + } + }, + "required": [ + "query", + "limit", + "offset", + "total", + "allowed_types", + "cache" + ] + }, + "SystemSearchPayload": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SystemSearchResult" + } + }, + "grouped_results": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SystemSearchResult" + } + } + }, + "meta": { + "$ref": "#/components/schemas/SystemSearchMeta" + } + }, + "required": [ + "results", + "grouped_results", + "meta" + ] + }, + "SystemSearchResponse": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "data": { + "$ref": "#/components/schemas/SystemSearchPayload" + }, + "meta": { + "type": "object", + "additionalProperties": true + }, + "includes": { + "type": "object", + "additionalProperties": true + } + }, + "required": [ + "success", + "data", + "meta", + "includes" + ] + }, + "SystemSearchCacheClearResponse": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "data": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "query_cache_cleared": { + "type": "boolean" + }, + "intent_cache_cleared": { + "type": "boolean" + } + }, + "required": [ + "message", + "query_cache_cleared", + "intent_cache_cleared" + ] + }, + "meta": { + "type": "object", + "additionalProperties": true + }, + "includes": { + "type": "object", + "additionalProperties": true + } + }, + "required": [ + "success", + "data", + "meta", + "includes" + ] + }, + "SystemSearchCacheRebuildRequest": { + "type": "object", + "properties": { + "scope": { + "type": "string", + "enum": [ + "all", + "types", + "dirty" + ], + "default": "all" + }, + "types": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SystemSearchEntityType" + } + } + } + }, + "SystemSearchCacheRebuildResponse": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "data": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "request": { + "type": "object", + "properties": { + "scope": { + "type": "string", + "enum": [ + "all", + "types", + "dirty" + ] + }, + "types": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SystemSearchEntityType" + } + }, + "requested_at": { + "type": "integer" + } + }, + "required": [ + "scope", + "types", + "requested_at" + ] + }, + "query_cache_cleared": { + "type": "boolean" + }, + "intent_cache_cleared": { + "type": "boolean" + } + }, + "required": [ + "message", + "request", + "query_cache_cleared", + "intent_cache_cleared" + ] + }, + "meta": { + "type": "object", + "additionalProperties": true + }, + "includes": { + "type": "object", + "additionalProperties": true + } + }, + "required": [ + "success", + "data", + "meta", + "includes" + ] + }, + "ModuleConfigValue": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": true + } + ], + "nullable": true + }, + "ModuleConfigEnvelopeBase": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "meta": { + "oneOf": [ + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": true + } + ] + }, + "includes": { + "oneOf": [ + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": true + } + ] + } + }, + "required": [ + "success", + "meta", + "includes" + ] + }, + "EconomicConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "enum": [ + "economic" + ] + }, + "variable": { + "type": "string", + "enum": [ + "adminFeeMonthly", + "adminFeeOrder", + "feeProductId", + "invoiceLayoutNumber", + "paymentTermsNumber" + ] + }, + "type": { + "type": "string", + "enum": [ + "string", + "int" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "RecaptchaConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "enum": [ + "reCAPTCHA" + ] + }, + "variable": { + "type": "string", + "enum": [ + "enabled", + "secret_key_v2", + "site_key_v2" + ] + }, + "type": { + "type": "string", + "enum": [ + "bool", + "string" + ] + }, + "value": { + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "EmailConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "enum": [ + "Email" + ] + }, + "variable": { + "type": "string", + "enum": [ + "enabled", + "mailersend_api_key", + "mailersend_enabled", + "smtp_encryption", + "smtp_from", + "smtp_from_name", + "smtp_host", + "smtp_password", + "smtp_port", + "smtp_reply_to", + "smtp_reply_to_name", + "smtp_username" + ] + }, + "type": { + "type": "string", + "enum": [ + "bool", + "string", + "int" + ] + }, + "value": { + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string" + }, + { + "type": "integer" + } + ] + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "BackupsConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "enum": [ + "Backups" + ] + }, + "variable": { + "type": "string", + "enum": [ + "enabled" + ] + }, + "type": { + "type": "string", + "enum": [ + "bool" + ] + }, + "value": { + "type": "boolean" + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "BirdConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "enum": [ + "bird" + ] + }, + "variable": { + "type": "string", + "enum": [ + "api_key", + "enabled", + "server_url", + "workplaceId", + "channelId" + ] + }, + "type": { + "type": "string", + "enum": [ + "string", + "bool" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "boolean" + } + ] + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "MotorApiConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "enum": [ + "motorapi" + ] + }, + "variable": { + "type": "string", + "enum": [ + "daily_limit", + "enabled", + "secret_key" + ] + }, + "type": { + "type": "string", + "enum": [ + "int", + "bool", + "string" + ] + }, + "value": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "boolean" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "StripeConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "enum": [ + "Stripe" + ] + }, + "variable": { + "type": "string", + "enum": [ + "economic_customer_number", + "enabled", + "publishable_key", + "secret_key" + ] + }, + "type": { + "type": "string", + "enum": [ + "int", + "bool", + "string" + ] + }, + "value": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "boolean" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "FxRatesApiConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "enum": [ + "fxratesapi" + ] + }, + "variable": { + "type": "string", + "enum": [ + "daily_limit", + "enabled", + "secret_key" + ] + }, + "type": { + "type": "string", + "enum": [ + "int", + "bool", + "string" + ] + }, + "value": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "boolean" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "WeatherApiConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "enum": [ + "weatherapi" + ] + }, + "variable": { + "type": "string", + "enum": [ + "enabled", + "secret_key" + ] + }, + "type": { + "type": "string", + "enum": [ + "bool", + "string" + ] + }, + "value": { + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "GatewayApiConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "enum": [ + "GatewayAPI" + ] + }, + "variable": { + "type": "string", + "enum": [ + "api_key", + "api_secret", + "api_token", + "enabled", + "sender" + ] + }, + "type": { + "type": "string", + "enum": [ + "string", + "bool" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "boolean" + } + ] + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "XlvaskConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "enum": [ + "xlvask" + ] + }, + "variable": { + "type": "string", + "enum": [ + "enabled", + "password", + "synchronization_enabled", + "username" + ] + }, + "type": { + "type": "string", + "enum": [ + "bool", + "string" + ] + }, + "value": { + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "EntraConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "enum": [ + "Entra" + ] + }, + "variable": { + "type": "string", + "enum": [ + "enabled", + "entra_client_id", + "entra_client_secret", + "entra_tenant_id" + ] + }, + "type": { + "type": "string", + "enum": [ + "bool", + "string" + ] + }, + "value": { + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "LimbleConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "enum": [ + "limble" + ] + }, + "variable": { + "type": "string", + "enum": [ + "client_id", + "client_secret", + "enabled", + "webhooks_enabled" + ] + }, + "type": { + "type": "string", + "enum": [ + "string", + "bool" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "boolean" + } + ] + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "OcrSpaceConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "enum": [ + "ocrSpace" + ] + }, + "variable": { + "type": "string", + "enum": [ + "api_key", + "enabled" + ] + }, + "type": { + "type": "string", + "enum": [ + "string", + "bool" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "boolean" + } + ] + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "OpenAiConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "enum": [ + "openAI" + ] + }, + "variable": { + "type": "string", + "enum": [ + "api_key", + "enabled" + ] + }, + "type": { + "type": "string", + "enum": [ + "string", + "bool" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "boolean" + } + ] + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "LicensePlateRecognizerConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "enum": [ + "licenseplaterecognizer" + ] + }, + "variable": { + "type": "string", + "enum": [ + "api_key", + "enabled" + ] + }, + "type": { + "type": "string", + "enum": [ + "string", + "bool" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "boolean" + } + ] + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "VirkdataConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "enum": [ + "virkdata" + ] + }, + "variable": { + "type": "string", + "enum": [ + "enabled", + "monthly_limit", + "secret_key" + ] + }, + "type": { + "type": "string", + "enum": [ + "bool", + "int", + "string" + ] + }, + "value": { + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "integer" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "ShellyConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "enum": [ + "shelly" + ] + }, + "variable": { + "type": "string", + "enum": [ + "enabled", + "secret_key", + "server_url" + ] + }, + "type": { + "type": "string", + "enum": [ + "bool", + "string" + ] + }, + "value": { + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "SelfServeConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "enum": [ + "selfserve" + ] + }, + "variable": { + "type": "string", + "enum": [ + "enabled", + "minute_product" + ] + }, + "type": { + "type": "string", + "enum": [ + "bool", + "int" + ] + }, + "value": { + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "integer" + } + ] + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "EconomicConfigListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EconomicConfigEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "RecaptchaConfigListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RecaptchaConfigEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "EmailConfigListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EmailConfigEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "BackupsConfigListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BackupsConfigEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "BirdConfigListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BirdConfigEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "MotorApiConfigListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MotorApiConfigEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "StripeConfigListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StripeConfigEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "FxRatesApiConfigListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FxRatesApiConfigEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "WeatherApiConfigListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/WeatherApiConfigEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "GatewayApiConfigListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GatewayApiConfigEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "XlvaskConfigListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/XlvaskConfigEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "EntraConfigListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EntraConfigEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "LimbleConfigListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LimbleConfigEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "OcrSpaceConfigListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OcrSpaceConfigEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "OpenAiConfigListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OpenAiConfigEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "LicensePlateRecognizerConfigListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LicensePlateRecognizerConfigEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "VirkdataConfigListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VirkdataConfigEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "ShellyConfigListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ShellyConfigEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "SelfServeConfigListResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SelfServeConfigEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "DepartmentWeatherStatus": { + "type": "string", + "enum": [ + "unknown", + "healthy", + "degraded", + "unhealthy" + ] + }, + "DepartmentWeatherCondition": { + "type": "string", + "enum": [ + "clear", + "mostly_clear", + "partly_cloudy", + "mostly_cloudy", + "overcast", + "rain", + "showers", + "thunderstorm", + "snow", + "fog" + ] + }, + "DepartmentWeatherTimelineEntry": { + "type": "object", + "properties": { + "time": { + "type": "string", + "example": "01:00" + }, + "weather": { + "$ref": "#/components/schemas/DepartmentWeatherCondition" + }, + "washes": { + "type": "integer", + "minimum": 0, + "example": 0 + }, + "hours": { + "type": "integer", + "minimum": 0, + "example": 10 + }, + "status": { + "$ref": "#/components/schemas/DepartmentWeatherStatus" + } + }, + "required": [ + "time", + "weather", + "washes", + "hours", + "status" + ] + }, + "WeatherApiObjectResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "object", + "additionalProperties": true + } + }, + "required": [ + "data" + ] + } + ] + }, + "DepartmentWeatherTimelineResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ModuleConfigEnvelopeBase" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DepartmentWeatherTimelineEntry" + } + } + }, + "required": [ + "data" + ] + } + ] + }, + "ModuleConfigEntry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "description": "Module name" + }, + "variable": { + "type": "string", + "description": "Configuration variable key" + }, + "type": { + "type": "string", + "description": "Stored value type in module_config" + }, + "value": { + "$ref": "#/components/schemas/ModuleConfigValue" + } + }, + "required": [ + "module", + "variable", + "type", + "value" + ] + }, + "ModuleConfigListResponse": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ModuleConfigEntry" + } + }, + "meta": { + "oneOf": [ + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": true + } + ] + }, + "includes": { + "oneOf": [ + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": true + } + ] + } + }, + "required": [ + "success", + "data", + "meta", + "includes" + ] + }, + "ModuleConfigUpdateResponse": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "data": { + "type": "boolean" + }, + "meta": { + "oneOf": [ + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": true + } + ] + }, + "includes": { + "oneOf": [ + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": true + } + ] + } + }, + "required": [ + "success", + "data", + "meta", + "includes" + ] + }, + "ModuleConfigTestResponse": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "data": { + "type": "string" + }, + "meta": { + "oneOf": [ + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": true + } + ] + }, + "includes": { + "oneOf": [ + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": true + } + ] + } + }, + "required": [ + "success", + "data", + "meta", + "includes" + ] + }, + "User": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "User ID" + }, + "customer_number": { + "type": "integer", + "description": "e-conomic customer number" + }, + "display_name": { + "type": "string", + "description": "User's display name" + }, + "group_id": { + "type": "integer", + "description": "User group/role ID" + }, + "phone_country_code": { + "type": "integer", + "description": "Phone country code" + }, + "phone": { + "type": "integer", + "description": "Phone number" + }, + "email": { + "type": "string", + "format": "email", + "description": "Email address" + }, + "sms_notifications_enabled": { + "type": "boolean", + "description": "SMS notifications enabled" + }, + "email_notifications_enabled": { + "type": "boolean", + "description": "Email notifications enabled" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "SubuserGrant": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "billing_customer_number": { + "type": "integer", + "description": "e-conomic customer number" + }, + "subuser": { + "type": "integer", + "description": "Subuser ID" + }, + "enabled": { + "type": "boolean" + }, + "note": { + "type": "string", + "nullable": true + }, + "permissions": { + "type": "array", + "description": "List of permission node keys", + "items": { + "type": "string", + "example": "BOOKINGS_LIST" + } + }, + "created_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "updated_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "deleted_at": { + "type": "string", + "format": "date-time", + "nullable": true + } + } + }, + "SubuserGrantCreateRequest": { + "type": "object", + "required": [ + "customer_number", + "subuser_id" + ], + "properties": { + "customer_number": { + "type": "integer", + "description": "e-conomic customer number" + }, + "subuser_id": { + "type": "integer", + "description": "Subuser ID to grant permissions for" + }, + "enabled": { + "type": "boolean", + "default": true + }, + "note": { + "type": "string", + "nullable": true, + "maxLength": 65535 + }, + "permissions": { + "type": "array", + "description": "Optional list of permission keys; defaults will be applied if omitted", + "items": { + "type": "string" + } + } + } + }, + "SubuserGrantUpdateRequest": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "note": { + "type": "string", + "nullable": true, + "maxLength": 65535 + }, + "permissions": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "SubuserGrantSummary": { + "type": "object", + "description": "Summary of a subuser grant grouped by billing customer number", + "properties": { + "billing_customer_number": { + "type": "integer", + "description": "e-conomic customer number this grant applies to" + }, + "permissions": { + "type": "array", + "description": "List of permission node keys enabled for this customer", + "items": { + "type": "string" + } + } + } + }, + "SubuserSelf": { + "type": "object", + "description": "Authenticated subuser profile with enabled grants", + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string", + "nullable": true + }, + "email": { + "type": "string", + "format": "email", + "nullable": true + }, + "phone_country_code": { + "type": "integer", + "nullable": true + }, + "phone": { + "type": "integer", + "nullable": true + }, + "grants": { + "type": "array", + "description": "Enabled, non-deleted grants for the subuser grouped by billing customer number", + "items": { + "$ref": "#/components/schemas/SubuserGrantSummary" + } + }, + "created_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "updated_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "suspended_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "two_factor_enabled": { + "type": "boolean", + "description": "Indicates if 2FA is enabled for this account" + } + } + }, + "PermissionNode": { + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "Permission node key" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "type": { + "type": "string", + "description": "Permission type (e.g., TOGGLE)" + }, + "default": { + "type": "boolean" + } + } + }, + "PermissionNodeGroup": { + "type": "object", + "properties": { + "group": { + "type": "string" + }, + "description": { + "type": "string" + }, + "nodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PermissionNode" + } + } + } + }, + "UserCreate": { + "type": "object", + "required": [ + "customer_number", + "password" + ], + "properties": { + "customer_number": { + "type": "integer" + }, + "password": { + "type": "string", + "format": "password" + }, + "display_name": { + "type": "string" + }, + "group_id": { + "type": "integer" + }, + "email": { + "type": "string", + "format": "email" + }, + "phone": { + "type": "integer" + }, + "phone_country_code": { + "type": "integer" + } + } + }, + "UserUpdate": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "customer_number": { + "type": "integer" + }, + "display_name": { + "type": "string" + }, + "group_id": { + "type": "integer" + }, + "email": { + "type": "string", + "format": "email" + }, + "phone": { + "type": "integer" + }, + "phone_country_code": { + "type": "integer" + } + } + }, + "Order": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "Order ID" + }, + "customer_id": { + "type": "integer", + "description": "Customer number" + }, + "customer_name": { + "type": "string", + "description": "Customer name" + }, + "user_id": { + "type": "integer", + "description": "User ID" + }, + "cashier_id": { + "type": "integer", + "description": "Cashier user ID" + }, + "cashier_name": { + "type": "string", + "description": "Cashier name" + }, + "department_id": { + "type": "integer", + "description": "Department ID" + }, + "status": { + "type": "string", + "description": "Order status" + }, + "total_net_amount": { + "type": "number", + "format": "float", + "description": "Total order amount" + }, + "po": { + "type": "string", + "description": "Purchase order number", + "nullable": true + }, + "lane": { + "type": "string", + "description": "Lane information", + "nullable": true + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "CollectedInvoiceEconomicCompareResponse": { + "type": "object", + "description": "Result of comparing a collected invoice with its E-conomic counterpart", + "properties": { + "collected_invoice_id": { + "type": "integer", + "description": "The internal collected invoice ID", + "example": 123 + }, + "draft_id": { + "type": "integer", + "nullable": true, + "description": "E-conomic draft invoice ID, if present", + "example": 456 + }, + "booked_id": { + "type": "integer", + "nullable": true, + "description": "E-conomic booked invoice ID, if present", + "example": 28368 + }, + "warnings": { + "type": "array", + "description": "List of warnings detected during comparison", + "items": { + "type": "string" + }, + "example": [ + "Total amount mismatch for draft invoice ID 456: E-Conomic total is 867.5, internal total is 694" + ] + }, + "draft_total": { + "type": "number", + "format": "float", + "nullable": true, + "description": "Total amount from the E-conomic draft (gross)", + "example": 867.5 + }, + "booked_total": { + "type": "number", + "format": "float", + "nullable": true, + "description": "Total amount from the E-conomic booked invoice (gross minus VAT if applicable)", + "example": 694 + }, + "difference": { + "type": "number", + "format": "float", + "nullable": true, + "description": "Selected e-conomic total (draft when available, otherwise booked) minus internal_total", + "example": 0 + }, + "internal_total": { + "type": "number", + "format": "float", + "description": "Internal total amount for the collected invoice", + "example": 694 + } + }, + "required": [ + "collected_invoice_id", + "internal_total" + ] + }, + "CollectedInvoiceEconomicV2DetailsResponse": { + "type": "object", + "properties": { + "collected_invoice_id": { + "type": "integer" + }, + "external_id": { + "type": "string" + }, + "order_ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "economic": { + "type": "object", + "properties": { + "draft_id": { + "type": "integer", + "nullable": true + }, + "booked_id": { + "type": "integer", + "nullable": true + } + } + }, + "customer": { + "$ref": "#/components/schemas/CollectedInvoiceEconomicV2CustomerSummary" + }, + "internal": { + "type": "object", + "required": [ + "normalized" + ], + "properties": { + "normalized": { + "$ref": "#/components/schemas/EconomicV2NormalizedInvoice" + } + } + }, + "draft": { + "type": "object", + "properties": { + "exists": { + "type": "boolean" + }, + "raw": { + "type": "object", + "nullable": true, + "additionalProperties": true + }, + "normalized": { + "allOf": [ + { + "$ref": "#/components/schemas/EconomicV2NormalizedInvoice" + } + ], + "nullable": true + } + } + }, + "booked": { + "type": "object", + "properties": { + "exists": { + "type": "boolean" + }, + "raw": { + "type": "object", + "nullable": true, + "additionalProperties": true + }, + "normalized": { + "allOf": [ + { + "$ref": "#/components/schemas/EconomicV2NormalizedInvoice" + } + ], + "nullable": true + } + } + }, + "warnings": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "collected_invoice_id", + "order_ids", + "economic", + "customer", + "internal", + "draft", + "booked", + "warnings" + ] + }, + "CollectedInvoiceEconomicV2CustomerSummary": { + "type": "object", + "properties": { + "internal_customer_number": { + "type": "integer", + "nullable": true + }, + "draft_customer_number": { + "type": "integer", + "nullable": true + }, + "booked_customer_number": { + "type": "integer", + "nullable": true + }, + "exists": { + "type": "boolean" + }, + "name": { + "type": "string", + "nullable": true + }, + "barred": { + "type": "boolean", + "nullable": true + } + }, + "required": [ + "exists" + ] + }, + "CollectedInvoiceEconomicV2CompareResponse": { + "type": "object", + "properties": { + "collected_invoice_id": { + "type": "integer" + }, + "details": { + "$ref": "#/components/schemas/CollectedInvoiceEconomicV2DetailsResponse" + }, + "comparison": { + "$ref": "#/components/schemas/EconomicV2Comparison" + }, + "warnings": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "collected_invoice_id", + "details", + "comparison", + "warnings" + ] + }, + "CollectedInvoiceEconomicV2CompareBulkResponse": { + "type": "object", + "properties": { + "requested": { + "type": "integer" + }, + "compared": { + "type": "integer" + }, + "failed": { + "type": "integer" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CollectedInvoiceEconomicV2CompareResponse" + } + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "collected_invoice_id": { + "type": "integer" + }, + "error": { + "type": "string" + } + } + } + } + }, + "required": [ + "requested", + "compared", + "failed", + "results", + "errors" + ] + }, + "CollectedInvoiceEconomicV2RevenueStatisticsResponse": { + "type": "object", + "properties": { + "filters": { + "type": "object", + "properties": { + "dateFrom": { + "type": "string", + "format": "date" + }, + "dateTo": { + "type": "string", + "format": "date" + }, + "customer_numbers": { + "type": "array", + "items": { + "type": "integer" + } + }, + "department_numbers": { + "type": "array", + "items": { + "type": "integer" + } + }, + "currency": { + "type": "string", + "nullable": true + }, + "barred": { + "type": "string", + "enum": [ + "all", + "barred", + "active" + ] + }, + "max_pages": { + "type": "integer" + } + } + }, + "summary": { + "$ref": "#/components/schemas/EconomicV2RevenueSummary" + }, + "customers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EconomicV2RevenueCustomerStat" + } + }, + "departments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EconomicV2RevenueDepartmentStat" + } + }, + "currencies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EconomicV2RevenueCurrencyStat" + } + }, + "warnings": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "filters", + "summary", + "customers", + "departments", + "currencies", + "warnings" + ] + }, + "EconomicV2RevenueSummary": { + "type": "object", + "properties": { + "invoice_count": { + "type": "integer" + }, + "line_count": { + "type": "integer" + }, + "unique_customers": { + "type": "integer" + }, + "net_amount": { + "type": "number" + }, + "vat_amount": { + "type": "number" + }, + "gross_amount": { + "type": "number" + }, + "average_invoice_net_amount": { + "type": "number" + } + }, + "required": [ + "invoice_count", + "line_count", + "unique_customers", + "net_amount", + "vat_amount", + "gross_amount", + "average_invoice_net_amount" + ] + }, + "EconomicV2RevenueCustomerStat": { + "type": "object", + "properties": { + "customer_number": { + "type": "integer" + }, + "customer_name": { + "type": "string", + "nullable": true + }, + "barred": { + "type": "boolean", + "nullable": true + }, + "invoice_count": { + "type": "integer" + }, + "net_amount": { + "type": "number" + }, + "vat_amount": { + "type": "number" + }, + "gross_amount": { + "type": "number" + } + }, + "required": [ + "customer_number", + "invoice_count", + "net_amount", + "vat_amount", + "gross_amount" + ] + }, + "EconomicV2RevenueDepartmentStat": { + "type": "object", + "properties": { + "department_key": { + "type": "string" + }, + "department_number": { + "type": "integer", + "nullable": true + }, + "invoice_count": { + "type": "integer" + }, + "line_count": { + "type": "integer" + }, + "net_amount": { + "type": "number" + }, + "vat_amount": { + "type": "number" + }, + "gross_amount": { + "type": "number" + } + }, + "required": [ + "department_key", + "invoice_count", + "line_count", + "net_amount", + "vat_amount", + "gross_amount" + ] + }, + "EconomicV2RevenueCurrencyStat": { + "type": "object", + "properties": { + "currency": { + "type": "string" + }, + "invoice_count": { + "type": "integer" + }, + "net_amount": { + "type": "number" + }, + "vat_amount": { + "type": "number" + }, + "gross_amount": { + "type": "number" + } + }, + "required": [ + "currency", + "invoice_count", + "net_amount", + "vat_amount", + "gross_amount" + ] + }, + "EconomicV2NormalizedInvoice": { + "type": "object", + "properties": { + "source": { + "type": "string", + "enum": [ + "internal", + "draft", + "booked" + ] + }, + "totals": { + "type": "object", + "properties": { + "net_total": { + "type": "number" + }, + "line_net_total": { + "type": "number" + }, + "line_count": { + "type": "integer" + }, + "billable_line_count": { + "type": "integer" + }, + "difference_from_line_sum": { + "type": "number", + "nullable": true + } + } + }, + "departments": { + "$ref": "#/components/schemas/EconomicV2DepartmentDistribution" + }, + "lines": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EconomicV2NormalizedLineItem" + } + }, + "warnings": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "source", + "totals", + "departments", + "lines", + "warnings" + ] + }, + "EconomicV2NormalizedLineItem": { + "type": "object", + "properties": { + "index": { + "type": "integer" + }, + "source": { + "type": "string" + }, + "source_order_id": { + "type": "integer", + "nullable": true + }, + "source_line_id": { + "type": "integer", + "nullable": true + }, + "line_type": { + "type": "string", + "enum": [ + "product", + "discount", + "text" + ] + }, + "billable": { + "type": "boolean" + }, + "product_number": { + "type": "string", + "nullable": true + }, + "product_id": { + "type": "integer", + "nullable": true + }, + "description": { + "type": "string" + }, + "reference": { + "type": "string" + }, + "quantity": { + "type": "number" + }, + "unit_net_price": { + "type": "number" + }, + "line_net_amount": { + "type": "number" + }, + "department_distribution": { + "$ref": "#/components/schemas/EconomicV2DepartmentDistribution" + }, + "match_key": { + "type": "string" + } + }, + "required": [ + "source", + "line_type", + "billable", + "description", + "reference", + "quantity", + "unit_net_price", + "line_net_amount", + "department_distribution", + "match_key" + ] + }, + "EconomicV2DepartmentDistribution": { + "type": "object", + "additionalProperties": { + "type": "number" + }, + "example": { + "75": 100 + } + }, + "EconomicV2Comparison": { + "type": "object", + "properties": { + "totals": { + "type": "object", + "properties": { + "internal_net_total": { + "type": "number" + } + } + }, + "targets": { + "type": "object", + "properties": { + "draft": { + "$ref": "#/components/schemas/EconomicV2TargetComparison" + }, + "booked": { + "$ref": "#/components/schemas/EconomicV2TargetComparison" + } + } + }, + "warnings": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "totals", + "targets", + "warnings" + ] + }, + "EconomicV2TargetComparison": { + "type": "object", + "properties": { + "target": { + "type": "string", + "enum": [ + "draft", + "booked" + ] + }, + "status": { + "type": "string", + "enum": [ + "exact_match", + "partial_mismatch", + "total_mismatch", + "missing_target" + ] + }, + "overall_match": { + "type": "boolean" + }, + "totals": { + "$ref": "#/components/schemas/EconomicV2TotalsComparison" + }, + "lines": { + "type": "object", + "properties": { + "summary": { + "type": "object", + "properties": { + "internal_billable_count": { + "type": "integer" + }, + "target_billable_count": { + "type": "integer" + }, + "mismatch_count": { + "type": "integer" + } + } + }, + "diff": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EconomicV2LineDiffEntry" + } + } + } + }, + "departments": { + "type": "object", + "properties": { + "matches": { + "type": "boolean" + }, + "diff": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EconomicV2DepartmentDiffEntry" + } + } + } + }, + "mismatch_reasons": { + "type": "array", + "items": { + "type": "string" + } + }, + "warnings": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "target", + "status", + "overall_match", + "totals", + "lines", + "departments", + "mismatch_reasons", + "warnings" + ] + }, + "EconomicV2TotalsComparison": { + "type": "object", + "properties": { + "internal_net_total": { + "type": "number", + "nullable": true + }, + "target_net_total": { + "type": "number", + "nullable": true + }, + "difference": { + "type": "number", + "nullable": true + }, + "abs_difference": { + "type": "number", + "nullable": true + }, + "matches": { + "type": "boolean" + } + }, + "required": [ + "matches" + ] + }, + "EconomicV2LineDiffEntry": { + "type": "object", + "properties": { + "match_key": { + "type": "string" + }, + "reasons": { + "type": "array", + "items": { + "type": "string" + } + }, + "internal_line": { + "allOf": [ + { + "$ref": "#/components/schemas/EconomicV2NormalizedLineItem" + } + ], + "nullable": true + }, + "target_line": { + "allOf": [ + { + "$ref": "#/components/schemas/EconomicV2NormalizedLineItem" + } + ], + "nullable": true + } + }, + "required": [ + "match_key", + "reasons" + ] + }, + "EconomicV2DepartmentDiffEntry": { + "type": "object", + "properties": { + "department_key": { + "type": "string" + }, + "internal_amount": { + "type": "number" + }, + "target_amount": { + "type": "number" + }, + "difference": { + "type": "number" + }, + "matches": { + "type": "boolean" + } + }, + "required": [ + "department_key", + "internal_amount", + "target_amount", + "difference", + "matches" + ] + }, + "InvoicingDistributionV2Transaction": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "date": { + "type": "string", + "format": "date-time" + }, + "amount": { + "type": "number" + }, + "booked": { + "type": "boolean" + }, + "department_id": { + "type": "integer" + }, + "excluded": { + "type": "boolean" + } + }, + "required": [ + "id", + "date", + "amount", + "booked", + "department_id", + "excluded" + ] + }, + "InvoicingDistributionV2Customer": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "nullable": true + }, + "customer_number": { + "type": "integer" + }, + "customer_name": { + "type": "string" + }, + "transactions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InvoicingDistributionV2Transaction" + } + }, + "requires_action": { + "type": "boolean" + }, + "meta": { + "type": "object", + "additionalProperties": true + } + }, + "required": [ + "customer_number", + "customer_name", + "transactions", + "requires_action", + "meta" + ] + }, + "InvoicingDistributionV2CategoryResponse": { + "type": "object", + "properties": { + "customers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InvoicingDistributionV2Customer" + } + }, + "collective_results": { + "type": "object", + "additionalProperties": true + }, + "warnings": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "customers", + "collective_results", + "warnings" + ] + }, + "InvoicingDistributionV2FixedPricingResponse": { + "$ref": "#/components/schemas/InvoicingDistributionV2CategoryResponse" + }, + "InvoicingDistributionV2WashSubscriptionsResponse": { + "$ref": "#/components/schemas/InvoicingDistributionV2CategoryResponse" + }, + "InvoicingDistributionV2CustomerPricesResponse": { + "$ref": "#/components/schemas/InvoicingDistributionV2CategoryResponse" + }, + "InvoicingDistributionV2BookedDepartment75Group": { + "type": "object", + "properties": { + "month": { + "type": "string", + "example": "2026-01" + }, + "source_category": { + "type": "string", + "enum": [ + "fixed_pricing", + "wash_subscriptions", + "unclassified" + ] + }, + "invoice_ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "booked_net_amount": { + "type": "number" + }, + "department_distribution": { + "$ref": "#/components/schemas/EconomicV2DepartmentDistribution" + }, + "undistributed_net_amount": { + "type": "number" + } + }, + "required": [ + "month", + "source_category", + "invoice_ids", + "booked_net_amount", + "department_distribution", + "undistributed_net_amount" + ] + }, + "InvoicingDistributionV2BookedDepartment75Meta": { + "type": "object", + "properties": { + "booked_net_amount": { + "type": "number" + }, + "distributed_net_amount": { + "type": "number" + }, + "undistributed_net_amount": { + "type": "number" + }, + "department_distribution": { + "$ref": "#/components/schemas/EconomicV2DepartmentDistribution" + }, + "booked_groups": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InvoicingDistributionV2BookedDepartment75Group" + } + } + }, + "required": [ + "booked_net_amount", + "distributed_net_amount", + "undistributed_net_amount", + "department_distribution", + "booked_groups" + ] + }, + "InvoicingDistributionV2BookedDepartment75Customer": { + "allOf": [ + { + "$ref": "#/components/schemas/InvoicingDistributionV2Customer" + }, + { + "type": "object", + "properties": { + "meta": { + "type": "object", + "properties": { + "booked_department_75": { + "$ref": "#/components/schemas/InvoicingDistributionV2BookedDepartment75Meta" + } + }, + "required": [ + "booked_department_75" + ] + } + } + } + ] + }, + "InvoicingDistributionV2BookedDepartment75CollectiveResults": { + "type": "object", + "properties": { + "booked_net_amount": { + "type": "number" + }, + "distributed_net_amount": { + "type": "number" + }, + "undistributed_net_amount": { + "type": "number" + }, + "department_distribution": { + "$ref": "#/components/schemas/EconomicV2DepartmentDistribution" + }, + "department_distribution_parsed": { + "type": "object", + "additionalProperties": { + "type": "number" + } + } + }, + "required": [ + "booked_net_amount", + "distributed_net_amount", + "undistributed_net_amount", + "department_distribution", + "department_distribution_parsed" + ] + }, + "InvoicingDistributionV2BookedDepartment75Response": { + "type": "object", + "properties": { + "customers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InvoicingDistributionV2BookedDepartment75Customer" + } + }, + "collective_results": { + "$ref": "#/components/schemas/InvoicingDistributionV2BookedDepartment75CollectiveResults" + }, + "warnings": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "customers", + "collective_results", + "warnings" + ] + }, + "InvoicingDistributionV2AllResponse": { + "type": "object", + "properties": { + "fixed_pricing": { + "$ref": "#/components/schemas/InvoicingDistributionV2FixedPricingResponse" + }, + "wash_subscriptions": { + "$ref": "#/components/schemas/InvoicingDistributionV2WashSubscriptionsResponse" + }, + "customer_prices": { + "$ref": "#/components/schemas/InvoicingDistributionV2CustomerPricesResponse" + }, + "booked_department_75": { + "$ref": "#/components/schemas/InvoicingDistributionV2BookedDepartment75Response" + } + }, + "required": [ + "fixed_pricing", + "wash_subscriptions", + "customer_prices", + "booked_department_75" + ] + }, + "PricingHistoryVersionEntry": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "type": { + "type": "string", + "enum": [ + "fixed_pricing", + "vehicle_subscription", + "discount_override" + ] + }, + "customer_number": { + "type": "integer" + }, + "effective_from": { + "type": "string", + "format": "date-time" + }, + "effective_to": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "source": { + "type": "string" + }, + "confidence": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "inferred": { + "type": "boolean" + }, + "metadata_json": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": true + }, + { + "type": "array", + "items": {} + } + ], + "nullable": true + } + }, + "required": [ + "id", + "type", + "customer_number", + "effective_from", + "source", + "confidence", + "inferred" + ] + }, + "CustomerPricingHistoryResponse": { + "type": "object", + "properties": { + "customer_number": { + "type": "integer" + }, + "fixed_pricing": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true + } + }, + "vehicle_subscriptions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true + } + }, + "discount_overrides": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true + } + }, + "timeline": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PricingHistoryVersionEntry" + } + } + }, + "required": [ + "customer_number", + "fixed_pricing", + "vehicle_subscriptions", + "discount_overrides", + "timeline" + ] + }, + "InvoicingWashSubscriptionsDistributionResponse": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "example": true + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InvoicingWashSubscriptionsDistributionCustomer" + } + }, + "meta": { + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionMeta" + }, + "includes": { + "type": "object", + "additionalProperties": true + } + }, + "required": [ + "success", + "data", + "meta", + "includes" + ] + }, + "InvoicingWashSubscriptionsDistributionCustomer": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "nullable": true + }, + "customer_number": { + "type": "integer" + }, + "customer_name": { + "type": "string" + }, + "transactions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionTransaction" + } + }, + "requires_action": { + "type": "boolean" + }, + "meta": { + "type": "object", + "properties": { + "subscription": { + "type": "object", + "additionalProperties": true + } + }, + "required": [ + "subscription" + ] + } + }, + "required": [ + "customer_number", + "customer_name", + "transactions", + "requires_action", + "meta" + ] + }, + "InvoicingFixedPricingDistributionResponse": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "example": true + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionCustomer" + } + }, + "meta": { + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionMeta" + }, + "includes": { + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionIncludes" + } + }, + "required": [ + "success", + "data", + "meta", + "includes" + ] + }, + "InvoicingFixedPricingDistributionCustomer": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "customer_number": { + "type": "integer" + }, + "customer_name": { + "type": "string" + }, + "transactions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionTransaction" + } + }, + "requires_action": { + "type": "boolean" + }, + "meta": { + "type": "object", + "properties": { + "fixed_pricing": { + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionFixedPricing" + } + }, + "required": [ + "fixed_pricing" + ] + } + }, + "required": [ + "id", + "customer_number", + "customer_name", + "transactions", + "requires_action", + "meta" + ] + }, + "InvoicingFixedPricingDistributionTransaction": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "date": { + "type": "string", + "description": "Datetime in `YYYY-MM-DD HH:mm:ss` format.", + "example": "2026-02-02 10:43:41" + }, + "amount": { + "type": "number" + }, + "booked": { + "type": "boolean" + }, + "excluded": { + "type": "boolean" + } + }, + "required": [ + "id", + "date", + "amount", + "booked", + "excluded" + ] + }, + "InvoicingFixedPricingDistributionFixedPricing": { + "type": "object", + "properties": { + "customer_number": { + "type": "integer" + }, + "price": { + "type": "number" + }, + "description": { + "type": "string" + }, + "original_price": { + "type": "number" + }, + "department_totals": { + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionNumberMapOrEmptyArray" + }, + "department_totals_relative": { + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionNumberMapOrEmptyArray" + } + }, + "required": [ + "customer_number", + "price", + "description", + "original_price", + "department_totals", + "department_totals_relative" + ] + }, + "InvoicingFixedPricingDistributionMeta": { + "type": "object", + "properties": { + "date_from": { + "type": "string", + "description": "Datetime in `YYYY-MM-DD HH:mm:ss` format.", + "example": "2026-02-01 00:00:00" + }, + "date_to": { + "type": "string", + "description": "Datetime in `YYYY-MM-DD HH:mm:ss` format.", + "example": "2026-02-28 23:59:59" + } + }, + "required": [ + "date_from", + "date_to" + ] + }, + "InvoicingFixedPricingDistributionIncludes": { + "type": "object", + "properties": { + "debug_invoicing_period_customers_with_orders_in_date_range": { + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionExecutionTime" + }, + "debug_invoicing_period_process_customer_numbers": { + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionExecutionTime" + }, + "debug_invoicing_period_get_transactions_for_customers_in_date_range": { + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionExecutionTime" + }, + "debug_invoicing_period_calculate_transaction_totals": { + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionExecutionTime" + }, + "debug_invoicing_period_construct_customer_objects": { + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionExecutionTime" + }, + "collective_fixed_pricing_results": { + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionCollectiveResults" + } + }, + "additionalProperties": true + }, + "InvoicingFixedPricingDistributionExecutionTime": { + "type": "object", + "properties": { + "execution_time": { + "type": "number" + } + }, + "required": [ + "execution_time" + ] + }, + "InvoicingFixedPricingDistributionCollectiveResults": { + "type": "object", + "properties": { + "total_fixed_price": { + "type": "number" + }, + "total_original_price": { + "type": "number" + }, + "total_department_totals": { + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionNumberMapOrEmptyArray" + }, + "total_department_totals_relative": { + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionNumberMapOrEmptyArray" + }, + "total_department_totals_parsed": { + "type": "object", + "additionalProperties": { + "type": "number" + } + }, + "total_department_totals_relative_parsed": { + "type": "object", + "additionalProperties": { + "type": "number" + } + } + }, + "required": [ + "total_fixed_price", + "total_original_price", + "total_department_totals", + "total_department_totals_relative", + "total_department_totals_parsed", + "total_department_totals_relative_parsed" + ] + }, + "InvoicingFixedPricingDistributionNumberMapOrEmptyArray": { + "oneOf": [ + { + "type": "object", + "additionalProperties": { + "type": "number" + } + }, + { + "type": "array", + "maxItems": 0 + } + ] + }, + "SelfServeLaneStatus": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "Lane ID" + }, + "status": { + "type": "string", + "description": "Current lane status (e.g., IDLE, OCCUPIED)" + }, + "mode": { + "type": "string", + "description": "Current lane mode (e.g., AUTOMATIC, MANUAL)" + }, + "state": { + "type": "string", + "description": "Current lane state (e.g., READY, WASHING)" + }, + "wash_start_time": { + "type": "integer", + "description": "Timestamp when the wash started (0 if not washing)", + "nullable": true + }, + "elapsed_wash_time": { + "type": "integer", + "description": "Elapsed wash time in seconds", + "nullable": true + }, + "license_plate": { + "type": "string", + "description": "License plate of the vehicle in the lane", + "nullable": true + }, + "customer_number": { + "type": "integer", + "description": "Customer number associated with the current lane use", + "nullable": true + } + } + }, + "SelfServeConfig": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether the self-serve module is enabled" + }, + "minute_product": { + "type": "integer", + "description": "The product ID used for minute-based billing" + } + } + }, + "SelfserveLaneService": { + "type": "string", + "description": "Allowed self-serve lane service name", + "enum": [ + "MACHINE" + ] + }, + "SelfserveMachineType": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string", + "nullable": true + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "nullable": true + } + } + }, + "SelfserveVisibleQuestion": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "question": { + "type": "string" + }, + "description": { + "type": "string" + }, + "condition_id": { + "type": "integer", + "nullable": true + }, + "order_priority": { + "type": "integer" + }, + "answer": { + "type": "boolean", + "nullable": true + } + } + }, + "SelfserveTaskDecision": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "task": { + "type": "string" + }, + "description": { + "type": "string" + }, + "condition_id": { + "type": "integer", + "nullable": true + }, + "order_priority": { + "type": "integer" + }, + "services": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SelfserveLaneService" + } + }, + "buttons": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "SelfserveWashSession": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "lane_id": { + "type": "integer" + }, + "department_id": { + "type": "integer" + }, + "machine_type_id": { + "type": "integer", + "nullable": true + }, + "customer_number": { + "type": "integer", + "nullable": true + }, + "vehicle_id": { + "type": "integer", + "nullable": true + }, + "vehicle_type_id": { + "type": "integer", + "nullable": true + }, + "reg": { + "type": "string" + }, + "status": { + "type": "string" + }, + "allowed": { + "type": "boolean" + }, + "machine_relay_enabled": { + "type": "boolean" + }, + "machine_relay_enabled_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "machine_start_triggered": { + "type": "boolean" + }, + "machine_start_triggered_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "order_id": { + "type": "integer", + "nullable": true + }, + "completed_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "metadata": { + "type": "object", + "additionalProperties": true + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "nullable": true + } + } + }, + "SelfserveWashQuestionAnswer": { + "type": "object", + "properties": { + "question_id": { + "type": "integer" + }, + "question": { + "type": "string" + }, + "answer": { + "type": "boolean" + }, + "answered_at": { + "type": "string", + "format": "date-time" + } + } + }, + "SelfserveWashTaskSnapshot": { + "type": "object", + "properties": { + "task_id": { + "type": "integer", + "nullable": true + }, + "task": { + "type": "string" + }, + "description": { + "type": "string", + "nullable": true + }, + "services": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SelfserveLaneService" + } + }, + "buttons": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "SelfserveWashEvent": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "type": { + "type": "string" + }, + "payload": { + "type": "object", + "additionalProperties": true, + "nullable": true + }, + "created_at": { + "type": "string", + "format": "date-time" + } + } + }, + "SelfserveVehicleAllowedResponse": { + "type": "object", + "properties": { + "lane": { + "$ref": "#/components/schemas/DepartmentLane" + }, + "machine_type": { + "allOf": [ + { + "$ref": "#/components/schemas/SelfserveMachineType" + } + ], + "nullable": true + }, + "vehicle": { + "type": "object", + "additionalProperties": true, + "nullable": true + }, + "reg": { + "type": "string" + }, + "customer_number": { + "type": "integer", + "nullable": true + }, + "questions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SelfserveVisibleQuestion" + } + }, + "tasks": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SelfserveTaskDecision" + } + }, + "allowed_services": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SelfserveLaneService" + } + }, + "machine_available": { + "type": "boolean" + }, + "all_visible_questions_answered": { + "type": "boolean" + }, + "allowed": { + "type": "boolean" + }, + "session": { + "allOf": [ + { + "$ref": "#/components/schemas/SelfserveWashSession" + } + ], + "nullable": true + } + } + }, + "SelfserveWashSummary": { + "type": "object", + "properties": { + "session": { + "$ref": "#/components/schemas/SelfserveWashSession" + }, + "lane": { + "allOf": [ + { + "$ref": "#/components/schemas/DepartmentLane" + } + ], + "nullable": true + }, + "machine_type": { + "allOf": [ + { + "$ref": "#/components/schemas/SelfserveMachineType" + } + ], + "nullable": true + }, + "questions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SelfserveWashQuestionAnswer" + } + }, + "tasks": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SelfserveWashTaskSnapshot" + } + }, + "events": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SelfserveWashEvent" + } + } + } + }, + "DepartmentSelfserveVehicleConditionMutationResponse": { + "type": "object", + "properties": { + "condition": { + "$ref": "#/components/schemas/DepartmentSelfserveVehicleCondition" + }, + "selfserve": { + "$ref": "#/components/schemas/SelfserveWashSummary" + } + } + }, + "MachineButtonPressWebhookResponse": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "scanner": { + "type": "string" + }, + "lane_id": { + "type": "integer" + }, + "selfserve": { + "$ref": "#/components/schemas/SelfserveWashSummary" + } + } + }, + "DepartmentSelfserveQuestion": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "Question ID" + }, + "department": { + "type": "integer", + "description": "Department ID" + }, + "lane": { + "type": "integer", + "description": "Lane ID" + }, + "product": { + "type": "integer", + "description": "Product ID" + }, + "condition_id": { + "type": "integer", + "description": "Question condition object ID", + "nullable": true + }, + "question": { + "type": "string", + "description": "Question text" + }, + "description": { + "type": "string", + "description": "Question description" + }, + "order_priority": { + "type": "integer", + "description": "Display order priority (lower numbers shown first)" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "DepartmentSelfserveTask": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "Task ID" + }, + "department": { + "type": "integer", + "description": "Department ID" + }, + "lane": { + "type": "integer", + "description": "Lane ID" + }, + "product": { + "type": "integer", + "description": "Product ID" + }, + "machine_type_id": { + "type": "integer", + "description": "Reusable machine type ID", + "nullable": true + }, + "condition_id": { + "type": "integer", + "description": "Condition ID (if conditional task)", + "nullable": true + }, + "task": { + "type": "string", + "description": "Task text" + }, + "description": { + "type": "string", + "description": "Task description" + }, + "order_priority": { + "type": "integer", + "description": "Display order priority (lower numbers shown first)" + }, + "services": { + "type": "array", + "description": "Services enabled by this task. Each item must be a valid service enum name.", + "items": { + "$ref": "#/components/schemas/SelfserveLaneService" + }, + "default": [] + }, + "buttons": { + "type": "array", + "description": "Dynamic image button IDs enabled by this task.", + "items": { + "type": "integer" + }, + "default": [] + }, + "dynamic_images_vehicle_type": { + "type": "integer", + "nullable": true, + "description": "Optional vehicle type selection override for the machine UI." + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "DepartmentSelfserveCondition": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "Condition ID" + }, + "department": { + "type": "integer", + "description": "Department ID" + }, + "lane": { + "type": "integer", + "description": "Lane ID" + }, + "product": { + "type": "integer", + "description": "Product ID" + }, + "machine_type_id": { + "type": "integer", + "description": "Reusable machine type ID", + "nullable": true + }, + "condition_id": { + "type": "integer", + "description": "Optional condition ID", + "nullable": true + }, + "name": { + "type": "string", + "description": "Condition name" + }, + "description": { + "type": "string", + "description": "Condition description" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "DepartmentSelfserveConditionRule": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "Rule ID" + }, + "condition_id": { + "type": "integer", + "description": "Condition object ID" + }, + "type": { + "type": "string", + "description": "Condition type (e.g., IS_TRUE, IS_FALSE)" + }, + "object_type": { + "type": "string", + "description": "The object type to which the condition applies (e.g., question, task, etc.)" + }, + "object_id": { + "type": "integer", + "description": "The object id to which the condition applies" + }, + "name": { + "type": "string", + "description": "Condition name" + }, + "description": { + "type": "string", + "description": "Condition description" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "DepartmentSelfserveVehicleCondition": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "Vehicle condition ID" + }, + "department": { + "type": "integer", + "description": "Department ID" + }, + "lane": { + "type": "integer", + "description": "Lane ID" + }, + "customer_id": { + "type": "integer", + "description": "Customer ID", + "nullable": true + }, + "reg": { + "type": "string", + "description": "Vehicle registration number" + }, + "question": { + "type": "integer", + "description": "Question ID" + }, + "value": { + "type": "boolean", + "description": "Answer value" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "deleted_at": { + "type": "string", + "format": "date-time", + "nullable": true + } + } + }, + "OrderCreate": { + "type": "object", + "required": [ + "customer_id", + "department_id" + ], + "properties": { + "customer_id": { + "type": "integer" + }, + "department_id": { + "type": "integer" + }, + "cashier_id": { + "type": "integer" + }, + "po": { + "type": "string" + }, + "lane": { + "type": "string" + } + } + }, + "OrderUpdate": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "customer_id": { + "type": "integer" + }, + "department_id": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "po": { + "type": "string" + }, + "lane": { + "type": "string" + } + } + }, + "OrderItem": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "order_id": { + "type": "integer" + }, + "product_id": { + "type": "integer" + }, + "product_name": { + "type": "string" + }, + "quantity": { + "type": "integer" + }, + "unit_price": { + "type": "number", + "format": "float" + }, + "discount": { + "type": "number", + "format": "float" + }, + "total_price": { + "type": "number", + "format": "float" + } + } + }, + "OrderItemCreate": { + "type": "object", + "required": [ + "order_id", + "product_id", + "quantity" + ], + "properties": { + "order_id": { + "type": "integer" + }, + "product_id": { + "type": "integer" + }, + "quantity": { + "type": "integer" + }, + "discount": { + "type": "number", + "format": "float" + } + } + }, + "OrderItemUpdate": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + }, + "quantity": { + "type": "integer" + }, + "discount": { + "type": "number", + "format": "float" + } + } + }, + "Department": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "economic_department_id": { + "type": "integer" + }, + "visible": { + "type": "boolean" + }, + "dimension": { + "type": "integer" + }, + "branding": { + "type": "integer" + }, + "longitude": { + "type": "number", + "format": "float" + }, + "latitude": { + "type": "number", + "format": "float" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "DepartmentGuest": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "longitude": { + "type": "number", + "format": "float" + }, + "latitude": { + "type": "number", + "format": "float" + }, + "address": { + "type": "string", + "description": "Department address (same as description)" + }, + "self_serve_enabled": { + "type": "boolean" + }, + "lanes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DepartmentLaneGuest" + } + } + } + }, + "DepartmentLaneGuest": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "status": { + "type": "string" + }, + "products": { + "type": "array", + "items": { + "type": "integer" + } + }, + "machine_available": { + "type": "boolean" + } + } + }, + "DepartmentCreate": { + "type": "object", + "required": [ + "name", + "economic_department_id" + ], + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "economic_department_id": { + "type": "integer" + }, + "visible": { + "type": "boolean" + }, + "longitude": { + "type": "number", + "format": "float" + }, + "latitude": { + "type": "number", + "format": "float" + } + } + }, + "DepartmentUpdate": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "visible": { + "type": "boolean" + }, + "longitude": { + "type": "number", + "format": "float" + }, + "latitude": { + "type": "number", + "format": "float" + } + } + }, + "DepartmentLane": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "department": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "relay_in_id": { + "type": "string" + }, + "relay_out_id": { + "type": "string" + }, + "relay_machine_id": { + "type": "string" + }, + "dynamic_image_id": { + "type": "integer", + "nullable": true, + "minimum": 1 + }, + "machine_type_id": { + "type": "integer", + "nullable": true + }, + "status": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "DepartmentLaneCreate": { + "type": "object", + "required": [ + "department", + "name" + ], + "properties": { + "department": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "relay_in_id": { + "type": "string" + }, + "relay_out_id": { + "type": "string" + }, + "relay_machine_id": { + "type": "string" + }, + "dynamic_image_id": { + "type": "integer", + "nullable": true, + "minimum": 1 + }, + "machine_type_id": { + "type": "integer", + "nullable": true + } + } + }, + "DepartmentLaneUpdate": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + }, + "department": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "relay_in_id": { + "type": "string" + }, + "relay_out_id": { + "type": "string" + }, + "relay_machine_id": { + "type": "string" + }, + "dynamic_image_id": { + "type": "integer", + "nullable": true, + "minimum": 1 + }, + "machine_type_id": { + "type": "integer", + "nullable": true + } + } + }, + "DepartmentGate": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "department": { + "type": "integer" + }, + "is_entrance": { + "type": "boolean" + }, + "is_exit": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "config": { + "$ref": "#/components/schemas/DepartmentGateConfig" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "DepartmentGateConfig": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "example": "PHONE_CALL" + }, + "phone_number": { + "type": "string", + "nullable": true, + "example": 4512345678 + }, + "call_duration_threshold": { + "type": "integer", + "nullable": true, + "example": 10 + } + }, + "description": "Configuration for the department gate.\nIf type is 'PHONE_CALL', 'phone_number' and 'call_duration_threshold' are required.\n" + }, + "DepartmentGateCreate": { + "type": "object", + "required": [ + "department", + "is_entrance", + "is_exit", + "name", + "config" + ], + "properties": { + "department": { + "type": "integer" + }, + "is_entrance": { + "type": "boolean" + }, + "is_exit": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "config": { + "$ref": "#/components/schemas/DepartmentGateConfig" + } + } + }, + "DepartmentGateUpdate": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + }, + "is_entrance": { + "type": "boolean" + }, + "is_exit": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "config": { + "$ref": "#/components/schemas/DepartmentGateConfig" + } + } + }, + "DepartmentRelay": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "department": { + "type": "integer" + }, + "relay_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "SWITCH", + "TRIGGER" + ] + }, + "config": { + "$ref": "#/components/schemas/DepartmentRelayConfig" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "DepartmentRelayConfig": { + "type": "object", + "properties": { + "what_happens": { + "type": "string", + "nullable": true, + "example": "open_gate" + }, + "webhook_token": { + "type": "string", + "nullable": true, + "example": "secret_token" + } + }, + "description": "Configuration for the department relay.\nIf the relay 'type' is 'TRIGGER', 'what_happens' and 'webhook_token' are required.\n" + }, + "DepartmentRelayCreate": { + "type": "object", + "required": [ + "department", + "relay_id", + "name", + "type", + "config" + ], + "properties": { + "department": { + "type": "integer" + }, + "relay_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "SWITCH", + "TRIGGER" + ] + }, + "config": { + "$ref": "#/components/schemas/DepartmentRelayConfig" + } + } + }, + "DepartmentRelayUpdate": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + }, + "relay_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "SWITCH", + "TRIGGER" + ] + }, + "config": { + "$ref": "#/components/schemas/DepartmentRelayConfig" + } + } + }, + "Product": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "price": { + "type": "number", + "format": "float" + }, + "category_id": { + "type": "integer" + }, + "category_name": { + "type": "string" + }, + "visible": { + "type": "boolean" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "ProductCreate": { + "type": "object", + "required": [ + "name", + "price", + "category_id" + ], + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "price": { + "type": "number", + "format": "float" + }, + "category_id": { + "type": "integer" + }, + "visible": { + "type": "boolean" + } + } + }, + "ProductUpdate": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "price": { + "type": "number", + "format": "float" + }, + "category_id": { + "type": "integer" + }, + "visible": { + "type": "boolean" + } + } + }, + "Category": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "CategoryCreate": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + } + } + }, + "CategoryUpdate": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + } + } + }, + "ModuleActionLog": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "Log ID" + }, + "module": { + "type": "string", + "description": "The module name" + }, + "action": { + "type": "string", + "description": "The action name" + }, + "status_code": { + "type": "integer", + "description": "HTTP status code" + }, + "data": { + "type": "object", + "description": "The action data (JSON decoded)" + }, + "created_at": { + "type": "string", + "format": "date-time", + "description": "Log creation timestamp" + } + } + }, + "Booking": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "customer_id": { + "type": "integer" + }, + "department_id": { + "type": "integer" + }, + "booking_time": { + "type": "string", + "format": "date-time" + }, + "status": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + } + } + }, + "BookingUpdate": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "booking_time": { + "type": "string", + "format": "date-time" + } + } + }, + "Vehicle": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "user_id": { + "type": "integer", + "description": "Internal user ID owning the customer account" + }, + "reg": { + "type": "string", + "description": "Vehicle registration number" + }, + "customer_id": { + "type": "integer" + }, + "customer_name": { + "type": "string" + }, + "type": { + "type": "integer", + "description": "Product ID representing the vehicle wash type" + }, + "reference": { + "type": "string", + "nullable": true, + "description": "Optional external reference/label" + }, + "wash_subscription": { + "type": "boolean" + }, + "barred": { + "type": "boolean", + "description": "True if the associated customer is barred" + }, + "addons": { + "type": "object", + "properties": { + "enabled": { + "type": "integer" + }, + "available": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "type": "object" + } + } + } + }, + "last_order_id": { + "type": "integer", + "nullable": true + }, + "xlvask": { + "type": "object", + "nullable": true, + "description": "XL Vask vehicle data when available" + }, + "vehicle_types": { + "type": "array", + "items": { + "type": "object" + } + }, + "created_at": { + "type": "string", + "format": "date-time" + } + } + }, + "Notification": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "user_id": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "message": { + "type": "string" + }, + "read": { + "type": "boolean" + }, + "created_at": { + "type": "string", + "format": "date-time" + } + } + }, + "NotificationCreate": { + "type": "object", + "required": [ + "user_id", + "title", + "message" + ], + "properties": { + "user_id": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "message": { + "type": "string" + } + } + }, + "Permission": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Permission identifier" + }, + "description": { + "type": "string", + "description": "Human-readable description" + } + } + }, + "GoalsCriteria": { + "type": "object", + "description": "Goal evaluation criteria", + "properties": { + "type": { + "type": "string", + "description": "Criteria type", + "enum": [ + "PRODUCT", + "REVENUE", + "VISITS", + "NONE" + ], + "example": "PRODUCT" + }, + "target": { + "type": "number", + "description": "Target value for the goal", + "example": 100 + }, + "label": { + "type": "string", + "description": "Optional short label/title for this goal criteria (max 255 characters)", + "example": "Q1 Revenue Goal" + }, + "start": { + "type": "string", + "format": "date-time", + "description": "Start of the evaluation window (ISO 8601)" + }, + "end": { + "type": "string", + "format": "date-time", + "description": "End of the evaluation window (ISO 8601)" + }, + "users": { + "type": "array", + "description": "List of user customer numbers included in the criteria", + "items": { + "type": "integer" + } + }, + "departments": { + "type": "array", + "description": "List of department IDs included in the criteria", + "items": { + "type": "integer" + } + }, + "products": { + "type": "array", + "description": "List of product IDs included in the criteria", + "items": { + "type": "integer" + } + }, + "progress_alert_frequency": { + "type": "string", + "description": "Frequency of progress alerts for the goal.\nAccepted values: DAILY, WEEKLY, MONTHLY, CHANGED, NONE.\nThe canonical field name is snake_case `progress_alert_frequency`.\nFor backward-compatibility the API also accepts camelCase `progressAlertFrequency` on input.\n", + "enum": [ + "DAILY", + "WEEKLY", + "MONTHLY", + "CHANGED", + "NONE" + ], + "example": "DAILY" + }, + "progress_alert_destination": { + "type": "string", + "description": "Destination/channel where progress alerts should be delivered.\nAccepted values: SLACK, EMAIL, SMS, NONE.\nThe canonical field name is snake_case `progress_alert_destination`.\nFor backward-compatibility the API also accepts camelCase `progressAlertDestination` on input.\n", + "enum": [ + "SLACK", + "EMAIL", + "SMS", + "NONE" + ], + "example": "NONE" + }, + "progress_alert_progress_type": { + "type": "string", + "description": "What part of the progress should be included in alert messages.\nAccepted values: ALL, PERCENTAGE_ONLY, COUNT_ONLY, COUNT_AND_TARGET, NONE.\nThe canonical field name is snake_case `progress_alert_progress_type`.\nFor backward-compatibility the API also accepts camelCase `progressAlertProgressType` on input.\n", + "enum": [ + "ALL", + "PERCENTAGE_ONLY", + "COUNT_ONLY", + "COUNT_AND_TARGET", + "NONE" + ], + "example": "ALL" + }, + "progress_alert_style": { + "type": "string", + "description": "Presentation style of the alert.\nAccepted values: DEPARTMENT_COMPARE, COLLECTIVE, SINGLE_DEPARTMENT, NONE.\nThe canonical field name is snake_case `progress_alert_style`.\nFor backward-compatibility the API also accepts camelCase `progressAlertStyle` on input.\n", + "enum": [ + "DEPARTMENT_COMPARE", + "COLLECTIVE", + "SINGLE_DEPARTMENT", + "NONE" + ], + "example": "NONE" + }, + "progress_alert_format": { + "type": "string", + "nullable": true, + "description": "Optional custom template for the alert body. Supports tokens `{label}`, `{percent}`, `{count}`, `{target}`, `{timeframe}`, `{departments}`, `{prefix}`, `{body}`.\nMax length depends on destination: 160 characters for SMS; 1024 characters for EMAIL/SLACK/other.\nThe canonical field name is snake_case `progress_alert_format`.\nFor backward-compatibility the API also accepts camelCase `progressAlertFormat` on input.\n" + }, + "progress_alert_weekdays": { + "type": "array", + "description": "Weekdays on which progress alerts should be sent.\nUse one or more of: MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY.\nThe canonical field name is snake_case `progress_alert_weekdays`.\nFor backward-compatibility the API also accepts camelCase `progressAlertWeekdays` on input.\n", + "items": { + "type": "string", + "enum": [ + "MONDAY", + "TUESDAY", + "WEDNESDAY", + "THURSDAY", + "FRIDAY", + "SATURDAY", + "SUNDAY" + ] + }, + "example": [ + "MONDAY", + "WEDNESDAY", + "FRIDAY" + ] + }, + "progress_alert_time_of_day": { + "type": "string", + "nullable": true, + "description": "Time of day (with timezone) when progress alerts should be sent.\nFormat: `HH:MMZ` or `HH:MM±HH:MM` (24-hour clock with UTC offset). Examples: `14:30Z`, `09:15+02:00`, `18:45-05:00`.\nThe canonical field name is snake_case `progress_alert_time_of_day`.\nFor backward-compatibility the API also accepts camelCase `progressAlertTimeOfDay` on input.\n", + "pattern": "^([01]\\d|2[0-3]):[0-5]\\d(?:Z|[+-](?:[01]\\d|2[0-3]):?[0-5]\\d)$", + "example": "14:30+02:00" + }, + "department_daily_targets": { + "type": "object", + "description": "Optional per-department custom daily targets. Keys are department IDs and values are non-negative numbers representing the target per operating day for that department.\nIf omitted, the daily target is split evenly across selected departments. The canonical field name is snake_case `department_daily_targets`.\nFor backward-compatibility the API also accepts camelCase `departmentDailyTargets` on input.\n", + "x-additionalPropertiesName": "department_id", + "additionalProperties": { + "type": "number", + "minimum": 0 + }, + "example": { + "12": 3, + "15": 5 + } + } + } + }, + "GoalProgressDetails": { + "type": "object", + "properties": { + "count": { + "type": "number", + "description": "Current progress value" + }, + "target": { + "type": "number", + "description": "Target value for the period" + }, + "date_from": { + "type": "string", + "nullable": true, + "description": "Inclusive period start datetime (ISO-8601), null when no lower bound applies", + "example": "2026-01-01T00:00:00+00:00" + }, + "date_end": { + "type": "string", + "nullable": true, + "description": "Inclusive period end datetime (ISO-8601), null when no upper bound applies", + "example": "2026-02-26T23:59:59+00:00" + } + } + }, + "DepartmentGoalProgress": { + "type": "object", + "title": "Department progress details", + "description": "Goal progress details for a single department across multiple timeframes.\nTimeframes are clamped to the goal timeframe (never before goal start and never after goal end).\n", + "properties": { + "all": { + "$ref": "#/components/schemas/GoalProgressDetails" + }, + "today": { + "$ref": "#/components/schemas/GoalProgressDetails" + }, + "week": { + "$ref": "#/components/schemas/GoalProgressDetails" + }, + "month": { + "$ref": "#/components/schemas/GoalProgressDetails" + }, + "year": { + "$ref": "#/components/schemas/GoalProgressDetails" + }, + "to_date": { + "$ref": "#/components/schemas/GoalProgressDetails" + } + } + }, + "DepartmentGoal": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "created_by": { + "type": "integer", + "description": "ID of the user who created the goal" + }, + "departments": { + "type": "array", + "items": { + "type": "integer" + } + }, + "criteria": { + "$ref": "#/components/schemas/GoalsCriteria" + }, + "progress": { + "type": "object", + "description": "Goal progress details for various timeframes.\n`year` starts at January 1 of the current year or the goal start, whichever is later.\n`to_date` starts at the goal start and ends at today (also clamped by goal end).\n", + "properties": { + "all": { + "$ref": "#/components/schemas/GoalProgressDetails" + }, + "today": { + "$ref": "#/components/schemas/GoalProgressDetails" + }, + "week": { + "$ref": "#/components/schemas/GoalProgressDetails" + }, + "month": { + "$ref": "#/components/schemas/GoalProgressDetails" + }, + "year": { + "$ref": "#/components/schemas/GoalProgressDetails" + }, + "to_date": { + "$ref": "#/components/schemas/GoalProgressDetails" + }, + "departmental_distribution": { + "type": "object", + "description": "Progress details broken down by department. Keys are department IDs.\nIncludes `all`, `today`, `week`, `month`, `year`, and `to_date` timeframes.\n", + "x-additionalPropertiesName": "department_id", + "additionalProperties": { + "$ref": "#/components/schemas/DepartmentGoalProgress" + }, + "example": { + "12": { + "all": { + "count": 15, + "target": 100 + }, + "today": { + "count": 2, + "target": 5 + }, + "week": { + "count": 10, + "target": 35 + }, + "month": { + "count": 15, + "target": 100 + }, + "year": { + "count": 15, + "target": 100 + }, + "to_date": { + "count": 15, + "target": 100 + } + } + } + } + } + }, + "created_at": { + "type": "string", + "description": "Creation timestamp" + }, + "updated_at": { + "type": "string", + "description": "Update timestamp" + } + } + }, + "DepartmentGoalCreate": { + "type": "object", + "required": [ + "departments", + "criteria" + ], + "properties": { + "departments": { + "type": "array", + "items": { + "type": "integer" + } + }, + "criteria": { + "$ref": "#/components/schemas/GoalsCriteria" + } + } + }, + "DepartmentGoalUpdate": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "integer" + }, + "departments": { + "type": "array", + "items": { + "type": "integer" + } + }, + "criteria": { + "$ref": "#/components/schemas/GoalsCriteria" + } + } + }, + "Passkey": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "credential_id": { + "type": "string", + "description": "Base64URL-encoded credential ID" + }, + "name": { + "type": "string", + "nullable": true + }, + "algorithm": { + "type": "string", + "example": "ES256" + }, + "transports": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "usb", + "nfc", + "ble", + "internal" + ] + }, + "sign_count": { + "type": "integer" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "PasskeyCreateRequest": { + "type": "object", + "required": [ + "credential_id", + "public_key", + "algorithm", + "transports" + ], + "properties": { + "credential_id": { + "type": "string", + "description": "Base64URL-encoded credential ID returned from WebAuthn" + }, + "public_key": { + "type": "string", + "description": "Base64URL-encoded public key (COSE or PEM as stored)" + }, + "algorithm": { + "type": "string", + "example": "ES256" + }, + "transports": { + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "type": "string", + "nullable": true + } + } + }, + "PasskeyRenameRequest": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + } + } + }, + "BirdVoiceCall": { + "type": "object", + "properties": { + "id": { + "type": "string", + "example": "4015cf84-8028-46a1-a0d9-9213e5bf4f09" + }, + "channelId": { + "type": "string", + "example": "a2545e48-fe8c-5741-9bdc-42a081076bc9" + }, + "originator": { + "type": "object", + "properties": { + "number": { + "type": "object", + "properties": { + "type": { + "type": "string", + "example": "pstn" + }, + "number": { + "type": "string", + "example": "+4532330288" + }, + "countryIsoCode": { + "type": "string", + "example": "DK" + } + } + } + } + }, + "receiver": { + "type": "object", + "properties": { + "contact": { + "type": "object", + "properties": { + "id": { + "type": "string", + "example": "18229adf-af8c-404a-b036-ae193c22e33c" + }, + "identifierKey": { + "type": "string", + "example": "phonenumber" + }, + "identifierValue": { + "type": "string", + "example": "+4542331128" + } + } + }, + "number": { + "type": "object", + "properties": { + "type": { + "type": "string", + "example": "pstn" + }, + "number": { + "type": "string", + "example": "+4542331128" + }, + "countryIsoCode": { + "type": "string", + "example": "DK" + } + } + } + } + }, + "from": { + "type": "string", + "example": "+4532330288" + }, + "to": { + "type": "string", + "example": "+4542331128" + }, + "direction": { + "type": "string", + "example": "outgoing" + }, + "status": { + "type": "string", + "example": "completed" + }, + "type": { + "type": "string", + "example": "pstn" + }, + "duration": { + "type": "integer", + "example": 3 + }, + "hangupCauseCode": { + "type": "integer", + "example": 16 + }, + "hangupSource": { + "type": "string", + "example": "callee" + }, + "sipInsights": { + "type": "object", + "properties": { + "hangupSipCode": { + "type": "string", + "example": "200" + } + } + }, + "qualityInsights": { + "type": "object", + "properties": { + "mos": { + "type": "string", + "example": "4.50" + }, + "pdd": { + "type": "string", + "example": "2.15" + } + } + }, + "price": { + "type": "object", + "properties": { + "currencyCode": { + "type": "string", + "example": "EUR" + }, + "amount": { + "type": "string", + "example": "0.0079" + } + } + }, + "createdAt": { + "type": "string", + "format": "date-time", + "example": "2026-02-27T13:45:36.216Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "example": "2026-02-27T13:45:46.532Z" + }, + "ringingAt": { + "type": "string", + "format": "date-time", + "example": "2026-02-27T13:45:38.367Z" + }, + "answeredAt": { + "type": "string", + "format": "date-time", + "example": "2026-02-27T13:45:43.359Z" + }, + "endedAt": { + "type": "string", + "format": "date-time", + "example": "2026-02-27T13:45:46.368Z" + } + } + }, + "BirdVoiceCallListResponse": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "example": true + }, + "data": { + "type": "object", + "properties": { + "nextPageToken": { + "type": "string", + "example": "WzE3NzIxNTY5NTI0MDUsIjk5ZDU4M2VkLTQyMzAtNDExNy1hOTQ0LTllY2JjNzhmYWJlMSJd" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BirdVoiceCall" + } + } + } + }, + "meta": { + "oneOf": [ + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": true + } + ], + "example": [] + }, + "includes": { + "oneOf": [ + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": true + } + ], + "example": [] + } + } + }, + "BirdVoiceCallSingleResponse": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "example": true + }, + "data": { + "$ref": "#/components/schemas/BirdVoiceCall" + }, + "meta": { + "oneOf": [ + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": true + } + ], + "example": [] + }, + "includes": { + "oneOf": [ + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": true + } + ], + "example": [] + } + } + }, + "BirdTestOutboundCallResponse": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "example": true + }, + "data": { + "type": "object", + "properties": { + "to": { + "type": "string", + "example": "+45 42 33 11 28" + }, + "to_e164": { + "type": "string", + "example": "+4542331128" + }, + "call_id": { + "type": "string", + "nullable": true, + "example": "4015cf84-8028-46a1-a0d9-9213e5bf4f09" + }, + "final_status": { + "type": "string", + "nullable": true, + "example": "completed" + }, + "hangup_sent": { + "type": "boolean", + "example": true + }, + "created_call": { + "$ref": "#/components/schemas/BirdVoiceCall" + }, + "last_call_snapshot": { + "$ref": "#/components/schemas/BirdVoiceCall" + }, + "hangup_response": { + "$ref": "#/components/schemas/BirdVoiceCall" + } + } + }, + "meta": { + "oneOf": [ + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": true + } + ], + "example": [] + }, + "includes": { + "oneOf": [ + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": true + } + ], + "example": [] + } + } + }, + "BirdNumber": { + "type": "object", + "properties": { + "id": { + "type": "string", + "example": "019c73dc-60f1-76c4-98b0-c4318706b938" + }, + "workspaceId": { + "type": "string", + "example": "3d5fae4f-9c2d-41aa-9840-28b18e6a94bc" + }, + "type": { + "type": "string", + "example": "national" + }, + "country": { + "type": "string", + "example": "DK" + }, + "number": { + "type": "string", + "example": "+4532330288" + }, + "status": { + "type": "string", + "example": "active" + }, + "capabilities": { + "type": "object", + "properties": { + "voice": { + "$ref": "#/components/schemas/BirdNumberCapability" + }, + "sms": { + "$ref": "#/components/schemas/BirdNumberCapability" + }, + "mms": { + "$ref": "#/components/schemas/BirdNumberCapability" + }, + "fax": { + "$ref": "#/components/schemas/BirdNumberCapability" + }, + "whatsapp": { + "$ref": "#/components/schemas/BirdNumberCapability" + } + } + }, + "monthlyRecurringPrice": { + "type": "object", + "properties": { + "currencyCode": { + "type": "string", + "example": "EUR" + }, + "amount": { + "type": "integer", + "example": 1000000 + }, + "exponent": { + "type": "integer", + "example": -6 + } + } + }, + "complianceRequirements": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true + } + }, + "configurations": { + "type": "object", + "additionalProperties": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "example": "2026-02-19T03:05:48.529Z" + }, + "updatedAt": { + "type": "string", + "format": "date-time", + "example": "2026-02-19T03:08:17.753Z" + }, + "activatedAt": { + "type": "string", + "format": "date-time", + "nullable": true, + "example": "2026-02-19T03:05:48.529Z" + }, + "deactivatedAt": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "deactivatesAt": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "subscription": { + "type": "object", + "additionalProperties": true + }, + "endpointSubscription": { + "type": "object", + "additionalProperties": true + }, + "requirements": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true + } + }, + "whatsApp": { + "type": "object", + "additionalProperties": true + }, + "endpoint": { + "type": "object", + "additionalProperties": true + } + } + }, + "BirdNumberCapability": { + "type": "object", + "properties": { + "inbound": { + "type": "boolean" + }, + "outbound": { + "type": "boolean" + } + } + }, + "BirdNumberListResponse": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "example": true + }, + "data": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BirdNumber" + } + } + } + }, + "meta": { + "oneOf": [ + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": true + } + ], + "example": [] + }, + "includes": { + "oneOf": [ + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": true + } + ], + "example": [] + } + } + }, + "BirdNumberSingleResponse": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "example": true + }, + "data": { + "$ref": "#/components/schemas/BirdNumber" + }, + "meta": { + "oneOf": [ + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": true + } + ], + "example": [] + }, + "includes": { + "oneOf": [ + { + "type": "array", + "items": {} + }, + { + "type": "object", + "additionalProperties": true + } + ], + "example": [] + } + } + } + } + } +} diff --git a/documentation/topics/API-Overview.topic b/documentation/topics/API-Overview.topic index 8ec0d075..f17dd329 100644 --- a/documentation/topics/API-Overview.topic +++ b/documentation/topics/API-Overview.topic @@ -5,11 +5,14 @@ xsi:noNamespaceSchemaLocation="https://resources.jetbrains.com/writerside/1.0/topic.v2.xsd" title="API Overview" id="API-Overview"> -

This section provides a high-level overview of how to interact with the API.

+

This section provides a high-level overview of how to interact with the API based on openapi.yaml.

- + +

The API currently defines the following servers:

- https://api.truckwash.dk/api/v1 +https://api.truckwash.dk +https://api.truckwash.io +http://localhost/api
@@ -20,12 +23,20 @@ Description - Content-Type - Should be application/json for all POST/PUT requests. + Authorization + Use Bearer authentication for protected endpoints: Authorization: Bearer <JWT>. Accept - application/json is recommended. + Use application/json. + + + Content-Type + Use application/json for request bodies. + + + X-Customer-Number + Required for many customer-scoped requests when authenticated as a subuser.
diff --git a/documentation/topics/API-Reference.topic b/documentation/topics/API-Reference.topic new file mode 100644 index 00000000..031d8423 --- /dev/null +++ b/documentation/topics/API-Reference.topic @@ -0,0 +1,10 @@ + + + + + +

Comprehensive API reference generated from the repository root openapi.yaml.

+
diff --git a/documentation/topics/Authentication.topic b/documentation/topics/Authentication.topic index 89b3cf67..f659d698 100644 --- a/documentation/topics/Authentication.topic +++ b/documentation/topics/Authentication.topic @@ -5,12 +5,19 @@ xsi:noNamespaceSchemaLocation="https://resources.jetbrains.com/writerside/1.0/topic.v2.xsd" title="Authentication" id="Authentication"> -

All API requests must be authenticated using an API token.

+

The API uses the BearerAuth security scheme (HTTP Bearer, JWT).

- -

Include your token in the Authorization header as a Bearer token:

+ +

Get a token from /auth/login or /auth/employee/login, then send:

Authorization: Bearer YOUR_API_TOKEN
+ + +

When authenticated as a subuser, include a target customer header for customer-scoped endpoints:

+ + X-Customer-Number: 123456 + +
diff --git a/documentation/topics/Error-Handling.topic b/documentation/topics/Error-Handling.topic index a9bc1ccf..91ad3145 100644 --- a/documentation/topics/Error-Handling.topic +++ b/documentation/topics/Error-Handling.topic @@ -5,49 +5,52 @@ xsi:noNamespaceSchemaLocation="https://resources.jetbrains.com/writerside/1.0/topic.v2.xsd" title="Error Handling" id="Error-Handling"> -

This section details how the API handles and reports errors.

+

This section describes error responses defined in openapi.yaml.

- -

Errors are returned as a JSON object with an error message and code:

+ +

The shared Error schema is:

- { - "success": false, - "message": "Invalid API token", - "code": "AUTH_001" - } +{ + "error": "Invalid API token", + "code": 401 +}
-

The API uses standard HTTP status codes:

+

Common error status codes used across endpoints:

- - - - - + - + - + - + + + + + + + + + - +
Code Meaning
200OK - Request succeeded
400Bad Request - Invalid parametersBad Request
401Unauthorized - Missing or invalid tokenUnauthorized
403Forbidden - Insufficient permissionsForbidden
404Not Found - Resource does not existNot Found
409Conflict
422Unprocessable Entity
500Server Error - Internal server failureInternal Server Error
diff --git a/documentation/topics/generated/Config_Module_Backups.topic b/documentation/topics/generated/Config_Module_Backups.topic new file mode 100644 index 00000000..6cdb29f2 --- /dev/null +++ b/documentation/topics/generated/Config_Module_Backups.topic @@ -0,0 +1,10 @@ + + + + + +

Backup configuration for backup module behavior.

+
diff --git a/documentation/topics/generated/Config_Module_Backups_Page_1.topic b/documentation/topics/generated/Config_Module_Backups_Page_1.topic new file mode 100644 index 00000000..15fce64b --- /dev/null +++ b/documentation/topics/generated/Config_Module_Backups_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Config_Module_Bird.topic b/documentation/topics/generated/Config_Module_Bird.topic new file mode 100644 index 00000000..2d74eba3 --- /dev/null +++ b/documentation/topics/generated/Config_Module_Bird.topic @@ -0,0 +1,10 @@ + + + + + +

Bird communication integration configuration.

+
diff --git a/documentation/topics/generated/Config_Module_Bird_Page_1.topic b/documentation/topics/generated/Config_Module_Bird_Page_1.topic new file mode 100644 index 00000000..1f8835e9 --- /dev/null +++ b/documentation/topics/generated/Config_Module_Bird_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Config_Module_Email.topic b/documentation/topics/generated/Config_Module_Email.topic new file mode 100644 index 00000000..c9ac2e95 --- /dev/null +++ b/documentation/topics/generated/Config_Module_Email.topic @@ -0,0 +1,10 @@ + + + + + +

Email provider and SMTP/MailerSend configuration.

+
diff --git a/documentation/topics/generated/Config_Module_Email_Page_1.topic b/documentation/topics/generated/Config_Module_Email_Page_1.topic new file mode 100644 index 00000000..9c66f5aa --- /dev/null +++ b/documentation/topics/generated/Config_Module_Email_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Config_Module_Entra.topic b/documentation/topics/generated/Config_Module_Entra.topic new file mode 100644 index 00000000..3ff643aa --- /dev/null +++ b/documentation/topics/generated/Config_Module_Entra.topic @@ -0,0 +1,10 @@ + + + + + +

Microsoft Entra identity integration configuration.

+
diff --git a/documentation/topics/generated/Config_Module_Entra_Page_1.topic b/documentation/topics/generated/Config_Module_Entra_Page_1.topic new file mode 100644 index 00000000..11d7b350 --- /dev/null +++ b/documentation/topics/generated/Config_Module_Entra_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Config_Module_FXRatesAPI.topic b/documentation/topics/generated/Config_Module_FXRatesAPI.topic new file mode 100644 index 00000000..61736f21 --- /dev/null +++ b/documentation/topics/generated/Config_Module_FXRatesAPI.topic @@ -0,0 +1,10 @@ + + + + + +

FXRatesAPI exchange-rate integration configuration.

+
diff --git a/documentation/topics/generated/Config_Module_FXRatesAPI_Page_1.topic b/documentation/topics/generated/Config_Module_FXRatesAPI_Page_1.topic new file mode 100644 index 00000000..83ce174b --- /dev/null +++ b/documentation/topics/generated/Config_Module_FXRatesAPI_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Config_Module_GatewayAPI.topic b/documentation/topics/generated/Config_Module_GatewayAPI.topic new file mode 100644 index 00000000..6175891f --- /dev/null +++ b/documentation/topics/generated/Config_Module_GatewayAPI.topic @@ -0,0 +1,10 @@ + + + + + +

GatewayAPI integration configuration.

+
diff --git a/documentation/topics/generated/Config_Module_GatewayAPI_Page_1.topic b/documentation/topics/generated/Config_Module_GatewayAPI_Page_1.topic new file mode 100644 index 00000000..5cabd770 --- /dev/null +++ b/documentation/topics/generated/Config_Module_GatewayAPI_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Config_Module_LicensePlateRecognizer.topic b/documentation/topics/generated/Config_Module_LicensePlateRecognizer.topic new file mode 100644 index 00000000..432e9222 --- /dev/null +++ b/documentation/topics/generated/Config_Module_LicensePlateRecognizer.topic @@ -0,0 +1,10 @@ + + + + + +

License plate recognizer integration configuration.

+
diff --git a/documentation/topics/generated/Config_Module_LicensePlateRecognizer_Page_1.topic b/documentation/topics/generated/Config_Module_LicensePlateRecognizer_Page_1.topic new file mode 100644 index 00000000..9820f185 --- /dev/null +++ b/documentation/topics/generated/Config_Module_LicensePlateRecognizer_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Config_Module_Limble.topic b/documentation/topics/generated/Config_Module_Limble.topic new file mode 100644 index 00000000..9e521ea6 --- /dev/null +++ b/documentation/topics/generated/Config_Module_Limble.topic @@ -0,0 +1,10 @@ + + + + + +

Limble integration configuration.

+
diff --git a/documentation/topics/generated/Config_Module_Limble_Page_1.topic b/documentation/topics/generated/Config_Module_Limble_Page_1.topic new file mode 100644 index 00000000..4669155d --- /dev/null +++ b/documentation/topics/generated/Config_Module_Limble_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Config_Module_MotorAPI.topic b/documentation/topics/generated/Config_Module_MotorAPI.topic new file mode 100644 index 00000000..44152ed6 --- /dev/null +++ b/documentation/topics/generated/Config_Module_MotorAPI.topic @@ -0,0 +1,10 @@ + + + + + +

MotorAPI vehicle lookup integration configuration.

+
diff --git a/documentation/topics/generated/Config_Module_MotorAPI_Page_1.topic b/documentation/topics/generated/Config_Module_MotorAPI_Page_1.topic new file mode 100644 index 00000000..796ba859 --- /dev/null +++ b/documentation/topics/generated/Config_Module_MotorAPI_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Config_Module_OcrSpace.topic b/documentation/topics/generated/Config_Module_OcrSpace.topic new file mode 100644 index 00000000..9e5f5033 --- /dev/null +++ b/documentation/topics/generated/Config_Module_OcrSpace.topic @@ -0,0 +1,10 @@ + + + + + +

OCR Space integration configuration.

+
diff --git a/documentation/topics/generated/Config_Module_OcrSpace_Page_1.topic b/documentation/topics/generated/Config_Module_OcrSpace_Page_1.topic new file mode 100644 index 00000000..fc63c3ad --- /dev/null +++ b/documentation/topics/generated/Config_Module_OcrSpace_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Config_Module_OpenAI.topic b/documentation/topics/generated/Config_Module_OpenAI.topic new file mode 100644 index 00000000..150b671c --- /dev/null +++ b/documentation/topics/generated/Config_Module_OpenAI.topic @@ -0,0 +1,10 @@ + + + + + +

OpenAI integration configuration.

+
diff --git a/documentation/topics/generated/Config_Module_OpenAI_Page_1.topic b/documentation/topics/generated/Config_Module_OpenAI_Page_1.topic new file mode 100644 index 00000000..7874197c --- /dev/null +++ b/documentation/topics/generated/Config_Module_OpenAI_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Config_Module_Self_Serve.topic b/documentation/topics/generated/Config_Module_Self_Serve.topic new file mode 100644 index 00000000..e30226c2 --- /dev/null +++ b/documentation/topics/generated/Config_Module_Self_Serve.topic @@ -0,0 +1,10 @@ + + + + + +

Self-serve module runtime configuration.

+
diff --git a/documentation/topics/generated/Config_Module_Self_Serve_Page_1.topic b/documentation/topics/generated/Config_Module_Self_Serve_Page_1.topic new file mode 100644 index 00000000..a3b94b9c --- /dev/null +++ b/documentation/topics/generated/Config_Module_Self_Serve_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Config_Module_Shelly.topic b/documentation/topics/generated/Config_Module_Shelly.topic new file mode 100644 index 00000000..094b8991 --- /dev/null +++ b/documentation/topics/generated/Config_Module_Shelly.topic @@ -0,0 +1,10 @@ + + + + + +

Shelly integration configuration.

+
diff --git a/documentation/topics/generated/Config_Module_Shelly_Page_1.topic b/documentation/topics/generated/Config_Module_Shelly_Page_1.topic new file mode 100644 index 00000000..1a33d16d --- /dev/null +++ b/documentation/topics/generated/Config_Module_Shelly_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Config_Module_Stripe.topic b/documentation/topics/generated/Config_Module_Stripe.topic new file mode 100644 index 00000000..247f5d1e --- /dev/null +++ b/documentation/topics/generated/Config_Module_Stripe.topic @@ -0,0 +1,10 @@ + + + + + +

Stripe integration configuration.

+
diff --git a/documentation/topics/generated/Config_Module_Stripe_Page_1.topic b/documentation/topics/generated/Config_Module_Stripe_Page_1.topic new file mode 100644 index 00000000..6fe4e291 --- /dev/null +++ b/documentation/topics/generated/Config_Module_Stripe_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Config_Module_VirkData.topic b/documentation/topics/generated/Config_Module_VirkData.topic new file mode 100644 index 00000000..e7d286a4 --- /dev/null +++ b/documentation/topics/generated/Config_Module_VirkData.topic @@ -0,0 +1,10 @@ + + + + + +

VirkData integration configuration.

+
diff --git a/documentation/topics/generated/Config_Module_VirkData_Page_1.topic b/documentation/topics/generated/Config_Module_VirkData_Page_1.topic new file mode 100644 index 00000000..84c9c735 --- /dev/null +++ b/documentation/topics/generated/Config_Module_VirkData_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Config_Module_WeatherAPI.topic b/documentation/topics/generated/Config_Module_WeatherAPI.topic new file mode 100644 index 00000000..d34796e4 --- /dev/null +++ b/documentation/topics/generated/Config_Module_WeatherAPI.topic @@ -0,0 +1,10 @@ + + + + + +

WeatherAPI integration configuration.

+
diff --git a/documentation/topics/generated/Config_Module_WeatherAPI_Page_1.topic b/documentation/topics/generated/Config_Module_WeatherAPI_Page_1.topic new file mode 100644 index 00000000..4a6cc249 --- /dev/null +++ b/documentation/topics/generated/Config_Module_WeatherAPI_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Config_Module_XLVask.topic b/documentation/topics/generated/Config_Module_XLVask.topic new file mode 100644 index 00000000..818b8ee2 --- /dev/null +++ b/documentation/topics/generated/Config_Module_XLVask.topic @@ -0,0 +1,10 @@ + + + + + +

XLVask integration configuration.

+
diff --git a/documentation/topics/generated/Config_Module_XLVask_Page_1.topic b/documentation/topics/generated/Config_Module_XLVask_Page_1.topic new file mode 100644 index 00000000..9676c848 --- /dev/null +++ b/documentation/topics/generated/Config_Module_XLVask_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Config_Module_e_conomic.topic b/documentation/topics/generated/Config_Module_e_conomic.topic new file mode 100644 index 00000000..2a9c02f5 --- /dev/null +++ b/documentation/topics/generated/Config_Module_e_conomic.topic @@ -0,0 +1,10 @@ + + + + + +

e-conomic accounting integration configuration.

+
diff --git a/documentation/topics/generated/Config_Module_e_conomic_Page_1.topic b/documentation/topics/generated/Config_Module_e_conomic_Page_1.topic new file mode 100644 index 00000000..1d4877a2 --- /dev/null +++ b/documentation/topics/generated/Config_Module_e_conomic_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Config_Module_reCAPTCHA.topic b/documentation/topics/generated/Config_Module_reCAPTCHA.topic new file mode 100644 index 00000000..1c41d93c --- /dev/null +++ b/documentation/topics/generated/Config_Module_reCAPTCHA.topic @@ -0,0 +1,10 @@ + + + + + +

reCAPTCHA protection configuration.

+
diff --git a/documentation/topics/generated/Config_Module_reCAPTCHA_Page_1.topic b/documentation/topics/generated/Config_Module_reCAPTCHA_Page_1.topic new file mode 100644 index 00000000..49f21b35 --- /dev/null +++ b/documentation/topics/generated/Config_Module_reCAPTCHA_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Modules_Module_Action_Logs.topic b/documentation/topics/generated/Modules_Module_Action_Logs.topic new file mode 100644 index 00000000..c65a63c4 --- /dev/null +++ b/documentation/topics/generated/Modules_Module_Action_Logs.topic @@ -0,0 +1,10 @@ + + + + + +

Audit and operational logs for integration module activity.

+
diff --git a/documentation/topics/generated/Modules_Module_Action_Logs_Page_1.topic b/documentation/topics/generated/Modules_Module_Action_Logs_Page_1.topic new file mode 100644 index 00000000..df65851b --- /dev/null +++ b/documentation/topics/generated/Modules_Module_Action_Logs_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Modules_Module_Backup.topic b/documentation/topics/generated/Modules_Module_Backup.topic new file mode 100644 index 00000000..1d11f061 --- /dev/null +++ b/documentation/topics/generated/Modules_Module_Backup.topic @@ -0,0 +1,10 @@ + + + + + +

Backup integrations and backup module orchestration.

+
diff --git a/documentation/topics/generated/Modules_Module_Backup_Page_1.topic b/documentation/topics/generated/Modules_Module_Backup_Page_1.topic new file mode 100644 index 00000000..3cfdb7eb --- /dev/null +++ b/documentation/topics/generated/Modules_Module_Backup_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Modules_Module_CVR.topic b/documentation/topics/generated/Modules_Module_CVR.topic new file mode 100644 index 00000000..11345e8d --- /dev/null +++ b/documentation/topics/generated/Modules_Module_CVR.topic @@ -0,0 +1,10 @@ + + + + + +

Danish company registry (CVR) lookup and search integration.

+
diff --git a/documentation/topics/generated/Modules_Module_CVR_Page_1.topic b/documentation/topics/generated/Modules_Module_CVR_Page_1.topic new file mode 100644 index 00000000..197702af --- /dev/null +++ b/documentation/topics/generated/Modules_Module_CVR_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Modules_Module_Entra.topic b/documentation/topics/generated/Modules_Module_Entra.topic new file mode 100644 index 00000000..652317bc --- /dev/null +++ b/documentation/topics/generated/Modules_Module_Entra.topic @@ -0,0 +1,10 @@ + + + + + +

Microsoft Entra directory integration endpoints.

+
diff --git a/documentation/topics/generated/Modules_Module_Entra_Page_1.topic b/documentation/topics/generated/Modules_Module_Entra_Page_1.topic new file mode 100644 index 00000000..3df53d43 --- /dev/null +++ b/documentation/topics/generated/Modules_Module_Entra_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Modules_Module_FXRatesAPI.topic b/documentation/topics/generated/Modules_Module_FXRatesAPI.topic new file mode 100644 index 00000000..09549b55 --- /dev/null +++ b/documentation/topics/generated/Modules_Module_FXRatesAPI.topic @@ -0,0 +1,10 @@ + + + + + +

Currency exchange-rate lookup integration.

+
diff --git a/documentation/topics/generated/Modules_Module_FXRatesAPI_Page_1.topic b/documentation/topics/generated/Modules_Module_FXRatesAPI_Page_1.topic new file mode 100644 index 00000000..d998e8bb --- /dev/null +++ b/documentation/topics/generated/Modules_Module_FXRatesAPI_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Modules_Module_MotorAPI.topic b/documentation/topics/generated/Modules_Module_MotorAPI.topic new file mode 100644 index 00000000..e2cc59f2 --- /dev/null +++ b/documentation/topics/generated/Modules_Module_MotorAPI.topic @@ -0,0 +1,10 @@ + + + + + +

Vehicle lookup integration via MotorAPI.

+
diff --git a/documentation/topics/generated/Modules_Module_MotorAPI_Page_1.topic b/documentation/topics/generated/Modules_Module_MotorAPI_Page_1.topic new file mode 100644 index 00000000..a5c0b1c4 --- /dev/null +++ b/documentation/topics/generated/Modules_Module_MotorAPI_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Modules_Module_Self_Serve.topic b/documentation/topics/generated/Modules_Module_Self_Serve.topic new file mode 100644 index 00000000..11b3c713 --- /dev/null +++ b/documentation/topics/generated/Modules_Module_Self_Serve.topic @@ -0,0 +1,10 @@ + + + + + +

Self-serve lane control and machine command endpoints.

+
diff --git a/documentation/topics/generated/Modules_Module_Self_Serve_Page_1.topic b/documentation/topics/generated/Modules_Module_Self_Serve_Page_1.topic new file mode 100644 index 00000000..1cb84005 --- /dev/null +++ b/documentation/topics/generated/Modules_Module_Self_Serve_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Modules_Module_Stripe.topic b/documentation/topics/generated/Modules_Module_Stripe.topic new file mode 100644 index 00000000..bbb4a34e --- /dev/null +++ b/documentation/topics/generated/Modules_Module_Stripe.topic @@ -0,0 +1,10 @@ + + + + + +

Stripe payments, invoices, terminals, products, and customers.

+
diff --git a/documentation/topics/generated/Modules_Module_Stripe_Page_1.topic b/documentation/topics/generated/Modules_Module_Stripe_Page_1.topic new file mode 100644 index 00000000..4c17ad17 --- /dev/null +++ b/documentation/topics/generated/Modules_Module_Stripe_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Modules_Module_VirkData.topic b/documentation/topics/generated/Modules_Module_VirkData.topic new file mode 100644 index 00000000..a3168363 --- /dev/null +++ b/documentation/topics/generated/Modules_Module_VirkData.topic @@ -0,0 +1,10 @@ + + + + + +

VirkData company information integration.

+
diff --git a/documentation/topics/generated/Modules_Module_VirkData_Page_1.topic b/documentation/topics/generated/Modules_Module_VirkData_Page_1.topic new file mode 100644 index 00000000..4bb2b8b6 --- /dev/null +++ b/documentation/topics/generated/Modules_Module_VirkData_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Modules_Module_Wash_Certificates.topic b/documentation/topics/generated/Modules_Module_Wash_Certificates.topic new file mode 100644 index 00000000..0a0d4f26 --- /dev/null +++ b/documentation/topics/generated/Modules_Module_Wash_Certificates.topic @@ -0,0 +1,10 @@ + + + + + +

Wash certificate retrieval and listing integration.

+
diff --git a/documentation/topics/generated/Modules_Module_Wash_Certificates_Page_1.topic b/documentation/topics/generated/Modules_Module_Wash_Certificates_Page_1.topic new file mode 100644 index 00000000..d5e1ee43 --- /dev/null +++ b/documentation/topics/generated/Modules_Module_Wash_Certificates_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Modules_Module_WeatherAPI.topic b/documentation/topics/generated/Modules_Module_WeatherAPI.topic new file mode 100644 index 00000000..1e787fed --- /dev/null +++ b/documentation/topics/generated/Modules_Module_WeatherAPI.topic @@ -0,0 +1,10 @@ + + + + + +

Weather provider integration for current, forecast, and search.

+
diff --git a/documentation/topics/generated/Modules_Module_WeatherAPI_Page_1.topic b/documentation/topics/generated/Modules_Module_WeatherAPI_Page_1.topic new file mode 100644 index 00000000..240f8653 --- /dev/null +++ b/documentation/topics/generated/Modules_Module_WeatherAPI_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Modules_Module_XLVask.topic b/documentation/topics/generated/Modules_Module_XLVask.topic new file mode 100644 index 00000000..7500733f --- /dev/null +++ b/documentation/topics/generated/Modules_Module_XLVask.topic @@ -0,0 +1,10 @@ + + + + + +

XLVask synchronization, usage logs, vehicles, and customers.

+
diff --git a/documentation/topics/generated/Modules_Module_XLVask_Page_1.topic b/documentation/topics/generated/Modules_Module_XLVask_Page_1.topic new file mode 100644 index 00000000..c059b69b --- /dev/null +++ b/documentation/topics/generated/Modules_Module_XLVask_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Modules_Module_e_conomic.topic b/documentation/topics/generated/Modules_Module_e_conomic.topic new file mode 100644 index 00000000..6fca0683 --- /dev/null +++ b/documentation/topics/generated/Modules_Module_e_conomic.topic @@ -0,0 +1,10 @@ + + + + + +

Accounting and invoicing integration with e-conomic.

+
diff --git a/documentation/topics/generated/Modules_Module_e_conomic_Page_1.topic b/documentation/topics/generated/Modules_Module_e_conomic_Page_1.topic new file mode 100644 index 00000000..ee2428f1 --- /dev/null +++ b/documentation/topics/generated/Modules_Module_e_conomic_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Attachments.topic b/documentation/topics/generated/Tag_Attachments.topic new file mode 100644 index 00000000..35eff617 --- /dev/null +++ b/documentation/topics/generated/Tag_Attachments.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Attachments_Page_1.topic b/documentation/topics/generated/Tag_Attachments_Page_1.topic new file mode 100644 index 00000000..29ebeafc --- /dev/null +++ b/documentation/topics/generated/Tag_Attachments_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Authentication.topic b/documentation/topics/generated/Tag_Authentication.topic new file mode 100644 index 00000000..47780ef6 --- /dev/null +++ b/documentation/topics/generated/Tag_Authentication.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Authentication_Page_1.topic b/documentation/topics/generated/Tag_Authentication_Page_1.topic new file mode 100644 index 00000000..1f12cf12 --- /dev/null +++ b/documentation/topics/generated/Tag_Authentication_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Bird.topic b/documentation/topics/generated/Tag_Bird.topic new file mode 100644 index 00000000..61c3c4b2 --- /dev/null +++ b/documentation/topics/generated/Tag_Bird.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Bird_Page_1.topic b/documentation/topics/generated/Tag_Bird_Page_1.topic new file mode 100644 index 00000000..49ae2025 --- /dev/null +++ b/documentation/topics/generated/Tag_Bird_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Bookings.topic b/documentation/topics/generated/Tag_Bookings.topic new file mode 100644 index 00000000..0ededc9c --- /dev/null +++ b/documentation/topics/generated/Tag_Bookings.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Bookings_Page_1.topic b/documentation/topics/generated/Tag_Bookings_Page_1.topic new file mode 100644 index 00000000..b040929c --- /dev/null +++ b/documentation/topics/generated/Tag_Bookings_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Branding.topic b/documentation/topics/generated/Tag_Branding.topic new file mode 100644 index 00000000..078e1f09 --- /dev/null +++ b/documentation/topics/generated/Tag_Branding.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Branding_Page_1.topic b/documentation/topics/generated/Tag_Branding_Page_1.topic new file mode 100644 index 00000000..ae9148df --- /dev/null +++ b/documentation/topics/generated/Tag_Branding_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Categories.topic b/documentation/topics/generated/Tag_Categories.topic new file mode 100644 index 00000000..59c1fb0d --- /dev/null +++ b/documentation/topics/generated/Tag_Categories.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Categories_Page_1.topic b/documentation/topics/generated/Tag_Categories_Page_1.topic new file mode 100644 index 00000000..a7ee0f93 --- /dev/null +++ b/documentation/topics/generated/Tag_Categories_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Config.topic b/documentation/topics/generated/Tag_Config.topic new file mode 100644 index 00000000..48429663 --- /dev/null +++ b/documentation/topics/generated/Tag_Config.topic @@ -0,0 +1,34 @@ + + + + + +

Configuration endpoints grouped by module name.

+ + + + + + + + + + + + + + + + + + + + + + +
ModuleDescription
BackupsBackup configuration for backup module behavior.
BirdBird communication integration configuration.
e-conomice-conomic accounting integration configuration.
EmailEmail provider and SMTP/MailerSend configuration.
EntraMicrosoft Entra identity integration configuration.
FXRatesAPIFXRatesAPI exchange-rate integration configuration.
GatewayAPIGatewayAPI integration configuration.
LicensePlateRecognizerLicense plate recognizer integration configuration.
LimbleLimble integration configuration.
MotorAPIMotorAPI vehicle lookup integration configuration.
OcrSpaceOCR Space integration configuration.
OpenAIOpenAI integration configuration.
reCAPTCHAreCAPTCHA protection configuration.
Self-ServeSelf-serve module runtime configuration.
ShellyShelly integration configuration.
StripeStripe integration configuration.
VirkDataVirkData integration configuration.
WeatherAPIWeatherAPI integration configuration.
XLVaskXLVask integration configuration.
+
+
diff --git a/documentation/topics/generated/Tag_Departments.topic b/documentation/topics/generated/Tag_Departments.topic new file mode 100644 index 00000000..de3ad223 --- /dev/null +++ b/documentation/topics/generated/Tag_Departments.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Departments_Page_1.topic b/documentation/topics/generated/Tag_Departments_Page_1.topic new file mode 100644 index 00000000..7dd38095 --- /dev/null +++ b/documentation/topics/generated/Tag_Departments_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Departments_Page_2.topic b/documentation/topics/generated/Tag_Departments_Page_2.topic new file mode 100644 index 00000000..4ea69fab --- /dev/null +++ b/documentation/topics/generated/Tag_Departments_Page_2.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Forms.topic b/documentation/topics/generated/Tag_Forms.topic new file mode 100644 index 00000000..86d07f56 --- /dev/null +++ b/documentation/topics/generated/Tag_Forms.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Forms_Page_1.topic b/documentation/topics/generated/Tag_Forms_Page_1.topic new file mode 100644 index 00000000..c153c9db --- /dev/null +++ b/documentation/topics/generated/Tag_Forms_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Goals.topic b/documentation/topics/generated/Tag_Goals.topic new file mode 100644 index 00000000..1e959b33 --- /dev/null +++ b/documentation/topics/generated/Tag_Goals.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Goals_Page_1.topic b/documentation/topics/generated/Tag_Goals_Page_1.topic new file mode 100644 index 00000000..8280f391 --- /dev/null +++ b/documentation/topics/generated/Tag_Goals_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Invoices.topic b/documentation/topics/generated/Tag_Invoices.topic new file mode 100644 index 00000000..23322399 --- /dev/null +++ b/documentation/topics/generated/Tag_Invoices.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Invoices_Page_1.topic b/documentation/topics/generated/Tag_Invoices_Page_1.topic new file mode 100644 index 00000000..91d34a4e --- /dev/null +++ b/documentation/topics/generated/Tag_Invoices_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Invoices_Page_2.topic b/documentation/topics/generated/Tag_Invoices_Page_2.topic new file mode 100644 index 00000000..1f932a2a --- /dev/null +++ b/documentation/topics/generated/Tag_Invoices_Page_2.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Modules.topic b/documentation/topics/generated/Tag_Modules.topic new file mode 100644 index 00000000..cdb648c4 --- /dev/null +++ b/documentation/topics/generated/Tag_Modules.topic @@ -0,0 +1,28 @@ + + + + + +

Module integrations sorted by module name.

+ + + + + + + + + + + + + + + + +
ModuleDescription
Action LogsAudit and operational logs for integration module activity.
BackupBackup integrations and backup module orchestration.
CVRDanish company registry (CVR) lookup and search integration.
e-conomicAccounting and invoicing integration with e-conomic.
EntraMicrosoft Entra directory integration endpoints.
FXRatesAPICurrency exchange-rate lookup integration.
MotorAPIVehicle lookup integration via MotorAPI.
Self-ServeSelf-serve lane control and machine command endpoints.
StripeStripe payments, invoices, terminals, products, and customers.
VirkDataVirkData company information integration.
Wash CertificatesWash certificate retrieval and listing integration.
WeatherAPIWeather provider integration for current, forecast, and search.
XLVaskXLVask synchronization, usage logs, vehicles, and customers.
+
+
diff --git a/documentation/topics/generated/Tag_Notifications.topic b/documentation/topics/generated/Tag_Notifications.topic new file mode 100644 index 00000000..b1ab5182 --- /dev/null +++ b/documentation/topics/generated/Tag_Notifications.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Notifications_Page_1.topic b/documentation/topics/generated/Tag_Notifications_Page_1.topic new file mode 100644 index 00000000..6c052d36 --- /dev/null +++ b/documentation/topics/generated/Tag_Notifications_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Order_Items.topic b/documentation/topics/generated/Tag_Order_Items.topic new file mode 100644 index 00000000..4f24e04c --- /dev/null +++ b/documentation/topics/generated/Tag_Order_Items.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Order_Items_Page_1.topic b/documentation/topics/generated/Tag_Order_Items_Page_1.topic new file mode 100644 index 00000000..eb60d385 --- /dev/null +++ b/documentation/topics/generated/Tag_Order_Items_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Orders.topic b/documentation/topics/generated/Tag_Orders.topic new file mode 100644 index 00000000..4f1b16d5 --- /dev/null +++ b/documentation/topics/generated/Tag_Orders.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Orders_Page_1.topic b/documentation/topics/generated/Tag_Orders_Page_1.topic new file mode 100644 index 00000000..142dd43d --- /dev/null +++ b/documentation/topics/generated/Tag_Orders_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Plate_Scans.topic b/documentation/topics/generated/Tag_Plate_Scans.topic new file mode 100644 index 00000000..451e89cd --- /dev/null +++ b/documentation/topics/generated/Tag_Plate_Scans.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Plate_Scans_Page_1.topic b/documentation/topics/generated/Tag_Plate_Scans_Page_1.topic new file mode 100644 index 00000000..60bff3e2 --- /dev/null +++ b/documentation/topics/generated/Tag_Plate_Scans_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Products.topic b/documentation/topics/generated/Tag_Products.topic new file mode 100644 index 00000000..3206a17d --- /dev/null +++ b/documentation/topics/generated/Tag_Products.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Products_Page_1.topic b/documentation/topics/generated/Tag_Products_Page_1.topic new file mode 100644 index 00000000..47945ffe --- /dev/null +++ b/documentation/topics/generated/Tag_Products_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Roles.topic b/documentation/topics/generated/Tag_Roles.topic new file mode 100644 index 00000000..b3e01ccb --- /dev/null +++ b/documentation/topics/generated/Tag_Roles.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Roles_Page_1.topic b/documentation/topics/generated/Tag_Roles_Page_1.topic new file mode 100644 index 00000000..704c01ee --- /dev/null +++ b/documentation/topics/generated/Tag_Roles_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Search.topic b/documentation/topics/generated/Tag_Search.topic new file mode 100644 index 00000000..eeae238d --- /dev/null +++ b/documentation/topics/generated/Tag_Search.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Search_Page_1.topic b/documentation/topics/generated/Tag_Search_Page_1.topic new file mode 100644 index 00000000..92a85971 --- /dev/null +++ b/documentation/topics/generated/Tag_Search_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Security.topic b/documentation/topics/generated/Tag_Security.topic new file mode 100644 index 00000000..c95d3cf1 --- /dev/null +++ b/documentation/topics/generated/Tag_Security.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Security_Page_1.topic b/documentation/topics/generated/Tag_Security_Page_1.topic new file mode 100644 index 00000000..0efd088c --- /dev/null +++ b/documentation/topics/generated/Tag_Security_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Self_Serve.topic b/documentation/topics/generated/Tag_Self_Serve.topic new file mode 100644 index 00000000..f61a0c51 --- /dev/null +++ b/documentation/topics/generated/Tag_Self_Serve.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Self_Serve_Page_1.topic b/documentation/topics/generated/Tag_Self_Serve_Page_1.topic new file mode 100644 index 00000000..c6d948f8 --- /dev/null +++ b/documentation/topics/generated/Tag_Self_Serve_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Self_Serve_Page_2.topic b/documentation/topics/generated/Tag_Self_Serve_Page_2.topic new file mode 100644 index 00000000..c2d54e21 --- /dev/null +++ b/documentation/topics/generated/Tag_Self_Serve_Page_2.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Statistics.topic b/documentation/topics/generated/Tag_Statistics.topic new file mode 100644 index 00000000..b5014bec --- /dev/null +++ b/documentation/topics/generated/Tag_Statistics.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Statistics_Page_1.topic b/documentation/topics/generated/Tag_Statistics_Page_1.topic new file mode 100644 index 00000000..5d45e7fa --- /dev/null +++ b/documentation/topics/generated/Tag_Statistics_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Subusers.topic b/documentation/topics/generated/Tag_Subusers.topic new file mode 100644 index 00000000..0c760f8a --- /dev/null +++ b/documentation/topics/generated/Tag_Subusers.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Subusers_Page_1.topic b/documentation/topics/generated/Tag_Subusers_Page_1.topic new file mode 100644 index 00000000..8ff0a26c --- /dev/null +++ b/documentation/topics/generated/Tag_Subusers_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Users.topic b/documentation/topics/generated/Tag_Users.topic new file mode 100644 index 00000000..28f90011 --- /dev/null +++ b/documentation/topics/generated/Tag_Users.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Users_Page_1.topic b/documentation/topics/generated/Tag_Users_Page_1.topic new file mode 100644 index 00000000..3be43b0f --- /dev/null +++ b/documentation/topics/generated/Tag_Users_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Users_Page_2.topic b/documentation/topics/generated/Tag_Users_Page_2.topic new file mode 100644 index 00000000..fdf67db7 --- /dev/null +++ b/documentation/topics/generated/Tag_Users_Page_2.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Vehicles.topic b/documentation/topics/generated/Tag_Vehicles.topic new file mode 100644 index 00000000..100f8305 --- /dev/null +++ b/documentation/topics/generated/Tag_Vehicles.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Vehicles_Page_1.topic b/documentation/topics/generated/Tag_Vehicles_Page_1.topic new file mode 100644 index 00000000..c16c8674 --- /dev/null +++ b/documentation/topics/generated/Tag_Vehicles_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/Tag_Worker.topic b/documentation/topics/generated/Tag_Worker.topic new file mode 100644 index 00000000..fc994fdb --- /dev/null +++ b/documentation/topics/generated/Tag_Worker.topic @@ -0,0 +1,10 @@ + + + + + +

Endpoints in this section are generated from openapi.yaml.

+
diff --git a/documentation/topics/generated/Tag_Worker_Page_1.topic b/documentation/topics/generated/Tag_Worker_Page_1.topic new file mode 100644 index 00000000..a55f2054 --- /dev/null +++ b/documentation/topics/generated/Tag_Worker_Page_1.topic @@ -0,0 +1,10 @@ + + + + + +

This page groups endpoint topics for this object type.

+
diff --git a/documentation/topics/generated/addBrandingOption.topic b/documentation/topics/generated/addBrandingOption.topic new file mode 100644 index 00000000..ff33b57d --- /dev/null +++ b/documentation/topics/generated/addBrandingOption.topic @@ -0,0 +1,60 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /branding + + +

Operation ID: addBrandingOption

+

Create a new branding option

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "cvr": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name", + "description", + "cvr" + ], + "type": "object" +} + +
+ + + + + +
StatusDescriptionContent Types
200Branding option added successfullyapplication/json
403
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/addButtonPress.topic b/documentation/topics/generated/addButtonPress.topic new file mode 100644 index 00000000..48b2acb7 --- /dev/null +++ b/documentation/topics/generated/addButtonPress.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /relay/button/press/post + + +

Operation ID: addButtonPress

+

Record machine start button press webhook

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + +
NameInRequiredTypeDescription
tokenquerynostring
lane_idquerynointeger
regquerynostring
+
+ + + + + +
StatusDescriptionContent Types
201Button press recorded and linked to a self-serve wash sessionapplication/json
404
+

Schema for response 201 (application/json):

+ +{ + "$ref": "#/components/schemas/MachineButtonPressWebhookResponse" +} + +
+
diff --git a/documentation/topics/generated/addButtonPressPost.topic b/documentation/topics/generated/addButtonPressPost.topic new file mode 100644 index 00000000..d7317bfb --- /dev/null +++ b/documentation/topics/generated/addButtonPressPost.topic @@ -0,0 +1,57 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /relay/button/press/post + + +

Operation ID: addButtonPressPost

+

Record machine start button press webhook

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{ + "properties": { + "lane_id": { + "type": "integer" + }, + "reg": { + "type": "string" + }, + "token": { + "type": "string" + } + }, + "type": "object" +} + +
+ + + + + +
StatusDescriptionContent Types
201Button press recorded and linked to a self-serve wash sessionapplication/json
404
+

Schema for response 201 (application/json):

+ +{ + "$ref": "#/components/schemas/MachineButtonPressWebhookResponse" +} + +
+
diff --git a/documentation/topics/generated/addCustomerAttribute.topic b/documentation/topics/generated/addCustomerAttribute.topic new file mode 100644 index 00000000..d394a7b7 --- /dev/null +++ b/documentation/topics/generated/addCustomerAttribute.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /customer/attributes + + +

Operation ID: addCustomerAttribute

+

Add a custom attribute to a customer

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
201Customer attribute added successfullyapplication/json
+

Schema for response 201 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/addCustomerCode.topic b/documentation/topics/generated/addCustomerCode.topic new file mode 100644 index 00000000..831f803e --- /dev/null +++ b/documentation/topics/generated/addCustomerCode.topic @@ -0,0 +1,54 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /admin/customer/code + + +

Operation ID: addCustomerCode

+

Add customer code

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "code": { + "type": "string" + }, + "customer_number": { + "type": "integer" + }, + "user_id": { + "type": "integer" + } + }, + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/addCustomerDefaultDepartment.topic b/documentation/topics/generated/addCustomerDefaultDepartment.topic new file mode 100644 index 00000000..d9c5c684 --- /dev/null +++ b/documentation/topics/generated/addCustomerDefaultDepartment.topic @@ -0,0 +1,54 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /customer/department/default + + +

Operation ID: addCustomerDefaultDepartment

+

Add customer default department

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "customer_number": { + "type": "integer" + }, + "department": { + "type": "integer" + } + }, + "required": [ + "department" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/addCustomerFixedPricing.topic b/documentation/topics/generated/addCustomerFixedPricing.topic new file mode 100644 index 00000000..58909b0c --- /dev/null +++ b/documentation/topics/generated/addCustomerFixedPricing.topic @@ -0,0 +1,59 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /customer/pricing/fixed + + +

Operation ID: addCustomerFixedPricing

+

Add customer fixed pricing

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "customer_number": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "price": { + "type": "integer" + } + }, + "required": [ + "customer_number", + "price", + "description" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/addCustomerNote.topic b/documentation/topics/generated/addCustomerNote.topic new file mode 100644 index 00000000..eeb8603b --- /dev/null +++ b/documentation/topics/generated/addCustomerNote.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /customer/notes + + +

Operation ID: addCustomerNote

+

Add a note to a customer

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
201Customer note added successfullyapplication/json
+

Schema for response 201 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/addDailyReport.topic b/documentation/topics/generated/addDailyReport.topic new file mode 100644 index 00000000..f4b6fcbf --- /dev/null +++ b/documentation/topics/generated/addDailyReport.topic @@ -0,0 +1,59 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /departments/daily-reports + + +

Operation ID: addDailyReport

+

Add daily report

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "date": { + "type": "string" + }, + "department_id": { + "type": "integer" + }, + "report": { + "type": "string" + } + }, + "required": [ + "department_id", + "date", + "report" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/addDepartmentCategory.topic b/documentation/topics/generated/addDepartmentCategory.topic new file mode 100644 index 00000000..671afdcf --- /dev/null +++ b/documentation/topics/generated/addDepartmentCategory.topic @@ -0,0 +1,51 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /departments/categories + + +

Operation ID: addDepartmentCategory

+

Associate a product category with a department

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "category_id": { + "type": "integer" + }, + "department_id": { + "type": "integer" + } + }, + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
201Category added to department successfullyapplication/json
+

Schema for response 201 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/addOrderItem.topic b/documentation/topics/generated/addOrderItem.topic new file mode 100644 index 00000000..5354b6a0 --- /dev/null +++ b/documentation/topics/generated/addOrderItem.topic @@ -0,0 +1,44 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /order/items + + +

Operation ID: addOrderItem

+

Add a new item to an existing order

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/OrderItemCreate" +} + +
+ + + + + +
StatusDescriptionContent Types
201Order item added successfullyapplication/json
400
+

Schema for response 201 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/addPlateScanner.topic b/documentation/topics/generated/addPlateScanner.topic new file mode 100644 index 00000000..0cd2297c --- /dev/null +++ b/documentation/topics/generated/addPlateScanner.topic @@ -0,0 +1,59 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /numberplatescanners + + +

Operation ID: addPlateScanner

+

Add plate scanner

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "department_id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "notes": { + "type": "string" + } + }, + "required": [ + "department_id", + "name", + "notes" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
201Plate scanner added successfullyapplication/json
+

Schema for response 201 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/addRole.topic b/documentation/topics/generated/addRole.topic new file mode 100644 index 00000000..0d318200 --- /dev/null +++ b/documentation/topics/generated/addRole.topic @@ -0,0 +1,51 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /roles + + +

Operation ID: addRole

+

Add role

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/addRolePermission.topic b/documentation/topics/generated/addRolePermission.topic new file mode 100644 index 00000000..80ab4f9a --- /dev/null +++ b/documentation/topics/generated/addRolePermission.topic @@ -0,0 +1,55 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /roles/permissions + + +

Operation ID: addRolePermission

+

Add permission to role

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "permission": { + "type": "string" + }, + "role_id": { + "type": "integer" + } + }, + "required": [ + "role_id", + "permission" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/addSelfserveCondition.topic b/documentation/topics/generated/addSelfserveCondition.topic new file mode 100644 index 00000000..16c9b58f --- /dev/null +++ b/documentation/topics/generated/addSelfserveCondition.topic @@ -0,0 +1,79 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /department/selfserve/conditions + + +

Operation ID: addSelfserveCondition

+

Add a new self-serve condition. Either provide a reusable machine_type_id or a legacy department/lane/product scope.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "condition_id": { + "nullable": true, + "type": "integer" + }, + "department": { + "default": 0, + "type": "integer" + }, + "description": { + "type": "string" + }, + "lane": { + "default": 0, + "type": "integer" + }, + "machine_type_id": { + "nullable": true, + "type": "integer" + }, + "name": { + "type": "string" + }, + "product": { + "default": 0, + "type": "integer" + } + }, + "required": [ + "name", + "description" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Successfully added conditionapplication/json
400
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/DepartmentSelfserveCondition" +} + +
+
diff --git a/documentation/topics/generated/addSelfserveConditionRule.topic b/documentation/topics/generated/addSelfserveConditionRule.topic new file mode 100644 index 00000000..e2d33b32 --- /dev/null +++ b/documentation/topics/generated/addSelfserveConditionRule.topic @@ -0,0 +1,75 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /department/selfserve/condition/rules + + +

Operation ID: addSelfserveConditionRule

+

Add a new self-serve condition rule.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "condition_id": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "object_id": { + "type": "integer" + }, + "object_type": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "condition_id", + "type", + "object_type", + "object_id", + "name", + "description" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Successfully added condition ruleapplication/json
400
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/DepartmentSelfserveConditionRule" +} + +
+
diff --git a/documentation/topics/generated/addSelfserveMachineType.topic b/documentation/topics/generated/addSelfserveMachineType.topic new file mode 100644 index 00000000..8157adf2 --- /dev/null +++ b/documentation/topics/generated/addSelfserveMachineType.topic @@ -0,0 +1,57 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /department/selfserve/machine-types + + +

Operation ID: addSelfserveMachineType

+

Add reusable self-serve machine type

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "description": { + "nullable": true, + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successfully added machine typeapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/SelfserveMachineType" +} + +
+
diff --git a/documentation/topics/generated/addSelfserveQuestion.topic b/documentation/topics/generated/addSelfserveQuestion.topic new file mode 100644 index 00000000..7a785461 --- /dev/null +++ b/documentation/topics/generated/addSelfserveQuestion.topic @@ -0,0 +1,79 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /department/selfserve/questions + + +

Operation ID: addSelfserveQuestion

+

Add a new self-serve question. Questions are typically shared across departments and lanes by omitting department, lane, and product, which default to 0.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "condition_id": { + "nullable": true, + "type": "integer" + }, + "department": { + "default": 0, + "type": "integer" + }, + "description": { + "type": "string" + }, + "lane": { + "default": 0, + "type": "integer" + }, + "order_priority": { + "default": 0, + "type": "integer" + }, + "product": { + "default": 0, + "type": "integer" + }, + "question": { + "type": "string" + } + }, + "required": [ + "question", + "description" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Successfully added questionapplication/json
400
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/DepartmentSelfserveQuestion" +} + +
+
diff --git a/documentation/topics/generated/addSelfserveTask.topic b/documentation/topics/generated/addSelfserveTask.topic new file mode 100644 index 00000000..8dcd2bcb --- /dev/null +++ b/documentation/topics/generated/addSelfserveTask.topic @@ -0,0 +1,103 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /department/selfserve/tasks + + +

Operation ID: addSelfserveTask

+

Add a new self-serve task. Either provide a reusable machine_type_id or a legacy department/lane/product scope.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "buttons": { + "default": [], + "description": "Optional dynamic image button IDs enabled by this task.", + "items": { + "type": "integer" + }, + "type": "array" + }, + "condition_id": { + "nullable": true, + "type": "integer" + }, + "department": { + "default": 0, + "type": "integer" + }, + "description": { + "type": "string" + }, + "dynamic_images_vehicle_type": { + "description": "Optional vehicle type selection override for the machine UI. Integer >= 0 or null.", + "nullable": true, + "type": "integer" + }, + "lane": { + "default": 0, + "type": "integer" + }, + "machine_type_id": { + "nullable": true, + "type": "integer" + }, + "order_priority": { + "default": 0, + "type": "integer" + }, + "product": { + "default": 0, + "type": "integer" + }, + "services": { + "description": "Optional services enabled by this task. Items must be valid service enum names.", + "items": { + "$ref": "#/components/schemas/SelfserveLaneService" + }, + "type": "array" + }, + "task": { + "type": "string" + } + }, + "required": [ + "task", + "description" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Successfully added taskapplication/json
400
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/DepartmentSelfserveTask" +} + +
+
diff --git a/documentation/topics/generated/addSelfserveVehicleCondition.topic b/documentation/topics/generated/addSelfserveVehicleCondition.topic new file mode 100644 index 00000000..bcc83594 --- /dev/null +++ b/documentation/topics/generated/addSelfserveVehicleCondition.topic @@ -0,0 +1,74 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /department/selfserve/vehicle/conditions + + +

Operation ID: addSelfserveVehicleCondition

+

Add a new vehicle condition (answer to a question). Customers can only add conditions for their own vehicles.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "customer_id": { + "nullable": true, + "type": "integer" + }, + "department": { + "type": "integer" + }, + "lane": { + "type": "integer" + }, + "question": { + "type": "integer" + }, + "reg": { + "type": "string" + }, + "value": { + "type": "boolean" + } + }, + "required": [ + "department", + "lane", + "reg", + "question" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Successfully added vehicle conditionapplication/json
400
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/DepartmentSelfserveVehicleConditionMutationResponse" +} + +
+
diff --git a/documentation/topics/generated/addVehicle.topic b/documentation/topics/generated/addVehicle.topic new file mode 100644 index 00000000..06648d95 --- /dev/null +++ b/documentation/topics/generated/addVehicle.topic @@ -0,0 +1,85 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /vehicles + + +

Operation ID: addVehicle

+

Create a new vehicle for a customer. + +Permissions: +- Own scope: `add_vehicle` (linked to subuser node `VEHICLES_ADD`). +- Broader scope: `add_vehicle_other`. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
noobject
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "customer_id": { + "description": "Optional explicit target customer. Defaults to the effective customer context.", + "type": "integer" + }, + "reference": { + "maxLength": 255, + "nullable": true, + "type": "string" + }, + "reg": { + "description": "Vehicle registration number", + "maxLength": 12, + "minLength": 2, + "type": "string" + }, + "type": { + "description": "Product ID representing the vehicle wash type", + "type": "integer" + }, + "wash_subscription": { + "type": "boolean" + } + }, + "required": [ + "reg", + "type", + "wash_subscription" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Vehicle createdapplication/json
400
403
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/adminDeleteBooking.topic b/documentation/topics/generated/adminDeleteBooking.topic new file mode 100644 index 00000000..aac95d8d --- /dev/null +++ b/documentation/topics/generated/adminDeleteBooking.topic @@ -0,0 +1,51 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /admin/bookings/delete + + +

Operation ID: adminDeleteBooking

+

Delete booking (admin)

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "id": { + "type": "integer" + } + }, + "required": [ + "id" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/birdCreateFlashCall.topic b/documentation/topics/generated/birdCreateFlashCall.topic new file mode 100644 index 00000000..ca92902d --- /dev/null +++ b/documentation/topics/generated/birdCreateFlashCall.topic @@ -0,0 +1,54 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /bird/voice/flash-calls + + +

Operation ID: birdCreateFlashCall

+

Create/place a flash call via Bird

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
workspaceIdquerynostringBird Workspace identifier (falls back to module configuration if omitted)
channelIdquerynostringBird Channel identifier (falls back to module configuration if omitted)
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "additionalProperties": true, + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Flash call createdapplication/json
+

Schema for response 200 (application/json):

+ +{ + "additionalProperties": true, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/birdCreateVoiceCall.topic b/documentation/topics/generated/birdCreateVoiceCall.topic new file mode 100644 index 00000000..e6e1aa18 --- /dev/null +++ b/documentation/topics/generated/birdCreateVoiceCall.topic @@ -0,0 +1,65 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /bird/voice/calls + + +

Operation ID: birdCreateVoiceCall

+

Create/place a voice call via Bird

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
workspaceIdquerynostringBird Workspace identifier (falls back to module configuration if omitted)
channelIdquerynostringBird Channel identifier (falls back to module configuration if omitted)
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "additionalProperties": true, + "properties": { + "from": { + "description": "E.164 phone number of the caller (sender)", + "example": "+4599988877", + "type": "string" + }, + "to": { + "description": "E.164 phone number of the callee", + "example": "+4511122233", + "type": "string" + } + }, + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Call createdapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/BirdVoiceCallSingleResponse" +} + +
+
diff --git a/documentation/topics/generated/birdDeleteNumber.topic b/documentation/topics/generated/birdDeleteNumber.topic new file mode 100644 index 00000000..c2e46149 --- /dev/null +++ b/documentation/topics/generated/birdDeleteNumber.topic @@ -0,0 +1,44 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /bird/numbers/{id} + + +

Operation ID: birdDeleteNumber

+

Delete/release a number by ID

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
workspaceIdquerynostringBird Workspace identifier (optional if configured)
idpathyesstring
+
+ + + + +
StatusDescriptionContent Types
200Number deletion/release acceptedapplication/json
+

Schema for response 200 (application/json):

+ +{ + "additionalProperties": true, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/birdEndFlashCall.topic b/documentation/topics/generated/birdEndFlashCall.topic new file mode 100644 index 00000000..4065399c --- /dev/null +++ b/documentation/topics/generated/birdEndFlashCall.topic @@ -0,0 +1,55 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /bird/voice/flash-calls/{id} + + +

Operation ID: birdEndFlashCall

+

Posts a completion/update payload to the flash call resource to finalize verification.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + +
NameInRequiredTypeDescription
workspaceIdquerynostringBird Workspace identifier (falls back to module configuration if omitted)
channelIdquerynostringBird Channel identifier (falls back to module configuration if omitted)
idpathyesstring
+
+ +

Required: no.

+

Content type: application/json

+ +{ + "additionalProperties": true, + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Flash call completedapplication/json
+

Schema for response 200 (application/json):

+ +{ + "additionalProperties": true, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/birdEndFlashCallByNumbers.topic b/documentation/topics/generated/birdEndFlashCallByNumbers.topic new file mode 100644 index 00000000..119da6d9 --- /dev/null +++ b/documentation/topics/generated/birdEndFlashCallByNumbers.topic @@ -0,0 +1,66 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /bird/voice/flash-calls/end + + +

Operation ID: birdEndFlashCallByNumbers

+

Ends an ongoing flash call by specifying the originating and destination numbers.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
workspaceIdquerynostringBird Workspace identifier (falls back to module configuration if omitted)
channelIdquerynostringBird Channel identifier (falls back to module configuration if omitted)
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "additionalProperties": true, + "properties": { + "from": { + "description": "E.164 formatted caller number", + "example": "+4599988877", + "type": "string" + }, + "to": { + "description": "E.164 formatted callee number", + "example": "+4511122233", + "type": "string" + } + }, + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Flash call completed (by numbers)application/json
+

Schema for response 200 (application/json):

+ +{ + "additionalProperties": true, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/birdGetFlashCall.topic b/documentation/topics/generated/birdGetFlashCall.topic new file mode 100644 index 00000000..caf22d68 --- /dev/null +++ b/documentation/topics/generated/birdGetFlashCall.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /bird/voice/flash-calls/{id} + + +

Operation ID: birdGetFlashCall

+

Get a flash call by ID

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + +
NameInRequiredTypeDescription
workspaceIdquerynostringBird Workspace identifier (falls back to module configuration if omitted)
channelIdquerynostringBird Channel identifier (falls back to module configuration if omitted)
idpathyesstring
+
+ + + + +
StatusDescriptionContent Types
200Flash call detailsapplication/json
+

Schema for response 200 (application/json):

+ +{ + "additionalProperties": true, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/birdGetNumber.topic b/documentation/topics/generated/birdGetNumber.topic new file mode 100644 index 00000000..4bea5863 --- /dev/null +++ b/documentation/topics/generated/birdGetNumber.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /bird/numbers/{id} + + +

Operation ID: birdGetNumber

+

Get a number by ID

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
workspaceIdquerynostringBird Workspace identifier (optional if configured)
idpathyesstring
+
+ + + + +
StatusDescriptionContent Types
200Number detailsapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/BirdNumberSingleResponse" +} + +
+
diff --git a/documentation/topics/generated/birdGetVoiceCall.topic b/documentation/topics/generated/birdGetVoiceCall.topic new file mode 100644 index 00000000..68f5d626 --- /dev/null +++ b/documentation/topics/generated/birdGetVoiceCall.topic @@ -0,0 +1,44 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /bird/voice/calls/{id} + + +

Operation ID: birdGetVoiceCall

+

Get a voice call by ID

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + +
NameInRequiredTypeDescription
workspaceIdquerynostringBird Workspace identifier (falls back to module configuration if omitted)
channelIdquerynostringBird Channel identifier (falls back to module configuration if omitted)
idpathyesstring
+
+ + + + +
StatusDescriptionContent Types
200Call detailsapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/BirdVoiceCallSingleResponse" +} + +
+
diff --git a/documentation/topics/generated/birdHangupVoiceCall.topic b/documentation/topics/generated/birdHangupVoiceCall.topic new file mode 100644 index 00000000..419d7eb2 --- /dev/null +++ b/documentation/topics/generated/birdHangupVoiceCall.topic @@ -0,0 +1,44 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /bird/voice/calls/{id}/hangup + + +

Operation ID: birdHangupVoiceCall

+

Hang up a voice call by ID

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + +
NameInRequiredTypeDescription
workspaceIdquerynostringBird Workspace identifier (falls back to module configuration if omitted)
channelIdquerynostringBird Channel identifier (falls back to module configuration if omitted)
idpathyesstring
+
+ + + + +
StatusDescriptionContent Types
200Hangup requestedapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/BirdVoiceCallSingleResponse" +} + +
+
diff --git a/documentation/topics/generated/birdListFlashCalls.topic b/documentation/topics/generated/birdListFlashCalls.topic new file mode 100644 index 00000000..277bf6b5 --- /dev/null +++ b/documentation/topics/generated/birdListFlashCalls.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /bird/voice/flash-calls + + +

Operation ID: birdListFlashCalls

+

List flash calls

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + +
NameInRequiredTypeDescription
workspaceIdquerynostringBird Workspace identifier (falls back to module configuration if omitted)
channelIdquerynostringBird Channel identifier (falls back to module configuration if omitted)
pagequerynointeger
+
+ + + + +
StatusDescriptionContent Types
200A list of flash callsapplication/json
+

Schema for response 200 (application/json):

+ +{ + "additionalProperties": true, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/birdListNumbers.topic b/documentation/topics/generated/birdListNumbers.topic new file mode 100644 index 00000000..811b45aa --- /dev/null +++ b/documentation/topics/generated/birdListNumbers.topic @@ -0,0 +1,44 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /bird/numbers + + +

Operation ID: birdListNumbers

+

List your numbers

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + +
NameInRequiredTypeDescription
workspaceIdquerynostringBird Workspace identifier (optional if configured)
pagequerynointeger
limitquerynointeger
+
+ + + + +
StatusDescriptionContent Types
200A list of numbersapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/BirdNumberListResponse" +} + +
+
diff --git a/documentation/topics/generated/birdListVoiceCalls.topic b/documentation/topics/generated/birdListVoiceCalls.topic new file mode 100644 index 00000000..2b6ca35a --- /dev/null +++ b/documentation/topics/generated/birdListVoiceCalls.topic @@ -0,0 +1,44 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /bird/voice/calls + + +

Operation ID: birdListVoiceCalls

+

List voice calls

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + +
NameInRequiredTypeDescription
workspaceIdquerynostringBird Workspace identifier (falls back to module configuration if omitted)
channelIdquerynostringBird Channel identifier (falls back to module configuration if omitted)
pagequerynointeger
+
+ + + + +
StatusDescriptionContent Types
200A list of callsapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/BirdVoiceCallListResponse" +} + +
+
diff --git a/documentation/topics/generated/birdSayOnVoiceCall.topic b/documentation/topics/generated/birdSayOnVoiceCall.topic new file mode 100644 index 00000000..381abe3e --- /dev/null +++ b/documentation/topics/generated/birdSayOnVoiceCall.topic @@ -0,0 +1,88 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /bird/voice/calls/{id}/say + + +

Operation ID: birdSayOnVoiceCall

+

Say a message on an active voice call and hang up afterwards

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + +
NameInRequiredTypeDescription
workspaceIdquerynostringBird Workspace identifier (falls back to module configuration if omitted)
channelIdquerynostringBird Channel identifier (falls back to module configuration if omitted)
idpathyesstringCall identifier
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "hangup": { + "description": "Whether to hang up the call after the message finishes playing (defaults to true)", + "example": true, + "type": "boolean" + }, + "locale": { + "description": "The locale to use for the TTS voice (e.g. en-US)", + "example": "en-US", + "type": "string" + }, + "loop": { + "description": "Number of times to loop the message", + "example": 1, + "type": "integer" + }, + "text": { + "description": "The text message to play via TTS", + "example": "The gate will open shortly.", + "type": "string" + }, + "timeout": { + "description": "Timeout in seconds for the TTS action", + "example": 1, + "type": "integer" + }, + "voice": { + "description": "The voice identifier to use", + "example": "male", + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200TTS action requestedapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/BirdVoiceCallSingleResponse" +} + +
+
diff --git a/documentation/topics/generated/birdTestOutboundVoiceCall.topic b/documentation/topics/generated/birdTestOutboundVoiceCall.topic new file mode 100644 index 00000000..20c7e7df --- /dev/null +++ b/documentation/topics/generated/birdTestOutboundVoiceCall.topic @@ -0,0 +1,76 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /bird/voice/calls/test-outbound + + +

Operation ID: birdTestOutboundVoiceCall

+

Calls +45 42 33 11 28 and hangs up when the call reaches accepted/ongoing state.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
workspaceIdquerynostringBird Workspace identifier (falls back to module configuration if omitted)
channelIdquerynostringBird Channel identifier (falls back to module configuration if omitted)
+
+ +

Required: no.

+

Content type: application/json

+ +{ + "additionalProperties": true, + "properties": { + "from": { + "description": "Caller E.164 number to use for the test call", + "example": "+4599988877", + "type": "string" + }, + "hangupCause": { + "description": "Optional hangup cause passed through to Bird", + "type": "string" + }, + "maxPollSeconds": { + "description": "Max time to wait before timing out", + "example": 30, + "minimum": 5, + "type": "integer" + }, + "pollIntervalSeconds": { + "description": "Poll interval while waiting for accepted status", + "example": 2, + "minimum": 1, + "type": "integer" + } + }, + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Test call created and either hung up or timed outapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/BirdTestOutboundCallResponse" +} + +
+
diff --git a/documentation/topics/generated/captureStripePaymentIntent.topic b/documentation/topics/generated/captureStripePaymentIntent.topic new file mode 100644 index 00000000..98029a55 --- /dev/null +++ b/documentation/topics/generated/captureStripePaymentIntent.topic @@ -0,0 +1,51 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /orders/module/stripe/payment_intent/capture + + +

Operation ID: captureStripePaymentIntent

+

Capture Stripe payment intent

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "id": { + "type": "integer" + } + }, + "required": [ + "id" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/checkEconomicCustomerExists.topic b/documentation/topics/generated/checkEconomicCustomerExists.topic new file mode 100644 index 00000000..cde2df37 --- /dev/null +++ b/documentation/topics/generated/checkEconomicCustomerExists.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /economic/doesCustomerExist + + +

Operation ID: checkEconomicCustomerExists

+

Check if customer exists in e-conomic

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
cvrqueryyesstring
+
+ + + + + +
StatusDescriptionContent Types
200Customer check completedapplication/json
404
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/clearSystemSearchCache.topic b/documentation/topics/generated/clearSystemSearchCache.topic new file mode 100644 index 00000000..9c9c72b8 --- /dev/null +++ b/documentation/topics/generated/clearSystemSearchCache.topic @@ -0,0 +1,38 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /superuser/search/system/cache + + +

Operation ID: clearSystemSearchCache

+

Clears both query-result cache and intent-parser cache namespaces for system-wide search.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + +
StatusDescriptionContent Types
200Cache cleared successfullyapplication/json
401
403
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/SystemSearchCacheClearResponse" +} + +
+
diff --git a/documentation/topics/generated/cloneRole.topic b/documentation/topics/generated/cloneRole.topic new file mode 100644 index 00000000..28e7f369 --- /dev/null +++ b/documentation/topics/generated/cloneRole.topic @@ -0,0 +1,55 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /roles/clone + + +

Operation ID: cloneRole

+

Clone role

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "name": { + "type": "string" + }, + "role_id": { + "type": "integer" + } + }, + "required": [ + "role_id", + "name" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/closeDraftInvoice.topic b/documentation/topics/generated/closeDraftInvoice.topic new file mode 100644 index 00000000..c48f3b07 --- /dev/null +++ b/documentation/topics/generated/closeDraftInvoice.topic @@ -0,0 +1,48 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /invoices/draft/close + + +

Operation ID: closeDraftInvoice

+

Close a draft invoice

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "id": { + "type": "integer" + } + }, + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Draft invoice closed successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/compareCollectedInvoiceEconomic.topic b/documentation/topics/generated/compareCollectedInvoiceEconomic.topic new file mode 100644 index 00000000..5c599827 --- /dev/null +++ b/documentation/topics/generated/compareCollectedInvoiceEconomic.topic @@ -0,0 +1,49 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /collected-invoices/economic/compare + + +

Operation ID: compareCollectedInvoiceEconomic

+

Compares a collected invoice in the system with its corresponding invoice in E-conomic. +Returns totals from both sources, their difference, and any warnings detected during comparison. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
collected_invoice_idqueryyesintegerThe internal collected invoice ID to compare
+
+ + + + + + + + + +
StatusDescriptionContent Types
200Comparison completed successfullyapplication/json
400
401
403
404
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/CollectedInvoiceEconomicCompareResponse" +} + +
+
diff --git a/documentation/topics/generated/compareCollectedInvoiceEconomicV2.topic b/documentation/topics/generated/compareCollectedInvoiceEconomicV2.topic new file mode 100644 index 00000000..85317628 --- /dev/null +++ b/documentation/topics/generated/compareCollectedInvoiceEconomicV2.topic @@ -0,0 +1,47 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /collected-invoices/economic/v2/compare + + +

Operation ID: compareCollectedInvoiceEconomicV2

+

Compare internal invoice with draft/booked (V2)

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
collected_invoice_idqueryyesinteger
+
+ + + + + + + + + +
StatusDescriptionContent Types
200Comparison completedapplication/json
400
401
403
404
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/CollectedInvoiceEconomicV2CompareResponse" +} + +
+
diff --git a/documentation/topics/generated/compareCollectedInvoiceEconomicV2Bulk.topic b/documentation/topics/generated/compareCollectedInvoiceEconomicV2Bulk.topic new file mode 100644 index 00000000..006c95d9 --- /dev/null +++ b/documentation/topics/generated/compareCollectedInvoiceEconomicV2Bulk.topic @@ -0,0 +1,63 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /collected-invoices/economic/v2/compare/bulk + + +

Operation ID: compareCollectedInvoiceEconomicV2Bulk

+

Bulk compare collected invoices against draft/booked (V2)

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "collected_invoice_ids": { + "items": { + "minimum": 1, + "type": "integer" + }, + "maxItems": 200, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "collected_invoice_ids" + ], + "type": "object" +} + +
+ + + + + + + + +
StatusDescriptionContent Types
200Bulk comparison completedapplication/json
400
401
403
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/CollectedInvoiceEconomicV2CompareBulkResponse" +} + +
+
diff --git a/documentation/topics/generated/completeOrderBooking.topic b/documentation/topics/generated/completeOrderBooking.topic new file mode 100644 index 00000000..120f2773 --- /dev/null +++ b/documentation/topics/generated/completeOrderBooking.topic @@ -0,0 +1,54 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /order-bookings/complete + + +

Operation ID: completeOrderBooking

+

Complete order booking

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "id": { + "type": "integer" + }, + "safety_seal": { + "type": "integer" + } + }, + "required": [ + "id" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/completeSubuserSetup.topic b/documentation/topics/generated/completeSubuserSetup.topic new file mode 100644 index 00000000..c02cbf38 --- /dev/null +++ b/documentation/topics/generated/completeSubuserSetup.topic @@ -0,0 +1,83 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /subusers/setup + + +

Operation ID: completeSubuserSetup

+

Completes subuser setup by setting a password and basic profile fields. Accepts optional +`username` and `email`. +

+
+

No authentication required.

+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "email": { + "format": "email", + "maxLength": 255, + "minLength": 3, + "type": "string" + }, + "name": { + "maxLength": 255, + "minLength": 3, + "type": "string" + }, + "password": { + "description": "Must include at least one uppercase letter, one lowercase letter, and one number", + "format": "password", + "minLength": 8, + "pattern": "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\\\d).+$", + "type": "string" + }, + "token": { + "description": "One-time setup token", + "type": "string" + }, + "username": { + "maxLength": 255, + "minLength": 3, + "type": "string" + } + }, + "required": [ + "token", + "password", + "name" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Setup completedapplication/json
400
500
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "message": { + "example": "Password set successfully", + "type": "string" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/completeWashWithoutWashCertificate.topic b/documentation/topics/generated/completeWashWithoutWashCertificate.topic new file mode 100644 index 00000000..b3ab8de1 --- /dev/null +++ b/documentation/topics/generated/completeWashWithoutWashCertificate.topic @@ -0,0 +1,51 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /admin/bookings/completeWashWithoutWashCertificate + + +

Operation ID: completeWashWithoutWashCertificate

+

Complete wash without wash certificate

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "id": { + "type": "integer" + } + }, + "required": [ + "id" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/createBackupModule.topic b/documentation/topics/generated/createBackupModule.topic new file mode 100644 index 00000000..762bd287 --- /dev/null +++ b/documentation/topics/generated/createBackupModule.topic @@ -0,0 +1,55 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /modules/backup/backups + + +

Operation ID: createBackupModule

+

Create backup module

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "description": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name", + "description" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/createCategory.topic b/documentation/topics/generated/createCategory.topic new file mode 100644 index 00000000..adfc0ded --- /dev/null +++ b/documentation/topics/generated/createCategory.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /categories + + +

Operation ID: createCategory

+

Create a new product category

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/CategoryCreate" +} + +
+ + + + +
StatusDescriptionContent Types
201Category created successfullyapplication/json
+

Schema for response 201 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/createCollectedInvoice.topic b/documentation/topics/generated/createCollectedInvoice.topic new file mode 100644 index 00000000..ee6dd4ba --- /dev/null +++ b/documentation/topics/generated/createCollectedInvoice.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /collected-invoices + + +

Operation ID: createCollectedInvoice

+

Create a new collected invoice

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
201Collected invoice created successfullyapplication/json
+

Schema for response 201 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/createDepartment.topic b/documentation/topics/generated/createDepartment.topic new file mode 100644 index 00000000..308861b5 --- /dev/null +++ b/documentation/topics/generated/createDepartment.topic @@ -0,0 +1,44 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /departments + + +

Operation ID: createDepartment

+

Create a new department

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/DepartmentCreate" +} + +
+ + + + + +
StatusDescriptionContent Types
201Department created successfullyapplication/json
400
+

Schema for response 201 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/createDepartmentGate.topic b/documentation/topics/generated/createDepartmentGate.topic new file mode 100644 index 00000000..d071b5b0 --- /dev/null +++ b/documentation/topics/generated/createDepartmentGate.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /department/gates + + +

Operation ID: createDepartmentGate

+

Create department gate

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/DepartmentGateCreate" +} + +
+ + + + +
StatusDescriptionContent Types
201Department gate created successfullyapplication/json
+

Schema for response 201 (application/json):

+ +{ + "$ref": "#/components/schemas/DepartmentGate" +} + +
+
diff --git a/documentation/topics/generated/createDepartmentGoal.topic b/documentation/topics/generated/createDepartmentGoal.topic new file mode 100644 index 00000000..ff1fe33d --- /dev/null +++ b/documentation/topics/generated/createDepartmentGoal.topic @@ -0,0 +1,52 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /goals/department + + +

Operation ID: createDepartmentGoal

+

Create a new department goal. + +Access control: +- The provided `departments` must be a subset of the user's departments unless the user has `superuser`. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/DepartmentGoalCreate" +} + +
+ + + + + + + +
StatusDescriptionContent Types
201Department goal created successfullyapplication/json
400
401
403
+

Schema for response 201 (application/json):

+ +{ + "$ref": "#/components/schemas/DepartmentGoal" +} + +
+
diff --git a/documentation/topics/generated/createDepartmentLane.topic b/documentation/topics/generated/createDepartmentLane.topic new file mode 100644 index 00000000..5710a15a --- /dev/null +++ b/documentation/topics/generated/createDepartmentLane.topic @@ -0,0 +1,44 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /department/lanes + + +

Operation ID: createDepartmentLane

+

Create a new department lane

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/DepartmentLaneCreate" +} + +
+ + + + + +
StatusDescriptionContent Types
201Department lane created successfullyapplication/json
400
+

Schema for response 201 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/createDepartmentRelay.topic b/documentation/topics/generated/createDepartmentRelay.topic new file mode 100644 index 00000000..c671868a --- /dev/null +++ b/documentation/topics/generated/createDepartmentRelay.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /department/relays + + +

Operation ID: createDepartmentRelay

+

Create department relay

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/DepartmentRelayCreate" +} + +
+ + + + +
StatusDescriptionContent Types
201Department relay created successfullyapplication/json
+

Schema for response 201 (application/json):

+ +{ + "$ref": "#/components/schemas/DepartmentRelay" +} + +
+
diff --git a/documentation/topics/generated/createEconomicCustomer.topic b/documentation/topics/generated/createEconomicCustomer.topic new file mode 100644 index 00000000..6655427d --- /dev/null +++ b/documentation/topics/generated/createEconomicCustomer.topic @@ -0,0 +1,67 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /modules/economic/customer + + +

Operation ID: createEconomicCustomer

+

Create e-conomic customer

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "customer_number": { + "type": "integer" + }, + "cvr": { + "type": "integer" + }, + "email": { + "type": "string" + }, + "name": { + "type": "string" + }, + "phone": { + "type": "integer" + } + }, + "required": [ + "customer_number", + "cvr", + "email", + "phone", + "name" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/createNotification.topic b/documentation/topics/generated/createNotification.topic new file mode 100644 index 00000000..da2149df --- /dev/null +++ b/documentation/topics/generated/createNotification.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /notifications + + +

Operation ID: createNotification

+

Create a new notification

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/NotificationCreate" +} + +
+ + + + +
StatusDescriptionContent Types
201Notification created successfullyapplication/json
+

Schema for response 201 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/createOrder.topic b/documentation/topics/generated/createOrder.topic new file mode 100644 index 00000000..d3de5140 --- /dev/null +++ b/documentation/topics/generated/createOrder.topic @@ -0,0 +1,47 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /orders + + +

Operation ID: createOrder

+

Create a new wash order

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/OrderCreate" +} + +
+ + + + + + +
StatusDescriptionContent Types
201Order created successfullyapplication/json
400
401
+

Schema for response 201 (application/json):

+ +{ + "$ref": "#/components/schemas/Order" +} + +
+
diff --git a/documentation/topics/generated/createPasskey.topic b/documentation/topics/generated/createPasskey.topic new file mode 100644 index 00000000..60c412aa --- /dev/null +++ b/documentation/topics/generated/createPasskey.topic @@ -0,0 +1,57 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /account/security/passkeys + + +

Operation ID: createPasskey

+

Create/add a passkey for the authenticated user

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/PasskeyCreateRequest" +} + +
+ + + + + +
StatusDescriptionContent Types
200Passkey createdapplication/json
400Invalid session or requestapplication/json
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "id": { + "type": "integer" + } + }, + "type": "object" +} + +

Schema for response 400 (application/json):

+ +{ + "$ref": "#/components/schemas/Error" +} + +
+
diff --git a/documentation/topics/generated/createProduct.topic b/documentation/topics/generated/createProduct.topic new file mode 100644 index 00000000..ff66a254 --- /dev/null +++ b/documentation/topics/generated/createProduct.topic @@ -0,0 +1,44 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /products + + +

Operation ID: createProduct

+

Create a new product

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/ProductCreate" +} + +
+ + + + + +
StatusDescriptionContent Types
201Product created successfullyapplication/json
400
+

Schema for response 201 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/createStripeInvoice.topic b/documentation/topics/generated/createStripeInvoice.topic new file mode 100644 index 00000000..d1dde192 --- /dev/null +++ b/documentation/topics/generated/createStripeInvoice.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /modules/stripe/invoice + + +

Operation ID: createStripeInvoice

+

Create an invoice in Stripe

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
201Stripe invoice created successfullyapplication/json
+

Schema for response 201 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/createStripePaymentIntent.topic b/documentation/topics/generated/createStripePaymentIntent.topic new file mode 100644 index 00000000..397e461a --- /dev/null +++ b/documentation/topics/generated/createStripePaymentIntent.topic @@ -0,0 +1,58 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /orders/module/stripe/payment_intent + + +

Operation ID: createStripePaymentIntent

+

Create Stripe payment intent

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "id": { + "type": "integer" + }, + "reader": { + "type": "string" + }, + "tax_percentage": { + "type": "integer" + } + }, + "required": [ + "id", + "reader" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/createSubuser.topic b/documentation/topics/generated/createSubuser.topic new file mode 100644 index 00000000..df6fd5a6 --- /dev/null +++ b/documentation/topics/generated/createSubuser.topic @@ -0,0 +1,78 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /subusers/me + + +

Operation ID: createSubuser

+

Creates a subuser (driver) account using a company's CVR and a phone number. Validates the +CVR via e-conomic, ensures the phone number is not already in use, and if SMS is enabled +sends a setup link by SMS for the user to complete registration. +

+
+

No authentication required.

+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "cvr": { + "description": "Danish CVR (8 digits)", + "example": 12345678, + "type": "integer" + }, + "phone": { + "description": "Phone number (4–15 digits, no leading +)", + "example": 12345678, + "type": "integer" + }, + "phone_country_code": { + "description": "Phone country code (1–3 digits)", + "example": 45, + "type": "integer" + } + }, + "required": [ + "cvr", + "phone_country_code", + "phone" + ], + "type": "object" +} + +
+ + + + + + + +
StatusDescriptionContent Types
200Subuser created (or pending setup) and company identifiedapplication/json
400
404
500
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "customer_number": { + "description": "Matched e-conomic customer number", + "example": 1000, + "type": "integer" + }, + "cvr": { + "example": 12345678, + "type": "integer" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/createSubuserGrant.topic b/documentation/topics/generated/createSubuserGrant.topic new file mode 100644 index 00000000..95eedbaf --- /dev/null +++ b/documentation/topics/generated/createSubuserGrant.topic @@ -0,0 +1,53 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /subusers/grants + + +

Operation ID: createSubuserGrant

+

Create subuser grant

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/SubuserGrantCreateRequest" +} + +
+ + + + + + + +
StatusDescriptionContent Types
200Grant createdapplication/json
400
401
500
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "grant": { + "$ref": "#/components/schemas/SubuserGrant" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/createUser.topic b/documentation/topics/generated/createUser.topic new file mode 100644 index 00000000..f0a386b4 --- /dev/null +++ b/documentation/topics/generated/createUser.topic @@ -0,0 +1,47 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /users + + +

Operation ID: createUser

+

Create a new user account

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/UserCreate" +} + +
+ + + + + + +
StatusDescriptionContent Types
201User created successfullyapplication/json
400
401
+

Schema for response 201 (application/json):

+ +{ + "$ref": "#/components/schemas/User" +} + +
+
diff --git a/documentation/topics/generated/customerLogin.topic b/documentation/topics/generated/customerLogin.topic new file mode 100644 index 00000000..46a27e5c --- /dev/null +++ b/documentation/topics/generated/customerLogin.topic @@ -0,0 +1,95 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /auth/login + + +

Operation ID: customerLogin

+

Authenticate a customer using customer number and password

+
+

No authentication required.

+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "customer_number": { + "description": "Customer's e-conomic customer number", + "example": 12345, + "type": "integer" + }, + "g_recaptcha_response": { + "description": "reCAPTCHA verification token", + "type": "string" + }, + "password": { + "description": "Customer password", + "format": "password", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "customer_number", + "password", + "g_recaptcha_response" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Login successfulapplication/json
400
401
+

Schema for response 200 (application/json):

+ +{ + "oneOf": [ + { + "properties": { + "token": { + "description": "Bearer authentication token", + "example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", + "type": "string" + } + }, + "required": [ + "token" + ], + "type": "object" + }, + { + "properties": { + "2fa_required": { + "example": true, + "type": "boolean" + }, + "2fa_token": { + "description": "Temporary 2FA verification token", + "example": "557a3e7b1a2b...", + "type": "string" + } + }, + "required": [ + "2fa_required", + "2fa_token" + ], + "type": "object" + } + ] +} + +
+
diff --git a/documentation/topics/generated/debugWorker.topic b/documentation/topics/generated/debugWorker.topic new file mode 100644 index 00000000..6c2a8334 --- /dev/null +++ b/documentation/topics/generated/debugWorker.topic @@ -0,0 +1,35 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /worker/debug + + +

Operation ID: debugWorker

+

Execute debug commands on the worker (often restricted)

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
StatusDescriptionContent Types
200Debug information retrieved successfullyapplication/json
403
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/deleteCustomerAttribute.topic b/documentation/topics/generated/deleteCustomerAttribute.topic new file mode 100644 index 00000000..f1b3f327 --- /dev/null +++ b/documentation/topics/generated/deleteCustomerAttribute.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /customer/attributes + + +

Operation ID: deleteCustomerAttribute

+

Remove a custom attribute from a customer

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200Customer attribute deleted successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/deleteCustomerDefaultDepartment.topic b/documentation/topics/generated/deleteCustomerDefaultDepartment.topic new file mode 100644 index 00000000..e44f3dc9 --- /dev/null +++ b/documentation/topics/generated/deleteCustomerDefaultDepartment.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /customer/department/default + + +

Operation ID: deleteCustomerDefaultDepartment

+

Delete customer default department

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
customer_numberquerynointeger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/deleteCustomerFixedPricing.topic b/documentation/topics/generated/deleteCustomerFixedPricing.topic new file mode 100644 index 00000000..38fffadf --- /dev/null +++ b/documentation/topics/generated/deleteCustomerFixedPricing.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /customer/pricing/fixed + + +

Operation ID: deleteCustomerFixedPricing

+

Delete customer fixed pricing

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
customer_numberqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/deleteCustomerNote.topic b/documentation/topics/generated/deleteCustomerNote.topic new file mode 100644 index 00000000..980869e6 --- /dev/null +++ b/documentation/topics/generated/deleteCustomerNote.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /customer/notes + + +

Operation ID: deleteCustomerNote

+

Remove a note from a customer

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200Customer note deleted successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/deleteDepartmentGate.topic b/documentation/topics/generated/deleteDepartmentGate.topic new file mode 100644 index 00000000..63cf3ad9 --- /dev/null +++ b/documentation/topics/generated/deleteDepartmentGate.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /department/gates + + +

Operation ID: deleteDepartmentGate

+

Delete department gate

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Department gate deletedapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/deleteDepartmentGoal.topic b/documentation/topics/generated/deleteDepartmentGoal.topic new file mode 100644 index 00000000..9f692677 --- /dev/null +++ b/documentation/topics/generated/deleteDepartmentGoal.topic @@ -0,0 +1,49 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /goals/department/progress-alert/test + + +

Operation ID: deleteDepartmentGoal

+

Delete a department goal by `id`. + +Access control: +- The creator (`created_by`) may delete regardless of department membership. +- Otherwise the user must satisfy the subset rule or have `superuser`. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesintegerID of the goal to delete
+
+ + + + + + + + +
StatusDescriptionContent Types
200Department goal deleted successfullyapplication/json
400
401
403
404
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/deleteDepartmentRelay.topic b/documentation/topics/generated/deleteDepartmentRelay.topic new file mode 100644 index 00000000..45dc0996 --- /dev/null +++ b/documentation/topics/generated/deleteDepartmentRelay.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /department/relays + + +

Operation ID: deleteDepartmentRelay

+

Delete department relay

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Department relay deletedapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/deleteNotification.topic b/documentation/topics/generated/deleteNotification.topic new file mode 100644 index 00000000..552a3600 --- /dev/null +++ b/documentation/topics/generated/deleteNotification.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /notifications + + +

Operation ID: deleteNotification

+

Delete a notification

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Notification deleted successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/deleteOrder.topic b/documentation/topics/generated/deleteOrder.topic new file mode 100644 index 00000000..46c1e866 --- /dev/null +++ b/documentation/topics/generated/deleteOrder.topic @@ -0,0 +1,42 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /orders + + +

Operation ID: deleteOrder

+

Delete an existing order

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesinteger
+
+ + + + + + +
StatusDescriptionContent Types
200Order deleted successfullyapplication/json
401
404
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/deleteOrderItem.topic b/documentation/topics/generated/deleteOrderItem.topic new file mode 100644 index 00000000..3e85f0e9 --- /dev/null +++ b/documentation/topics/generated/deleteOrderItem.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /order/items + + +

Operation ID: deleteOrderItem

+

Remove an item from an order

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesinteger
+
+ + + + + +
StatusDescriptionContent Types
200Order item deleted successfullyapplication/json
404
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/deleteOwnBooking.topic b/documentation/topics/generated/deleteOwnBooking.topic new file mode 100644 index 00000000..b875df74 --- /dev/null +++ b/documentation/topics/generated/deleteOwnBooking.topic @@ -0,0 +1,51 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /user/bookings/delete + + +

Operation ID: deleteOwnBooking

+

Delete own booking

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "id": { + "type": "integer" + } + }, + "required": [ + "id" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/deletePasskey.topic b/documentation/topics/generated/deletePasskey.topic new file mode 100644 index 00000000..ccc2418e --- /dev/null +++ b/documentation/topics/generated/deletePasskey.topic @@ -0,0 +1,47 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /account/security/passkeys/{id} + + +

Operation ID: deletePasskey

+

Delete a passkey

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idpathyesinteger
+
+ + + + + +
StatusDescriptionContent Types
200Passkey deletedapplication/json
404Not foundapplication/json
+

Schema for response 200 (application/json):

+ +{} + +

Schema for response 404 (application/json):

+ +{ + "$ref": "#/components/schemas/Error" +} + +
+
diff --git a/documentation/topics/generated/deleteSelfserveCondition.topic b/documentation/topics/generated/deleteSelfserveCondition.topic new file mode 100644 index 00000000..316dccc2 --- /dev/null +++ b/documentation/topics/generated/deleteSelfserveCondition.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /department/selfserve/conditions + + +

Operation ID: deleteSelfserveCondition

+

Delete a self-serve condition.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesintegerCondition ID
+
+ + + + + + +
StatusDescriptionContent Types
200Successfully deleted conditionapplication/json
400
404
+

Schema for response 200 (application/json):

+ +{ + "example": "Condition deleted", + "type": "string" +} + +
+
diff --git a/documentation/topics/generated/deleteSelfserveConditionRule.topic b/documentation/topics/generated/deleteSelfserveConditionRule.topic new file mode 100644 index 00000000..67e38bd1 --- /dev/null +++ b/documentation/topics/generated/deleteSelfserveConditionRule.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /department/selfserve/condition/rules + + +

Operation ID: deleteSelfserveConditionRule

+

Delete a self-serve condition rule.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesintegerRule ID
+
+ + + + + + +
StatusDescriptionContent Types
200Successfully deleted condition ruleapplication/json
400
404
+

Schema for response 200 (application/json):

+ +{ + "example": "Rule deleted", + "type": "string" +} + +
+
diff --git a/documentation/topics/generated/deleteSelfserveMachineType.topic b/documentation/topics/generated/deleteSelfserveMachineType.topic new file mode 100644 index 00000000..d9249f81 --- /dev/null +++ b/documentation/topics/generated/deleteSelfserveMachineType.topic @@ -0,0 +1,44 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /department/selfserve/machine-types + + +

Operation ID: deleteSelfserveMachineType

+

Delete reusable self-serve machine type

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesinteger
+
+ + + + + +
StatusDescriptionContent Types
200Successfully deleted machine typeapplication/json
404
+

Schema for response 200 (application/json):

+ +{ + "example": "Machine type deleted", + "type": "string" +} + +
+
diff --git a/documentation/topics/generated/deleteSelfserveQuestion.topic b/documentation/topics/generated/deleteSelfserveQuestion.topic new file mode 100644 index 00000000..a820faf4 --- /dev/null +++ b/documentation/topics/generated/deleteSelfserveQuestion.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /department/selfserve/questions + + +

Operation ID: deleteSelfserveQuestion

+

Delete a self-serve question by ID.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesintegerQuestion ID
+
+ + + + + + +
StatusDescriptionContent Types
200Successfully deleted questionapplication/json
400
404
+

Schema for response 200 (application/json):

+ +{ + "example": "Question deleted", + "type": "string" +} + +
+
diff --git a/documentation/topics/generated/deleteSelfserveTask.topic b/documentation/topics/generated/deleteSelfserveTask.topic new file mode 100644 index 00000000..2d49d53b --- /dev/null +++ b/documentation/topics/generated/deleteSelfserveTask.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /department/selfserve/tasks + + +

Operation ID: deleteSelfserveTask

+

Delete a self-serve task by ID.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesintegerTask ID
+
+ + + + + + +
StatusDescriptionContent Types
200Successfully deleted taskapplication/json
400
404
+

Schema for response 200 (application/json):

+ +{ + "example": "Task deleted", + "type": "string" +} + +
+
diff --git a/documentation/topics/generated/deleteSelfserveTaskAttachment.topic b/documentation/topics/generated/deleteSelfserveTaskAttachment.topic new file mode 100644 index 00000000..1b0b9cf5 --- /dev/null +++ b/documentation/topics/generated/deleteSelfserveTaskAttachment.topic @@ -0,0 +1,51 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /department/selfserve/tasks/attachments + + +

Operation ID: deleteSelfserveTaskAttachment

+

Remove an attachment from a specific self-serve task.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
task_idqueryyesintegerTask ID
attachment_idqueryyesintegerAttachment ID
+
+ + + + + + +
StatusDescriptionContent Types
200Attachment deleted successfullyapplication/json
400
404
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "message": { + "example": "Attachment deleted successfully", + "type": "string" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/deleteSelfserveVehicleCondition.topic b/documentation/topics/generated/deleteSelfserveVehicleCondition.topic new file mode 100644 index 00000000..f893940e --- /dev/null +++ b/documentation/topics/generated/deleteSelfserveVehicleCondition.topic @@ -0,0 +1,58 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /department/selfserve/vehicle/conditions + + +

Operation ID: deleteSelfserveVehicleCondition

+

Delete a vehicle condition. Customers can only delete conditions for their own vehicles.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesintegerCondition ID
+
+ + + + + + +
StatusDescriptionContent Types
200Successfully deleted vehicle conditionapplication/json
400
404
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "message": { + "example": "Condition deleted", + "type": "string" + }, + "selfserve": { + "allOf": [ + { + "$ref": "#/components/schemas/SelfserveWashSummary" + } + ], + "nullable": true + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/deleteStripePaymentIntent.topic b/documentation/topics/generated/deleteStripePaymentIntent.topic new file mode 100644 index 00000000..9d23714a --- /dev/null +++ b/documentation/topics/generated/deleteStripePaymentIntent.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /orders/module/stripe/payment_intent + + +

Operation ID: deleteStripePaymentIntent

+

Delete Stripe payment intent

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/deleteSubuserGrant.topic b/documentation/topics/generated/deleteSubuserGrant.topic new file mode 100644 index 00000000..626a1df2 --- /dev/null +++ b/documentation/topics/generated/deleteSubuserGrant.topic @@ -0,0 +1,51 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /subusers/grants/{id} + + +

Operation ID: deleteSubuserGrant

+

Delete subuser grant

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idpathyesinteger
+
+ + + + + + + +
StatusDescriptionContent Types
200Grant deletedapplication/json
401
404
500
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "message": { + "example": "Grant deleted", + "type": "string" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/deleteVehicle.topic b/documentation/topics/generated/deleteVehicle.topic new file mode 100644 index 00000000..e6a88c01 --- /dev/null +++ b/documentation/topics/generated/deleteVehicle.topic @@ -0,0 +1,48 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /vehicles + + +

Operation ID: deleteVehicle

+

Delete an existing vehicle. + +Permissions: +- Own scope: `delete_vehicle` (linked to subuser node `VEHICLES_DELETE`). +- Broader scope: `delete_vehicle_other`. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
noobject
idqueryyesinteger
+
+ + + + + + +
StatusDescriptionContent Types
200Vehicle deletedapplication/json
403
404
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/disable2fa.topic b/documentation/topics/generated/disable2fa.topic new file mode 100644 index 00000000..12348e2f --- /dev/null +++ b/documentation/topics/generated/disable2fa.topic @@ -0,0 +1,54 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /auth/2fa/disable + + +

Operation ID: disable2fa

+

Verify a code and disable 2FA for the authenticated user/subuser

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "code": { + "description": "The 6-digit TOTP code", + "type": "string" + } + }, + "required": [ + "code" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
2002FA disabled successfullyapplication/json
400
401
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/disableWorkerDebug.topic b/documentation/topics/generated/disableWorkerDebug.topic new file mode 100644 index 00000000..46c74ffa --- /dev/null +++ b/documentation/topics/generated/disableWorkerDebug.topic @@ -0,0 +1,35 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /worker/debug/off + + +

Operation ID: disableWorkerDebug

+

Disable worker debug

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
StatusDescriptionContent Types
200Worker debug disabledapplication/json
403
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/downloadBookingPdf.topic b/documentation/topics/generated/downloadBookingPdf.topic new file mode 100644 index 00000000..7339c910 --- /dev/null +++ b/documentation/topics/generated/downloadBookingPdf.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /bookings/download_pdf + + +

Operation ID: downloadBookingPdf

+

Download booking PDF

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/downloadOrderAttachment.topic b/documentation/topics/generated/downloadOrderAttachment.topic new file mode 100644 index 00000000..1ddf54f2 --- /dev/null +++ b/documentation/topics/generated/downloadOrderAttachment.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /orders/attachments/download + + +

Operation ID: downloadOrderAttachment

+

Download a specific order attachment

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Attachment downloaded successfullyapplication/octet-stream
+

Schema for response 200 (application/octet-stream):

+ +{ + "format": "binary", + "type": "string" +} + +
+
diff --git a/documentation/topics/generated/downloadOwnWashCertificate.topic b/documentation/topics/generated/downloadOwnWashCertificate.topic new file mode 100644 index 00000000..39905d0d --- /dev/null +++ b/documentation/topics/generated/downloadOwnWashCertificate.topic @@ -0,0 +1,51 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /user/bookings/washcertificate/download + + +

Operation ID: downloadOwnWashCertificate

+

Get download link for own wash certificate

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "id": { + "type": "integer" + } + }, + "required": [ + "id" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/downloadSelfserveTaskAttachment.topic b/documentation/topics/generated/downloadSelfserveTaskAttachment.topic new file mode 100644 index 00000000..9511f613 --- /dev/null +++ b/documentation/topics/generated/downloadSelfserveTaskAttachment.topic @@ -0,0 +1,51 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /department/selfserve/tasks/attachments/download + + +

Operation ID: downloadSelfserveTaskAttachment

+

Generate a download link for a specific self-serve task attachment.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
task_idqueryyesintegerTask ID
attachment_idqueryyesintegerAttachment ID
+
+ + + + + + +
StatusDescriptionContent Types
200Successfully generated download linkapplication/json
400
404
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "download_link": { + "format": "uri", + "type": "string" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/editBrandingOption.topic b/documentation/topics/generated/editBrandingOption.topic new file mode 100644 index 00000000..04c8ac11 --- /dev/null +++ b/documentation/topics/generated/editBrandingOption.topic @@ -0,0 +1,61 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /branding + + +

Operation ID: editBrandingOption

+

Update an existing branding option

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "cvr": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" +} + +
+ + + + + +
StatusDescriptionContent Types
200Branding option updated successfullyapplication/json
403
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/editDailyReport.topic b/documentation/topics/generated/editDailyReport.topic new file mode 100644 index 00000000..7c667823 --- /dev/null +++ b/documentation/topics/generated/editDailyReport.topic @@ -0,0 +1,55 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /departments/daily-reports + + +

Operation ID: editDailyReport

+

Edit daily report

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "id": { + "type": "integer" + }, + "report": { + "type": "string" + } + }, + "required": [ + "id", + "report" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/editRole.topic b/documentation/topics/generated/editRole.topic new file mode 100644 index 00000000..7f63dc49 --- /dev/null +++ b/documentation/topics/generated/editRole.topic @@ -0,0 +1,55 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /roles + + +

Operation ID: editRole

+

Edit role

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/editVehicle.topic b/documentation/topics/generated/editVehicle.topic new file mode 100644 index 00000000..bdd5afc9 --- /dev/null +++ b/documentation/topics/generated/editVehicle.topic @@ -0,0 +1,81 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /vehicles + + +

Operation ID: editVehicle

+

Update fields on an existing vehicle. + +Permissions: +- Own scope: `edit_vehicle` (linked to subuser node `VEHICLES_EDIT`). +- Broader scope: `edit_vehicle_other`. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
noobject
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "id": { + "type": "integer" + }, + "reference": { + "maxLength": 255, + "nullable": true, + "type": "string" + }, + "reg": { + "maxLength": 12, + "minLength": 2, + "type": "string" + }, + "type": { + "type": "integer" + }, + "wash_subscription": { + "type": "boolean" + } + }, + "required": [ + "id" + ], + "type": "object" +} + +
+ + + + + + + +
StatusDescriptionContent Types
200Vehicle updatedapplication/json
400
403
404
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/employeeLogin.topic b/documentation/topics/generated/employeeLogin.topic new file mode 100644 index 00000000..1520e2fd --- /dev/null +++ b/documentation/topics/generated/employeeLogin.topic @@ -0,0 +1,92 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /auth/employee/login + + +

Operation ID: employeeLogin

+

Authenticate an employee using user ID and password

+
+

No authentication required.

+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "g_recaptcha_response": { + "description": "reCAPTCHA verification token", + "type": "string" + }, + "password": { + "description": "Employee password", + "format": "password", + "type": "string" + }, + "user_id": { + "description": "Employee user ID", + "example": 1, + "type": "integer" + } + }, + "required": [ + "user_id", + "password", + "g_recaptcha_response" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Login successfulapplication/json
400
401
+

Schema for response 200 (application/json):

+ +{ + "oneOf": [ + { + "properties": { + "token": { + "description": "Bearer authentication token", + "type": "string" + } + }, + "required": [ + "token" + ], + "type": "object" + }, + { + "properties": { + "2fa_required": { + "example": true, + "type": "boolean" + }, + "2fa_token": { + "description": "Temporary 2FA verification token", + "type": "string" + } + }, + "required": [ + "2fa_required", + "2fa_token" + ], + "type": "object" + } + ] +} + +
+
diff --git a/documentation/topics/generated/enable2fa.topic b/documentation/topics/generated/enable2fa.topic new file mode 100644 index 00000000..7f9b9b18 --- /dev/null +++ b/documentation/topics/generated/enable2fa.topic @@ -0,0 +1,54 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /auth/2fa/enable + + +

Operation ID: enable2fa

+

Verify a code and enable 2FA for the authenticated user/subuser

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "code": { + "description": "The 6-digit TOTP code", + "type": "string" + } + }, + "required": [ + "code" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
2002FA enabled successfullyapplication/json
400
401
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/enableSelfServeLaneMachineRelay.topic b/documentation/topics/generated/enableSelfServeLaneMachineRelay.topic new file mode 100644 index 00000000..a68cabb8 --- /dev/null +++ b/documentation/topics/generated/enableSelfServeLaneMachineRelay.topic @@ -0,0 +1,83 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /modules/self-serve/lane/relay/machine/enable + + +

Operation ID: enableSelfServeLaneMachineRelay

+

Manually turns on the MACHINE relay for a self-serve lane if and only if the current allowed services +include `MACHINE` (set via `/modules/self-serve/lane/services/allowed`). The relay is never automatically +enabled; an explicit call to this endpoint is required. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "duration": { + "description": "Optional number of seconds after which the relay should automatically turn off", + "type": "integer" + }, + "lane_id": { + "type": "integer" + } + }, + "required": [ + "lane_id" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200MACHINE relay enabledapplication/json
401
403Not allowed to enable MACHINE relay (no matching task currently shown)application/json
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "duration": { + "nullable": true, + "type": "integer" + }, + "enabled": { + "type": "boolean" + }, + "lane_id": { + "type": "integer" + }, + "relay": { + "type": "string" + } + }, + "type": "object" +} + +

Schema for response 403 (application/json):

+ +{ + "$ref": "#/components/schemas/Error" +} + +
+
diff --git a/documentation/topics/generated/enableWorkerDebug.topic b/documentation/topics/generated/enableWorkerDebug.topic new file mode 100644 index 00000000..88ebd8d6 --- /dev/null +++ b/documentation/topics/generated/enableWorkerDebug.topic @@ -0,0 +1,35 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /worker/debug/on + + +

Operation ID: enableWorkerDebug

+

Enable worker debug

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
StatusDescriptionContent Types
200Worker debug enabledapplication/json
403
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/exportDraftInvoiceToEconomic.topic b/documentation/topics/generated/exportDraftInvoiceToEconomic.topic new file mode 100644 index 00000000..3522dbb5 --- /dev/null +++ b/documentation/topics/generated/exportDraftInvoiceToEconomic.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /economic/invoice/draft/export + + +

Operation ID: exportDraftInvoiceToEconomic

+

Export a draft invoice to e-conomic

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200Draft invoice exported successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/exportInvoiceToEconomic.topic b/documentation/topics/generated/exportInvoiceToEconomic.topic new file mode 100644 index 00000000..a82deef6 --- /dev/null +++ b/documentation/topics/generated/exportInvoiceToEconomic.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /economic/invoice/export + + +

Operation ID: exportInvoiceToEconomic

+

Export a booked invoice to e-conomic

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200Invoice exported successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/forceDisableSelfServeLaneMachine.topic b/documentation/topics/generated/forceDisableSelfServeLaneMachine.topic new file mode 100644 index 00000000..7e1fa2cc --- /dev/null +++ b/documentation/topics/generated/forceDisableSelfServeLaneMachine.topic @@ -0,0 +1,84 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /modules/self-serve/lane/force/machine/disable + + +

Operation ID: forceDisableSelfServeLaneMachine

+

Superuser/emergency endpoint. Turns off the MACHINE relay while ensuring the lane remains in an IN_WASH state +(simulating a started wash without machine assistance). +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "lane_id": { + "type": "integer" + }, + "license_plate": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "lane_id" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200MACHINE relay force-disabled and lane ensured in-washapplication/json
401
403
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "forced": { + "type": "boolean" + }, + "lane_id": { + "type": "integer" + }, + "machine": { + "enum": [ + "DISABLED" + ], + "type": "string" + }, + "state": { + "type": "string" + }, + "status": { + "type": "string" + }, + "wash_start_time": { + "type": "integer" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/forceEnableSelfServeLaneMachine.topic b/documentation/topics/generated/forceEnableSelfServeLaneMachine.topic new file mode 100644 index 00000000..8e0fa83d --- /dev/null +++ b/documentation/topics/generated/forceEnableSelfServeLaneMachine.topic @@ -0,0 +1,94 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /modules/self-serve/lane/force/machine/enable + + +

Operation ID: forceEnableSelfServeLaneMachine

+

Superuser/emergency endpoint. Bypasses the allowed services gating and directly turns on the MACHINE relay. +Also ensures the lane is marked as OCCUPIED and IN_WASH with a wash start timestamp if not already set. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "duration": { + "description": "Optional number of seconds after which the relay should automatically turn off", + "nullable": true, + "type": "integer" + }, + "lane_id": { + "type": "integer" + }, + "license_plate": { + "description": "Optional license plate to associate with the lane", + "nullable": true, + "type": "string" + } + }, + "required": [ + "lane_id" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200MACHINE relay force-enabled and lane marked in-washapplication/json
401
403
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "duration": { + "nullable": true, + "type": "integer" + }, + "forced": { + "type": "boolean" + }, + "lane_id": { + "type": "integer" + }, + "machine": { + "enum": [ + "ENABLED" + ], + "type": "string" + }, + "state": { + "type": "string" + }, + "status": { + "type": "string" + }, + "wash_start_time": { + "type": "integer" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/generateWashCertificate.topic b/documentation/topics/generated/generateWashCertificate.topic new file mode 100644 index 00000000..2d926baf --- /dev/null +++ b/documentation/topics/generated/generateWashCertificate.topic @@ -0,0 +1,49 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /order/wash-certificate + + +

Operation ID: generateWashCertificate

+

Generate a wash certificate for an order

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "order_id": { + "type": "integer" + } + }, + "type": "object" +} + +
+ + + + + +
StatusDescriptionContent Types
200Wash certificate generated successfullyapplication/json
400
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getAllExchangeRates.topic b/documentation/topics/generated/getAllExchangeRates.topic new file mode 100644 index 00000000..72046d22 --- /dev/null +++ b/documentation/topics/generated/getAllExchangeRates.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/fxratesapi/rates + + +

Operation ID: getAllExchangeRates

+

Get all available exchange rates

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Exchange rates retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getAvailableVehicleAddons.topic b/documentation/topics/generated/getAvailableVehicleAddons.topic new file mode 100644 index 00000000..8e78a2c1 --- /dev/null +++ b/documentation/topics/generated/getAvailableVehicleAddons.topic @@ -0,0 +1,48 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /vehicles/addons/available + + +

Operation ID: getAvailableVehicleAddons

+

Get list of available addons for a vehicle. + +Permissions: +- Own scope: `list_vehicle_addon_own` (linked to subuser node `VEHICLES_LIST`). +- Broader scope: `list_vehicles_addon_other`. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
noobject
idqueryyesinteger
+
+ + + + + + +
StatusDescriptionContent Types
200Available addons retrieved successfullyapplication/json
403
404
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getBackupsConfig.topic b/documentation/topics/generated/getBackupsConfig.topic new file mode 100644 index 00000000..4bf7609d --- /dev/null +++ b/documentation/topics/generated/getBackupsConfig.topic @@ -0,0 +1,36 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /backups/config + + +

Operation ID: getBackupsConfig

+

Get backups config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Backups configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/BackupsConfigListResponse" +} + +
+
diff --git a/documentation/topics/generated/getBirdConfig.topic b/documentation/topics/generated/getBirdConfig.topic new file mode 100644 index 00000000..f76ca4be --- /dev/null +++ b/documentation/topics/generated/getBirdConfig.topic @@ -0,0 +1,36 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /bird/config + + +

Operation ID: getBirdConfig

+

Get Bird config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Bird configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/BirdConfigListResponse" +} + +
+
diff --git a/documentation/topics/generated/getCollectedInvoiceEconomicV2Details.topic b/documentation/topics/generated/getCollectedInvoiceEconomicV2Details.topic new file mode 100644 index 00000000..b0a7256f --- /dev/null +++ b/documentation/topics/generated/getCollectedInvoiceEconomicV2Details.topic @@ -0,0 +1,49 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /collected-invoices/economic/v2/details + + +

Operation ID: getCollectedInvoiceEconomicV2Details

+

Returns normalized internal lines and best-effort fetched draft/booked e-conomic lines +for a collected invoice, including department distributions and warnings. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
collected_invoice_idqueryyesinteger
+
+ + + + + + + + + +
StatusDescriptionContent Types
200Details resolved successfullyapplication/json
400
401
403
404
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/CollectedInvoiceEconomicV2DetailsResponse" +} + +
+
diff --git a/documentation/topics/generated/getCollectedInvoiceEconomicV2RevenueStatistics.topic b/documentation/topics/generated/getCollectedInvoiceEconomicV2RevenueStatistics.topic new file mode 100644 index 00000000..c4f78f25 --- /dev/null +++ b/documentation/topics/generated/getCollectedInvoiceEconomicV2RevenueStatistics.topic @@ -0,0 +1,54 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /collected-invoices/economic/v2/revenue-statistics + + +

Operation ID: getCollectedInvoiceEconomicV2RevenueStatistics

+

Aggregates booked e-conomic revenue across invoices and lines, with optional filters +for date range, customer(s), department(s), currency, and barred-customer status. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + + + + + +
NameInRequiredTypeDescription
dateFromquerynostringStart date (inclusive), defaults to first day of current month.
dateToquerynostringEnd date (inclusive), defaults to today.
customer_numbersquerynostringComma-separated customer numbers to include.
department_numbersquerynostringComma-separated department numbers to include.
currencyquerynostringRestrict to a specific invoice currency.
barredquerynostringFilter by e-conomic customer barred status.
max_pagesquerynointegerSafety cap for paginated e-conomic reads.
+
+ + + + + + + + +
StatusDescriptionContent Types
200Revenue statistics resolved successfullyapplication/json
400
401
403
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/CollectedInvoiceEconomicV2RevenueStatisticsResponse" +} + +
+
diff --git a/documentation/topics/generated/getCurrentSubuser.topic b/documentation/topics/generated/getCurrentSubuser.topic new file mode 100644 index 00000000..6a7e2caf --- /dev/null +++ b/documentation/topics/generated/getCurrentSubuser.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /subusers/me + + +

Operation ID: getCurrentSubuser

+

Returns the authenticated subuser (driver) profile and their enabled grants grouped by +`billing_customer_number`. + +Notes: +- This endpoint is available only to authenticated subuser sessions. +- It does not require the `X-Customer-Number` header; all enabled, non-deleted grants for the + subuser are included in the response. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + +
StatusDescriptionContent Types
200Current subuser detailsapplication/json
401
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/SubuserSelf" +} + +
+
diff --git a/documentation/topics/generated/getCustomer.topic b/documentation/topics/generated/getCustomer.topic new file mode 100644 index 00000000..fa9d1bc3 --- /dev/null +++ b/documentation/topics/generated/getCustomer.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /users/customer + + +

Operation ID: getCustomer

+

Get details about a specific customer

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
customer_numberquerynointeger
+
+ + + + + +
StatusDescriptionContent Types
200Customer retrieved successfullyapplication/json
404
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/User" +} + +
+
diff --git a/documentation/topics/generated/getCustomerAttributes.topic b/documentation/topics/generated/getCustomerAttributes.topic new file mode 100644 index 00000000..d5136c8d --- /dev/null +++ b/documentation/topics/generated/getCustomerAttributes.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /customer/attributes + + +

Operation ID: getCustomerAttributes

+

Get custom attributes for a customer

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
customer_idquerynointeger
+
+ + + + +
StatusDescriptionContent Types
200Customer attributes retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getCustomerCode.topic b/documentation/topics/generated/getCustomerCode.topic new file mode 100644 index 00000000..eae0dbcc --- /dev/null +++ b/documentation/topics/generated/getCustomerCode.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /admin/customer/code + + +

Operation ID: getCustomerCode

+

Get customer code

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
customer_numberquerynointeger
user_idquerynointeger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getCustomerDefaultDepartment.topic b/documentation/topics/generated/getCustomerDefaultDepartment.topic new file mode 100644 index 00000000..7f7ceeab --- /dev/null +++ b/documentation/topics/generated/getCustomerDefaultDepartment.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /customer/department/default + + +

Operation ID: getCustomerDefaultDepartment

+

Get customer default department

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
customer_numberquerynointeger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getCustomerFixedPricing.topic b/documentation/topics/generated/getCustomerFixedPricing.topic new file mode 100644 index 00000000..bdca8d1f --- /dev/null +++ b/documentation/topics/generated/getCustomerFixedPricing.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /customer/pricing/fixed + + +

Operation ID: getCustomerFixedPricing

+

Get customer fixed pricing

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
customer_numberqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getCustomerName.topic b/documentation/topics/generated/getCustomerName.topic new file mode 100644 index 00000000..d0992370 --- /dev/null +++ b/documentation/topics/generated/getCustomerName.topic @@ -0,0 +1,47 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /admin/customer/name + + +

Operation ID: getCustomerName

+

Get the full name of a customer

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
user_idquerynointeger
+
+ + + + +
StatusDescriptionContent Types
200Customer name retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/getCustomerNotes.topic b/documentation/topics/generated/getCustomerNotes.topic new file mode 100644 index 00000000..2f598c57 --- /dev/null +++ b/documentation/topics/generated/getCustomerNotes.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /customer/notes + + +

Operation ID: getCustomerNotes

+

Get notes for a customer

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
customer_idquerynointeger
+
+ + + + +
StatusDescriptionContent Types
200Customer notes retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getCustomerPricingHistoryV2.topic b/documentation/topics/generated/getCustomerPricingHistoryV2.topic new file mode 100644 index 00000000..d0014788 --- /dev/null +++ b/documentation/topics/generated/getCustomerPricingHistoryV2.topic @@ -0,0 +1,48 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /superuser/customers/pricing-history + + +

Operation ID: getCustomerPricingHistoryV2

+

Get customer versioned pricing/subscription/discount timeline

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + +
NameInRequiredTypeDescription
customer_numberqueryyesinteger
dateFromqueryyesstring
dateToqueryyesstring
+
+ + + + + + + + +
StatusDescriptionContent Types
200Customer timeline resolvedapplication/json
400
401
403
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/CustomerPricingHistoryResponse" +} + +
+
diff --git a/documentation/topics/generated/getDailyReport.topic b/documentation/topics/generated/getDailyReport.topic new file mode 100644 index 00000000..f2c8b069 --- /dev/null +++ b/documentation/topics/generated/getDailyReport.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /departments/daily-reports/get + + +

Operation ID: getDailyReport

+

Get daily report

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
department_idqueryyesinteger
datequeryyesstring
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getDailyReportBookingsCount.topic b/documentation/topics/generated/getDailyReportBookingsCount.topic new file mode 100644 index 00000000..24f7efbe --- /dev/null +++ b/documentation/topics/generated/getDailyReportBookingsCount.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /departments/daily-reports/bookings-count + + +

Operation ID: getDailyReportBookingsCount

+

Get bookings count for daily reports

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
datequeryyesstring
department_idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getDailyReportProductCount.topic b/documentation/topics/generated/getDailyReportProductCount.topic new file mode 100644 index 00000000..1e351f70 --- /dev/null +++ b/documentation/topics/generated/getDailyReportProductCount.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /departments/daily-reports/product-count + + +

Operation ID: getDailyReportProductCount

+

Get product count for daily reports

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + + +
NameInRequiredTypeDescription
datequeryyesstring
date_toquerynostring
department_idqueryyesinteger
product_idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getDailyReportTransactionCount.topic b/documentation/topics/generated/getDailyReportTransactionCount.topic new file mode 100644 index 00000000..b5a82e6c --- /dev/null +++ b/documentation/topics/generated/getDailyReportTransactionCount.topic @@ -0,0 +1,42 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /departments/daily-reports/transaction-count + + +

Operation ID: getDailyReportTransactionCount

+

Get transaction count for daily reports

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + +
NameInRequiredTypeDescription
datequeryyesstring
date_toquerynostring
department_idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getDepartmentBookingCount.topic b/documentation/topics/generated/getDepartmentBookingCount.topic new file mode 100644 index 00000000..9945e040 --- /dev/null +++ b/documentation/topics/generated/getDepartmentBookingCount.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /admin/bookings/department/count + + +

Operation ID: getDepartmentBookingCount

+

Get department unfulfilled bookings count

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
department_idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getDepartmentCategories.topic b/documentation/topics/generated/getDepartmentCategories.topic new file mode 100644 index 00000000..d44d0212 --- /dev/null +++ b/documentation/topics/generated/getDepartmentCategories.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /departments/categories + + +

Operation ID: getDepartmentCategories

+

Get product categories available in a department

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
department_idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Department categories retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getDepartmentDraftInvoiceTotals.topic b/documentation/topics/generated/getDepartmentDraftInvoiceTotals.topic new file mode 100644 index 00000000..afc30be4 --- /dev/null +++ b/documentation/topics/generated/getDepartmentDraftInvoiceTotals.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /statistics/economic/totals/department_draft_invoice_totals + + +

Operation ID: getDepartmentDraftInvoiceTotals

+

Get department draft invoice totals

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getDepartmentLaneDynamicImage.topic b/documentation/topics/generated/getDepartmentLaneDynamicImage.topic new file mode 100644 index 00000000..3a790cd6 --- /dev/null +++ b/documentation/topics/generated/getDepartmentLaneDynamicImage.topic @@ -0,0 +1,54 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /department/lanes/dynamic-image + + +

Operation ID: getDepartmentLaneDynamicImage

+

Returns a composed machine UI image for the specified department lane. +You can optionally highlight button indices, set the current step indicator, and toggle only-current-step mode. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + + + + +
NameInRequiredTypeDescription
departmentqueryyesintegerDepartment ID
lanequeryyesintegerLane ID
buttonsquerynooneOfHighlighted button IDs (0-indexed). Accepts CSV, JSON array, or repeated query params.
current_stepquerynointegerCurrent step indicator (non-negative integer)
only_current_stepquerynobooleanIf true, only draw the current step highlight
vehicle_typequerynointegerVehicle type selection override (nullable non-negative integer)
+
+ + + + + + + + +
StatusDescriptionContent Types
200Dynamic image rendered successfullyimage/png
400
401
403
404
+

Schema for response 200 (image/png):

+ +{ + "format": "binary", + "type": "string" +} + +
+
diff --git a/documentation/topics/generated/getDepartmentPrices.topic b/documentation/topics/generated/getDepartmentPrices.topic new file mode 100644 index 00000000..4ff4518d --- /dev/null +++ b/documentation/topics/generated/getDepartmentPrices.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /superuser/department/prices + + +

Operation ID: getDepartmentPrices

+

Get department prices

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
department_idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getDepartmentRecommendedOrder.topic b/documentation/topics/generated/getDepartmentRecommendedOrder.topic new file mode 100644 index 00000000..fd285da4 --- /dev/null +++ b/documentation/topics/generated/getDepartmentRecommendedOrder.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /departments/order/recommended + + +

Operation ID: getDepartmentRecommendedOrder

+

Get recommended order for department

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
department_idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getDepartmentSelfServeEnabled.topic b/documentation/topics/generated/getDepartmentSelfServeEnabled.topic new file mode 100644 index 00000000..6856913b --- /dev/null +++ b/documentation/topics/generated/getDepartmentSelfServeEnabled.topic @@ -0,0 +1,48 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /departments/self-serve/enabled + + +

Operation ID: getDepartmentSelfServeEnabled

+

Check if self-serve is enabled for a specific department

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesintegerDepartment ID
+
+ + + + + +
StatusDescriptionContent Types
200Successfully retrieved statusapplication/json
404
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "enabled": { + "type": "boolean" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/getDepartmentSentInvoiceTotals.topic b/documentation/topics/generated/getDepartmentSentInvoiceTotals.topic new file mode 100644 index 00000000..23b85dbe --- /dev/null +++ b/documentation/topics/generated/getDepartmentSentInvoiceTotals.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /statistics/economic/totals/department_sent_invoice_totals + + +

Operation ID: getDepartmentSentInvoiceTotals

+

Get department sent invoice totals

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getDepartmentTerminalLocation.topic b/documentation/topics/generated/getDepartmentTerminalLocation.topic new file mode 100644 index 00000000..3f66c089 --- /dev/null +++ b/documentation/topics/generated/getDepartmentTerminalLocation.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/stripe/department/terminal/location + + +

Operation ID: getDepartmentTerminalLocation

+

Get department terminal location

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getDepartmentTerminalReaders.topic b/documentation/topics/generated/getDepartmentTerminalReaders.topic new file mode 100644 index 00000000..bc3270f6 --- /dev/null +++ b/documentation/topics/generated/getDepartmentTerminalReaders.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/stripe/department/terminal/readers + + +

Operation ID: getDepartmentTerminalReaders

+

Get department terminal readers

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getDepartmentVariables.topic b/documentation/topics/generated/getDepartmentVariables.topic new file mode 100644 index 00000000..b248dfa6 --- /dev/null +++ b/documentation/topics/generated/getDepartmentVariables.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /superuser/department/variables + + +

Operation ID: getDepartmentVariables

+

Get department variables

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
department_idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getDepartmentWeatherTimeline.topic b/documentation/topics/generated/getDepartmentWeatherTimeline.topic new file mode 100644 index 00000000..50804a70 --- /dev/null +++ b/documentation/topics/generated/getDepartmentWeatherTimeline.topic @@ -0,0 +1,58 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /departments/weather + + +

Operation ID: getDepartmentWeatherTimeline

+

Returns hourly weather, washes, hours and productivity status for a department

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesintegerDepartment ID
+
+ + + + +
StatusDescriptionContent Types
200Department weather timeline retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/DepartmentWeatherTimelineResponse", + "allOf": [ + { + "$ref": "#/components/schemas/SuccessResponse" + }, + { + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/DepartmentWeatherTimelineEntry" + }, + "type": "array" + } + }, + "type": "object" + } + ] +} + +
+
diff --git a/documentation/topics/generated/getEconomicConfig.topic b/documentation/topics/generated/getEconomicConfig.topic new file mode 100644 index 00000000..91d0c421 --- /dev/null +++ b/documentation/topics/generated/getEconomicConfig.topic @@ -0,0 +1,36 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /economic/config + + +

Operation ID: getEconomicConfig

+

Get e-conomic config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200e-conomic configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/EconomicConfigListResponse" +} + +
+
diff --git a/documentation/topics/generated/getEconomicCustomer.topic b/documentation/topics/generated/getEconomicCustomer.topic new file mode 100644 index 00000000..07f1c011 --- /dev/null +++ b/documentation/topics/generated/getEconomicCustomer.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/economic/customer + + +

Operation ID: getEconomicCustomer

+

Get e-conomic customer details

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
customer_numberqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getEconomicDepartments.topic b/documentation/topics/generated/getEconomicDepartments.topic new file mode 100644 index 00000000..f1d605d1 --- /dev/null +++ b/documentation/topics/generated/getEconomicDepartments.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /economic/departments + + +

Operation ID: getEconomicDepartments

+

Get e-conomic departments

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getEconomicLayouts.topic b/documentation/topics/generated/getEconomicLayouts.topic new file mode 100644 index 00000000..03d23b59 --- /dev/null +++ b/documentation/topics/generated/getEconomicLayouts.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /economic/layouts + + +

Operation ID: getEconomicLayouts

+

Get available invoice layouts from e-conomic

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Layouts retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getEconomicPaymentTerms.topic b/documentation/topics/generated/getEconomicPaymentTerms.topic new file mode 100644 index 00000000..4d50377a --- /dev/null +++ b/documentation/topics/generated/getEconomicPaymentTerms.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /economic/payment-terms + + +

Operation ID: getEconomicPaymentTerms

+

Get available payment terms from e-conomic

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Payment terms retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getEconomicProducts.topic b/documentation/topics/generated/getEconomicProducts.topic new file mode 100644 index 00000000..4c17e4d7 --- /dev/null +++ b/documentation/topics/generated/getEconomicProducts.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /economic/products + + +

Operation ID: getEconomicProducts

+

Get e-conomic products

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getEconomicTotals.topic b/documentation/topics/generated/getEconomicTotals.topic new file mode 100644 index 00000000..81a83532 --- /dev/null +++ b/documentation/topics/generated/getEconomicTotals.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /statistics/economic/totals + + +

Operation ID: getEconomicTotals

+

Get total economic statistics

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getEmailConfig.topic b/documentation/topics/generated/getEmailConfig.topic new file mode 100644 index 00000000..83cc35d5 --- /dev/null +++ b/documentation/topics/generated/getEmailConfig.topic @@ -0,0 +1,36 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /email/config + + +

Operation ID: getEmailConfig

+

Get email config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Email configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/EmailConfigListResponse" +} + +
+
diff --git a/documentation/topics/generated/getEntraConfig.topic b/documentation/topics/generated/getEntraConfig.topic new file mode 100644 index 00000000..465b5161 --- /dev/null +++ b/documentation/topics/generated/getEntraConfig.topic @@ -0,0 +1,36 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /entra/config + + +

Operation ID: getEntraConfig

+

Get Entra config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Entra configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/EntraConfigListResponse" +} + +
+
diff --git a/documentation/topics/generated/getExchangeRate.topic b/documentation/topics/generated/getExchangeRate.topic new file mode 100644 index 00000000..b3c78b63 --- /dev/null +++ b/documentation/topics/generated/getExchangeRate.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/fxratesapi/rate + + +

Operation ID: getExchangeRate

+

Get current exchange rate

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
fromqueryyesstring
toqueryyesstring
+
+ + + + +
StatusDescriptionContent Types
200Exchange rate retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getForm.topic b/documentation/topics/generated/getForm.topic new file mode 100644 index 00000000..06e54fda --- /dev/null +++ b/documentation/topics/generated/getForm.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /form + + +

Operation ID: getForm

+

Retrieve a form definition

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idquerynointeger
+
+ + + + +
StatusDescriptionContent Types
200Form retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getFxRatesApiConfig.topic b/documentation/topics/generated/getFxRatesApiConfig.topic new file mode 100644 index 00000000..5cc241b3 --- /dev/null +++ b/documentation/topics/generated/getFxRatesApiConfig.topic @@ -0,0 +1,36 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /fxratesapi/config + + +

Operation ID: getFxRatesApiConfig

+

Get FXRatesAPI config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200FXRatesAPI configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/FxRatesApiConfigListResponse" +} + +
+
diff --git a/documentation/topics/generated/getGatewayApiConfig.topic b/documentation/topics/generated/getGatewayApiConfig.topic new file mode 100644 index 00000000..e8fa3178 --- /dev/null +++ b/documentation/topics/generated/getGatewayApiConfig.topic @@ -0,0 +1,36 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /gatewayapi/config + + +

Operation ID: getGatewayApiConfig

+

Get GatewayAPI config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200GatewayAPI configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/GatewayApiConfigListResponse" +} + +
+
diff --git a/documentation/topics/generated/getInvoicePdf.topic b/documentation/topics/generated/getInvoicePdf.topic new file mode 100644 index 00000000..bdda6b09 --- /dev/null +++ b/documentation/topics/generated/getInvoicePdf.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /invoices/pdf + + +

Operation ID: getInvoicePdf

+

Download an invoice as PDF

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200PDF retrieved successfullyapplication/pdf
+

Schema for response 200 (application/pdf):

+ +{ + "format": "binary", + "type": "string" +} + +
+
diff --git a/documentation/topics/generated/getInvoicingFixedPricingDistribution.topic b/documentation/topics/generated/getInvoicingFixedPricingDistribution.topic new file mode 100644 index 00000000..fa944bc4 --- /dev/null +++ b/documentation/topics/generated/getInvoicingFixedPricingDistribution.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /superuser/invoicing/period/distribution/fixed-pricing + + +

Operation ID: getInvoicingFixedPricingDistribution

+

Get invoicing distribution for fixed pricing items

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
dateFromqueryyesstring
dateToqueryyesstring
+
+ + + + +
StatusDescriptionContent Types
200Fixed pricing distribution retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/InvoicingFixedPricingDistributionResponse" +} + +
+
diff --git a/documentation/topics/generated/getInvoicingPeriodDistributionV2All.topic b/documentation/topics/generated/getInvoicingPeriodDistributionV2All.topic new file mode 100644 index 00000000..6eaa418d --- /dev/null +++ b/documentation/topics/generated/getInvoicingPeriodDistributionV2All.topic @@ -0,0 +1,47 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /superuser/invoicing/period/distribution/v2/all + + +

Operation ID: getInvoicingPeriodDistributionV2All

+

Get version-aware historical distribution (all)

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
dateFromqueryyesstring
dateToqueryyesstring
+
+ + + + + + + + +
StatusDescriptionContent Types
200Version-aware historical distribution (all categories)application/json
400
401
403
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/InvoicingDistributionV2AllResponse" +} + +
+
diff --git a/documentation/topics/generated/getInvoicingPeriodDistributionV2BookedDepartment75.topic b/documentation/topics/generated/getInvoicingPeriodDistributionV2BookedDepartment75.topic new file mode 100644 index 00000000..ad4c4adb --- /dev/null +++ b/documentation/topics/generated/getInvoicingPeriodDistributionV2BookedDepartment75.topic @@ -0,0 +1,47 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /superuser/invoicing/period/distribution/v2/booked-department-75 + + +

Operation ID: getInvoicingPeriodDistributionV2BookedDepartment75

+

Get booked e-conomic department 75 redistribution

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
dateFromqueryyesstring
dateToqueryyesstring
+
+ + + + + + + + +
StatusDescriptionContent Types
200Actual booked e-conomic department 75 net amounts redistributed to internal departmentsapplication/json
400
401
403
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/InvoicingDistributionV2BookedDepartment75Response" +} + +
+
diff --git a/documentation/topics/generated/getInvoicingPeriodDistributionV2CustomerPrices.topic b/documentation/topics/generated/getInvoicingPeriodDistributionV2CustomerPrices.topic new file mode 100644 index 00000000..856a831a --- /dev/null +++ b/documentation/topics/generated/getInvoicingPeriodDistributionV2CustomerPrices.topic @@ -0,0 +1,47 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /superuser/invoicing/period/distribution/v2/customer-prices + + +

Operation ID: getInvoicingPeriodDistributionV2CustomerPrices

+

Get version-aware historical customer-price discount distribution

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
dateFromqueryyesstring
dateToqueryyesstring
+
+ + + + + + + + +
StatusDescriptionContent Types
200Version-aware customer-price discount distributionapplication/json
400
401
403
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/InvoicingDistributionV2CustomerPricesResponse" +} + +
+
diff --git a/documentation/topics/generated/getInvoicingPeriodDistributionV2FixedPricing.topic b/documentation/topics/generated/getInvoicingPeriodDistributionV2FixedPricing.topic new file mode 100644 index 00000000..31130af1 --- /dev/null +++ b/documentation/topics/generated/getInvoicingPeriodDistributionV2FixedPricing.topic @@ -0,0 +1,47 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /superuser/invoicing/period/distribution/v2/fixed-pricing + + +

Operation ID: getInvoicingPeriodDistributionV2FixedPricing

+

Get version-aware historical fixed pricing distribution

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
dateFromqueryyesstring
dateToqueryyesstring
+
+ + + + + + + + +
StatusDescriptionContent Types
200Version-aware fixed pricing distributionapplication/json
400
401
403
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/InvoicingDistributionV2FixedPricingResponse" +} + +
+
diff --git a/documentation/topics/generated/getInvoicingPeriodDistributionV2WashSubscriptions.topic b/documentation/topics/generated/getInvoicingPeriodDistributionV2WashSubscriptions.topic new file mode 100644 index 00000000..16801f72 --- /dev/null +++ b/documentation/topics/generated/getInvoicingPeriodDistributionV2WashSubscriptions.topic @@ -0,0 +1,47 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /superuser/invoicing/period/distribution/v2/wash-subscriptions + + +

Operation ID: getInvoicingPeriodDistributionV2WashSubscriptions

+

Get version-aware historical wash subscription distribution

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
dateFromqueryyesstring
dateToqueryyesstring
+
+ + + + + + + + +
StatusDescriptionContent Types
200Version-aware wash subscription distributionapplication/json
400
401
403
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/InvoicingDistributionV2WashSubscriptionsResponse" +} + +
+
diff --git a/documentation/topics/generated/getInvoicingPeriods.topic b/documentation/topics/generated/getInvoicingPeriods.topic new file mode 100644 index 00000000..9d3eb1d8 --- /dev/null +++ b/documentation/topics/generated/getInvoicingPeriods.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /superuser/invoicing/period + + +

Operation ID: getInvoicingPeriods

+

Retrieve invoicing periods for superusers

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
dateFromqueryyesstring
dateToqueryyesstring
+
+ + + + +
StatusDescriptionContent Types
200Invoicing periods retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getInvoicingWashSubscriptionsDistribution.topic b/documentation/topics/generated/getInvoicingWashSubscriptionsDistribution.topic new file mode 100644 index 00000000..20b9befb --- /dev/null +++ b/documentation/topics/generated/getInvoicingWashSubscriptionsDistribution.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /superuser/invoicing/period/distribution/wash-subscriptions + + +

Operation ID: getInvoicingWashSubscriptionsDistribution

+

Get invoicing distribution for wash subscriptions

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
dateFromqueryyesstring
dateToqueryyesstring
+
+ + + + +
StatusDescriptionContent Types
200Wash subscriptions distribution retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/InvoicingWashSubscriptionsDistributionResponse" +} + +
+
diff --git a/documentation/topics/generated/getLastMonthIncome.topic b/documentation/topics/generated/getLastMonthIncome.topic new file mode 100644 index 00000000..5fc006d3 --- /dev/null +++ b/documentation/topics/generated/getLastMonthIncome.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /statistics/income/last-month + + +

Operation ID: getLastMonthIncome

+

Get income statistics for the previous month

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Last month's income statistics retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getLicensePlateRecognizerConfig.topic b/documentation/topics/generated/getLicensePlateRecognizerConfig.topic new file mode 100644 index 00000000..3b42a368 --- /dev/null +++ b/documentation/topics/generated/getLicensePlateRecognizerConfig.topic @@ -0,0 +1,36 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /licenseplaterecognizer/config + + +

Operation ID: getLicensePlateRecognizerConfig

+

Get LicensePlateRecognizer config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200LicensePlateRecognizer configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/LicensePlateRecognizerConfigListResponse" +} + +
+
diff --git a/documentation/topics/generated/getLimbleConfig.topic b/documentation/topics/generated/getLimbleConfig.topic new file mode 100644 index 00000000..26241254 --- /dev/null +++ b/documentation/topics/generated/getLimbleConfig.topic @@ -0,0 +1,36 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /limble/config + + +

Operation ID: getLimbleConfig

+

Get Limble config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Limble configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/LimbleConfigListResponse" +} + +
+
diff --git a/documentation/topics/generated/getMotorApiConfig.topic b/documentation/topics/generated/getMotorApiConfig.topic new file mode 100644 index 00000000..835f35be --- /dev/null +++ b/documentation/topics/generated/getMotorApiConfig.topic @@ -0,0 +1,36 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /motorapi/config + + +

Operation ID: getMotorApiConfig

+

Get MotorAPI config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200MotorAPI configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/MotorApiConfigListResponse" +} + +
+
diff --git a/documentation/topics/generated/getNewBookingsStats.topic b/documentation/topics/generated/getNewBookingsStats.topic new file mode 100644 index 00000000..55f4ddbd --- /dev/null +++ b/documentation/topics/generated/getNewBookingsStats.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /statistics/bookings/new + + +

Operation ID: getNewBookingsStats

+

Get statistics for new bookings

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200New bookings statistics retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getNewOrdersStats.topic b/documentation/topics/generated/getNewOrdersStats.topic new file mode 100644 index 00000000..4c362342 --- /dev/null +++ b/documentation/topics/generated/getNewOrdersStats.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /statistics/orders/new + + +

Operation ID: getNewOrdersStats

+

Get statistics for new orders

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200New orders statistics retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getOcrSpaceConfig.topic b/documentation/topics/generated/getOcrSpaceConfig.topic new file mode 100644 index 00000000..c473eaac --- /dev/null +++ b/documentation/topics/generated/getOcrSpaceConfig.topic @@ -0,0 +1,36 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /ocrspace/config + + +

Operation ID: getOcrSpaceConfig

+

Get OcrSpace config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200OcrSpace configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/OcrSpaceConfigListResponse" +} + +
+
diff --git a/documentation/topics/generated/getOpenAiConfig.topic b/documentation/topics/generated/getOpenAiConfig.topic new file mode 100644 index 00000000..23931ec3 --- /dev/null +++ b/documentation/topics/generated/getOpenAiConfig.topic @@ -0,0 +1,36 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /openai/config + + +

Operation ID: getOpenAiConfig

+

Get OpenAI config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200OpenAI configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/OpenAiConfigListResponse" +} + +
+
diff --git a/documentation/topics/generated/getOrder.topic b/documentation/topics/generated/getOrder.topic new file mode 100644 index 00000000..efeba16c --- /dev/null +++ b/documentation/topics/generated/getOrder.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /order + + +

Operation ID: getOrder

+

Get detailed information about a specific order

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesinteger
+
+ + + + + +
StatusDescriptionContent Types
200Order retrieved successfullyapplication/json
404
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/Order" +} + +
+
diff --git a/documentation/topics/generated/getPlateScanPostResults.topic b/documentation/topics/generated/getPlateScanPostResults.topic new file mode 100644 index 00000000..18dfbecd --- /dev/null +++ b/documentation/topics/generated/getPlateScanPostResults.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /numberplatescans/post + + +

Operation ID: getPlateScanPostResults

+

Get post-scan results

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Post-scan results retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getReadyToInvoice.topic b/documentation/topics/generated/getReadyToInvoice.topic new file mode 100644 index 00000000..9f7f6942 --- /dev/null +++ b/documentation/topics/generated/getReadyToInvoice.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /collected-invoices/ready-to-invoice + + +

Operation ID: getReadyToInvoice

+

Get collected invoices that are ready to be processed

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Ready invoices retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getRecaptchaConfig.topic b/documentation/topics/generated/getRecaptchaConfig.topic new file mode 100644 index 00000000..60ced51c --- /dev/null +++ b/documentation/topics/generated/getRecaptchaConfig.topic @@ -0,0 +1,56 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /auth/reCAPTCHA/public + + +

Operation ID: getRecaptchaConfig

+

Retrieve public reCAPTCHA configuration for login forms

+
+

No authentication required.

+ + + + +
StatusDescriptionContent Types
200reCAPTCHA configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "rate_limit": { + "properties": { + "enabled": { + "type": "boolean" + }, + "limit": { + "type": "integer" + }, + "remaining": { + "type": "integer" + }, + "reset": { + "type": "integer" + }, + "warning": { + "nullable": true, + "type": "string" + } + }, + "type": "object" + }, + "recaptcha": { + "type": "object" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/getRecaptchaModuleConfig.topic b/documentation/topics/generated/getRecaptchaModuleConfig.topic new file mode 100644 index 00000000..73b5c7a5 --- /dev/null +++ b/documentation/topics/generated/getRecaptchaModuleConfig.topic @@ -0,0 +1,36 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /reCAPTCHA/config + + +

Operation ID: getRecaptchaModuleConfig

+

Get reCAPTCHA config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200reCAPTCHA configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/RecaptchaConfigListResponse" +} + +
+
diff --git a/documentation/topics/generated/getSelfServeConfig.topic b/documentation/topics/generated/getSelfServeConfig.topic new file mode 100644 index 00000000..66304ea9 --- /dev/null +++ b/documentation/topics/generated/getSelfServeConfig.topic @@ -0,0 +1,36 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /selfserve/config + + +

Operation ID: getSelfServeConfig

+

Get Self-Serve config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Self-serve configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/SelfServeConfigListResponse" +} + +
+
diff --git a/documentation/topics/generated/getSelfServeLaneStatus.topic b/documentation/topics/generated/getSelfServeLaneStatus.topic new file mode 100644 index 00000000..968c972c --- /dev/null +++ b/documentation/topics/generated/getSelfServeLaneStatus.topic @@ -0,0 +1,42 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/self-serve/lane/status + + +

Operation ID: getSelfServeLaneStatus

+

Retrieve the current status of a self-serve lane

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
lane_idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Lane status retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/SelfServeLaneStatus" +} + +
+
diff --git a/documentation/topics/generated/getSelfserveVehicleAllowed.topic b/documentation/topics/generated/getSelfserveVehicleAllowed.topic new file mode 100644 index 00000000..283258b6 --- /dev/null +++ b/documentation/topics/generated/getSelfserveVehicleAllowed.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /department/selfserve/vehicle/allowed + + +

Operation ID: getSelfserveVehicleAllowed

+

Check whether self-serve is allowed for a vehicle on a lane

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
lane_idqueryyesinteger
regqueryyesstring
+
+ + + + + + +
StatusDescriptionContent Types
200Successfully evaluated self-serve eligibilityapplication/json
403
404
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/SelfserveVehicleAllowedResponse" +} + +
+
diff --git a/documentation/topics/generated/getSelfserveWashSummary.topic b/documentation/topics/generated/getSelfserveWashSummary.topic new file mode 100644 index 00000000..de956fcb --- /dev/null +++ b/documentation/topics/generated/getSelfserveWashSummary.topic @@ -0,0 +1,46 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /department/selfserve/washes/summary + + +

Operation ID: getSelfserveWashSummary

+

Get self-serve wash summary

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + +
NameInRequiredTypeDescription
session_idquerynointeger
lane_idquerynointeger
regquerynostring
+
+ + + + + + +
StatusDescriptionContent Types
200Successfully retrieved self-serve wash summaryapplication/json
403
404
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/SelfserveWashSummary" +} + +
+
diff --git a/documentation/topics/generated/getSession.topic b/documentation/topics/generated/getSession.topic new file mode 100644 index 00000000..1bc5e8c2 --- /dev/null +++ b/documentation/topics/generated/getSession.topic @@ -0,0 +1,51 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /auth/session + + +

Operation ID: getSession

+

Retrieve information about the current authenticated user session

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + +
StatusDescriptionContent Types
200Session information retrieved successfullyapplication/json
400
401
+

Schema for response 200 (application/json):

+ +{ + "allOf": [ + { + "$ref": "#/components/schemas/User" + }, + { + "properties": { + "two_factor_enabled": { + "description": "Indicates if 2FA is enabled for this account", + "type": "boolean" + } + }, + "type": "object" + } + ] +} + +
+
diff --git a/documentation/topics/generated/getShellyConfig.topic b/documentation/topics/generated/getShellyConfig.topic new file mode 100644 index 00000000..386797d0 --- /dev/null +++ b/documentation/topics/generated/getShellyConfig.topic @@ -0,0 +1,36 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /shelly/config + + +

Operation ID: getShellyConfig

+

Get Shelly config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Shelly configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ShellyConfigListResponse" +} + +
+
diff --git a/documentation/topics/generated/getStripeConfig.topic b/documentation/topics/generated/getStripeConfig.topic new file mode 100644 index 00000000..47a15db9 --- /dev/null +++ b/documentation/topics/generated/getStripeConfig.topic @@ -0,0 +1,36 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /stripe/config + + +

Operation ID: getStripeConfig

+

Get Stripe config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Stripe configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/StripeConfigListResponse" +} + +
+
diff --git a/documentation/topics/generated/getStripePaymentIntent.topic b/documentation/topics/generated/getStripePaymentIntent.topic new file mode 100644 index 00000000..6309b7d9 --- /dev/null +++ b/documentation/topics/generated/getStripePaymentIntent.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /orders/module/stripe/payment_intent + + +

Operation ID: getStripePaymentIntent

+

Get Stripe payment intent

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getSubuser.topic b/documentation/topics/generated/getSubuser.topic new file mode 100644 index 00000000..093d1fe4 --- /dev/null +++ b/documentation/topics/generated/getSubuser.topic @@ -0,0 +1,95 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /subusers/{id} + + +

Operation ID: getSubuser

+

Returns the subuser if the authenticated user has at least one enabled, non-deleted grant +for their customer number to this subuser. Otherwise returns 404. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idpathyesinteger
+
+ + + + + + + +
StatusDescriptionContent Types
200Subuser detailsapplication/json
401
404
500
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "created_at": { + "format": "date-time", + "nullable": true, + "type": "string" + }, + "email": { + "format": "email", + "nullable": true, + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "nullable": true, + "type": "string" + }, + "permissions": { + "description": "Aggregated permission keys granted for the caller's customer", + "items": { + "type": "string" + }, + "type": "array" + }, + "phone": { + "nullable": true, + "type": "integer" + }, + "phone_country_code": { + "nullable": true, + "type": "integer" + }, + "suspended_at": { + "format": "date-time", + "nullable": true, + "type": "string" + }, + "updated_at": { + "format": "date-time", + "nullable": true, + "type": "string" + }, + "username": { + "nullable": true, + "type": "string" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/getSuperuserUser.topic b/documentation/topics/generated/getSuperuserUser.topic new file mode 100644 index 00000000..e3d67dd4 --- /dev/null +++ b/documentation/topics/generated/getSuperuserUser.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /superuser/user + + +

Operation ID: getSuperuserUser

+

Get detailed user information by user ID

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
user_idquerynointeger
+
+ + + + + +
StatusDescriptionContent Types
200User retrieved successfullyapplication/json
404
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/User" +} + +
+
diff --git a/documentation/topics/generated/getThisMonthIncome.topic b/documentation/topics/generated/getThisMonthIncome.topic new file mode 100644 index 00000000..f4f99efd --- /dev/null +++ b/documentation/topics/generated/getThisMonthIncome.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /statistics/income/this-month + + +

Operation ID: getThisMonthIncome

+

Get income statistics for the current month

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200This month's income statistics retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getThisYearIncome.topic b/documentation/topics/generated/getThisYearIncome.topic new file mode 100644 index 00000000..1993d349 --- /dev/null +++ b/documentation/topics/generated/getThisYearIncome.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /statistics/income/this-year + + +

Operation ID: getThisYearIncome

+

Get income statistics for the current year

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200This year's income statistics retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getTodayIncome.topic b/documentation/topics/generated/getTodayIncome.topic new file mode 100644 index 00000000..e5a12612 --- /dev/null +++ b/documentation/topics/generated/getTodayIncome.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /statistics/income/today + + +

Operation ID: getTodayIncome

+

Get income statistics for today

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Today's income statistics retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getTotalIncomeTodayByDepartments.topic b/documentation/topics/generated/getTotalIncomeTodayByDepartments.topic new file mode 100644 index 00000000..3196326d --- /dev/null +++ b/documentation/topics/generated/getTotalIncomeTodayByDepartments.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /statistics/income/departments + + +

Operation ID: getTotalIncomeTodayByDepartments

+

Get total income today by departments

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getUnknownCustomerVehicles.topic b/documentation/topics/generated/getUnknownCustomerVehicles.topic new file mode 100644 index 00000000..58f4731f --- /dev/null +++ b/documentation/topics/generated/getUnknownCustomerVehicles.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /department/vehicles/unknown-customer + + +

Operation ID: getUnknownCustomerVehicles

+

Get unknown customer vehicles in department

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getUserBookings.topic b/documentation/topics/generated/getUserBookings.topic new file mode 100644 index 00000000..d18236e9 --- /dev/null +++ b/documentation/topics/generated/getUserBookings.topic @@ -0,0 +1,39 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /user/bookings + + +

Operation ID: getUserBookings

+

Retrieve bookings for the authenticated user

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200User bookings retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/Booking" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/getUserDiscounts.topic b/documentation/topics/generated/getUserDiscounts.topic new file mode 100644 index 00000000..1d72997e --- /dev/null +++ b/documentation/topics/generated/getUserDiscounts.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /superuser/user/discounts + + +

Operation ID: getUserDiscounts

+

Get user discounts

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
user_idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getUserIdFromCustomerNumber.topic b/documentation/topics/generated/getUserIdFromCustomerNumber.topic new file mode 100644 index 00000000..d9e26c8c --- /dev/null +++ b/documentation/topics/generated/getUserIdFromCustomerNumber.topic @@ -0,0 +1,47 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /admin/customer/getUserId + + +

Operation ID: getUserIdFromCustomerNumber

+

Convert e-conomic customer number to internal user ID

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
customer_numberqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200User ID retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "user_id": { + "type": "integer" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/getUserInvoices.topic b/documentation/topics/generated/getUserInvoices.topic new file mode 100644 index 00000000..b6ea5eed --- /dev/null +++ b/documentation/topics/generated/getUserInvoices.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /user/invoices + + +

Operation ID: getUserInvoices

+

Retrieve invoices for the authenticated user

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200User invoices retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getUserKeys.topic b/documentation/topics/generated/getUserKeys.topic new file mode 100644 index 00000000..71cb0fea --- /dev/null +++ b/documentation/topics/generated/getUserKeys.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /superuser/user/keys + + +

Operation ID: getUserKeys

+

Get user keys

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
user_idqueryyesinteger
keyquerynostring
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getUserOrder.topic b/documentation/topics/generated/getUserOrder.topic new file mode 100644 index 00000000..494b020e --- /dev/null +++ b/documentation/topics/generated/getUserOrder.topic @@ -0,0 +1,42 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /user/order + + +

Operation ID: getUserOrder

+

Get details of a specific order for the authenticated user

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Order retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/Order" +} + +
+
diff --git a/documentation/topics/generated/getUserOrders.topic b/documentation/topics/generated/getUserOrders.topic new file mode 100644 index 00000000..1c9ea8e7 --- /dev/null +++ b/documentation/topics/generated/getUserOrders.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /user/orders + + +

Operation ID: getUserOrders

+

Retrieve orders for the authenticated user

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
noobject
+
+ + + + +
StatusDescriptionContent Types
200Orders retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/Order" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/getUserPermissions.topic b/documentation/topics/generated/getUserPermissions.topic new file mode 100644 index 00000000..753dfebb --- /dev/null +++ b/documentation/topics/generated/getUserPermissions.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /user/permissions + + +

Operation ID: getUserPermissions

+

Get user permissions

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getUsersWithVehicleSubscriptions.topic b/documentation/topics/generated/getUsersWithVehicleSubscriptions.topic new file mode 100644 index 00000000..f557f925 --- /dev/null +++ b/documentation/topics/generated/getUsersWithVehicleSubscriptions.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /superuser/users-with-vehicle-subscriptions + + +

Operation ID: getUsersWithVehicleSubscriptions

+

Get users with vehicle subscriptions

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getVehicleCustomerSuggestions.topic b/documentation/topics/generated/getVehicleCustomerSuggestions.topic new file mode 100644 index 00000000..8dae93e2 --- /dev/null +++ b/documentation/topics/generated/getVehicleCustomerSuggestions.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /department/vehicle/customer-suggestions + + +

Operation ID: getVehicleCustomerSuggestions

+

Get vehicle customer suggestions

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
regqueryyesstring
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getVehicleStatus.topic b/documentation/topics/generated/getVehicleStatus.topic new file mode 100644 index 00000000..c932d02e --- /dev/null +++ b/documentation/topics/generated/getVehicleStatus.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /vehicles/status + + +

Operation ID: getVehicleStatus

+

Get vehicle status

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
regqueryyesstring
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getVirkdataConfig.topic b/documentation/topics/generated/getVirkdataConfig.topic new file mode 100644 index 00000000..d1e0fb82 --- /dev/null +++ b/documentation/topics/generated/getVirkdataConfig.topic @@ -0,0 +1,36 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /virkdata/config + + +

Operation ID: getVirkdataConfig

+

Get Virkdata config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Virkdata configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/VirkdataConfigListResponse" +} + +
+
diff --git a/documentation/topics/generated/getWeatherApiConfig.topic b/documentation/topics/generated/getWeatherApiConfig.topic new file mode 100644 index 00000000..38f7fba0 --- /dev/null +++ b/documentation/topics/generated/getWeatherApiConfig.topic @@ -0,0 +1,36 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /weatherapi/config + + +

Operation ID: getWeatherApiConfig

+

Get WeatherAPI config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200WeatherAPI configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/WeatherApiConfigListResponse" +} + +
+
diff --git a/documentation/topics/generated/getWorkerLicensePlates.topic b/documentation/topics/generated/getWorkerLicensePlates.topic new file mode 100644 index 00000000..952574b4 --- /dev/null +++ b/documentation/topics/generated/getWorkerLicensePlates.topic @@ -0,0 +1,35 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /worker/licenseplates + + +

Operation ID: getWorkerLicensePlates

+

Fetch all unique license plates from various database tables

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
StatusDescriptionContent Types
200License plates retrieved successfullyapplication/json
403
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getWorkerStatus.topic b/documentation/topics/generated/getWorkerStatus.topic new file mode 100644 index 00000000..4f3c8835 --- /dev/null +++ b/documentation/topics/generated/getWorkerStatus.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /worker/status + + +

Operation ID: getWorkerStatus

+

Get detailed status of the system worker

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Worker status retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getWorkerVersion.topic b/documentation/topics/generated/getWorkerVersion.topic new file mode 100644 index 00000000..3c96cd9e --- /dev/null +++ b/documentation/topics/generated/getWorkerVersion.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /worker/version + + +

Operation ID: getWorkerVersion

+

Get the current version of the system worker

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Worker version retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getXlvaskConfig.topic b/documentation/topics/generated/getXlvaskConfig.topic new file mode 100644 index 00000000..0974cd95 --- /dev/null +++ b/documentation/topics/generated/getXlvaskConfig.topic @@ -0,0 +1,36 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /xlvask/config + + +

Operation ID: getXlvaskConfig

+

Get XLVask config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200XLVask configuration retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/XlvaskConfigListResponse" +} + +
+
diff --git a/documentation/topics/generated/getXlvaskUsageLogs.topic b/documentation/topics/generated/getXlvaskUsageLogs.topic new file mode 100644 index 00000000..d209606d --- /dev/null +++ b/documentation/topics/generated/getXlvaskUsageLogs.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/xlvask/usageLog + + +

Operation ID: getXlvaskUsageLogs

+

Retrieve usage logs from XLVask system

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
noobject
+
+ + + + +
StatusDescriptionContent Types
200Usage logs retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getXlvaskUsageOrders.topic b/documentation/topics/generated/getXlvaskUsageOrders.topic new file mode 100644 index 00000000..c1058eb0 --- /dev/null +++ b/documentation/topics/generated/getXlvaskUsageOrders.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/xlvask/services/usage/orders + + +

Operation ID: getXlvaskUsageOrders

+

Get XLVask usage orders

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getXlvaskUsageOrdersFastLink.topic b/documentation/topics/generated/getXlvaskUsageOrdersFastLink.topic new file mode 100644 index 00000000..a9642271 --- /dev/null +++ b/documentation/topics/generated/getXlvaskUsageOrdersFastLink.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/xlvask/services/usage/orders/fast-link + + +

Operation ID: getXlvaskUsageOrdersFastLink

+

Get XLVask usage orders fast link

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/getYesterdayIncome.topic b/documentation/topics/generated/getYesterdayIncome.topic new file mode 100644 index 00000000..8ade3e31 --- /dev/null +++ b/documentation/topics/generated/getYesterdayIncome.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /statistics/income/yesterday + + +

Operation ID: getYesterdayIncome

+

Get income statistics for yesterday

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Yesterday's income statistics retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/importEconomicCustomers.topic b/documentation/topics/generated/importEconomicCustomers.topic new file mode 100644 index 00000000..dccc1df1 --- /dev/null +++ b/documentation/topics/generated/importEconomicCustomers.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /economic/customers/import + + +

Operation ID: importEconomicCustomers

+

Import customers from e-conomic

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200Customers imported successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listBackupModules.topic b/documentation/topics/generated/listBackupModules.topic new file mode 100644 index 00000000..1d1c402d --- /dev/null +++ b/documentation/topics/generated/listBackupModules.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/backup/backups + + +

Operation ID: listBackupModules

+

List backup modules

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listBookings.topic b/documentation/topics/generated/listBookings.topic new file mode 100644 index 00000000..f6911f5e --- /dev/null +++ b/documentation/topics/generated/listBookings.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /bookings + + +

Operation ID: listBookings

+

Retrieve a list of bookings

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
noobject
+
+ + + + +
StatusDescriptionContent Types
200Bookings retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/Booking" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/listBrandingOptions.topic b/documentation/topics/generated/listBrandingOptions.topic new file mode 100644 index 00000000..59aa76ea --- /dev/null +++ b/documentation/topics/generated/listBrandingOptions.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /branding + + +

Operation ID: listBrandingOptions

+

Retrieve a list of branding options or a specific branding option if ID is provided

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
idquerynointeger
noobject
+
+ + + + + + +
StatusDescriptionContent Types
200Branding options retrieved successfullyapplication/json
400
403
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listCategories.topic b/documentation/topics/generated/listCategories.topic new file mode 100644 index 00000000..c5f76474 --- /dev/null +++ b/documentation/topics/generated/listCategories.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /categories + + +

Operation ID: listCategories

+

Retrieve a list of product categories

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
noobject
+
+ + + + +
StatusDescriptionContent Types
200Categories retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/Category" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/listCollectedInvoices.topic b/documentation/topics/generated/listCollectedInvoices.topic new file mode 100644 index 00000000..52c60d81 --- /dev/null +++ b/documentation/topics/generated/listCollectedInvoices.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /collected-invoices + + +

Operation ID: listCollectedInvoices

+

Get list of collected invoices

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
noobject
+
+ + + + +
StatusDescriptionContent Types
200Collected invoices retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listCustomers.topic b/documentation/topics/generated/listCustomers.topic new file mode 100644 index 00000000..94cc025b --- /dev/null +++ b/documentation/topics/generated/listCustomers.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /customers + + +

Operation ID: listCustomers

+

List customers

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
noobject
barredquerynostringOptional e-conomic barred customer filter.
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listDailyReports.topic b/documentation/topics/generated/listDailyReports.topic new file mode 100644 index 00000000..5907829f --- /dev/null +++ b/documentation/topics/generated/listDailyReports.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /departments/daily-reports + + +

Operation ID: listDailyReports

+

List daily reports

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listDepartmentGates.topic b/documentation/topics/generated/listDepartmentGates.topic new file mode 100644 index 00000000..e23d189f --- /dev/null +++ b/documentation/topics/generated/listDepartmentGates.topic @@ -0,0 +1,54 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /department/gates + + +

Operation ID: listDepartmentGates

+

Retrieve department gates, optionally filtered by id

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
idquerynointeger
noobject
+
+ + + + + +
StatusDescriptionContent Types
200Department gates retrieved successfullyapplication/json
401
+

Schema for response 200 (application/json):

+ +{ + "oneOf": [ + { + "$ref": "#/components/schemas/DepartmentGate" + }, + { + "items": { + "$ref": "#/components/schemas/DepartmentGate" + }, + "type": "array" + } + ] +} + +
+
diff --git a/documentation/topics/generated/listDepartmentGoals.topic b/documentation/topics/generated/listDepartmentGoals.topic new file mode 100644 index 00000000..9647ad40 --- /dev/null +++ b/documentation/topics/generated/listDepartmentGoals.topic @@ -0,0 +1,55 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /goals/department + + +

Operation ID: listDepartmentGoals

+

Retrieve a list of department goals or a single goal when `id` is provided. + +Access control: +- A user may only access goals where the goal's `departments` set is a subset of the user's departments. +- Users with the `superuser` permission may access all goals. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
idquerynointegerWhen provided, returns the single goal with this id (if accessible)
noobject
+
+ + + + + + + + +
StatusDescriptionContent Types
200Goals retrieved successfullyapplication/json
400
401
403
404
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/DepartmentGoal" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/listDepartmentLanes.topic b/documentation/topics/generated/listDepartmentLanes.topic new file mode 100644 index 00000000..d395500e --- /dev/null +++ b/documentation/topics/generated/listDepartmentLanes.topic @@ -0,0 +1,46 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /department/lanes + + +

Operation ID: listDepartmentLanes

+

Retrieve a list of all department lanes

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
noobject
+
+ + + + + +
StatusDescriptionContent Types
200Department lanes retrieved successfullyapplication/json
401
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/DepartmentLane" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/listDepartmentPlateScanners.topic b/documentation/topics/generated/listDepartmentPlateScanners.topic new file mode 100644 index 00000000..af8ba260 --- /dev/null +++ b/documentation/topics/generated/listDepartmentPlateScanners.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /department/numberplatescanners + + +

Operation ID: listDepartmentPlateScanners

+

List department plate scanners

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Department plate scanners retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listDepartmentRelays.topic b/documentation/topics/generated/listDepartmentRelays.topic new file mode 100644 index 00000000..106cd3c7 --- /dev/null +++ b/documentation/topics/generated/listDepartmentRelays.topic @@ -0,0 +1,54 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /department/relays + + +

Operation ID: listDepartmentRelays

+

Retrieve department relays, optionally filtered by id

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
idquerynointeger
noobject
+
+ + + + + +
StatusDescriptionContent Types
200Department relays retrieved successfullyapplication/json
401
+

Schema for response 200 (application/json):

+ +{ + "oneOf": [ + { + "$ref": "#/components/schemas/DepartmentRelay" + }, + { + "items": { + "$ref": "#/components/schemas/DepartmentRelay" + }, + "type": "array" + } + ] +} + +
+
diff --git a/documentation/topics/generated/listDepartments.topic b/documentation/topics/generated/listDepartments.topic new file mode 100644 index 00000000..2506f9a3 --- /dev/null +++ b/documentation/topics/generated/listDepartments.topic @@ -0,0 +1,47 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /departments + + +

Operation ID: listDepartments

+

Retrieve a list of all visible departments

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
idquerynointegerFilter by specific department ID
noobject
+
+ + + + + +
StatusDescriptionContent Types
200Departments retrieved successfullyapplication/json
401
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/Department" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/listDraftInvoices.topic b/documentation/topics/generated/listDraftInvoices.topic new file mode 100644 index 00000000..51bf5a55 --- /dev/null +++ b/documentation/topics/generated/listDraftInvoices.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /invoices/draft + + +

Operation ID: listDraftInvoices

+

Retrieve a list of draft invoices

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
noobject
+
+ + + + +
StatusDescriptionContent Types
200Draft invoices retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listEntraUsers.topic b/documentation/topics/generated/listEntraUsers.topic new file mode 100644 index 00000000..e759fb4c --- /dev/null +++ b/documentation/topics/generated/listEntraUsers.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/entra/users + + +

Operation ID: listEntraUsers

+

Get list of users from Microsoft Entra (Azure AD)

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Entra users retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listGuestDepartments.topic b/documentation/topics/generated/listGuestDepartments.topic new file mode 100644 index 00000000..83298010 --- /dev/null +++ b/documentation/topics/generated/listGuestDepartments.topic @@ -0,0 +1,39 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /guest/departments + + +

Operation ID: listGuestDepartments

+

Get list of departments without authentication

+
+

No authentication required.

+ + + + +
NameInRequiredTypeDescription
include_lanesquerynobooleanWhether to include lane status and self-serve information
+
+ + + + +
StatusDescriptionContent Types
200Departments retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/DepartmentGuest" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/listModuleActionLogs.topic b/documentation/topics/generated/listModuleActionLogs.topic new file mode 100644 index 00000000..3f5d3e35 --- /dev/null +++ b/documentation/topics/generated/listModuleActionLogs.topic @@ -0,0 +1,47 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/action-logs + + +

Operation ID: listModuleActionLogs

+

Retrieve a paginated list of module action logs with searching and filtering

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
noobject
+
+ + + + + + +
StatusDescriptionContent Types
200Module action logs retrieved successfullyapplication/json
401
403
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/ModuleActionLog" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/listNotifications.topic b/documentation/topics/generated/listNotifications.topic new file mode 100644 index 00000000..638c4d74 --- /dev/null +++ b/documentation/topics/generated/listNotifications.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /notifications + + +

Operation ID: listNotifications

+

Get list of notifications

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
noobject
+
+ + + + +
StatusDescriptionContent Types
200Notifications retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/Notification" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/listOrderAttachments.topic b/documentation/topics/generated/listOrderAttachments.topic new file mode 100644 index 00000000..234675b6 --- /dev/null +++ b/documentation/topics/generated/listOrderAttachments.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /orders/attachments + + +

Operation ID: listOrderAttachments

+

Get attachments for an order

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
order_idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Order attachments retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listOrderBookings.topic b/documentation/topics/generated/listOrderBookings.topic new file mode 100644 index 00000000..f05efa67 --- /dev/null +++ b/documentation/topics/generated/listOrderBookings.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /order-bookings + + +

Operation ID: listOrderBookings

+

List order bookings

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idquerynointeger
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listOrderItems.topic b/documentation/topics/generated/listOrderItems.topic new file mode 100644 index 00000000..e229272b --- /dev/null +++ b/documentation/topics/generated/listOrderItems.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /order/items + + +

Operation ID: listOrderItems

+

Get all items for a specific order

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
order_idqueryyesinteger
+
+ + + + +
StatusDescriptionContent Types
200Order items retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/OrderItem" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/listOrders.topic b/documentation/topics/generated/listOrders.topic new file mode 100644 index 00000000..720210e9 --- /dev/null +++ b/documentation/topics/generated/listOrders.topic @@ -0,0 +1,48 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /orders + + +

Operation ID: listOrders

+

Retrieve a paginated list of orders

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
noobject
show_wash_subscriptionquerynostring
+
+ + + + + + +
StatusDescriptionContent Types
200Orders retrieved successfullyapplication/json
401
403
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/Order" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/listPasskeys.topic b/documentation/topics/generated/listPasskeys.topic new file mode 100644 index 00000000..84f00fcd --- /dev/null +++ b/documentation/topics/generated/listPasskeys.topic @@ -0,0 +1,46 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /account/security/passkeys + + +

Operation ID: listPasskeys

+

List passkeys for the authenticated user

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
StatusDescriptionContent Types
200A list of passkeysapplication/json
400Invalid session or requestapplication/json
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/Passkey" + }, + "type": "array" +} + +

Schema for response 400 (application/json):

+ +{ + "$ref": "#/components/schemas/Error" +} + +
+
diff --git a/documentation/topics/generated/listPermissions.topic b/documentation/topics/generated/listPermissions.topic new file mode 100644 index 00000000..ba1be68c --- /dev/null +++ b/documentation/topics/generated/listPermissions.topic @@ -0,0 +1,39 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /permissions + + +

Operation ID: listPermissions

+

Get list of all available permissions

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Permissions retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/Permission" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/listPlateScanners.topic b/documentation/topics/generated/listPlateScanners.topic new file mode 100644 index 00000000..a2d11180 --- /dev/null +++ b/documentation/topics/generated/listPlateScanners.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /numberplatescanners + + +

Operation ID: listPlateScanners

+

Get a list of all number plate scanners

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
noobject
+
+ + + + +
StatusDescriptionContent Types
200Plate scanners retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listPlateScans.topic b/documentation/topics/generated/listPlateScans.topic new file mode 100644 index 00000000..2b080830 --- /dev/null +++ b/documentation/topics/generated/listPlateScans.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /numberplatescans + + +

Operation ID: listPlateScans

+

Get a list of license plate scans

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
noobject
+
+ + + + +
StatusDescriptionContent Types
200Plate scans retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listProducts.topic b/documentation/topics/generated/listProducts.topic new file mode 100644 index 00000000..a788c167 --- /dev/null +++ b/documentation/topics/generated/listProducts.topic @@ -0,0 +1,50 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /products + + +

Operation ID: listProducts

+

Retrieve a list of products with optional filters for customer pricing and department

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + + + + +
NameInRequiredTypeDescription
customer_idquerynointegerCustomer ID for custom pricing
department_idquerynointegerDepartment ID for department-specific pricing
categoryquerynointegerFilter by category ID
idquerynointegerGet specific product by ID
final_pricequerynobooleanWhether to return final prices including discounts
noobject
+
+ + + + +
StatusDescriptionContent Types
200Products retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/Product" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/listRoles.topic b/documentation/topics/generated/listRoles.topic new file mode 100644 index 00000000..70c84ccb --- /dev/null +++ b/documentation/topics/generated/listRoles.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /roles + + +

Operation ID: listRoles

+

List roles

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listSelfserveConditionRules.topic b/documentation/topics/generated/listSelfserveConditionRules.topic new file mode 100644 index 00000000..d85593fd --- /dev/null +++ b/documentation/topics/generated/listSelfserveConditionRules.topic @@ -0,0 +1,52 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /department/selfserve/condition/rules + + +

Operation ID: listSelfserveConditionRules

+

Retrieve a list of self-serve condition rules.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + + + + +
NameInRequiredTypeDescription
idquerynointegerFilter by rule ID
condition_idquerynointegerFilter by condition ID
typequerynostringFilter by rule type
object_typequerynostringFilter by object type
object_idquerynointegerFilter by object ID
noobject
+
+ + + + + + +
StatusDescriptionContent Types
200Successfully retrieved condition rulesapplication/json
400
404
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/DepartmentSelfserveConditionRule" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/listSelfserveConditions.topic b/documentation/topics/generated/listSelfserveConditions.topic new file mode 100644 index 00000000..83e79281 --- /dev/null +++ b/documentation/topics/generated/listSelfserveConditions.topic @@ -0,0 +1,53 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /department/selfserve/conditions + + +

Operation ID: listSelfserveConditions

+

Retrieve a list of self-serve conditions for a department, lane, or product.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + + + + + +
NameInRequiredTypeDescription
idquerynointegerFilter by condition ID
departmentquerynointegerFilter by department ID
lanequerynointegerFilter by lane ID
productquerynointegerFilter by product ID
condition_idquerynointegerFilter by condition ID
machine_type_idquerynointegerFilter by reusable machine type ID
noobject
+
+ + + + + + +
StatusDescriptionContent Types
200Successfully retrieved conditionsapplication/json
400
404
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/DepartmentSelfserveCondition" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/listSelfserveMachineTypes.topic b/documentation/topics/generated/listSelfserveMachineTypes.topic new file mode 100644 index 00000000..fbd6355f --- /dev/null +++ b/documentation/topics/generated/listSelfserveMachineTypes.topic @@ -0,0 +1,54 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /department/selfserve/machine-types + + +

Operation ID: listSelfserveMachineTypes

+

List reusable self-serve machine types

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
idquerynointeger
noobject
+
+ + + + + +
StatusDescriptionContent Types
200Successfully retrieved machine typesapplication/json
404
+

Schema for response 200 (application/json):

+ +{ + "oneOf": [ + { + "$ref": "#/components/schemas/SelfserveMachineType" + }, + { + "items": { + "$ref": "#/components/schemas/SelfserveMachineType" + }, + "type": "array" + } + ] +} + +
+
diff --git a/documentation/topics/generated/listSelfserveQuestions.topic b/documentation/topics/generated/listSelfserveQuestions.topic new file mode 100644 index 00000000..14b481b3 --- /dev/null +++ b/documentation/topics/generated/listSelfserveQuestions.topic @@ -0,0 +1,51 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /department/selfserve/questions + + +

Operation ID: listSelfserveQuestions

+

Retrieve a list of self-serve questions for a department, lane, or product.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + + + +
NameInRequiredTypeDescription
idquerynointegerFilter by question ID
departmentquerynointegerFilter by department ID
lanequerynointegerFilter by lane ID
productquerynointegerFilter by product ID
noobject
+
+ + + + + + +
StatusDescriptionContent Types
200Successfully retrieved questionsapplication/json
400
404
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/DepartmentSelfserveQuestion" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/listSelfserveTaskAttachments.topic b/documentation/topics/generated/listSelfserveTaskAttachments.topic new file mode 100644 index 00000000..afee7249 --- /dev/null +++ b/documentation/topics/generated/listSelfserveTaskAttachments.topic @@ -0,0 +1,42 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /department/selfserve/tasks/attachments + + +

Operation ID: listSelfserveTaskAttachments

+

Retrieve a list of attachments for a specific self-serve task.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesintegerTask ID
+
+ + + + + + +
StatusDescriptionContent Types
200Successfully retrieved task attachmentsapplication/json
400
404
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listSelfserveTasks.topic b/documentation/topics/generated/listSelfserveTasks.topic new file mode 100644 index 00000000..1ada7084 --- /dev/null +++ b/documentation/topics/generated/listSelfserveTasks.topic @@ -0,0 +1,52 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /department/selfserve/tasks + + +

Operation ID: listSelfserveTasks

+

Retrieve a list of self-serve tasks for a department, lane, product, or condition_id.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + + + + +
NameInRequiredTypeDescription
idquerynointegerFilter by task ID
departmentquerynointegerFilter by department ID
lanequerynointegerFilter by lane ID
productquerynointegerFilter by product ID
condition_idquerynointegerFilter by condition ID
noobject
+
+ + + + + + +
StatusDescriptionContent Types
200Successfully retrieved tasksapplication/json
400
404
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/DepartmentSelfserveTask" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/listSelfserveVehicleConditions.topic b/documentation/topics/generated/listSelfserveVehicleConditions.topic new file mode 100644 index 00000000..92dd1695 --- /dev/null +++ b/documentation/topics/generated/listSelfserveVehicleConditions.topic @@ -0,0 +1,53 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /department/selfserve/vehicle/conditions + + +

Operation ID: listSelfserveVehicleConditions

+

Retrieve a list of vehicle conditions for a department, lane, reg, or question. Customers will only see their own vehicle conditions.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + + + + + +
NameInRequiredTypeDescription
idquerynointegerFilter by condition ID
departmentquerynointegerFilter by department ID
lanequerynointegerFilter by lane ID
regquerynostringFilter by vehicle registration number
questionquerynointegerFilter by question ID
customer_idquerynointegerFilter by customer ID
noobject
+
+ + + + + + +
StatusDescriptionContent Types
200Successfully retrieved vehicle conditionsapplication/json
400
404
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/DepartmentSelfserveVehicleCondition" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/listStripeCustomers.topic b/documentation/topics/generated/listStripeCustomers.topic new file mode 100644 index 00000000..c204122e --- /dev/null +++ b/documentation/topics/generated/listStripeCustomers.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/stripe/customers + + +

Operation ID: listStripeCustomers

+

Get list of Stripe customers

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Stripe customers retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listStripePrices.topic b/documentation/topics/generated/listStripePrices.topic new file mode 100644 index 00000000..bf16bde8 --- /dev/null +++ b/documentation/topics/generated/listStripePrices.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/stripe/prices + + +

Operation ID: listStripePrices

+

Get list of Stripe prices

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Stripe prices retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listStripeProducts.topic b/documentation/topics/generated/listStripeProducts.topic new file mode 100644 index 00000000..0c56775a --- /dev/null +++ b/documentation/topics/generated/listStripeProducts.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/stripe/products + + +

Operation ID: listStripeProducts

+

Get list of Stripe products

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Stripe products retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listStripeTerminalLocations.topic b/documentation/topics/generated/listStripeTerminalLocations.topic new file mode 100644 index 00000000..a3507439 --- /dev/null +++ b/documentation/topics/generated/listStripeTerminalLocations.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/stripe/terminal/locations + + +

Operation ID: listStripeTerminalLocations

+

List Stripe terminal locations

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listStripeTerminalReaders.topic b/documentation/topics/generated/listStripeTerminalReaders.topic new file mode 100644 index 00000000..56306084 --- /dev/null +++ b/documentation/topics/generated/listStripeTerminalReaders.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/stripe/terminal/readers + + +

Operation ID: listStripeTerminalReaders

+

List Stripe terminal readers

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listSubuserGrants.topic b/documentation/topics/generated/listSubuserGrants.topic new file mode 100644 index 00000000..63aaea65 --- /dev/null +++ b/documentation/topics/generated/listSubuserGrants.topic @@ -0,0 +1,54 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /subusers/grants + + +

Operation ID: listSubuserGrants

+

Returns subuser grant records filtered by `customer_number` and/or `subuser_id`.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
customer_numberquerynointegere-conomic customer number to filter by
subuser_idquerynointegerSubuser ID to filter by
+
+ + + + + + + +
StatusDescriptionContent Types
200Grants fetchedapplication/json
400
401
500
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "grants": { + "items": { + "$ref": "#/components/schemas/SubuserGrant" + }, + "type": "array" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/listSubuserPermissionNodes.topic b/documentation/topics/generated/listSubuserPermissionNodes.topic new file mode 100644 index 00000000..c0373797 --- /dev/null +++ b/documentation/topics/generated/listSubuserPermissionNodes.topic @@ -0,0 +1,46 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /subusers/permission-nodes + + +

Operation ID: listSubuserPermissionNodes

+

Returns grouped permission nodes available for subuser grants.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + +
StatusDescriptionContent Types
200Permission nodes fetchedapplication/json
401
500
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "permission_nodes": { + "items": { + "$ref": "#/components/schemas/PermissionNodeGroup" + }, + "type": "array" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/listSubusers.topic b/documentation/topics/generated/listSubusers.topic new file mode 100644 index 00000000..e28e61c0 --- /dev/null +++ b/documentation/topics/generated/listSubusers.topic @@ -0,0 +1,105 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /subusers + + +

Operation ID: listSubusers

+

Returns a paginated list of subusers (drivers) that have enabled grants tied to the +authenticated user's customer number. Only subusers with at least one enabled, non-deleted +grant for the caller's customer are returned. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + + +
NameInRequiredTypeDescription
pagequerynointeger
limitquerynointeger
searchquerynostring
include_non_enabledquerynobooleanInclude subusers that only have non-enabled grants (default false)
+
+ + + + + + +
StatusDescriptionContent Types
200List of visible subusersapplication/json
401
500
+

Schema for response 200 (application/json):

+ +{ + "items": { + "properties": { + "created_at": { + "format": "date-time", + "nullable": true, + "type": "string" + }, + "email": { + "format": "email", + "nullable": true, + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "nullable": true, + "type": "string" + }, + "permissions": { + "description": "Aggregated permission keys granted for the caller's customer", + "items": { + "type": "string" + }, + "type": "array" + }, + "phone": { + "nullable": true, + "type": "integer" + }, + "phone_country_code": { + "nullable": true, + "type": "integer" + }, + "suspended_at": { + "format": "date-time", + "nullable": true, + "type": "string" + }, + "two_factor_enabled": { + "description": "Indicates if 2FA is enabled for this account", + "type": "boolean" + }, + "updated_at": { + "format": "date-time", + "nullable": true, + "type": "string" + }, + "username": { + "nullable": true, + "type": "string" + } + }, + "type": "object" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/listSuperuserDepartments.topic b/documentation/topics/generated/listSuperuserDepartments.topic new file mode 100644 index 00000000..9b828ca3 --- /dev/null +++ b/documentation/topics/generated/listSuperuserDepartments.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /superuser/department + + +

Operation ID: listSuperuserDepartments

+

List departments (superuser)

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listUsers.topic b/documentation/topics/generated/listUsers.topic new file mode 100644 index 00000000..c5124b7d --- /dev/null +++ b/documentation/topics/generated/listUsers.topic @@ -0,0 +1,47 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /users + + +

Operation ID: listUsers

+

Retrieve a paginated list of users

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
noobject
+
+ + + + + + +
StatusDescriptionContent Types
200Users retrieved successfullyapplication/json
400
401
+

Schema for response 200 (application/json):

+ +{ + "items": { + "$ref": "#/components/schemas/User" + }, + "type": "array" +} + +
+
diff --git a/documentation/topics/generated/listVehicles.topic b/documentation/topics/generated/listVehicles.topic new file mode 100644 index 00000000..f2c16dc5 --- /dev/null +++ b/documentation/topics/generated/listVehicles.topic @@ -0,0 +1,68 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /vehicles + + +

Operation ID: listVehicles

+

List vehicles or fetch a specific vehicle when `id` is provided. + +- When `id` is present, returns a single vehicle object (404 if not found). +- Otherwise returns a paginated list of vehicles. + +Permissions: +- Own scope: `list_own_vehicles` (linked to subuser node `VEHICLES_LIST`). +- Broader scope: `list_vehicles_other`. + +Subusers may specify header `X-Customer-Number` to target a specific customer. If the broader +permission is missing, the list will automatically be restricted to the effective customer context. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + + +
NameInRequiredTypeDescription
noobject
idquerynointeger
regquerynostring
customer_idquerynointeger
+
+ + + + + + +
StatusDescriptionContent Types
200Vehicle(s) retrieved successfullyapplication/json
403
404
+

Schema for response 200 (application/json):

+ +{ + "oneOf": [ + { + "$ref": "#/components/schemas/Vehicle" + }, + { + "items": { + "$ref": "#/components/schemas/Vehicle" + }, + "type": "array" + } + ] +} + +
+
diff --git a/documentation/topics/generated/listWashCertificates.topic b/documentation/topics/generated/listWashCertificates.topic new file mode 100644 index 00000000..ffd2ad25 --- /dev/null +++ b/documentation/topics/generated/listWashCertificates.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/washcertificates + + +

Operation ID: listWashCertificates

+

List wash certificates

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listXlvaskCustomers.topic b/documentation/topics/generated/listXlvaskCustomers.topic new file mode 100644 index 00000000..b1a66023 --- /dev/null +++ b/documentation/topics/generated/listXlvaskCustomers.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/xlvask/customers + + +

Operation ID: listXlvaskCustomers

+

Get list of customers from XLVask

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200XLVask customers retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/listXlvaskVehicles.topic b/documentation/topics/generated/listXlvaskVehicles.topic new file mode 100644 index 00000000..a25ef811 --- /dev/null +++ b/documentation/topics/generated/listXlvaskVehicles.topic @@ -0,0 +1,34 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/xlvask/vehicles + + +

Operation ID: listXlvaskVehicles

+

Get list of vehicles from XLVask

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
StatusDescriptionContent Types
200XLVask vehicles retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/logout.topic b/documentation/topics/generated/logout.topic new file mode 100644 index 00000000..6d01dac1 --- /dev/null +++ b/documentation/topics/generated/logout.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /auth/logout + + +

Operation ID: logout

+

Invalidate the current authentication token

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
StatusDescriptionContent Types
200Logout successfulapplication/json
401
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "message": { + "example": "Logged out", + "type": "string" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/lookupCvr.topic b/documentation/topics/generated/lookupCvr.topic new file mode 100644 index 00000000..34e4c859 --- /dev/null +++ b/documentation/topics/generated/lookupCvr.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /cvr/lookup + + +

Operation ID: lookupCvr

+

Get detailed information for a CVR number

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
cvrqueryyesstring
+
+ + + + +
StatusDescriptionContent Types
200CVR information retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/markOrderCompleted.topic b/documentation/topics/generated/markOrderCompleted.topic new file mode 100644 index 00000000..52716e43 --- /dev/null +++ b/documentation/topics/generated/markOrderCompleted.topic @@ -0,0 +1,52 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /orders/mark_as_completed + + +

Operation ID: markOrderCompleted

+

Mark an order as completed

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "id": { + "type": "integer" + } + }, + "required": [ + "id" + ], + "type": "object" +} + +
+ + + + + +
StatusDescriptionContent Types
200Order marked as completed successfullyapplication/json
400
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/motorApiLookup.topic b/documentation/topics/generated/motorApiLookup.topic new file mode 100644 index 00000000..389886d1 --- /dev/null +++ b/documentation/topics/generated/motorApiLookup.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/motorapi/lookup + + +

Operation ID: motorApiLookup

+

Look up vehicle information using license plate

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
platequeryyesstring
+
+ + + + +
StatusDescriptionContent Types
200Vehicle information retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/passkeyChallenge.topic b/documentation/topics/generated/passkeyChallenge.topic new file mode 100644 index 00000000..00b56dd8 --- /dev/null +++ b/documentation/topics/generated/passkeyChallenge.topic @@ -0,0 +1,108 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /auth/passkey/challenge + + +

Operation ID: passkeyChallenge

+

Generates a WebAuthn PublicKeyCredentialRequestOptions payload. If customer_number is provided, allowCredentials will be populated with existing passkeys for that account. Otherwise, a challenge is issued for discoverable credentials.

+
+

No authentication required.

+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "customer_number": { + "description": "Optional customer's e-conomic customer number", + "example": 12345, + "type": "integer" + }, + "g_recaptcha_response": { + "description": "reCAPTCHA verification token", + "type": "string" + } + }, + "required": [ + "g_recaptcha_response" + ], + "type": "object" +} + +
+ + + + + +
StatusDescriptionContent Types
200Challenge generatedapplication/json
400
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "challenge_token": { + "description": "Temporary token binding the challenge to the login attempt", + "type": "string" + }, + "publicKey": { + "properties": { + "allowCredentials": { + "items": { + "properties": { + "id": { + "description": "Base64URL-encoded credential ID", + "type": "string" + }, + "transports": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": { + "example": "public-key", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "challenge": { + "description": "Base64URL-encoded challenge", + "type": "string" + }, + "rpId": { + "description": "Relying party ID (truckwash.io or localhost)", + "example": "truckwash.io", + "type": "string" + }, + "timeout": { + "description": "Timeout in milliseconds", + "type": "integer" + }, + "userVerification": { + "enum": [ + "required", + "preferred", + "discouraged" + ], + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/passkeyVerify.topic b/documentation/topics/generated/passkeyVerify.topic new file mode 100644 index 00000000..3dc1f1b0 --- /dev/null +++ b/documentation/topics/generated/passkeyVerify.topic @@ -0,0 +1,135 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /auth/passkey/verify + + +

Operation ID: passkeyVerify

+

Verifies the WebAuthn assertion and challenge token. Returns a session token on success.

+
+

No authentication required.

+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "challenge_token": { + "description": "The token returned by the challenge endpoint", + "type": "string" + }, + "credential": { + "description": "The WebAuthn PublicKeyCredential object (assertion)", + "properties": { + "clientExtensionResults": { + "type": "object" + }, + "id": { + "description": "The credential ID (base64url)", + "type": "string" + }, + "rawId": { + "description": "The raw credential ID (base64url)", + "type": "string" + }, + "response": { + "properties": { + "authenticatorData": { + "description": "Base64URL-encoded authenticator data", + "type": "string" + }, + "clientDataJSON": { + "description": "Base64URL-encoded client data", + "type": "string" + }, + "signature": { + "description": "Base64URL-encoded signature", + "type": "string" + }, + "userHandle": { + "description": "Base64URL-encoded user handle", + "nullable": true, + "type": "string" + } + }, + "required": [ + "clientDataJSON", + "authenticatorData", + "signature" + ], + "type": "object" + }, + "type": { + "example": "public-key", + "type": "string" + } + }, + "required": [ + "id", + "rawId", + "type", + "response" + ], + "type": "object" + }, + "g_recaptcha_response": { + "description": "reCAPTCHA verification token", + "type": "string" + } + }, + "required": [ + "challenge_token", + "credential", + "g_recaptcha_response" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Verification successful, session startedapplication/json
400
401
+

Schema for response 200 (application/json):

+ +{ + "oneOf": [ + { + "properties": { + "token": { + "description": "Bearer token for customer", + "type": "string" + } + }, + "required": [ + "token" + ], + "type": "object" + }, + { + "properties": { + "session": { + "description": "Session token for subuser", + "type": "string" + } + }, + "required": [ + "session" + ], + "type": "object" + } + ] +} + +
+
diff --git a/documentation/topics/generated/rebuildSystemSearchCache.topic b/documentation/topics/generated/rebuildSystemSearchCache.topic new file mode 100644 index 00000000..0830a16d --- /dev/null +++ b/documentation/topics/generated/rebuildSystemSearchCache.topic @@ -0,0 +1,47 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /superuser/search/system/cache/rebuild + + +

Operation ID: rebuildSystemSearchCache

+

Queues a cache rebuild request and clears active query/intent cache namespaces immediately.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/SystemSearchCacheRebuildRequest" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Cache rebuild queued successfullyapplication/json
401
403
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/SystemSearchCacheRebuildResponse" +} + +
+
diff --git a/documentation/topics/generated/recordDepartmentPlateScan.topic b/documentation/topics/generated/recordDepartmentPlateScan.topic new file mode 100644 index 00000000..50bfaa73 --- /dev/null +++ b/documentation/topics/generated/recordDepartmentPlateScan.topic @@ -0,0 +1,55 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /numberplatescans/department + + +

Operation ID: recordDepartmentPlateScan

+

Record plate scan for department

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "department_id": { + "type": "integer" + }, + "plate": { + "type": "string" + } + }, + "required": [ + "plate", + "department_id" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
201Plate scan recorded successfullyapplication/json
+

Schema for response 201 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/recordPlateScan.topic b/documentation/topics/generated/recordPlateScan.topic new file mode 100644 index 00000000..139a6bc4 --- /dev/null +++ b/documentation/topics/generated/recordPlateScan.topic @@ -0,0 +1,55 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /numberplatescans + + +

Operation ID: recordPlateScan

+

Record a new license plate scan

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "lane_id": { + "type": "integer" + }, + "plate": { + "type": "string" + } + }, + "required": [ + "plate", + "lane_id" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
201Plate scan recorded successfullyapplication/json
+

Schema for response 201 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/registerCustomerByCvr.topic b/documentation/topics/generated/registerCustomerByCvr.topic new file mode 100644 index 00000000..b3aa005e --- /dev/null +++ b/documentation/topics/generated/registerCustomerByCvr.topic @@ -0,0 +1,95 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /auth/register/cvr + + +

Operation ID: registerCustomerByCvr

+

Register a new customer account using Danish CVR number

+
+

No authentication required.

+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "companyPhone": { + "description": "Company phone number", + "example": 21754690, + "maximum": 9999999999, + "minimum": 10000000, + "type": "integer" + }, + "contactEmail": { + "description": "Contact email", + "example": "contact@company.dk", + "format": "email", + "maxLength": 255, + "minLength": 5, + "type": "string" + }, + "contactName": { + "description": "Contact person name", + "example": "Mikkel", + "type": "string" + }, + "contactPhone": { + "description": "Contact phone number", + "example": 21754690, + "maximum": 9999999999, + "minimum": 10000000, + "type": "integer" + }, + "cvr": { + "description": "Danish CVR number", + "example": "44794780", + "maxLength": 20, + "minLength": 8, + "type": "string" + }, + "g_recaptcha_response": { + "description": "reCAPTCHA verification token", + "type": "string" + }, + "invoiceEmail": { + "description": "Email for invoices", + "example": "invoice@company.dk", + "format": "email", + "maxLength": 255, + "minLength": 5, + "type": "string" + } + }, + "required": [ + "cvr", + "companyPhone", + "invoiceEmail", + "contactEmail", + "contactPhone", + "contactName", + "g_recaptcha_response" + ], + "type": "object" +} + +
+ + + + + +
StatusDescriptionContent Types
201Customer registered successfullyapplication/json
400
+

Schema for response 201 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/removeDepartmentCategory.topic b/documentation/topics/generated/removeDepartmentCategory.topic new file mode 100644 index 00000000..754d69cf --- /dev/null +++ b/documentation/topics/generated/removeDepartmentCategory.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /departments/categories + + +

Operation ID: removeDepartmentCategory

+

Remove category from department

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/removeRolePermission.topic b/documentation/topics/generated/removeRolePermission.topic new file mode 100644 index 00000000..70c0db73 --- /dev/null +++ b/documentation/topics/generated/removeRolePermission.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + DELETE /roles/permissions + + +

Operation ID: removeRolePermission

+

Remove permission from role

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
role_idqueryyesinteger
permissionqueryyesstring
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/renamePasskey.topic b/documentation/topics/generated/renamePasskey.topic new file mode 100644 index 00000000..a1386ad1 --- /dev/null +++ b/documentation/topics/generated/renamePasskey.topic @@ -0,0 +1,56 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PATCH /account/security/passkeys/{id} + + +

Operation ID: renamePasskey

+

Rename a passkey

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idpathyesinteger
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/PasskeyRenameRequest" +} + +
+ + + + + +
StatusDescriptionContent Types
200Passkey renamedapplication/json
404Not foundapplication/json
+

Schema for response 200 (application/json):

+ +{} + +

Schema for response 404 (application/json):

+ +{ + "$ref": "#/components/schemas/Error" +} + +
+
diff --git a/documentation/topics/generated/requestPasswordReset.topic b/documentation/topics/generated/requestPasswordReset.topic new file mode 100644 index 00000000..b1183759 --- /dev/null +++ b/documentation/topics/generated/requestPasswordReset.topic @@ -0,0 +1,60 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /auth/password-reset/request + + +

Operation ID: requestPasswordReset

+

Send an email with a password reset token to the customer's email address

+
+

No authentication required.

+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "customer_number": { + "description": "The customer number", + "example": 123456, + "type": "integer" + }, + "g_recaptcha_response": { + "description": "reCAPTCHA verification token", + "type": "string" + } + }, + "required": [ + "customer_number", + "g_recaptcha_response" + ], + "type": "object" +} + +
+ + + + + +
StatusDescriptionContent Types
200Request processedapplication/json
400
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "message": { + "type": "string" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/searchCustomers.topic b/documentation/topics/generated/searchCustomers.topic new file mode 100644 index 00000000..4667fa02 --- /dev/null +++ b/documentation/topics/generated/searchCustomers.topic @@ -0,0 +1,48 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /customers/search + + +

Operation ID: searchCustomers

+

Search for customers using various criteria

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "query": { + "type": "string" + } + }, + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Customers found successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/searchCvr.topic b/documentation/topics/generated/searchCvr.topic new file mode 100644 index 00000000..2fc1ecd3 --- /dev/null +++ b/documentation/topics/generated/searchCvr.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /cvr/search + + +

Operation ID: searchCvr

+

Search for companies by name or CVR

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
queryqueryyesstring
+
+ + + + +
StatusDescriptionContent Types
200Search results retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/searchVehicles.topic b/documentation/topics/generated/searchVehicles.topic new file mode 100644 index 00000000..f361fddf --- /dev/null +++ b/documentation/topics/generated/searchVehicles.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /vehicles/search + + +

Operation ID: searchVehicles

+

Search vehicles

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
searchqueryyesstring
+
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/sendDepartmentGoalProgressAlertTest.topic b/documentation/topics/generated/sendDepartmentGoalProgressAlertTest.topic new file mode 100644 index 00000000..888e92fc --- /dev/null +++ b/documentation/topics/generated/sendDepartmentGoalProgressAlertTest.topic @@ -0,0 +1,150 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /goals/department/progress-alert/test + + +

Operation ID: sendDepartmentGoalProgressAlertTest

+

Sends a progress alert for a department goal to the destination defined in the goal's criteria. + +Permission required: `goals_department_progress_alert_test`. + +Access control: +- The caller must be a superuser or belong to all departments targeted by the goal. + +Behavior: +- Looks up the goal by `id`. +- Rebuilds the criteria from stored JSON and attaches the goal's departments. +- Renders the alert using the server-side renderer (respecting progress type/style/format and destination limits). +- Sends the alert to Slack, Email, or SMS depending on `progress_alert_destination`, unless overridden. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "department_id": { + "description": "Department id to use that department's Slack webhook when destination is SLACK", + "example": 3, + "type": "integer" + }, + "email_to": { + "description": "Email recipient when destination is EMAIL", + "example": "tester@example.com", + "format": "email", + "type": "string" + }, + "id": { + "description": "The department goal id", + "example": 42, + "type": "integer" + }, + "overrideDestination": { + "description": "Override the destination for this test", + "enum": [ + "SLACK", + "EMAIL", + "SMS", + "NONE" + ], + "example": "SLACK", + "type": "string" + }, + "slack_webhook": { + "description": "Slack webhook URL when destination is SLACK", + "example": "https://hooks.slack.com/services/T000/B000/XXX", + "type": "string" + }, + "sms_to": { + "description": "One or more MSISDN recipients when destination is SMS", + "oneOf": [ + { + "description": "Comma or semicolon separated list", + "example": "+4512345678, +4598765432", + "type": "string" + }, + { + "example": [ + "+4512345678", + "+4598765432" + ], + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "subject": { + "description": "Optional email subject when destination is EMAIL", + "example": "Dept Goal Progress Test", + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" +} + +
+ + + + + + + + + +
StatusDescriptionContent Types
200Alert sent successfullyapplication/json
400
401
403
404
500
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "destination": { + "description": "Final destination used", + "enum": [ + "SLACK", + "EMAIL", + "SMS", + "NONE" + ], + "type": "string" + }, + "id": { + "description": "Goal id", + "type": "integer" + }, + "message_preview": { + "description": "Rendered message preview", + "type": "string" + }, + "provider_response": { + "description": "Provider-specific response or status message" + }, + "target": { + "description": "The target used for delivery (email address, phone numbers, department id, or webhook)" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/sendSelfServeLaneCommand.topic b/documentation/topics/generated/sendSelfServeLaneCommand.topic new file mode 100644 index 00000000..3c626870 --- /dev/null +++ b/documentation/topics/generated/sendSelfServeLaneCommand.topic @@ -0,0 +1,68 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /modules/self-serve/lane/command + + +

Operation ID: sendSelfServeLaneCommand

+

Send a command (e.g., start, stop, reset) to a self-serve lane

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "command": { + "enum": [ + "START", + "STOP", + "RESET", + "RESERVE", + "RELEASE" + ], + "type": "string" + }, + "lane_id": { + "type": "integer" + }, + "license_plate": { + "description": "Required for START command", + "type": "string" + } + }, + "required": [ + "lane_id", + "command" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Command sent successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/SelfServeLaneStatus" +} + +
+
diff --git a/documentation/topics/generated/setDepartmentPrice.topic b/documentation/topics/generated/setDepartmentPrice.topic new file mode 100644 index 00000000..b1f4531b --- /dev/null +++ b/documentation/topics/generated/setDepartmentPrice.topic @@ -0,0 +1,59 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /superuser/department/prices + + +

Operation ID: setDepartmentPrice

+

Set department price

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "department_id": { + "type": "integer" + }, + "price": { + "type": "integer" + }, + "product_id": { + "type": "integer" + } + }, + "required": [ + "department_id", + "product_id", + "price" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/setDepartmentTerminalLocation.topic b/documentation/topics/generated/setDepartmentTerminalLocation.topic new file mode 100644 index 00000000..f99d4537 --- /dev/null +++ b/documentation/topics/generated/setDepartmentTerminalLocation.topic @@ -0,0 +1,55 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /modules/stripe/department/terminal/location + + +

Operation ID: setDepartmentTerminalLocation

+

Set department terminal location

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "id": { + "type": "integer" + }, + "location": { + "type": "string" + } + }, + "required": [ + "id", + "location" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/setDepartmentVariable.topic b/documentation/topics/generated/setDepartmentVariable.topic new file mode 100644 index 00000000..13de77ff --- /dev/null +++ b/documentation/topics/generated/setDepartmentVariable.topic @@ -0,0 +1,59 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /superuser/department/variables + + +

Operation ID: setDepartmentVariable

+

Set department variable

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "department_id": { + "type": "integer" + }, + "value": { + "type": "string" + }, + "variable": { + "type": "string" + } + }, + "required": [ + "department_id", + "variable", + "value" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/setPasswordUsingResetToken.topic b/documentation/topics/generated/setPasswordUsingResetToken.topic new file mode 100644 index 00000000..af38e54d --- /dev/null +++ b/documentation/topics/generated/setPasswordUsingResetToken.topic @@ -0,0 +1,71 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /auth/password-reset/set + + +

Operation ID: setPasswordUsingResetToken

+

Update the customer password using a valid reset token

+
+

No authentication required.

+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "g_recaptcha_response": { + "description": "reCAPTCHA verification token", + "type": "string" + }, + "password": { + "description": "The new password", + "type": "string" + }, + "token": { + "description": "The password reset token", + "type": "string" + } + }, + "required": [ + "token", + "password", + "g_recaptcha_response" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Password updated successfullyapplication/json
400
404Invalid or expired tokenapplication/json
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "message": { + "type": "string" + } + }, + "type": "object" +} + +

Schema for response 404 (application/json):

+ +{ + "$ref": "#/components/schemas/Error" +} + +
+
diff --git a/documentation/topics/generated/setSelfServeLaneAllowedServices.topic b/documentation/topics/generated/setSelfServeLaneAllowedServices.topic new file mode 100644 index 00000000..798db1fa --- /dev/null +++ b/documentation/topics/generated/setSelfServeLaneAllowedServices.topic @@ -0,0 +1,76 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /modules/self-serve/lane/services/allowed + + +

Operation ID: setSelfServeLaneAllowedServices

+

Updates the set of services that are allowed to be manually activated for a given self-serve lane, +derived from the tasks currently shown to the user after answering the self-serve questions. +This endpoint does not activate anything by itself; it only sets what is allowed to be activated. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "lane_id": { + "type": "integer" + }, + "task_ids": { + "description": "List of task IDs that are currently shown to the user", + "items": { + "type": "integer" + }, + "type": "array" + } + }, + "required": [ + "lane_id" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Allowed services updatedapplication/json
401
403
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "allowed_services": { + "items": { + "type": "string" + }, + "type": "array" + }, + "lane_id": { + "type": "integer" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/setUserDiscount.topic b/documentation/topics/generated/setUserDiscount.topic new file mode 100644 index 00000000..ded9b046 --- /dev/null +++ b/documentation/topics/generated/setUserDiscount.topic @@ -0,0 +1,62 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /superuser/user/discounts + + +

Operation ID: setUserDiscount

+

Set user discount

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "discount": { + "type": "integer" + }, + "is_category": { + "type": "boolean" + }, + "object_id": { + "type": "string" + }, + "user_id": { + "type": "integer" + } + }, + "required": [ + "discount", + "object_id", + "is_category" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/setUserKey.topic b/documentation/topics/generated/setUserKey.topic new file mode 100644 index 00000000..342a371b --- /dev/null +++ b/documentation/topics/generated/setUserKey.topic @@ -0,0 +1,58 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /superuser/user/keys + + +

Operation ID: setUserKey

+

Set user key

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "key": { + "type": "string" + }, + "user_id": { + "type": "integer" + }, + "value": { + "type": "string" + } + }, + "required": [ + "key", + "value" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/setUserPassword.topic b/documentation/topics/generated/setUserPassword.topic new file mode 100644 index 00000000..4f9f62c4 --- /dev/null +++ b/documentation/topics/generated/setUserPassword.topic @@ -0,0 +1,54 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /superuser/user/password + + +

Operation ID: setUserPassword

+

Set user password

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "password": { + "type": "string" + }, + "user_id": { + "type": "integer" + } + }, + "required": [ + "password" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/setVehicleAutoStartOnLpr.topic b/documentation/topics/generated/setVehicleAutoStartOnLpr.topic new file mode 100644 index 00000000..4afcfb9b --- /dev/null +++ b/documentation/topics/generated/setVehicleAutoStartOnLpr.topic @@ -0,0 +1,68 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /vehicles/set-auto-start-on-lpr + + +

Operation ID: setVehicleAutoStartOnLpr

+

Enable or disable automatic start on LPR for a vehicle in XL Vask. + +Permissions: +- Own scope: `set_auto_start_on_lpr` (linked to subuser node `VEHICLES_EDIT`). +- Broader scope: `set_auto_start_on_lpr_other`. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
noobject
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "active": { + "type": "boolean" + }, + "id": { + "type": "integer" + } + }, + "required": [ + "id", + "active" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Successapplication/json
403
404
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/setVehicleTypeId.topic b/documentation/topics/generated/setVehicleTypeId.topic new file mode 100644 index 00000000..86ca158e --- /dev/null +++ b/documentation/topics/generated/setVehicleTypeId.topic @@ -0,0 +1,71 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /vehicles/set-vehicle-type-id + + +

Operation ID: setVehicleTypeId

+

Set or change the XL Vask `vehicleTypeId` for a vehicle. + +Permissions: +- Own scope: `set_vehicle_type_id` (linked to subuser node `VEHICLES_EDIT`). +- Broader scope: `set_vehicle_type_id_other`. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
noobject
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "id": { + "type": "integer" + }, + "vehicleTypeId": { + "maxLength": 50, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "id", + "vehicleTypeId" + ], + "type": "object" +} + +
+ + + + + + + +
StatusDescriptionContent Types
200Successapplication/json
400
403
404
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/setup2fa.topic b/documentation/topics/generated/setup2fa.topic new file mode 100644 index 00000000..58697c4b --- /dev/null +++ b/documentation/topics/generated/setup2fa.topic @@ -0,0 +1,54 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /auth/2fa/setup + + +

Operation ID: setup2fa

+

Generate a new TOTP secret for the authenticated user/subuser

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + + +
StatusDescriptionContent Types
2002FA secret generated successfullyapplication/json
401
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "qr_code_url": { + "description": "An otpauth URL for generating a QR code", + "type": "string" + }, + "secret": { + "description": "The base32 encoded TOTP secret", + "type": "string" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/simulateStripePayment.topic b/documentation/topics/generated/simulateStripePayment.topic new file mode 100644 index 00000000..d7f50971 --- /dev/null +++ b/documentation/topics/generated/simulateStripePayment.topic @@ -0,0 +1,51 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /orders/module/stripe/debug/simulate_payment + + +

Operation ID: simulateStripePayment

+

Simulate Stripe payment

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "id": { + "type": "integer" + } + }, + "required": [ + "id" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/suIntimidate.topic b/documentation/topics/generated/suIntimidate.topic new file mode 100644 index 00000000..26f82583 --- /dev/null +++ b/documentation/topics/generated/suIntimidate.topic @@ -0,0 +1,58 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /su/intimidate + + +

Operation ID: suIntimidate

+

Create an authentication token for another user (Superuser only)

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "user_id": { + "type": "integer" + } + }, + "required": [ + "user_id" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "token": { + "type": "string" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/submitForm.topic b/documentation/topics/generated/submitForm.topic new file mode 100644 index 00000000..30942ded --- /dev/null +++ b/documentation/topics/generated/submitForm.topic @@ -0,0 +1,61 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /form + + +

Operation ID: submitForm

+

Submit a form

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "data": { + "description": "Form submission data", + "type": "object" + }, + "g_recaptcha_response": { + "description": "reCAPTCHA verification token (required if not authenticated)", + "type": "string" + }, + "id": { + "description": "Form identifier", + "type": "string" + } + }, + "required": [ + "id", + "data" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
201Form submitted successfullyapplication/json
+

Schema for response 201 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/subuserPasswordAuth.topic b/documentation/topics/generated/subuserPasswordAuth.topic new file mode 100644 index 00000000..7f077187 --- /dev/null +++ b/documentation/topics/generated/subuserPasswordAuth.topic @@ -0,0 +1,150 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /subusers/auth/password + + +

Operation ID: subuserPasswordAuth

+

Authenticates a subuser (driver) using a password together with one of the supported +identifiers: `phone_country_code` + `phone`, `subuser_id`, or `username`. + +On success, returns a newly generated session token for the subuser. +

+
+

No authentication required.

+ +

Required: yes.

+

Content type: application/json

+ +{ + "oneOf": [ + { + "properties": { + "password": { + "format": "password", + "maxLength": 255, + "minLength": 8, + "type": "string" + }, + "phone": { + "description": "Phone number (4–15 digits, no leading +)", + "example": 12345678, + "maximum": 999999999999999, + "minimum": 1000, + "type": "integer" + }, + "phone_country_code": { + "description": "Phone country code (1–3 digits)", + "example": 45, + "maximum": 999, + "minimum": 1, + "type": "integer" + } + }, + "required": [ + "phone_country_code", + "phone", + "password" + ], + "type": "object" + }, + { + "properties": { + "password": { + "format": "password", + "maxLength": 255, + "minLength": 8, + "type": "string" + }, + "subuser_id": { + "description": "Subuser ID", + "example": 42, + "type": "integer" + } + }, + "required": [ + "subuser_id", + "password" + ], + "type": "object" + }, + { + "properties": { + "password": { + "format": "password", + "maxLength": 255, + "minLength": 8, + "type": "string" + }, + "username": { + "example": "jdoe", + "maxLength": 255, + "minLength": 3, + "type": "string" + } + }, + "required": [ + "username", + "password" + ], + "type": "object" + } + ] +} + +
+ + + + + + + +
StatusDescriptionContent Types
200Authentication successfulapplication/json
400
404
500
+

Schema for response 200 (application/json):

+ +{ + "oneOf": [ + { + "properties": { + "session": { + "description": "Newly generated subuser session token", + "example": "2f7a8c0e-9b1d-4c6a-91a9-1a2b3c4d5e6f", + "type": "string" + } + }, + "required": [ + "session" + ], + "type": "object" + }, + { + "properties": { + "2fa_required": { + "example": true, + "type": "boolean" + }, + "2fa_token": { + "description": "Temporary 2FA verification token", + "example": "557a3e7b1a2b...", + "type": "string" + } + }, + "required": [ + "2fa_required", + "2fa_token" + ], + "type": "object" + } + ] +} + +
+
diff --git a/documentation/topics/generated/syncAllBookings.topic b/documentation/topics/generated/syncAllBookings.topic new file mode 100644 index 00000000..123f12f2 --- /dev/null +++ b/documentation/topics/generated/syncAllBookings.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /superuser/bookings/sync/all + + +

Operation ID: syncAllBookings

+

Sync all bookings from external system

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/syncBooking.topic b/documentation/topics/generated/syncBooking.topic new file mode 100644 index 00000000..102f3d8c --- /dev/null +++ b/documentation/topics/generated/syncBooking.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /admin/bookings/sync + + +

Operation ID: syncBooking

+

Sync booking from external system

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/systemWideSearchGet.topic b/documentation/topics/generated/systemWideSearchGet.topic new file mode 100644 index 00000000..69950f0f --- /dev/null +++ b/documentation/topics/generated/systemWideSearchGet.topic @@ -0,0 +1,51 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /search/system + + +

Operation ID: systemWideSearchGet

+

Search across all supported entities with permission-aware filtering and optional intent parsing debug metadata. Customer records and customer-related entities are matched against a local e-conomic customer index (name/address/email/CVR) that is refreshed by cron. Intent parsing is invoked adaptively when lexical confidence is low or when the query looks intent-driven. Results are ordered by relevance, with recent records preferred when relevance is comparable.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + + + + + + +
NameInRequiredTypeDescription
queryqueryyesstringFree-text query to search for. Supports natural-language intent fallback and domain synonyms such as `rabat` -> `discount`.
include_typesquerynoarray<SystemSearchEntityType>Comma-separated list of entity types to include. Defaults to all allowed types.
exclude_typesquerynoarray<SystemSearchEntityType>Comma-separated list of entity types to exclude.
include_associationsquerynobooleanInclude associated objects when matching a primary entity such as a customer.
debug_intentquerynobooleanInclude intent parser diagnostics in `meta.intent_parser`.
limitquerynointeger
offsetquerynointeger
+
+ + + + + + + +
StatusDescriptionContent Types
200Search results returned successfullyapplication/json
400
401
403
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/SystemSearchResponse" +} + +
+
diff --git a/documentation/topics/generated/systemWideSearchPost.topic b/documentation/topics/generated/systemWideSearchPost.topic new file mode 100644 index 00000000..56a1839b --- /dev/null +++ b/documentation/topics/generated/systemWideSearchPost.topic @@ -0,0 +1,48 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /search/system + + +

Operation ID: systemWideSearchPost

+

Search across all supported entities using JSON request payload. Customer-related matches include local e-conomic customer index fields. Intent parsing may run adaptively for intent-driven natural-language queries. Results are ordered by relevance, with recent records preferred when relevance is comparable.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/SystemSearchRequest" +} + +
+ + + + + + + +
StatusDescriptionContent Types
200Search results returned successfullyapplication/json
400
401
403
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/SystemSearchResponse" +} + +
+
diff --git a/documentation/topics/generated/testEmailConfig.topic b/documentation/topics/generated/testEmailConfig.topic new file mode 100644 index 00000000..64065c9c --- /dev/null +++ b/documentation/topics/generated/testEmailConfig.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /email/config/test + + +

Operation ID: testEmailConfig

+

Test email config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200Email configuration test completedapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigTestResponse" +} + +
+
diff --git a/documentation/topics/generated/toggleVehicleAddon.topic b/documentation/topics/generated/toggleVehicleAddon.topic new file mode 100644 index 00000000..982c23f0 --- /dev/null +++ b/documentation/topics/generated/toggleVehicleAddon.topic @@ -0,0 +1,68 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /vehicles/addons/toggle + + +

Operation ID: toggleVehicleAddon

+

Enable or disable a vehicle addon for a vehicle. + +Permissions: +- Own scope: `toggle_vehicle_addon_own` (linked to subuser node `VEHICLES_EDIT`). +- Broader scope: `toggle_vehicle_addon_other`. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
noobject
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "addon_id": { + "type": "integer" + }, + "vehicle_id": { + "type": "integer" + } + }, + "required": [ + "vehicle_id", + "addon_id" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Vehicle addon toggled successfullyapplication/json
403
404
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/updateBackupsConfig.topic b/documentation/topics/generated/updateBackupsConfig.topic new file mode 100644 index 00000000..2cd320ed --- /dev/null +++ b/documentation/topics/generated/updateBackupsConfig.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /backups/config + + +

Operation ID: updateBackupsConfig

+

Update backups config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200Backups configuration updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} + +
+
diff --git a/documentation/topics/generated/updateBirdConfig.topic b/documentation/topics/generated/updateBirdConfig.topic new file mode 100644 index 00000000..816ac0b2 --- /dev/null +++ b/documentation/topics/generated/updateBirdConfig.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /bird/config + + +

Operation ID: updateBirdConfig

+

Update Bird config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200Bird configuration updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} + +
+
diff --git a/documentation/topics/generated/updateBooking.topic b/documentation/topics/generated/updateBooking.topic new file mode 100644 index 00000000..9de44726 --- /dev/null +++ b/documentation/topics/generated/updateBooking.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /bookings + + +

Operation ID: updateBooking

+

Update an existing booking

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/BookingUpdate" +} + +
+ + + + +
StatusDescriptionContent Types
200Booking updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/updateCategory.topic b/documentation/topics/generated/updateCategory.topic new file mode 100644 index 00000000..3a0e932c --- /dev/null +++ b/documentation/topics/generated/updateCategory.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /categories + + +

Operation ID: updateCategory

+

Update an existing category

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/CategoryUpdate" +} + +
+ + + + +
StatusDescriptionContent Types
200Category updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/updateCollectedInvoice.topic b/documentation/topics/generated/updateCollectedInvoice.topic new file mode 100644 index 00000000..80743c56 --- /dev/null +++ b/documentation/topics/generated/updateCollectedInvoice.topic @@ -0,0 +1,41 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /collected-invoices + + +

Operation ID: updateCollectedInvoice

+

Update a collected invoice

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200Collected invoice updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/updateDepartment.topic b/documentation/topics/generated/updateDepartment.topic new file mode 100644 index 00000000..9de3913e --- /dev/null +++ b/documentation/topics/generated/updateDepartment.topic @@ -0,0 +1,44 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /departments + + +

Operation ID: updateDepartment

+

Update an existing department

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/DepartmentUpdate" +} + +
+ + + + + +
StatusDescriptionContent Types
200Department updated successfullyapplication/json
400
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/updateDepartmentGate.topic b/documentation/topics/generated/updateDepartmentGate.topic new file mode 100644 index 00000000..ade7718b --- /dev/null +++ b/documentation/topics/generated/updateDepartmentGate.topic @@ -0,0 +1,46 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /department/gates + + +

Operation ID: updateDepartmentGate

+

Update department gate

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/DepartmentGateUpdate" +} + +
+ + + + + +
StatusDescriptionContent Types
200Department gate updated successfullyapplication/json
404
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/DepartmentGate" +} + +
+
diff --git a/documentation/topics/generated/updateDepartmentGoal.topic b/documentation/topics/generated/updateDepartmentGoal.topic new file mode 100644 index 00000000..42efe6b3 --- /dev/null +++ b/documentation/topics/generated/updateDepartmentGoal.topic @@ -0,0 +1,54 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /goals/department + + +

Operation ID: updateDepartmentGoal

+

Update an existing department goal by `id`. + +Access control: +- The creator (`created_by`) may update regardless of department membership. +- Otherwise the user must satisfy the same subset rule as for read access, and any new `departments` provided must also be a subset unless the user has `superuser`. +

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/DepartmentGoalUpdate" +} + +
+ + + + + + + + +
StatusDescriptionContent Types
200Department goal updated successfullyapplication/json
400
401
403
404
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/DepartmentGoal" +} + +
+
diff --git a/documentation/topics/generated/updateDepartmentLane.topic b/documentation/topics/generated/updateDepartmentLane.topic new file mode 100644 index 00000000..2e4e2c0c --- /dev/null +++ b/documentation/topics/generated/updateDepartmentLane.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /department/lanes + + +

Operation ID: updateDepartmentLane

+

Update an existing department lane

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/DepartmentLaneUpdate" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Department lane updated successfullyapplication/json
400
404
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/updateDepartmentRelay.topic b/documentation/topics/generated/updateDepartmentRelay.topic new file mode 100644 index 00000000..b75f722e --- /dev/null +++ b/documentation/topics/generated/updateDepartmentRelay.topic @@ -0,0 +1,46 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /department/relays + + +

Operation ID: updateDepartmentRelay

+

Update department relay

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/DepartmentRelayUpdate" +} + +
+ + + + + +
StatusDescriptionContent Types
200Department relay updated successfullyapplication/json
404
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/DepartmentRelay" +} + +
+
diff --git a/documentation/topics/generated/updateDepartmentSelfServeEnabled.topic b/documentation/topics/generated/updateDepartmentSelfServeEnabled.topic new file mode 100644 index 00000000..20b8c2fc --- /dev/null +++ b/documentation/topics/generated/updateDepartmentSelfServeEnabled.topic @@ -0,0 +1,49 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /departments/self-serve/enabled + + +

Operation ID: updateDepartmentSelfServeEnabled

+

Enable or disable self-serve for a specific department

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
idqueryyesintegerDepartment ID
enabledqueryyesstringEnabled status (true/false)
+
+ + + + + +
StatusDescriptionContent Types
200Status updated successfullyapplication/json
404
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "message": { + "type": "string" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/updateEconomicConfig.topic b/documentation/topics/generated/updateEconomicConfig.topic new file mode 100644 index 00000000..e372fe65 --- /dev/null +++ b/documentation/topics/generated/updateEconomicConfig.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /economic/config + + +

Operation ID: updateEconomicConfig

+

Update e-conomic config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200e-conomic configuration updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} + +
+
diff --git a/documentation/topics/generated/updateEmailConfig.topic b/documentation/topics/generated/updateEmailConfig.topic new file mode 100644 index 00000000..f5486a1b --- /dev/null +++ b/documentation/topics/generated/updateEmailConfig.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /email/config + + +

Operation ID: updateEmailConfig

+

Update email config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200Email configuration updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} + +
+
diff --git a/documentation/topics/generated/updateEntraConfig.topic b/documentation/topics/generated/updateEntraConfig.topic new file mode 100644 index 00000000..e46bf962 --- /dev/null +++ b/documentation/topics/generated/updateEntraConfig.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /entra/config + + +

Operation ID: updateEntraConfig

+

Update Entra config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200Entra configuration updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} + +
+
diff --git a/documentation/topics/generated/updateFxRatesApiConfig.topic b/documentation/topics/generated/updateFxRatesApiConfig.topic new file mode 100644 index 00000000..4396260a --- /dev/null +++ b/documentation/topics/generated/updateFxRatesApiConfig.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /fxratesapi/config + + +

Operation ID: updateFxRatesApiConfig

+

Update FXRatesAPI config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200FXRatesAPI configuration updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} + +
+
diff --git a/documentation/topics/generated/updateGatewayApiConfig.topic b/documentation/topics/generated/updateGatewayApiConfig.topic new file mode 100644 index 00000000..487d53d6 --- /dev/null +++ b/documentation/topics/generated/updateGatewayApiConfig.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /gatewayapi/config + + +

Operation ID: updateGatewayApiConfig

+

Update GatewayAPI config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200GatewayAPI configuration updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} + +
+
diff --git a/documentation/topics/generated/updateLicensePlateRecognizerConfig.topic b/documentation/topics/generated/updateLicensePlateRecognizerConfig.topic new file mode 100644 index 00000000..97613111 --- /dev/null +++ b/documentation/topics/generated/updateLicensePlateRecognizerConfig.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /licenseplaterecognizer/config + + +

Operation ID: updateLicensePlateRecognizerConfig

+

Update LicensePlateRecognizer config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200LicensePlateRecognizer configuration updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} + +
+
diff --git a/documentation/topics/generated/updateLimbleConfig.topic b/documentation/topics/generated/updateLimbleConfig.topic new file mode 100644 index 00000000..cfe9ccad --- /dev/null +++ b/documentation/topics/generated/updateLimbleConfig.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /limble/config + + +

Operation ID: updateLimbleConfig

+

Update Limble config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200Limble configuration updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} + +
+
diff --git a/documentation/topics/generated/updateMotorApiConfig.topic b/documentation/topics/generated/updateMotorApiConfig.topic new file mode 100644 index 00000000..cd258360 --- /dev/null +++ b/documentation/topics/generated/updateMotorApiConfig.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /motorapi/config + + +

Operation ID: updateMotorApiConfig

+

Update MotorAPI config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200MotorAPI configuration updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} + +
+
diff --git a/documentation/topics/generated/updateOcrSpaceConfig.topic b/documentation/topics/generated/updateOcrSpaceConfig.topic new file mode 100644 index 00000000..b3da1a1b --- /dev/null +++ b/documentation/topics/generated/updateOcrSpaceConfig.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /ocrspace/config + + +

Operation ID: updateOcrSpaceConfig

+

Update OcrSpace config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200OcrSpace configuration updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} + +
+
diff --git a/documentation/topics/generated/updateOpenAiConfig.topic b/documentation/topics/generated/updateOpenAiConfig.topic new file mode 100644 index 00000000..48cc2254 --- /dev/null +++ b/documentation/topics/generated/updateOpenAiConfig.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /openai/config + + +

Operation ID: updateOpenAiConfig

+

Update OpenAI config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200OpenAI configuration updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} + +
+
diff --git a/documentation/topics/generated/updateOrder.topic b/documentation/topics/generated/updateOrder.topic new file mode 100644 index 00000000..a6eb0cc7 --- /dev/null +++ b/documentation/topics/generated/updateOrder.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /order + + +

Operation ID: updateOrder

+

Update an existing order

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/OrderUpdate" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Order updated successfullyapplication/json
400
401
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/updateOrderItem.topic b/documentation/topics/generated/updateOrderItem.topic new file mode 100644 index 00000000..e16c73b9 --- /dev/null +++ b/documentation/topics/generated/updateOrderItem.topic @@ -0,0 +1,44 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /order/items + + +

Operation ID: updateOrderItem

+

Update an existing order item

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/OrderItemUpdate" +} + +
+ + + + + +
StatusDescriptionContent Types
200Order item updated successfullyapplication/json
400
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/updateOrders.topic b/documentation/topics/generated/updateOrders.topic new file mode 100644 index 00000000..cfdb0ccc --- /dev/null +++ b/documentation/topics/generated/updateOrders.topic @@ -0,0 +1,44 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /orders + + +

Operation ID: updateOrders

+

Update an existing order

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/OrderUpdate" +} + +
+ + + + + +
StatusDescriptionContent Types
200Order updated successfullyapplication/json
400
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/updatePlateScanner.topic b/documentation/topics/generated/updatePlateScanner.topic new file mode 100644 index 00000000..d657599f --- /dev/null +++ b/documentation/topics/generated/updatePlateScanner.topic @@ -0,0 +1,63 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /numberplatescanners + + +

Operation ID: updatePlateScanner

+

Update plate scanner

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "department_id": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "notes": { + "type": "string" + } + }, + "required": [ + "id", + "department_id", + "name", + "notes" + ], + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Plate scanner updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/updateProduct.topic b/documentation/topics/generated/updateProduct.topic new file mode 100644 index 00000000..96008a94 --- /dev/null +++ b/documentation/topics/generated/updateProduct.topic @@ -0,0 +1,44 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /products + + +

Operation ID: updateProduct

+

Update an existing product

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/ProductUpdate" +} + +
+ + + + + +
StatusDescriptionContent Types
200Product updated successfullyapplication/json
400
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/updateRecaptchaConfig.topic b/documentation/topics/generated/updateRecaptchaConfig.topic new file mode 100644 index 00000000..84f42f4b --- /dev/null +++ b/documentation/topics/generated/updateRecaptchaConfig.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /reCAPTCHA/config + + +

Operation ID: updateRecaptchaConfig

+

Update reCAPTCHA config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200reCAPTCHA configuration updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} + +
+
diff --git a/documentation/topics/generated/updateSelfServeConfig.topic b/documentation/topics/generated/updateSelfServeConfig.topic new file mode 100644 index 00000000..fb06441b --- /dev/null +++ b/documentation/topics/generated/updateSelfServeConfig.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /selfserve/config + + +

Operation ID: updateSelfServeConfig

+

Update Self-Serve config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/SelfServeConfig" +} + +
+ + + + +
StatusDescriptionContent Types
200Self-serve configuration updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} + +
+
diff --git a/documentation/topics/generated/updateSelfserveCondition.topic b/documentation/topics/generated/updateSelfserveCondition.topic new file mode 100644 index 00000000..9e46b30f --- /dev/null +++ b/documentation/topics/generated/updateSelfserveCondition.topic @@ -0,0 +1,79 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /department/selfserve/conditions + + +

Operation ID: updateSelfserveCondition

+

Update an existing self-serve condition.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesintegerCondition ID
+
+ +

Required: no.

+

Content type: application/json

+ +{ + "properties": { + "condition_id": { + "nullable": true, + "type": "integer" + }, + "department": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "lane": { + "type": "integer" + }, + "machine_type_id": { + "nullable": true, + "type": "integer" + }, + "name": { + "type": "string" + }, + "product": { + "type": "integer" + } + }, + "type": "object" +} + +
+ + + + + + + +
StatusDescriptionContent Types
200Successfully updated conditionapplication/json
400
404
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/DepartmentSelfserveCondition" +} + +
+
diff --git a/documentation/topics/generated/updateSelfserveConditionRule.topic b/documentation/topics/generated/updateSelfserveConditionRule.topic new file mode 100644 index 00000000..a3ee753c --- /dev/null +++ b/documentation/topics/generated/updateSelfserveConditionRule.topic @@ -0,0 +1,74 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /department/selfserve/condition/rules + + +

Operation ID: updateSelfserveConditionRule

+

Update an existing self-serve condition rule.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesintegerRule ID
+
+ +

Required: no.

+

Content type: application/json

+ +{ + "properties": { + "condition_id": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "object_id": { + "type": "integer" + }, + "object_type": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" +} + +
+ + + + + + + +
StatusDescriptionContent Types
200Successfully updated condition ruleapplication/json
400
404
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/DepartmentSelfserveConditionRule" +} + +
+
diff --git a/documentation/topics/generated/updateSelfserveMachineType.topic b/documentation/topics/generated/updateSelfserveMachineType.topic new file mode 100644 index 00000000..e560c05e --- /dev/null +++ b/documentation/topics/generated/updateSelfserveMachineType.topic @@ -0,0 +1,61 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /department/selfserve/machine-types + + +

Operation ID: updateSelfserveMachineType

+

Update reusable self-serve machine type

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesinteger
+
+ +

Required: no.

+

Content type: application/json

+ +{ + "properties": { + "description": { + "nullable": true, + "type": "string" + }, + "name": { + "type": "string" + } + }, + "type": "object" +} + +
+ + + + + +
StatusDescriptionContent Types
200Successfully updated machine typeapplication/json
404
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/SelfserveMachineType" +} + +
+
diff --git a/documentation/topics/generated/updateSelfserveQuestion.topic b/documentation/topics/generated/updateSelfserveQuestion.topic new file mode 100644 index 00000000..08f3db6b --- /dev/null +++ b/documentation/topics/generated/updateSelfserveQuestion.topic @@ -0,0 +1,77 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /department/selfserve/questions + + +

Operation ID: updateSelfserveQuestion

+

Update an existing self-serve question.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesintegerQuestion ID
+
+ +

Required: no.

+

Content type: application/json

+ +{ + "properties": { + "condition_id": { + "nullable": true, + "type": "integer" + }, + "department": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "lane": { + "type": "integer" + }, + "order_priority": { + "type": "integer" + }, + "product": { + "type": "integer" + }, + "question": { + "type": "string" + } + }, + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Successfully updated questionapplication/json
400
404
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/DepartmentSelfserveQuestion" +} + +
+
diff --git a/documentation/topics/generated/updateSelfserveTask.topic b/documentation/topics/generated/updateSelfserveTask.topic new file mode 100644 index 00000000..00e2e388 --- /dev/null +++ b/documentation/topics/generated/updateSelfserveTask.topic @@ -0,0 +1,102 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /department/selfserve/tasks + + +

Operation ID: updateSelfserveTask

+

Update an existing self-serve task.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesintegerTask ID
+
+ +

Required: no.

+

Content type: application/json

+ +{ + "properties": { + "buttons": { + "description": "Button IDs enabled by this task. Set to null to clear all buttons.", + "items": { + "type": "integer" + }, + "nullable": true, + "type": "array" + }, + "condition_id": { + "nullable": true, + "type": "integer" + }, + "department": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "dynamic_images_vehicle_type": { + "description": "Vehicle type selection override. Set to null to clear.", + "nullable": true, + "type": "integer" + }, + "lane": { + "type": "integer" + }, + "machine_type_id": { + "nullable": true, + "type": "integer" + }, + "order_priority": { + "type": "integer" + }, + "product": { + "type": "integer" + }, + "services": { + "description": "Services enabled by this task. Set to null to clear all services.", + "items": { + "$ref": "#/components/schemas/SelfserveLaneService" + }, + "nullable": true, + "type": "array" + }, + "task": { + "type": "string" + } + }, + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Successfully updated taskapplication/json
400
404
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/DepartmentSelfserveTask" +} + +
+
diff --git a/documentation/topics/generated/updateSelfserveVehicleCondition.topic b/documentation/topics/generated/updateSelfserveVehicleCondition.topic new file mode 100644 index 00000000..d5e80962 --- /dev/null +++ b/documentation/topics/generated/updateSelfserveVehicleCondition.topic @@ -0,0 +1,75 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /department/selfserve/vehicle/conditions + + +

Operation ID: updateSelfserveVehicleCondition

+

Update an existing vehicle condition. Customers can only update conditions for their own vehicles.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idqueryyesintegerCondition ID
+
+ +

Required: no.

+

Content type: application/json

+ +{ + "properties": { + "customer_id": { + "nullable": true, + "type": "integer" + }, + "department": { + "type": "integer" + }, + "lane": { + "type": "integer" + }, + "question": { + "type": "integer" + }, + "reg": { + "type": "string" + }, + "value": { + "type": "boolean" + } + }, + "type": "object" +} + +
+ + + + + + + +
StatusDescriptionContent Types
200Successfully updated vehicle conditionapplication/json
400
404
500
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/DepartmentSelfserveVehicleConditionMutationResponse" +} + +
+
diff --git a/documentation/topics/generated/updateShellyConfig.topic b/documentation/topics/generated/updateShellyConfig.topic new file mode 100644 index 00000000..e20ba94b --- /dev/null +++ b/documentation/topics/generated/updateShellyConfig.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /shelly/config + + +

Operation ID: updateShellyConfig

+

Update Shelly config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200Shelly configuration updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} + +
+
diff --git a/documentation/topics/generated/updateStripeConfig.topic b/documentation/topics/generated/updateStripeConfig.topic new file mode 100644 index 00000000..84bf336c --- /dev/null +++ b/documentation/topics/generated/updateStripeConfig.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /stripe/config + + +

Operation ID: updateStripeConfig

+

Update Stripe config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200Stripe configuration updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} + +
+
diff --git a/documentation/topics/generated/updateSubuserGrant.topic b/documentation/topics/generated/updateSubuserGrant.topic new file mode 100644 index 00000000..e15ed304 --- /dev/null +++ b/documentation/topics/generated/updateSubuserGrant.topic @@ -0,0 +1,60 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PATCH /subusers/grants/{id} + + +

Operation ID: updateSubuserGrant

+

Update subuser grant

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
idpathyesinteger
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/SubuserGrantUpdateRequest" +} + +
+ + + + + + + + +
StatusDescriptionContent Types
200Grant updatedapplication/json
400
401
404
500
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "grant": { + "$ref": "#/components/schemas/SubuserGrant" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/updateUser.topic b/documentation/topics/generated/updateUser.topic new file mode 100644 index 00000000..eb81c52e --- /dev/null +++ b/documentation/topics/generated/updateUser.topic @@ -0,0 +1,45 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /users + + +

Operation ID: updateUser

+

Update an existing user

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "$ref": "#/components/schemas/UserUpdate" +} + +
+ + + + + + +
StatusDescriptionContent Types
200User updated successfullyapplication/json
400
401
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/updateUserNotifications.topic b/documentation/topics/generated/updateUserNotifications.topic new file mode 100644 index 00000000..eace59ee --- /dev/null +++ b/documentation/topics/generated/updateUserNotifications.topic @@ -0,0 +1,54 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + PUT /account/notifications + + +

Operation ID: updateUserNotifications

+

Update user notification settings

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "email_notifications_enabled": { + "type": "boolean" + }, + "sms_notifications_enabled": { + "type": "boolean" + }, + "wash_certificate_email": { + "type": "string" + } + }, + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
200Successapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/updateVirkdataConfig.topic b/documentation/topics/generated/updateVirkdataConfig.topic new file mode 100644 index 00000000..bc51b099 --- /dev/null +++ b/documentation/topics/generated/updateVirkdataConfig.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /virkdata/config + + +

Operation ID: updateVirkdataConfig

+

Update Virkdata config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200Virkdata configuration updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} + +
+
diff --git a/documentation/topics/generated/updateWeatherApiConfig.topic b/documentation/topics/generated/updateWeatherApiConfig.topic new file mode 100644 index 00000000..cff5109a --- /dev/null +++ b/documentation/topics/generated/updateWeatherApiConfig.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /weatherapi/config + + +

Operation ID: updateWeatherApiConfig

+

Update WeatherAPI config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200WeatherAPI configuration updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} + +
+
diff --git a/documentation/topics/generated/updateWorkerVersion.topic b/documentation/topics/generated/updateWorkerVersion.topic new file mode 100644 index 00000000..ba8afc67 --- /dev/null +++ b/documentation/topics/generated/updateWorkerVersion.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /worker/update-version + + +

Operation ID: updateWorkerVersion

+

Set the target version for the worker update

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
versionqueryyesstring
+
+ + + + +
StatusDescriptionContent Types
200Version update target set successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/updateXlvaskConfig.topic b/documentation/topics/generated/updateXlvaskConfig.topic new file mode 100644 index 00000000..acbafd4f --- /dev/null +++ b/documentation/topics/generated/updateXlvaskConfig.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /xlvask/config + + +

Operation ID: updateXlvaskConfig

+

Update XLVask config

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: no.

+

Content type: application/json

+ +{} + +
+ + + + +
StatusDescriptionContent Types
200XLVask configuration updated successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/ModuleConfigUpdateResponse" +} + +
+
diff --git a/documentation/topics/generated/uploadAttachment.topic b/documentation/topics/generated/uploadAttachment.topic new file mode 100644 index 00000000..e4b1b5ec --- /dev/null +++ b/documentation/topics/generated/uploadAttachment.topic @@ -0,0 +1,50 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /attachments/upload + + +

Operation ID: uploadAttachment

+

Upload a file attachment

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: multipart/form-data

+ +{ + "properties": { + "file": { + "format": "binary", + "type": "string" + } + }, + "type": "object" +} + +
+ + + + + +
StatusDescriptionContent Types
201Attachment uploaded successfullyapplication/json
400
+

Schema for response 201 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/uploadOrderAttachment.topic b/documentation/topics/generated/uploadOrderAttachment.topic new file mode 100644 index 00000000..50b2a2ff --- /dev/null +++ b/documentation/topics/generated/uploadOrderAttachment.topic @@ -0,0 +1,52 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /orders/attachments/upload + + +

Operation ID: uploadOrderAttachment

+

Upload an attachment to an order

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: multipart/form-data

+ +{ + "properties": { + "file": { + "format": "binary", + "type": "string" + }, + "order_id": { + "type": "integer" + } + }, + "type": "object" +} + +
+ + + + +
StatusDescriptionContent Types
201Order attachment uploaded successfullyapplication/json
+

Schema for response 201 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/uploadSelfserveTaskAttachment.topic b/documentation/topics/generated/uploadSelfserveTaskAttachment.topic new file mode 100644 index 00000000..ee777214 --- /dev/null +++ b/documentation/topics/generated/uploadSelfserveTaskAttachment.topic @@ -0,0 +1,64 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /department/selfserve/tasks/attachments/upload + + +

Operation ID: uploadSelfserveTaskAttachment

+

Upload a new attachment to a specific self-serve task using base64 encoding.

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "base64_file": { + "description": "Base64 encoded file content", + "type": "string" + }, + "file_name": { + "description": "Name of the file including extension", + "type": "string" + }, + "task_id": { + "type": "integer" + } + }, + "required": [ + "task_id", + "base64_file", + "file_name" + ], + "type": "object" +} + +
+ + + + + + + +
StatusDescriptionContent Types
200Attachment uploaded successfullyapplication/json
400
404
500
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/validateCustomerNumber.topic b/documentation/topics/generated/validateCustomerNumber.topic new file mode 100644 index 00000000..a825baf8 --- /dev/null +++ b/documentation/topics/generated/validateCustomerNumber.topic @@ -0,0 +1,46 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /guest/validation/customer-number + + +

Operation ID: validateCustomerNumber

+

Check if a customer number is valid and exists

+
+

No authentication required.

+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "customer_number": { + "type": "integer" + } + }, + "required": [ + "customer_number" + ], + "type": "object" +} + +
+ + + + + +
StatusDescriptionContent Types
200Customer number validation successfulapplication/json
400
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/validatePasswordResetToken.topic b/documentation/topics/generated/validatePasswordResetToken.topic new file mode 100644 index 00000000..90db1ee0 --- /dev/null +++ b/documentation/topics/generated/validatePasswordResetToken.topic @@ -0,0 +1,51 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /auth/password-reset/validate + + +

Operation ID: validatePasswordResetToken

+

Check if a password reset token is valid and hasn't expired

+
+

No authentication required.

+ + + + +
NameInRequiredTypeDescription
tokenqueryyesstringThe password reset token
+
+ + + + + +
StatusDescriptionContent Types
200Token is validapplication/json
404Invalid or expired tokenapplication/json
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "customer_id": { + "type": "integer" + }, + "valid": { + "type": "boolean" + } + }, + "type": "object" +} + +

Schema for response 404 (application/json):

+ +{ + "$ref": "#/components/schemas/Error" +} + +
+
diff --git a/documentation/topics/generated/validateSubuserSetupToken.topic b/documentation/topics/generated/validateSubuserSetupToken.topic new file mode 100644 index 00000000..20186b97 --- /dev/null +++ b/documentation/topics/generated/validateSubuserSetupToken.topic @@ -0,0 +1,48 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /subusers/setup + + +

Operation ID: validateSubuserSetupToken

+

Validates a subuser setup token generated during registration.

+
+

No authentication required.

+ + + + +
NameInRequiredTypeDescription
tokenqueryyesstringOne-time setup token received via SMS
+
+ + + + + + +
StatusDescriptionContent Types
200Token is validapplication/json
400
500
+

Schema for response 200 (application/json):

+ +{ + "properties": { + "message": { + "example": "Token is valid", + "type": "string" + }, + "subuser_id": { + "example": 42, + "type": "integer" + } + }, + "type": "object" +} + +
+
diff --git a/documentation/topics/generated/verify2fa.topic b/documentation/topics/generated/verify2fa.topic new file mode 100644 index 00000000..084ea531 --- /dev/null +++ b/documentation/topics/generated/verify2fa.topic @@ -0,0 +1,86 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + POST /auth/2fa/verify + + +

Operation ID: verify2fa

+

Complete the login process by verifying the 2FA code

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ +

Required: yes.

+

Content type: application/json

+ +{ + "properties": { + "2fa_token": { + "description": "The temporary 2FA verification token", + "type": "string" + }, + "code": { + "description": "The 6-digit TOTP code", + "type": "string" + } + }, + "required": [ + "2fa_token", + "code" + ], + "type": "object" +} + +
+ + + + + + +
StatusDescriptionContent Types
200Login successfulapplication/json
400
401
+

Schema for response 200 (application/json):

+ +{ + "oneOf": [ + { + "properties": { + "token": { + "description": "Bearer authentication token (for users/employees)", + "type": "string" + } + }, + "required": [ + "token" + ], + "type": "object" + }, + { + "properties": { + "session": { + "description": "Session token (for subusers)", + "type": "string" + } + }, + "required": [ + "session" + ], + "type": "object" + } + ] +} + +
+
diff --git a/documentation/topics/generated/virkdataSearch.topic b/documentation/topics/generated/virkdataSearch.topic new file mode 100644 index 00000000..c3a914eb --- /dev/null +++ b/documentation/topics/generated/virkdataSearch.topic @@ -0,0 +1,40 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/virkdata/search + + +

Operation ID: virkdataSearch

+

Search for company information in VirkData

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
searchqueryyesstring
+
+ + + + +
StatusDescriptionContent Types
200Company information retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{} + +
+
diff --git a/documentation/topics/generated/weatherApiCurrent.topic b/documentation/topics/generated/weatherApiCurrent.topic new file mode 100644 index 00000000..1229f42b --- /dev/null +++ b/documentation/topics/generated/weatherApiCurrent.topic @@ -0,0 +1,42 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/weatherapi/current + + +

Operation ID: weatherApiCurrent

+

Get current weather data from WeatherAPI for a location query

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
qqueryyesstringLocation query (e.g. city, postal code, or latitude,longitude)
+
+ + + + +
StatusDescriptionContent Types
200Current weather retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/WeatherApiObjectResponse" +} + +
+
diff --git a/documentation/topics/generated/weatherApiForecast.topic b/documentation/topics/generated/weatherApiForecast.topic new file mode 100644 index 00000000..4aadd8ce --- /dev/null +++ b/documentation/topics/generated/weatherApiForecast.topic @@ -0,0 +1,43 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/weatherapi/forecast + + +

Operation ID: weatherApiForecast

+

Get forecast weather data from WeatherAPI

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + + +
NameInRequiredTypeDescription
qqueryyesstringLocation query (e.g. city, postal code, or latitude,longitude)
daysquerynointegerNumber of forecast days
+
+ + + + +
StatusDescriptionContent Types
200Forecast weather retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/WeatherApiObjectResponse" +} + +
+
diff --git a/documentation/topics/generated/weatherApiSearch.topic b/documentation/topics/generated/weatherApiSearch.topic new file mode 100644 index 00000000..18eee5cd --- /dev/null +++ b/documentation/topics/generated/weatherApiSearch.topic @@ -0,0 +1,42 @@ + + + + + +

This endpoint documentation is generated directly from openapi.yaml.

+ + GET /modules/weatherapi/search + + +

Operation ID: weatherApiSearch

+

Search location suggestions from WeatherAPI

+
+ +

Security requirements:

+ + + +
SchemeScopes
BearerAuth-
+
+ + + + +
NameInRequiredTypeDescription
qqueryyesstringSearch text
+
+ + + + +
StatusDescriptionContent Types
200Location search results retrieved successfullyapplication/json
+

Schema for response 200 (application/json):

+ +{ + "$ref": "#/components/schemas/WeatherApiObjectResponse" +} + +
+
diff --git a/openapi.yaml b/openapi.yaml index 43b8637c..4c57ea96 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -36,6 +36,8 @@ security: tags: - name: Authentication description: User and employee authentication endpoints + - name: Security + description: Account security and passkey management endpoints - name: Users description: User management and customer operations - name: Search @@ -8192,7 +8194,7 @@ paths: get: tags: [Config] summary: Get reCAPTCHA config - operationId: getRecaptchaConfig + operationId: getRecaptchaModuleConfig responses: '200': description: reCAPTCHA configuration retrieved successfully diff --git a/scripts/generate_writerside_openapi_docs.py b/scripts/generate_writerside_openapi_docs.py new file mode 100644 index 00000000..01795bbf --- /dev/null +++ b/scripts/generate_writerside_openapi_docs.py @@ -0,0 +1,839 @@ +#!/usr/bin/env python3 +import argparse +import hashlib +import html +import json +import re +import sys +from dataclasses import dataclass +from pathlib import Path +from typing import Dict, List, Tuple + +import yaml + + +HTTP_METHODS = ["get", "post", "put", "patch", "delete", "options", "head", "trace"] +AUTOGEN_NOTE = "AUTO-GENERATED, DO NOT EDIT" +TOC_START_MARKER = "" +TOC_END_MARKER = "" +OPS_PER_PAGE = 20 +MODULE_DESCRIPTIONS: Dict[str, Tuple[str, str]] = { + "action-logs": ("Action Logs", "Audit and operational logs for integration module activity."), + "backup": ("Backup", "Backup integrations and backup module orchestration."), + "cvr": ("CVR", "Danish company registry (CVR) lookup and search integration."), + "economic": ("e-conomic", "Accounting and invoicing integration with e-conomic."), + "entra": ("Entra", "Microsoft Entra directory integration endpoints."), + "fxratesapi": ("FXRatesAPI", "Currency exchange-rate lookup integration."), + "motorapi": ("MotorAPI", "Vehicle lookup integration via MotorAPI."), + "self-serve": ("Self-Serve", "Self-serve lane control and machine command endpoints."), + "stripe": ("Stripe", "Stripe payments, invoices, terminals, products, and customers."), + "virkdata": ("VirkData", "VirkData company information integration."), + "washcertificates": ("Wash Certificates", "Wash certificate retrieval and listing integration."), + "weatherapi": ("WeatherAPI", "Weather provider integration for current, forecast, and search."), + "xlvask": ("XLVask", "XLVask synchronization, usage logs, vehicles, and customers."), +} +CONFIG_DESCRIPTIONS: Dict[str, Tuple[str, str]] = { + "backups": ("Backups", "Backup configuration for backup module behavior."), + "bird": ("Bird", "Bird communication integration configuration."), + "economic": ("e-conomic", "e-conomic accounting integration configuration."), + "email": ("Email", "Email provider and SMTP/MailerSend configuration."), + "entra": ("Entra", "Microsoft Entra identity integration configuration."), + "fxratesapi": ("FXRatesAPI", "FXRatesAPI exchange-rate integration configuration."), + "gatewayapi": ("GatewayAPI", "GatewayAPI integration configuration."), + "licenseplaterecognizer": ("LicensePlateRecognizer", "License plate recognizer integration configuration."), + "limble": ("Limble", "Limble integration configuration."), + "motorapi": ("MotorAPI", "MotorAPI vehicle lookup integration configuration."), + "ocrspace": ("OcrSpace", "OCR Space integration configuration."), + "openai": ("OpenAI", "OpenAI integration configuration."), + "reCAPTCHA": ("reCAPTCHA", "reCAPTCHA protection configuration."), + "selfserve": ("Self-Serve", "Self-serve module runtime configuration."), + "shelly": ("Shelly", "Shelly integration configuration."), + "stripe": ("Stripe", "Stripe integration configuration."), + "virkdata": ("VirkData", "VirkData integration configuration."), + "weatherapi": ("WeatherAPI", "WeatherAPI integration configuration."), + "xlvask": ("XLVask", "XLVask integration configuration."), +} + + +@dataclass(frozen=True) +class Operation: + method: str + path: str + title: str + topic_id: str + topic_file: str + primary_tag: str + operation_id: str + description: str + parameters: List[dict] + request_body: dict + responses: dict + security: List[dict] + module_key: str + module_name: str + module_description: str + config_key: str + config_name: str + config_description: str + + +def slugify(value: str) -> str: + slug = re.sub(r"[^A-Za-z0-9_]+", "_", value.strip()) + slug = re.sub(r"_+", "_", slug).strip("_") + if not slug: + slug = "unnamed" + if not re.match(r"^[A-Za-z_]", slug): + slug = f"id_{slug}" + return slug + + +def safe_token(value: str) -> str: + return slugify(value).lower() + + +def build_operation_topic_id(operation_id: str, method: str, path: str) -> str: + base = slugify(operation_id) + if len(base) > 110: + digest = hashlib.sha1(f"{method}:{path}:{operation_id}".encode("utf-8")).hexdigest()[:8] + base = f"{base[:100]}_{digest}" + return base + + +def schema_type_name(schema: dict) -> str: + if not isinstance(schema, dict): + return "unknown" + if "$ref" in schema: + ref = str(schema["$ref"]) + return ref.rsplit("/", 1)[-1] + if "type" in schema: + t = str(schema["type"]) + if t == "array" and isinstance(schema.get("items"), dict): + return f"array<{schema_type_name(schema['items'])}>" + return t + if "oneOf" in schema: + return "oneOf" + if "anyOf" in schema: + return "anyOf" + if "allOf" in schema: + return "allOf" + return "object" + + +def xml_escape(value: str) -> str: + return html.escape(value or "", quote=True) + + +def pretty_json(value: dict) -> str: + return html.escape(json.dumps(value, indent=2, ensure_ascii=False, sort_keys=True)) + + +def render_parameters_table(parameters: List[dict]) -> str: + if not parameters: + return "" + rows = [ + " ", + " ", + " ", + ] + for param in parameters: + name = xml_escape(str(param.get("name", ""))) + loc = xml_escape(str(param.get("in", ""))) + required = "yes" if param.get("required") else "no" + ptype = xml_escape(schema_type_name(param.get("schema", {}))) + desc = xml_escape(str(param.get("description", ""))) + rows.append( + f" " + ) + rows.append("
NameInRequiredTypeDescription
{name}{loc}{required}{ptype}{desc}
") + rows.append("
") + return "\n".join(rows) + "\n" + + +def render_request_body(request_body: dict) -> str: + if not isinstance(request_body, dict) or not request_body: + return "" + lines = [" "] + lines.append(f"

Required: {'yes' if request_body.get('required') else 'no'}.

") + content = request_body.get("content", {}) + if isinstance(content, dict) and content: + for content_type, media in content.items(): + lines.append(f"

Content type: {xml_escape(str(content_type))}

") + schema = media.get("schema") if isinstance(media, dict) else None + if isinstance(schema, dict): + lines.append(" ") + lines.append(pretty_json(schema)) + lines.append(" ") + lines.append("
") + return "\n".join(lines) + "\n" + + +def render_responses(responses: dict) -> str: + if not isinstance(responses, dict) or not responses: + return "" + lines = [ + " ", + " ", + " ", + ] + for status_code, response in responses.items(): + if not isinstance(response, dict): + continue + description = xml_escape(str(response.get("description", ""))) + content = response.get("content", {}) + if isinstance(content, dict): + content_types = ", ".join(sorted(str(k) for k in content.keys())) + else: + content_types = "" + lines.append( + f" " + ) + lines.append("
StatusDescriptionContent Types
{xml_escape(str(status_code))}{description}{xml_escape(content_types)}
") + + for status_code, response in responses.items(): + if not isinstance(response, dict): + continue + content = response.get("content", {}) + if not isinstance(content, dict): + continue + for content_type, media in content.items(): + schema = media.get("schema") if isinstance(media, dict) else None + if not isinstance(schema, dict): + continue + lines.append( + f"

Schema for response {xml_escape(str(status_code))} ({xml_escape(str(content_type))}):

" + ) + lines.append(" ") + lines.append(pretty_json(schema)) + lines.append(" ") + lines.append("
") + return "\n".join(lines) + "\n" + + +def render_security(security: List[dict]) -> str: + if not security: + return "

No authentication required.

\n" + lines = [ + " ", + "

Security requirements:

", + " ", + " ", + ] + for req in security: + if not isinstance(req, dict): + continue + for scheme, scopes in req.items(): + if isinstance(scopes, list): + scope_text = ", ".join(str(s) for s in scopes) if scopes else "-" + else: + scope_text = "-" + lines.append( + f" " + ) + lines.extend(["
SchemeScopes
{xml_escape(str(scheme))}{xml_escape(scope_text)}
", "
"]) + return "\n".join(lines) + "\n" + + +def render_operation_topic(operation: Operation) -> str: + title = html.escape(operation.title, quote=True) + endpoint = xml_escape(operation.path) + method = operation.method.upper() + topic_id = html.escape(operation.topic_id, quote=True) + description = xml_escape(operation.description) + operation_id = xml_escape(operation.operation_id) + + parameter_block = render_parameters_table(operation.parameters) + request_block = render_request_body(operation.request_body) + response_block = render_responses(operation.responses) + security_block = render_security(operation.security) + + return ( + '\n' + '\n' + '\n' + f"\n \n" + "

This endpoint documentation is generated directly from openapi.yaml.

\n" + " \n" + f" {method} {endpoint}\n" + " \n" + " \n" + f"

Operation ID: {operation_id}

\n" + f"

{description}

\n" + "
\n" + f"{security_block}" + f"{parameter_block}" + f"{request_block}" + f"{response_block}" + "
\n" + ) + + +def render_tag_topic(tag: str, topic_id: str) -> str: + title = html.escape(tag, quote=True) + safe_id = html.escape(topic_id, quote=True) + return ( + '\n' + '\n' + '\n' + f"\n \n" + "

Endpoints in this section are generated from openapi.yaml.

\n" + "
\n" + ) + + +def render_tag_page_topic(tag: str, topic_id: str, page_number: int, total_pages: int) -> str: + title = html.escape(f"{tag} - Page {page_number} of {total_pages}", quote=True) + safe_id = html.escape(topic_id, quote=True) + return ( + '\n' + '\n' + '\n' + f"\n \n" + "

This page groups endpoint topics for this object type.

\n" + "
\n" + ) + + +def render_module_topic(module_name: str, module_description: str, topic_id: str) -> str: + title = html.escape(module_name, quote=True) + safe_id = html.escape(topic_id, quote=True) + description = xml_escape(module_description) + return ( + '\n' + '\n' + '\n' + f"\n \n" + f"

{description}

\n" + "
\n" + ) + + +def render_modules_index_topic(topic_id: str, modules: List[Tuple[str, str]]) -> str: + safe_id = html.escape(topic_id, quote=True) + rows = [ + '', + "', + '', + "", + f" ", + "

Module integrations sorted by module name.

", + " ", + " ", + " ", + ] + for module_name, module_description in modules: + rows.append( + f" " + ) + rows.extend(["
ModuleDescription
{xml_escape(module_name)}{xml_escape(module_description)}
", "
", "
", ""]) + return "\n".join(rows) + + +def render_config_index_topic(topic_id: str, modules: List[Tuple[str, str]]) -> str: + safe_id = html.escape(topic_id, quote=True) + rows = [ + '', + "', + '', + "", + f" ", + "

Configuration endpoints grouped by module name.

", + " ", + " ", + " ", + ] + for module_name, module_description in modules: + rows.append( + f" " + ) + rows.extend(["
ModuleDescription
{xml_escape(module_name)}{xml_escape(module_description)}
", "
", "
", ""]) + return "\n".join(rows) + + +def infer_module(path: str) -> Tuple[str, str, str]: + segments = [segment for segment in path.split("/") if segment] + module_key = "misc" + if segments: + if segments[0] == "modules" and len(segments) > 1: + module_key = segments[1] + elif segments[0] in {"economic", "cvr"}: + module_key = segments[0] + + if module_key in MODULE_DESCRIPTIONS: + module_name, module_description = MODULE_DESCRIPTIONS[module_key] + else: + module_name = module_key.replace("-", " ").title() + module_description = "Integration module endpoints." + return module_key, module_name, module_description + + +def infer_config_module(path: str) -> Tuple[str, str, str]: + segments = [segment for segment in path.split("/") if segment] + config_key = segments[0] if segments else "misc" + if config_key in CONFIG_DESCRIPTIONS: + config_name, config_description = CONFIG_DESCRIPTIONS[config_key] + else: + config_name = config_key.replace("-", " ").title() + config_description = "Configuration endpoints for this module." + return config_key, config_name, config_description + + +def render_api_reference_topic() -> str: + return ( + '\n' + '\n' + '\n' + f"\n \n" + "

Comprehensive API reference generated from the repository root openapi.yaml.

\n" + "
\n" + ) + + +def write_if_changed(path: Path, content: str) -> bool: + if path.exists() and path.read_text(encoding="utf-8") == content: + return False + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(content, encoding="utf-8") + return True + + +def parse_openapi(openapi_path: Path) -> Tuple[List[str], List[Operation], Dict[str, List[Operation]]]: + doc = yaml.safe_load(openapi_path.read_text(encoding="utf-8")) + global_security = doc.get("security", []) + tags_section = doc.get("tags", []) + declared_tags = [] + for tag_item in tags_section: + if isinstance(tag_item, dict) and isinstance(tag_item.get("name"), str): + declared_tags.append(tag_item["name"]) + + declared_tag_set = set(declared_tags) + paths = doc.get("paths", {}) + if not isinstance(paths, dict): + raise ValueError("Invalid OpenAPI: top-level 'paths' must be an object.") + + operations: List[Operation] = [] + grouped: Dict[str, List[Operation]] = {} + seen_topic_ids: Dict[str, str] = {} + unknown_tags: List[str] = [] + + for api_path, path_item in paths.items(): + if not isinstance(path_item, dict): + continue + path_parameters = path_item.get("parameters", []) + for method in HTTP_METHODS: + operation = path_item.get(method) + if not isinstance(operation, dict): + continue + + operation_tags = operation.get("tags") + if isinstance(operation_tags, list) and operation_tags: + tags = [str(tag) for tag in operation_tags] + else: + tags = ["Misc"] + + for tag in tags: + if tag != "Misc" and tag not in declared_tag_set: + unknown_tags.append(f"{method.upper()} {api_path} => '{tag}'") + + primary_tag = tags[0] + operation_id = operation.get("operationId") + if not isinstance(operation_id, str) or not operation_id.strip(): + operation_id = f"{method}_{api_path}" + + summary = operation.get("summary") + if not isinstance(summary, str) or not summary.strip(): + summary = f"{method.upper()} {api_path}" + description = operation.get("description") + if not isinstance(description, str) or not description.strip(): + description = summary + + topic_id = build_operation_topic_id(operation_id, method, api_path) + existing = seen_topic_ids.get(topic_id) + operation_ref = f"{method.upper()} {api_path}" + if existing and existing != operation_ref: + raise ValueError( + f"Duplicate topic id '{topic_id}' generated for '{existing}' and '{operation_ref}'." + ) + seen_topic_ids[topic_id] = operation_ref + + topic_file = f"{topic_id}.topic" + operation_parameters = operation.get("parameters", []) + merged_parameters: List[dict] = [] + seen_params = set() + for param_source in [path_parameters, operation_parameters]: + if not isinstance(param_source, list): + continue + for param in param_source: + if not isinstance(param, dict): + continue + key = (str(param.get("in", "")), str(param.get("name", ""))) + if key in seen_params: + merged_parameters = [ + p + for p in merged_parameters + if (str(p.get("in", "")), str(p.get("name", ""))) != key + ] + seen_params.add(key) + merged_parameters.append(param) + + module_key, module_name, module_description = infer_module(api_path) + config_key, config_name, config_description = infer_config_module(api_path) + op = Operation( + method=method, + path=api_path, + title=summary, + topic_id=topic_id, + topic_file=topic_file, + primary_tag=primary_tag, + operation_id=operation_id, + description=description, + parameters=merged_parameters, + request_body=operation.get("requestBody", {}), + responses=operation.get("responses", {}), + security=operation.get("security", global_security), + module_key=module_key, + module_name=module_name, + module_description=module_description, + config_key=config_key, + config_name=config_name, + config_description=config_description, + ) + operations.append(op) + grouped.setdefault(primary_tag, []).append(op) + + if unknown_tags: + raise ValueError( + "Invalid tag mapping: operation tags not declared in top-level OpenAPI tags:\n" + + "\n".join(sorted(unknown_tags)) + ) + + for tag_ops in grouped.values(): + tag_ops.sort(key=lambda op: (op.path, op.method)) + + ordered_tags = [tag for tag in declared_tags if tag in grouped] + if "Misc" in grouped and "Misc" not in ordered_tags: + ordered_tags.append("Misc") + for extra in sorted(tag for tag in grouped if tag not in ordered_tags): + ordered_tags.append(extra) + + return ordered_tags, operations, grouped + + +def render_generated_toc(ordered_tags: List[str], grouped: Dict[str, List[Operation]]) -> str: + lines: List[str] = [] + lines.append(' ') + for tag in ordered_tags: + tag_topic_file = f"Tag_{slugify(tag)}.topic" + lines.append(f' ') + tag_ops = grouped.get(tag, []) + if tag == "Modules": + module_groups: Dict[str, List[Operation]] = {} + module_meta: Dict[str, Tuple[str, str]] = {} + for op in tag_ops: + module_groups.setdefault(op.module_key, []).append(op) + module_meta[op.module_key] = (op.module_name, op.module_description) + + for module_key in sorted(module_groups, key=lambda key: module_meta[key][0].lower()): + module_name, _ = module_meta[module_key] + module_slug = safe_token(module_name) + module_topic = f"modules_module_{module_slug}.topic" + lines.append(f' ') + module_ops = sorted(module_groups[module_key], key=lambda op: (op.module_name.lower(), op.title.lower(), op.path, op.method)) + total_pages = max(1, (len(module_ops) + OPS_PER_PAGE - 1) // OPS_PER_PAGE) + for page_index in range(total_pages): + start = page_index * OPS_PER_PAGE + end = start + OPS_PER_PAGE + page_ops = module_ops[start:end] + page_number = page_index + 1 + page_topic = f"modules_module_{module_slug}_page_{page_number}.topic" + lines.append(f' ') + for op in page_ops: + lines.append(f' ') + lines.append(" ") + lines.append(" ") + lines.append(" ") + continue + + if tag == "Config": + config_groups: Dict[str, List[Operation]] = {} + config_meta: Dict[str, Tuple[str, str]] = {} + for op in tag_ops: + config_groups.setdefault(op.config_key, []).append(op) + config_meta[op.config_key] = (op.config_name, op.config_description) + + for config_key in sorted(config_groups, key=lambda key: config_meta[key][0].lower()): + config_name, _ = config_meta[config_key] + config_slug = safe_token(config_name) + config_topic = f"config_module_{config_slug}.topic" + lines.append(f' ') + config_ops = sorted(config_groups[config_key], key=lambda op: (op.title.lower(), op.path, op.method)) + total_pages = max(1, (len(config_ops) + OPS_PER_PAGE - 1) // OPS_PER_PAGE) + for page_index in range(total_pages): + start = page_index * OPS_PER_PAGE + end = start + OPS_PER_PAGE + page_ops = config_ops[start:end] + page_number = page_index + 1 + page_topic = f"config_module_{config_slug}_page_{page_number}.topic" + lines.append(f' ') + for op in page_ops: + lines.append(f' ') + lines.append(" ") + lines.append(" ") + lines.append(" ") + continue + + total_pages = max(1, (len(tag_ops) + OPS_PER_PAGE - 1) // OPS_PER_PAGE) + for page_index in range(total_pages): + start = page_index * OPS_PER_PAGE + end = start + OPS_PER_PAGE + page_ops = tag_ops[start:end] + page_number = page_index + 1 + page_topic = f"Tag_{slugify(tag)}_Page_{page_number}.topic" + lines.append(f' ') + for op in page_ops: + lines.append(f' ') + lines.append(" ") + lines.append(" ") + lines.append(" ") + return "\n".join(lines) + "\n" + + +def apply_toc_block(ctw_tree_content: str, generated_toc: str) -> str: + block = f" {TOC_START_MARKER}\n{generated_toc.rstrip()}\n {TOC_END_MARKER}\n" + marker_pattern = re.compile( + rf"(?ms)^[ \t]*{re.escape(TOC_START_MARKER)}\r?\n.*?^[ \t]*{re.escape(TOC_END_MARKER)}\r?\n?" + ) + if marker_pattern.search(ctw_tree_content): + return marker_pattern.sub(block, ctw_tree_content, count=1) + + close_tag = "" + close_index = ctw_tree_content.rfind(close_tag) + if close_index == -1: + raise ValueError("Unable to update ctw.tree: missing .") + left = ctw_tree_content[:close_index].rstrip() + "\n\n" + right = ctw_tree_content[close_index:] + return left + block + right + + +def build_expected_outputs(root: Path) -> Dict[Path, str]: + documentation_dir = root / "documentation" + openapi_path = root / "openapi.yaml" + ctw_tree_path = documentation_dir / "ctw.tree" + api_reference_topic_path = documentation_dir / "topics" / "API-Reference.topic" + generated_dir = documentation_dir / "topics" / "generated" + generated_toc_path = documentation_dir / "generated" / "api-reference.toc.xml" + + openapi_doc = yaml.safe_load(openapi_path.read_text(encoding="utf-8")) + ordered_tags, operations, grouped = parse_openapi(openapi_path) + generated_toc = render_generated_toc(ordered_tags, grouped) + + expected: Dict[Path, str] = {} + expected[generated_toc_path] = generated_toc + expected[documentation_dir / "generated" / "openapi.json"] = json.dumps( + openapi_doc, indent=2, ensure_ascii=False, sort_keys=False + ) + "\n" + expected[api_reference_topic_path] = render_api_reference_topic() + + existing_tree = ctw_tree_path.read_text(encoding="utf-8") + expected[ctw_tree_path] = apply_toc_block(existing_tree, generated_toc) + + for tag in ordered_tags: + tag_slug = slugify(tag) + tag_topic_file = generated_dir / f"Tag_{tag_slug}.topic" + tag_ops = grouped[tag] + if tag == "Modules": + module_groups: Dict[str, List[Operation]] = {} + module_meta: Dict[str, Tuple[str, str]] = {} + for op in tag_ops: + module_groups.setdefault(op.module_key, []).append(op) + module_meta[op.module_key] = (op.module_name, op.module_description) + + module_list = [ + module_meta[module_key] + for module_key in sorted(module_groups, key=lambda key: module_meta[key][0].lower()) + ] + expected[tag_topic_file] = render_modules_index_topic(f"Tag_{tag_slug}", module_list) + + for module_key in sorted(module_groups, key=lambda key: module_meta[key][0].lower()): + module_name, module_description = module_meta[module_key] + module_slug = safe_token(module_name) + module_topic_file = generated_dir / f"modules_module_{module_slug}.topic" + expected[module_topic_file] = render_module_topic( + module_name=module_name, + module_description=module_description, + topic_id=f"modules_module_{module_slug}", + ) + + module_ops = sorted(module_groups[module_key], key=lambda op: (op.module_name.lower(), op.title.lower(), op.path, op.method)) + total_pages = max(1, (len(module_ops) + OPS_PER_PAGE - 1) // OPS_PER_PAGE) + for page_index in range(total_pages): + page_number = page_index + 1 + page_topic_file = generated_dir / f"modules_module_{module_slug}_page_{page_number}.topic" + expected[page_topic_file] = render_tag_page_topic( + tag=module_name, + topic_id=f"modules_module_{module_slug}_page_{page_number}", + page_number=page_number, + total_pages=total_pages, + ) + + for op in module_ops: + expected[generated_dir / op.topic_file] = render_operation_topic(op) + continue + + if tag == "Config": + config_groups: Dict[str, List[Operation]] = {} + config_meta: Dict[str, Tuple[str, str]] = {} + for op in tag_ops: + config_groups.setdefault(op.config_key, []).append(op) + config_meta[op.config_key] = (op.config_name, op.config_description) + + config_list = [ + config_meta[config_key] + for config_key in sorted(config_groups, key=lambda key: config_meta[key][0].lower()) + ] + expected[tag_topic_file] = render_config_index_topic(f"Tag_{tag_slug}", config_list) + + for config_key in sorted(config_groups, key=lambda key: config_meta[key][0].lower()): + config_name, config_description = config_meta[config_key] + config_slug = safe_token(config_name) + config_topic_file = generated_dir / f"config_module_{config_slug}.topic" + expected[config_topic_file] = render_module_topic( + module_name=config_name, + module_description=config_description, + topic_id=f"config_module_{config_slug}", + ) + + config_ops = sorted(config_groups[config_key], key=lambda op: (op.title.lower(), op.path, op.method)) + total_pages = max(1, (len(config_ops) + OPS_PER_PAGE - 1) // OPS_PER_PAGE) + for page_index in range(total_pages): + page_number = page_index + 1 + page_topic_file = generated_dir / f"config_module_{config_slug}_page_{page_number}.topic" + expected[page_topic_file] = render_tag_page_topic( + tag=config_name, + topic_id=f"config_module_{config_slug}_page_{page_number}", + page_number=page_number, + total_pages=total_pages, + ) + + for op in config_ops: + expected[generated_dir / op.topic_file] = render_operation_topic(op) + continue + + expected[tag_topic_file] = render_tag_topic(tag, f"Tag_{tag_slug}") + + total_pages = max(1, (len(tag_ops) + OPS_PER_PAGE - 1) // OPS_PER_PAGE) + for page_index in range(total_pages): + page_number = page_index + 1 + page_topic_file = generated_dir / f"Tag_{tag_slug}_Page_{page_number}.topic" + expected[page_topic_file] = render_tag_page_topic( + tag=tag, + topic_id=f"Tag_{tag_slug}_Page_{page_number}", + page_number=page_number, + total_pages=total_pages, + ) + + for op in tag_ops: + expected[generated_dir / op.topic_file] = render_operation_topic(op) + + operation_topic_names = {f"{op.topic_id}.topic" for op in operations} + operation_topics = [ + path for path in expected + if path.parent == generated_dir and path.name in operation_topic_names + ] + if len(operation_topics) != len(operations): + raise ValueError( + f"Coverage mismatch: expected {len(operations)} operation topics, built {len(operation_topics)} files." + ) + + return expected + + +def generate(root: Path) -> None: + expected = build_expected_outputs(root) + generated_dir = root / "documentation" / "topics" / "generated" + generated_dir.mkdir(parents=True, exist_ok=True) + + expected_generated_paths = { + path for path in expected if path.parent == generated_dir and path.suffix == ".topic" + } + for existing_file in generated_dir.glob("*.topic"): + if existing_file not in expected_generated_paths: + existing_file.unlink() + + changed_files = 0 + for path, content in expected.items(): + if write_if_changed(path, content): + changed_files += 1 + + print(f"Generated documentation artifacts. Updated files: {changed_files}") + + +def check(root: Path) -> None: + expected = build_expected_outputs(root) + generated_dir = root / "documentation" / "topics" / "generated" + + failures: List[str] = [] + for path, content in expected.items(): + if not path.exists(): + failures.append(f"Missing file: {path}") + continue + current = path.read_text(encoding="utf-8") + if current != content: + failures.append(f"Outdated file: {path}") + + if generated_dir.exists(): + expected_generated_paths = { + path for path in expected if path.parent == generated_dir and path.suffix == ".topic" + } + for existing_file in generated_dir.glob("*.topic"): + if existing_file not in expected_generated_paths: + failures.append(f"Stale generated topic: {existing_file}") + + if failures: + print("Documentation check failed:") + for failure in failures: + print(f"- {failure}") + print("Run: python scripts/generate_writerside_openapi_docs.py generate") + raise SystemExit(1) + + print("Documentation check passed.") + + +def main() -> None: + parser = argparse.ArgumentParser(description="Generate Writerside API docs from openapi.yaml.") + parser.add_argument("command", choices=["generate", "check"], help="Generation mode") + args = parser.parse_args() + + root = Path(__file__).resolve().parents[1] + try: + if args.command == "generate": + generate(root) + else: + check(root) + except ValueError as exc: + print(str(exc), file=sys.stderr) + raise SystemExit(1) + + +if __name__ == "__main__": + main()