Repository navigation
Reference Entitlements
What the account's plan allows; usage and limits.
Base path /api/v1/entitlements behind the gateway. Authentication, rate limits and the error format are the same for every service: see Scripting MowDeck. Rendered from apps/web/openapi/entitlements.json (OpenAPI 3.1), which you can also load into any OpenAPI tool.
Accounts
Accounts with a plan row, oldest first, with their effective plans (operators).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
offset |
query | integer | no | min 0; default 0
|
limit |
query | integer | no | min 1; max 200; default 50
|
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json AccountPageOut
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Get Account
One account: what applies, the assignment and its history (operators).
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
account_id |
path | string (uuid) | yes |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json AccountDetailOut
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Assign Plan
Assign a plan by hand (operators): history row, entitlements.plan.changed.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
account_id |
path | string (uuid) | yes |
Request body (required): application/json AssignmentIn
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json AccountDetailOut
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Features
Every feature key the modules declare (retired keys included).
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json array of FeatureOut
|
Me
The plan, status, limits and features that apply to the caller's account now.
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json ResolvedOut
|
Plans
The plans on offer (public: a pricing page needs no login).
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json array of PlanOut
|
Get Plan
One plan (operators), also an inactive one.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
key |
path | string | yes |
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json PlanDetailOut
|
| 422 | Validation Error |
application/json HTTPValidationError
|
Put Plan
Create or replace a plan (operators); every service drops its cached snapshots.
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
key |
path | string | yes |
Request body (required): application/json PlanIn
| Status | Meaning | Body |
|---|---|---|
| 200 | Successful Response |
application/json PlanDetailOut
|
| 422 | Validation Error |
application/json HTTPValidationError
|
One account for operators: what applies, the assignment and its history.
| Field | Type | Required | Notes |
|---|---|---|---|
account_id |
string (uuid) | yes | |
account_name |
string or null | yes | |
assigned |
AssignedOut or null | yes | |
effective |
ResolvedOut | yes | |
history |
array of HistoryOut | yes |
An account in the operator list: its assignment and what applies (no mower data).
| Field | Type | Required | Notes |
|---|---|---|---|
account_id |
string (uuid) | yes | |
account_name |
string or null | yes | |
assigned |
AssignedOut | yes | |
effective |
ResolvedOut | yes |
A page of accounts (offset/limit).
| Field | Type | Required | Notes |
|---|---|---|---|
billing_enabled |
boolean | yes | |
items |
array of AccountOut | yes | |
limit |
integer | yes | |
offset |
integer | yes | |
total |
integer | yes |
The stored assignment of an account.
| Field | Type | Required | Notes |
|---|---|---|---|
grace_until |
string (date-time) or null | yes | |
plan |
string | yes | |
since |
string (date-time) | yes | |
source |
PlanSource | yes | |
status |
PlanStatus | yes | Stored status (time does not change it). |
trial_until |
string (date-time) or null | yes | |
updated_at |
string (date-time) | yes |
Body of PUT /accounts/{id}/plan.
| Field | Type | Required | Notes |
|---|---|---|---|
account_name |
string or null | no | |
grace_until |
string (date-time) or null | no | End of a grace period; default now plus the grace days. |
plan |
string | yes | min length 1; max length 64 |
reason |
string | yes | Why (kept in the history).; min length 1; max length 500 |
status |
PlanStatus | no | default "active"
|
trial_until |
string (date-time) or null | no | End of a trial; default now plus the plan's trial days. |
A feature of the catalogue.
| Field | Type | Required | Notes |
|---|---|---|---|
description |
string | yes | |
key |
string | yes | |
module |
string | yes | |
retired |
boolean | yes |
One assignment.
| Field | Type | Required | Notes |
|---|---|---|---|
actor |
string or null | yes | |
at |
string (date-time) | yes | |
grace_until |
string (date-time) or null | yes | |
plan |
string | yes | |
reason |
string or null | yes | |
source |
PlanSource | yes | |
status |
PlanStatus | yes | |
trial_until |
string (date-time) or null | yes |
| Field | Type | Required | Notes |
|---|---|---|---|
detail |
array of ValidationError | no |
A plan for operators: also the features no module declares and where it came from.
| Field | Type | Required | Notes |
|---|---|---|---|
active |
boolean | yes | |
created_at |
string (date-time) or null | yes | |
description |
string or null | yes | |
features |
array of string | yes | Feature keys; * grants every feature. |
from_plan_file |
boolean | yes | Seeded from the plan file (a changed file entry overwrites it at the next start). |
is_default |
boolean | yes | |
key |
string | yes | |
limits |
PlanLimits | yes | Limits; null means unlimited. |
name |
string | yes | |
trial_days |
integer | yes | |
unknown_features |
array of string | yes | Feature keys of the plan that no module declares (kept, they gate nothing until a module enforcing them is deployed). |
updated_at |
string (date-time) or null | yes |
Body of PUT /plans/{key}: the whole plan.
| Field | Type | Required | Notes |
|---|---|---|---|
active |
boolean | no | default true
|
description |
string or null | no | |
features |
array of string or string | no | max items 500 |
is_default |
boolean | no | default false
|
limits |
PlanLimits | no | |
name |
string | yes | min length 1; max length 200 |
trial_days |
integer | no | min 0.0; max 365.0; default 0
|
The limits of a plan; None means unlimited.
| Field | Type | Required | Notes |
|---|---|---|---|
history_days |
integer or null | no | |
max_groups |
integer or null | no | |
max_mowers |
integer or null | no | |
max_schedules |
integer or null | no | |
max_sites |
integer or null | no | |
max_users |
integer or null | no |
A plan as offered.
| Field | Type | Required | Notes |
|---|---|---|---|
active |
boolean | yes | |
description |
string or null | yes | |
features |
array of string | yes | Feature keys; * grants every feature. |
is_default |
boolean | yes | |
key |
string | yes | |
limits |
PlanLimits | yes | Limits; null means unlimited. |
name |
string | yes | |
trial_days |
integer | yes |
Who set an account's plan.
Type: "default" | "manual" | "billing"
Status of an account's plan.
Type: "active" | "trial" | "grace" | "expired"
The plan that applies to an account now.
| Field | Type | Required | Notes |
|---|---|---|---|
account_id |
string (uuid) | yes | |
billing_enabled |
boolean | yes | False: billing is disabled on this installation and every account has the plan unlimited, whatever was assigned. |
features |
array of string | yes | |
grace_until |
string (date-time) or null | no | |
limits |
PlanLimits | yes | |
plan |
string | yes | |
plan_name |
string | yes | |
since |
string (date-time) or null | no | |
source |
PlanSource | yes | |
status |
PlanStatus | yes | Effective status (an ended trial is expired). |
trial_until |
string (date-time) or null | no |
| Field | Type | Required | Notes |
|---|---|---|---|
ctx |
object | no | |
input |
any | no | |
loc |
array of string or integer | yes | |
msg |
string | yes | |
type |
string | yes |
Mirrored from docs/reference/api/entitlements.md at commit d31bb5cc2fa17ace35f89531465b76d8f888ece6. Edit the file in the repository, not this wiki page.
Mirrored from the docs/ directory at commit d31bb5cc2fa17ace35f89531465b76d8f888ece6. Edit the files in the repository, not this wiki.
MowDeck documentation
- Home
- Phases
- Architecture
-
Decisions (ADR)
- Architecture decisions
- ADR 0001: OpenFGA instead of self-built authorization
- ADR 0002: Self-built Identity service in FastAPI instead of Keycloak or Zitadel
- ADR 0003: SvelteKit for the web app
- ADR 0004: Monorepo with a uv workspace
- ADR 0005: AGPL-3.0 for services and apps, Apache-2.0 for libraries
- ADR 0006: PostgreSQL for all persistence, no SQLite
- ADR 0007: NATS JetStream as event bus
- ADR 0008: Traefik as gateway
- ADR 0009: Command and event envelopes, subject naming and de-duplication
- ADR 0010: Python 3.13 for all services and libraries
- ADR 0011: Separate GPL-3.0 package for the PyMammotion adapter
- ADR 0012: Mower control interface and safety rules
- ADR 0013: Device-Gateway registry, sharding and per-mower concurrency
- ADR 0014: Authorization model, tuple ownership and the mowdeck-authz client
- ADR 0015: Tokens, sessions and key rotation
- ADR 0016: Fleet commands and authorization per command kind
- ADR 0017: Telemetry storage and retention
- ADR 0018: Realtime WebSocket protocol
- ADR 0019: Mammotion adapter transports, manual drive and secrets
- ADR 0020: Web app architecture
- ADR 0021: Browser authentication flow
- ADR 0022: Notifications: rules, recipients and delivery
- ADR 0023: Map rendering and projection
- ADR 0024: Scheduler: recurrence, rain pause and command issuing
- ADR 0025: Home Assistant integration as a pure API client
- ADR 0026: Manual drive channel over the Realtime WebSocket
- ADR 0027: Health history and theft alarm
- ADR 0028: Entitlements: plans as data and enforcement
- ADR 0029: Helm chart and release pipeline
- ADR 0030: Mowing patterns as plug-ins and the Planner
- ADR 0031: Billing with a Stripe adapter
- ADR 0032: Live camera over Agora, joined directly by the browser
- ADR 0033: Vision-assisted recovery with human approval
- ADR 0034: Linked cloud accounts and device discovery
- ADR 0035: Server-side camera frames and automatic AI analysis on errors
- ADR 0036: Native app shells with Capacitor, loading the web app from the server
- ADR 0037: Camera panorama calibration in the browser, with the AI supplying points only
- ADR 0038: Dual link per mower and firmware updates
- ADR 0039: Spot mowing by MowDeck-driven paths
- ADR 0040: Link heartbeat for online status
- ADR 0041: Spot runs from the dock: undock, transit and return
- ADR 0042: Drive calibration
- ADR 0043: Turn styles
- ADR 0044: Drive view with camera
- ADR 0045: Camera relay
- ADR 0046: Device settings as capabilities
- ADR 0047: The RTK base station as a Fleet device
- ADR 0048: Maintenance commands
- ADR 0049: Manual driving over the Mammotion cloud
- ADR 0050: Passkeys and the app login hand-off
- ADR 0051: Sign in with GitHub
- ADR 0052: Sign in with Apple
- ADR 0053: Retention and downsampling of the position track
- ADR 0054: Aerial photo under the mower map
- ADR 0055: Deploy maintenance window
- ADR 0056: Camera photo in push notifications for errors and theft alarms
- ADR 0057: Step-up re-authentication for critical actions
- ADR 0058: Theft tracking mode
- ADR 0059: iOS widgets and the mowing Live Activity
- ADR 0060: Apple Watch app
- ADR 0061: Mowing angle rotation
- ADR 0062: Setup tour for new users
- ADR 0063: Matter server (mowers in Apple Home and Google Home)
- ADR 0064: Personal access tokens and the public API documentation
- Development
-
Operations
- Operating the Compose stack
- Operating MowDeck on Kubernetes (Helm)
- Building the Bluetooth bridge (ESPHome on a XIAO ESP32-S3)
- Releases
- Billing operations
- Telemetry: retention and position downsampling
- iPhone and Android apps
- Passkeys
- Sign in with GitHub
- Aerial photo under the map
- Sign in with Apple
- Theft tracking mode
- Matter server
- Source code offer (AGPL-3.0 section 13)
- Spikes
- Guides
- API reference
- Original plan (German)