{
  "components": {
    "schemas": {
      "ActivateTheme": {
        "properties": {
          "id": {
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "AddBody": {
        "additionalProperties": false,
        "properties": {
          "gateway": {
            "type": "string"
          },
          "token": {
            "description": "Token created client-side by the provider SDK (e.g. Stripe `pm_…`).",
            "type": "string"
          }
        },
        "required": [
          "gateway",
          "token"
        ],
        "type": "object"
      },
      "AddFundsBody": {
        "additionalProperties": false,
        "properties": {
          "amount": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          }
        },
        "required": [
          "currency",
          "amount"
        ],
        "type": "object"
      },
      "AddFundsSettings": {
        "additionalProperties": false,
        "properties": {
          "auto_apply_credit": {
            "default": false,
            "description": "Apply available credit to new invoices automatically (WHMCS\n\"Credit Auto-Apply\"). Off by default.",
            "type": "boolean"
          },
          "enabled": {
            "default": false,
            "type": "boolean"
          },
          "max": {
            "default": "500",
            "description": "Largest single deposit.",
            "type": "string"
          },
          "max_balance": {
            "default": "1000",
            "description": "Highest credit balance (existing + unpaid deposits + this one). 0 = no cap.",
            "type": "string"
          },
          "min": {
            "default": "10",
            "description": "Smallest single deposit.",
            "type": "string"
          },
          "require_active_service": {
            "default": false,
            "description": "Only customers with at least one active service may deposit.",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "AddonInput": {
        "additionalProperties": false,
        "properties": {
          "description": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "prices": {
            "items": {
              "$ref": "#/components/schemas/AddonPrice"
            },
            "type": "array"
          },
          "product_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "sort_order": {
            "format": "int32",
            "type": "integer"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "AddonPrice": {
        "properties": {
          "amount": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "cycle": {
            "type": "string"
          },
          "setup_fee": {
            "type": "string"
          }
        },
        "required": [
          "currency",
          "cycle",
          "amount"
        ],
        "type": "object"
      },
      "AdjustBody": {
        "additionalProperties": false,
        "properties": {
          "amount": {
            "description": "Positive adds credit, negative removes it.",
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "note": {
            "type": "string"
          }
        },
        "required": [
          "currency",
          "amount"
        ],
        "type": "object"
      },
      "AdminDashboard": {
        "properties": {
          "active_services": {
            "format": "int64",
            "type": "integer"
          },
          "failed_jobs": {
            "format": "int64",
            "type": "integer"
          },
          "month_start": {
            "type": "string"
          },
          "overdue": {
            "items": {
              "$ref": "#/components/schemas/CurrencyTotal"
            },
            "type": "array"
          },
          "pending_orders": {
            "format": "int64",
            "type": "integer"
          },
          "revenue_month": {
            "description": "Applied payments since the start of the current month (UTC), per currency.",
            "items": {
              "$ref": "#/components/schemas/CurrencyTotal"
            },
            "type": "array"
          },
          "revenue_series": {
            "description": "Succeeded payments for the last 6 calendar months (UTC), oldest first.",
            "items": {
              "$ref": "#/components/schemas/MonthRevenue"
            },
            "type": "array"
          },
          "unpaid": {
            "items": {
              "$ref": "#/components/schemas/CurrencyTotal"
            },
            "type": "array"
          }
        },
        "required": [
          "month_start",
          "revenue_month",
          "unpaid",
          "overdue",
          "active_services",
          "pending_orders",
          "failed_jobs",
          "revenue_series"
        ],
        "type": "object"
      },
      "AdminOrderBody": {
        "additionalProperties": false,
        "properties": {
          "approve": {
            "description": "Approve (activate services) right away.",
            "type": "boolean"
          },
          "coupon": {
            "type": [
              "string",
              "null"
            ]
          },
          "currency": {
            "type": [
              "string",
              "null"
            ]
          },
          "customer_id": {
            "format": "uuid",
            "type": "string"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/CartItem"
            },
            "type": "array"
          }
        },
        "required": [
          "customer_id",
          "items"
        ],
        "type": "object"
      },
      "AdminUpdate": {
        "properties": {
          "admin_notes": {
            "type": [
              "string",
              "null"
            ]
          },
          "auto_renew": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "dns_management": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "expires_on": {
            "type": [
              "string",
              "null"
            ]
          },
          "privacy": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "registrar_lock": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "status": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "AffiliateUpdate": {
        "additionalProperties": false,
        "properties": {
          "commission_percent": {
            "type": "string"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "commission_percent",
          "status"
        ],
        "type": "object"
      },
      "AnnouncementBody": {
        "properties": {
          "body": {
            "type": "string"
          },
          "is_published": {
            "type": "boolean"
          },
          "locale": {
            "type": [
              "string",
              "null"
            ]
          },
          "published_at": {
            "description": "RFC 3339; omit for \"now\" (create) or \"unchanged\" (update).",
            "type": [
              "string",
              "null"
            ]
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "title",
          "body"
        ],
        "type": "object"
      },
      "ApplyBody": {
        "additionalProperties": false,
        "properties": {
          "amount": {
            "description": "Defaults to as much as the balance and the invoice allow.",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "ApprovalRules": {
        "properties": {
          "auto_approve": {
            "description": "Off = every order waits for staff (manual mode).",
            "type": "boolean"
          },
          "existing_clients_only": {
            "description": "Hold orders from clients with no previously approved order.",
            "type": "boolean"
          },
          "hold_fraud_review": {
            "description": "Hold orders flagged for fraud review.",
            "type": "boolean"
          },
          "manual_product_ids": {
            "description": "Products that always need manual approval.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "max_total": {
            "description": "Hold orders above this total (order currency).",
            "type": [
              "string",
              "null"
            ]
          },
          "require_paid": {
            "description": "Only approve once the order invoice is paid.",
            "type": "boolean"
          }
        },
        "required": [
          "auto_approve"
        ],
        "type": "object"
      },
      "ArticleBody": {
        "properties": {
          "body": {
            "type": "string"
          },
          "category_id": {
            "format": "uuid",
            "type": "string"
          },
          "is_published": {
            "type": "boolean"
          },
          "locale": {
            "type": [
              "string",
              "null"
            ]
          },
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "category_id",
          "slug",
          "title",
          "body"
        ],
        "type": "object"
      },
      "AssertBody": {
        "properties": {
          "challenge_id": {
            "format": "uuid",
            "type": "string"
          },
          "credential": {
            "type": "object"
          }
        },
        "required": [
          "challenge_id",
          "credential"
        ],
        "type": "object"
      },
      "AssignBody": {
        "additionalProperties": false,
        "properties": {
          "legal_entity_id": {
            "description": "`null` = use the default entity.",
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "AutoPayBody": {
        "additionalProperties": false,
        "properties": {
          "enabled": {
            "type": "boolean"
          }
        },
        "required": [
          "enabled"
        ],
        "type": "object"
      },
      "AutoRenewBody": {
        "properties": {
          "auto_renew": {
            "type": "boolean"
          }
        },
        "required": [
          "auto_renew"
        ],
        "type": "object"
      },
      "AutopaySettings": {
        "additionalProperties": false,
        "properties": {
          "enabled": {
            "default": true,
            "type": "boolean"
          },
          "retry_days": {
            "default": [
              0,
              3,
              7
            ],
            "description": "Days after the due date of each attempt; the first is usually 0.",
            "items": {
              "format": "int32",
              "type": "integer"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "BackupCodes": {
        "properties": {
          "backup_codes": {
            "description": "Plain codes, returned exactly once.",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "backup_codes"
        ],
        "type": "object"
      },
      "Balance": {
        "properties": {
          "amount": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          }
        },
        "required": [
          "currency",
          "amount"
        ],
        "type": "object"
      },
      "BankTransfer": {
        "additionalProperties": false,
        "description": "Operator bank details shown with manual-transfer instructions. Not secret.",
        "properties": {
          "bank_name": {
            "default": "",
            "type": "string"
          },
          "beneficiary": {
            "default": "",
            "type": "string"
          },
          "bic": {
            "default": "",
            "type": "string"
          },
          "iban": {
            "default": "",
            "type": "string"
          },
          "note": {
            "default": "",
            "description": "Free-form note appended to the instructions.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "BillableInput": {
        "properties": {
          "customer_id": {
            "format": "uuid",
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "invoice_action": {
            "type": "string"
          },
          "next_due_date": {
            "description": "First invoice date for `recurring` (YYYY-MM-DD).",
            "type": [
              "string",
              "null"
            ]
          },
          "quantity": {
            "type": "string"
          },
          "recur_cycle": {
            "description": "Required for `recurring` (e.g. monthly).",
            "type": [
              "string",
              "null"
            ]
          },
          "recur_times": {
            "description": "Number of times to bill a recurring item (omit = until cancelled).",
            "format": "int32",
            "type": [
              "integer",
              "null"
            ]
          },
          "unit_price": {
            "type": "string"
          }
        },
        "required": [
          "customer_id",
          "description",
          "unit_price",
          "invoice_action"
        ],
        "type": "object"
      },
      "BundleInput": {
        "properties": {
          "active": {
            "type": "boolean"
          },
          "description": {
            "type": "string"
          },
          "discount_percent": {
            "type": "string"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/ItemInput"
            },
            "type": "array"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "discount_percent",
          "items"
        ],
        "type": "object"
      },
      "CampaignInput": {
        "properties": {
          "body": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "segment": {
            "$ref": "#/components/schemas/Segment"
          },
          "subject": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "subject",
          "body"
        ],
        "type": "object"
      },
      "CancelBody": {
        "additionalProperties": false,
        "properties": {
          "kind": {
            "description": "`immediate` or `end_of_period`.",
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "kind"
        ],
        "type": "object"
      },
      "Candidate": {
        "properties": {
          "customer_id": {
            "format": "uuid",
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "last_activity": {
            "type": "string"
          },
          "user_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "customer_id",
          "user_id",
          "email",
          "last_activity"
        ],
        "type": "object"
      },
      "CannedBody": {
        "properties": {
          "body": {
            "type": "string"
          },
          "category": {
            "description": "Free-text grouping shown in the reply picker (WHMCS categories).",
            "type": "string"
          },
          "department_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "title",
          "body"
        ],
        "type": "object"
      },
      "CartBody": {
        "additionalProperties": false,
        "properties": {
          "country": {
            "type": "string"
          },
          "coupon": {
            "type": [
              "string",
              "null"
            ]
          },
          "currency": {
            "type": "string"
          },
          "email": {
            "description": "Optional email for cart recovery reminders.",
            "type": [
              "string",
              "null"
            ]
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/CartItem"
            },
            "type": "array"
          },
          "locale": {
            "type": "string"
          }
        },
        "required": [
          "currency"
        ],
        "type": "object"
      },
      "CartItem": {
        "additionalProperties": false,
        "properties": {
          "addons": {
            "description": "Addon ids to order with this product.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "config": {
            "description": "option_id → choice_id (or quantity for quantity options)",
            "type": "object"
          },
          "cycle": {
            "type": "string"
          },
          "fields": {
            "description": "Custom order field values (field_id → value).",
            "type": "object"
          },
          "product_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "product_id",
          "cycle"
        ],
        "type": "object"
      },
      "CategoryBody": {
        "properties": {
          "description": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "sort_order": {
            "format": "int32",
            "type": "integer"
          }
        },
        "required": [
          "slug",
          "name"
        ],
        "type": "object"
      },
      "ChangeBody": {
        "additionalProperties": false,
        "properties": {
          "product_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "product_id"
        ],
        "type": "object"
      },
      "ChatPost": {
        "additionalProperties": false,
        "properties": {
          "body": {
            "type": "string"
          }
        },
        "required": [
          "body"
        ],
        "type": "object"
      },
      "ChatStart": {
        "additionalProperties": false,
        "properties": {
          "email": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "page": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "email",
          "message"
        ],
        "type": "object"
      },
      "Check": {
        "properties": {
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "customer_email": {
            "type": "string"
          },
          "customer_id": {
            "format": "uuid",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "ip": {
            "type": [
              "string",
              "null"
            ]
          },
          "order_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "order_number": {
            "format": "int64",
            "type": [
              "integer",
              "null"
            ]
          },
          "reasons": {},
          "score": {
            "format": "int32",
            "type": "integer"
          },
          "verdict": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "customer_id",
          "customer_email",
          "score",
          "verdict",
          "reasons",
          "created_at"
        ],
        "type": "object"
      },
      "CheckBody": {
        "additionalProperties": false,
        "properties": {
          "code": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          }
        },
        "required": [
          "code",
          "currency"
        ],
        "type": "object"
      },
      "CheckoutBody": {
        "additionalProperties": false,
        "properties": {
          "cart_id": {
            "format": "uuid",
            "type": "string"
          },
          "country": {
            "description": "Billing country to store on the profile when it is still empty.",
            "type": [
              "string",
              "null"
            ]
          },
          "fields": {
            "description": "Custom order field values per cart line (index → field_id → value).",
            "type": "object"
          }
        },
        "required": [
          "cart_id"
        ],
        "type": "object"
      },
      "ChoiceInput": {
        "properties": {
          "label": {
            "type": "string"
          },
          "prices": {
            "items": {
              "$ref": "#/components/schemas/ChoicePrice"
            },
            "type": "array"
          }
        },
        "required": [
          "label"
        ],
        "type": "object"
      },
      "ChoicePrice": {
        "properties": {
          "amount": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "cycle": {
            "type": "string"
          }
        },
        "required": [
          "currency",
          "cycle",
          "amount"
        ],
        "type": "object"
      },
      "ChurnPoint": {
        "properties": {
          "churn_rate": {
            "description": "churned / customers_start, 4 decimals (0 when start is 0).",
            "type": "string"
          },
          "churned": {
            "description": "Of those, customers with no live service at the end.",
            "format": "int64",
            "type": "integer"
          },
          "customers_start": {
            "description": "Customers with a live service at the start of the month.",
            "format": "int64",
            "type": "integer"
          },
          "gained": {
            "description": "Customers live at the end who were not at the start.",
            "format": "int64",
            "type": "integer"
          },
          "month": {
            "type": "string"
          },
          "new_signups": {
            "format": "int64",
            "type": "integer"
          }
        },
        "required": [
          "month",
          "customers_start",
          "churned",
          "gained",
          "churn_rate",
          "new_signups"
        ],
        "type": "object"
      },
      "ClientDashboard": {
        "properties": {
          "active_services": {
            "format": "int64",
            "type": "integer"
          },
          "due": {
            "description": "Balance due per currency (total - paid of unpaid invoices).",
            "items": {
              "$ref": "#/components/schemas/CurrencyTotal"
            },
            "type": "array"
          },
          "overdue_invoices": {
            "format": "int64",
            "type": "integer"
          },
          "spend_series": {
            "description": "This customer's succeeded payments, last 6 months, oldest first.",
            "items": {
              "$ref": "#/components/schemas/MonthRevenue"
            },
            "type": "array"
          },
          "unpaid_invoices": {
            "format": "int64",
            "type": "integer"
          },
          "upcoming": {
            "items": {
              "$ref": "#/components/schemas/UpcomingService"
            },
            "type": "array"
          }
        },
        "required": [
          "active_services",
          "unpaid_invoices",
          "overdue_invoices",
          "due",
          "upcoming",
          "spend_series"
        ],
        "type": "object"
      },
      "CodeBody": {
        "properties": {
          "code": {
            "type": "string"
          }
        },
        "required": [
          "code"
        ],
        "type": "object"
      },
      "CompleteBody": {
        "properties": {
          "query": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Query parameters the provider appended to the return URL.",
            "propertyNames": {
              "type": "string"
            },
            "type": "object"
          }
        },
        "type": "object"
      },
      "ConfirmBody": {
        "properties": {
          "code": {
            "type": "string"
          },
          "password": {
            "type": "string"
          }
        },
        "required": [
          "password",
          "code"
        ],
        "type": "object"
      },
      "ConsumeBody": {
        "properties": {
          "token": {
            "type": "string"
          }
        },
        "required": [
          "token"
        ],
        "type": "object"
      },
      "ContactBody": {
        "properties": {
          "contact": {
            "type": "object"
          },
          "privacy": {
            "type": "boolean"
          }
        },
        "required": [
          "contact"
        ],
        "type": "object"
      },
      "ContactPatch": {
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string"
          },
          "permissions": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "name",
          "permissions"
        ],
        "type": "object"
      },
      "CouponInput": {
        "additionalProperties": false,
        "properties": {
          "active": {
            "type": "boolean"
          },
          "applies_addons": {
            "type": "boolean"
          },
          "applies_domains": {
            "type": "boolean"
          },
          "client_group_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "code": {
            "type": "string"
          },
          "currency": {
            "type": [
              "string",
              "null"
            ]
          },
          "customer_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "description": {
            "type": "string"
          },
          "expires_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "kind": {
            "type": "string"
          },
          "max_uses": {
            "format": "int32",
            "type": [
              "integer",
              "null"
            ]
          },
          "max_uses_per_customer": {
            "format": "int32",
            "type": [
              "integer",
              "null"
            ]
          },
          "product_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "recurring": {
            "type": "boolean"
          },
          "recurring_cycles": {
            "format": "int32",
            "type": [
              "integer",
              "null"
            ]
          },
          "starts_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "tlds": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "value": {
            "type": "string"
          }
        },
        "required": [
          "code",
          "kind",
          "value"
        ],
        "type": "object"
      },
      "CreateCustomer": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Profile"
          },
          {
            "properties": {
              "email": {
                "type": "string"
              }
            },
            "required": [
              "email"
            ],
            "type": "object"
          }
        ]
      },
      "CreateInvoice": {
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string"
          },
          "customer_id": {
            "format": "uuid",
            "type": "string"
          },
          "finalize": {
            "type": "boolean"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/ItemBody"
            },
            "type": "array"
          }
        },
        "required": [
          "customer_id",
          "currency",
          "items"
        ],
        "type": "object"
      },
      "CreateKey": {
        "properties": {
          "expires_in_days": {
            "description": "1–3650 days; omit for no expiry.",
            "format": "int64",
            "type": [
              "integer",
              "null"
            ]
          },
          "name": {
            "type": "string"
          },
          "scopes": {
            "description": "Permission names; each must be one the caller holds.",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "name",
          "scopes"
        ],
        "type": "object"
      },
      "CsvAnalyze": {
        "additionalProperties": false,
        "properties": {
          "csv": {
            "type": "string"
          },
          "kind": {
            "description": "clients | services | invoices",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "csv"
        ],
        "type": "object"
      },
      "CsvRun": {
        "additionalProperties": false,
        "properties": {
          "csv": {
            "type": "string"
          },
          "dry_run": {
            "type": "boolean"
          },
          "kind": {
            "type": "string"
          },
          "mapping": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Target field → CSV header.",
            "propertyNames": {
              "type": "string"
            },
            "type": "object"
          }
        },
        "required": [
          "kind",
          "csv",
          "mapping"
        ],
        "type": "object"
      },
      "CurrencyInput": {
        "properties": {
          "auto_update": {
            "type": "boolean"
          },
          "code": {
            "description": "ISO 4217 code (create only).",
            "type": [
              "string",
              "null"
            ]
          },
          "decimal_sep": {
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "exponent": {
            "format": "int32",
            "type": "integer"
          },
          "prefix": {
            "type": "string"
          },
          "rate": {
            "type": "string"
          },
          "suffix": {
            "type": "string"
          },
          "thousands_sep": {
            "type": "string"
          }
        },
        "required": [
          "exponent",
          "enabled",
          "rate"
        ],
        "type": "object"
      },
      "CurrencyLimit": {
        "additionalProperties": false,
        "properties": {
          "fee_fixed": {
            "default": "0",
            "type": "string"
          },
          "max": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          },
          "min": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "CurrencyTotal": {
        "properties": {
          "amount": {
            "type": "string"
          },
          "count": {
            "format": "int64",
            "type": "integer"
          },
          "currency": {
            "type": "string"
          }
        },
        "required": [
          "currency",
          "amount",
          "count"
        ],
        "type": "object"
      },
      "Current": {
        "properties": {
          "question": {
            "type": "string"
          },
          "question_id": {
            "format": "uuid",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "question_id",
          "question",
          "updated_at"
        ],
        "type": "object"
      },
      "CustomBody": {
        "additionalProperties": false,
        "properties": {
          "action": {
            "type": "string"
          },
          "params": {
            "type": "object"
          }
        },
        "required": [
          "action"
        ],
        "type": "object"
      },
      "CustomCode": {
        "properties": {
          "css": {
            "default": "",
            "type": "string"
          },
          "footer_js": {
            "default": "",
            "type": "string"
          },
          "head_js": {
            "default": "",
            "type": "string"
          }
        },
        "type": "object"
      },
      "CustomerGroupBody": {
        "properties": {
          "group_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "DebitLine": {
        "additionalProperties": false,
        "description": "Finalized credit notes issued against an invoice, oldest first.\nA line on a debit note (tax is computed by the tax engine at issue).",
        "properties": {
          "description": {
            "type": "string"
          },
          "quantity": {
            "type": "string"
          },
          "unit_price": {
            "type": "string"
          }
        },
        "required": [
          "description",
          "quantity",
          "unit_price"
        ],
        "type": "object"
      },
      "DebitNoteBody": {
        "additionalProperties": false,
        "properties": {
          "lines": {
            "items": {
              "$ref": "#/components/schemas/DebitLine"
            },
            "type": "array"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "lines"
        ],
        "type": "object"
      },
      "DecideBody": {
        "additionalProperties": false,
        "properties": {
          "approve": {
            "type": "boolean"
          },
          "note": {
            "type": "string"
          }
        },
        "required": [
          "approve"
        ],
        "type": "object"
      },
      "Delivery": {
        "properties": {
          "body_bytes": {
            "format": "int32",
            "type": "integer"
          },
          "duplicate": {
            "type": "boolean"
          },
          "error": {
            "type": [
              "string",
              "null"
            ]
          },
          "event_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "event_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "gateway": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "is_test": {
            "type": "boolean"
          },
          "kind": {
            "type": [
              "string",
              "null"
            ]
          },
          "provider_ref": {
            "type": [
              "string",
              "null"
            ]
          },
          "received_at": {
            "type": "string"
          },
          "signature_ok": {
            "type": "boolean"
          },
          "status_code": {
            "format": "int32",
            "type": "integer"
          }
        },
        "required": [
          "id",
          "gateway",
          "received_at",
          "is_test",
          "status_code",
          "signature_ok",
          "duplicate",
          "body_bytes"
        ],
        "type": "object"
      },
      "DepartmentBody": {
        "properties": {
          "description": {
            "type": "string"
          },
          "is_active": {
            "type": "boolean"
          },
          "name": {
            "type": "string"
          },
          "sort_order": {
            "format": "int32",
            "type": "integer"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "DepartmentSlaBody": {
        "properties": {
          "email": {
            "type": "string"
          },
          "sla_first_response_minutes": {
            "format": "int32",
            "type": [
              "integer",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "DismissBody": {
        "properties": {
          "dismissed": {
            "type": "boolean"
          }
        },
        "required": [
          "dismissed"
        ],
        "type": "object"
      },
      "Document": {
        "properties": {
          "content_type": {
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "customer_id": {
            "format": "uuid",
            "type": "string"
          },
          "filename": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "review_note": {
            "type": "string"
          },
          "reviewed_at": {
            "format": "date-time",
            "type": [
              "string",
              "null"
            ]
          },
          "size_bytes": {
            "format": "int32",
            "type": "integer"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "customer_id",
          "kind",
          "filename",
          "content_type",
          "size_bytes",
          "status",
          "review_note",
          "created_at"
        ],
        "type": "object"
      },
      "DomainDefaults": {
        "additionalProperties": false,
        "properties": {
          "dns_template": {
            "default": [],
            "description": "Records added to new domains ordered with DNS management.\n`{domain}` in a value is replaced with the domain name.",
            "items": {
              "type": "object"
            },
            "type": "array"
          },
          "nameservers": {
            "default": [],
            "description": "Used when the customer leaves nameservers empty (0 or 2..=13 hosts).",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "DueReminderSettings": {
        "properties": {
          "days_before": {
            "description": "Days before the due date on which a reminder is mailed (1..=60).",
            "items": {
              "format": "int32",
              "type": "integer"
            },
            "type": "array"
          },
          "enabled": {
            "type": "boolean"
          }
        },
        "required": [
          "enabled",
          "days_before"
        ],
        "type": "object"
      },
      "DuoBody": {
        "properties": {
          "api_host": {
            "type": "string"
          },
          "client_id": {
            "type": "string"
          },
          "client_secret": {
            "description": "Empty keeps the stored secret.",
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "scope": {
            "type": "string"
          }
        },
        "required": [
          "enabled",
          "client_id",
          "api_host",
          "scope"
        ],
        "type": "object"
      },
      "EarlyRenewal": {
        "description": "Outcome of an on-demand renewal.",
        "properties": {
          "invoice_id": {
            "format": "uuid",
            "type": "string"
          },
          "period_end": {
            "type": "string"
          },
          "period_start": {
            "description": "ISO date.",
            "type": "string"
          }
        },
        "required": [
          "invoice_id",
          "period_start",
          "period_end"
        ],
        "type": "object"
      },
      "EditMessage": {
        "additionalProperties": false,
        "properties": {
          "body": {
            "type": "string"
          }
        },
        "required": [
          "body"
        ],
        "type": "object"
      },
      "EmailPrefs": {
        "additionalProperties": false,
        "properties": {
          "invoices": {
            "type": "boolean"
          },
          "marketing": {
            "type": "boolean"
          },
          "services": {
            "type": "boolean"
          },
          "support": {
            "type": "boolean"
          }
        },
        "required": [
          "invoices",
          "services",
          "support",
          "marketing"
        ],
        "type": "object"
      },
      "EnabledBody": {
        "properties": {
          "enabled": {
            "type": "boolean"
          }
        },
        "required": [
          "enabled"
        ],
        "type": "object"
      },
      "EntityInput": {
        "additionalProperties": false,
        "properties": {
          "address": {
            "default": "",
            "type": "string"
          },
          "bank_name": {
            "default": "",
            "type": "string"
          },
          "credit_prefix": {
            "default": "",
            "type": "string"
          },
          "due_days": {
            "default": null,
            "format": "int32",
            "type": [
              "integer",
              "null"
            ]
          },
          "footer": {
            "default": "",
            "type": "string"
          },
          "iban": {
            "default": "",
            "type": "string"
          },
          "invoice_prefix": {
            "default": "",
            "type": "string"
          },
          "name": {
            "default": "",
            "type": "string"
          },
          "number_format": {
            "default": "",
            "description": "Tokens: `{prefix}`, `{year}`, `{yy}`, `{seq}` or `{seq:N}` (zero-padded, N 1..=12).",
            "type": "string"
          },
          "swift": {
            "default": "",
            "type": "string"
          },
          "tax_id": {
            "default": "",
            "type": "string"
          },
          "terms": {
            "default": "",
            "type": "string"
          }
        },
        "type": "object"
      },
      "EntityView": {
        "allOf": [
          {
            "$ref": "#/components/schemas/LegalEntity"
          },
          {
            "properties": {
              "next_number": {
                "description": "Next invoice number this year (not consumed).",
                "type": "string"
              }
            },
            "required": [
              "next_number"
            ],
            "type": "object"
          }
        ]
      },
      "Entry": {
        "properties": {
          "amount": {
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "invoice_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "kind": {
            "type": "string"
          },
          "note": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "currency",
          "amount",
          "kind",
          "note",
          "created_at"
        ],
        "type": "object"
      },
      "ErasureBody": {
        "additionalProperties": false,
        "properties": {
          "password": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "password"
        ],
        "type": "object"
      },
      "FieldInput": {
        "properties": {
          "admin_only": {
            "type": "boolean"
          },
          "description": {
            "type": "string"
          },
          "field_type": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "options": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "required": {
            "type": "boolean"
          },
          "sort_order": {
            "format": "int32",
            "type": "integer"
          }
        },
        "required": [
          "name",
          "field_type"
        ],
        "type": "object"
      },
      "FinishBody": {
        "properties": {
          "duo_code": {
            "type": "string"
          },
          "state": {
            "type": "string"
          }
        },
        "required": [
          "state",
          "duo_code"
        ],
        "type": "object"
      },
      "FixedTerm": {
        "additionalProperties": false,
        "properties": {
          "auto_terminate_days": {
            "description": "Terminate services this many days after activation; null = no fixed term.",
            "format": "int32",
            "type": [
              "integer",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "ForgotBody": {
        "properties": {
          "email": {
            "type": "string"
          }
        },
        "required": [
          "email"
        ],
        "type": "object"
      },
      "FraudSettings": {
        "additionalProperties": false,
        "properties": {
          "blocked_countries": {
            "default": [],
            "description": "ISO 3166-1 alpha-2 billing countries that are always rejected.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "enabled": {
            "default": false,
            "type": "boolean"
          },
          "max_first_order_total": {
            "default": "0",
            "description": "First-order total above which the order is flagged (0 = off).",
            "type": "string"
          },
          "max_orders_per_customer_day": {
            "default": 5,
            "description": "Orders allowed per customer in 24 h (0 = off).",
            "format": "int32",
            "minimum": 0,
            "type": "integer"
          },
          "max_orders_per_ip_day": {
            "default": 5,
            "description": "Orders allowed per IP in 24 h before the velocity rule fires (0 = off).",
            "format": "int32",
            "minimum": 0,
            "type": "integer"
          },
          "reject_score": {
            "default": 90,
            "description": "Score at which an order is rejected (cancelled as fraud).",
            "format": "int32",
            "minimum": 0,
            "type": "integer"
          },
          "review_score": {
            "default": 50,
            "description": "Score (0-100) at which an order is held for manual review.",
            "format": "int32",
            "minimum": 0,
            "type": "integer"
          }
        },
        "type": "object"
      },
      "GatewayRules": {
        "additionalProperties": false,
        "properties": {
          "currencies": {
            "default": [],
            "description": "Allowed currencies; empty = all.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "fee_percent": {
            "default": "0",
            "description": "Percentage fee, e.g. `2.9`.",
            "type": "string"
          },
          "limits": {
            "additionalProperties": {
              "$ref": "#/components/schemas/CurrencyLimit"
            },
            "default": {},
            "propertyNames": {
              "type": "string"
            },
            "type": "object"
          }
        },
        "type": "object"
      },
      "General": {
        "properties": {
          "company_name": {
            "default": "",
            "type": "string"
          },
          "domain": {
            "default": "",
            "type": "string"
          },
          "email": {
            "default": "",
            "type": "string"
          },
          "logo_url": {
            "default": "",
            "type": "string"
          },
          "pay_to_text": {
            "default": "",
            "type": "string"
          },
          "records_per_page": {
            "default": 0,
            "format": "int32",
            "minimum": 0,
            "type": "integer"
          }
        },
        "type": "object"
      },
      "GeneralSettings": {
        "properties": {
          "general": {
            "default": {
              "company_name": "",
              "domain": "",
              "email": "",
              "logo_url": "",
              "pay_to_text": "",
              "records_per_page": 0
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/General"
              }
            ]
          },
          "localisation": {
            "default": {
              "allow_language_choice": true,
              "client_date_format": "DD/MM/YYYY",
              "date_format": "DD/MM/YYYY",
              "default_country": "US",
              "default_language": "en",
              "timezone": "UTC"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/Localisation"
              }
            ]
          },
          "maintenance": {
            "default": {
              "enabled": false,
              "message": "",
              "redirect_url": ""
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/Maintenance"
              }
            ]
          },
          "ordering": {
            "default": {
              "allow_domain_only": true,
              "default_order_form": "standard",
              "enable_promo_field": true,
              "grace_days": 0,
              "show_cart_after_add": true,
              "tos_required": true
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/Ordering"
              }
            ]
          },
          "support": {
            "default": {
              "attachment_max_mb": 5,
              "attachments_per_message": 5,
              "live_chat": false
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/Support"
              }
            ]
          },
          "system_urls": {
            "default": {
              "privacy_url": "",
              "support_url": "",
              "system_url": "",
              "terms_url": ""
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/SystemUrls"
              }
            ]
          }
        },
        "type": "object"
      },
      "GiftBody": {
        "additionalProperties": false,
        "properties": {
          "amount": {
            "type": "string"
          },
          "count": {
            "format": "int32",
            "minimum": 0,
            "type": "integer"
          },
          "currency": {
            "type": "string"
          },
          "expires_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "note": {
            "type": "string"
          }
        },
        "required": [
          "currency",
          "amount"
        ],
        "type": "object"
      },
      "GroupBody": {
        "properties": {
          "color": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "discount_percent": {
            "description": "Decimal string, 0–100.",
            "type": [
              "string",
              "null"
            ]
          },
          "late_fee_exempt": {
            "type": "boolean"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "HeadlessCart": {
        "additionalProperties": false,
        "properties": {
          "country": {
            "type": "string"
          },
          "coupon": {
            "type": [
              "string",
              "null"
            ]
          },
          "currency": {
            "description": "Defaults to the customer's currency.",
            "type": [
              "string",
              "null"
            ]
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/CartItem"
            },
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "HousekeepingSettings": {
        "additionalProperties": false,
        "properties": {
          "client_status_sync": {
            "default": false,
            "description": "Mark customers inactive when they own no live service or domain, and\nactive again when they do (WHMCS \"Client Status Update\"). Closed\ncustomers are never touched.",
            "type": "boolean"
          },
          "log_retention_days": {
            "default": 0,
            "description": "Delete operational logs (email, module, mail-piping, notification and\nplugin deliveries) older than this many days (0 = keep). The audit log\nis never pruned here.",
            "format": "int32",
            "type": "integer"
          },
          "prune_attachments_days": {
            "default": 0,
            "description": "Delete attachments of tickets closed this many days ago (0 = keep).",
            "format": "int32",
            "type": "integer"
          },
          "ssl_monitoring": {
            "default": false,
            "description": "Probe the TLS certificate of active client domains once a day.",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "ImportBody": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/ImportItem"
            },
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "ImportItem": {
        "properties": {
          "customer_id": {
            "format": "uuid",
            "type": "string"
          },
          "cycle": {
            "type": "string"
          },
          "next_due_date": {
            "format": "date",
            "type": [
              "string",
              "null"
            ]
          },
          "product_id": {
            "format": "uuid",
            "type": "string"
          },
          "recurring_amount": {
            "type": "string"
          },
          "remote_id": {
            "type": "string"
          },
          "status": {
            "description": "`active` (default) or `suspended`.",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "remote_id",
          "customer_id",
          "product_id",
          "cycle",
          "recurring_amount"
        ],
        "type": "object"
      },
      "ImportResult": {
        "properties": {
          "error": {
            "type": [
              "string",
              "null"
            ]
          },
          "remote_id": {
            "type": "string"
          },
          "service_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "remote_id"
        ],
        "type": "object"
      },
      "InviteContact": {
        "additionalProperties": false,
        "properties": {
          "email": {
            "type": "string"
          },
          "locale": {
            "type": [
              "string",
              "null"
            ]
          },
          "name": {
            "type": "string"
          },
          "permissions": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "email",
          "name"
        ],
        "type": "object"
      },
      "InvoiceBranding": {
        "additionalProperties": false,
        "properties": {
          "accent": {
            "default": "",
            "description": "Accent colour as `#rrggbb`; empty = neutral.",
            "type": "string"
          },
          "address": {
            "default": "",
            "description": "Seller address, one line per row.",
            "type": "string"
          },
          "company_name": {
            "default": "",
            "description": "Seller name; empty = the site name.",
            "type": "string"
          },
          "footer": {
            "default": "",
            "description": "Small print at the bottom of each page (bank details, terms…).",
            "type": "string"
          },
          "tax_id": {
            "default": "",
            "description": "Seller tax / VAT id.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "InvoicesBulk": {
        "additionalProperties": false,
        "properties": {
          "action": {
            "description": "`mark_paid` | `void` | `remind`",
            "type": "string"
          },
          "gateway": {
            "type": [
              "string",
              "null"
            ]
          },
          "idempotency_key": {
            "description": "Required for `mark_paid`: replays with the same key change nothing.",
            "type": [
              "string",
              "null"
            ]
          },
          "ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "reference": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "ids",
          "action"
        ],
        "type": "object"
      },
      "IssueBody": {
        "properties": {
          "component": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "ends_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "kind": {
            "type": "string"
          },
          "priority": {
            "type": "string"
          },
          "starts_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string"
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "title",
          "kind",
          "priority",
          "status"
        ],
        "type": "object"
      },
      "ItemBody": {
        "additionalProperties": false,
        "properties": {
          "description": {
            "type": "string"
          },
          "quantity": {
            "type": "string"
          },
          "tax_rate": {
            "description": "Omit to let the tax engine price this line at finalization.",
            "type": [
              "string",
              "null"
            ]
          },
          "unit_price": {
            "type": "string"
          }
        },
        "required": [
          "description",
          "quantity",
          "unit_price"
        ],
        "type": "object"
      },
      "ItemInput": {
        "properties": {
          "cycle": {
            "type": "string"
          },
          "product_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "product_id",
          "cycle"
        ],
        "type": "object"
      },
      "KycSettings": {
        "properties": {
          "enabled": {
            "default": false,
            "type": "boolean"
          },
          "gate_orders": {
            "default": true,
            "description": "Block new orders (products and domains) until verified.",
            "type": "boolean"
          },
          "max_mb": {
            "default": 5,
            "format": "int32",
            "minimum": 0,
            "type": "integer"
          },
          "required_kinds": {
            "default": [
              "identity"
            ],
            "description": "Document kinds that must each have an approved document.",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "LegalEntity": {
        "properties": {
          "address": {
            "type": "string"
          },
          "bank_name": {
            "type": "string"
          },
          "created_at": {
            "type": "string"
          },
          "credit_prefix": {
            "type": "string"
          },
          "due_days": {
            "format": "int32",
            "type": [
              "integer",
              "null"
            ]
          },
          "footer": {
            "type": "string"
          },
          "iban": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "invoice_prefix": {
            "type": "string"
          },
          "is_default": {
            "type": "boolean"
          },
          "name": {
            "type": "string"
          },
          "number_format": {
            "type": "string"
          },
          "swift": {
            "type": "string"
          },
          "tax_id": {
            "type": "string"
          },
          "terms": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "address",
          "tax_id",
          "bank_name",
          "iban",
          "swift",
          "footer",
          "terms",
          "invoice_prefix",
          "credit_prefix",
          "number_format",
          "is_default",
          "created_at"
        ],
        "type": "object"
      },
      "LinesBody": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/ItemBody"
            },
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "Link": {
        "properties": {
          "clicks": {
            "format": "int64",
            "type": "integer"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "last_click_at": {
            "format": "date-time",
            "type": [
              "string",
              "null"
            ]
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "target_url": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "slug",
          "name",
          "target_url",
          "clicks",
          "created_at"
        ],
        "type": "object"
      },
      "LinkBody": {
        "properties": {
          "kind": {
            "description": "`ticket` or `invoice`.",
            "type": "string"
          },
          "target_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "target_id"
        ],
        "type": "object"
      },
      "LocaleBody": {
        "properties": {
          "locale": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "Localisation": {
        "properties": {
          "allow_language_choice": {
            "default": true,
            "type": "boolean"
          },
          "client_date_format": {
            "default": "DD/MM/YYYY",
            "type": "string"
          },
          "date_format": {
            "default": "DD/MM/YYYY",
            "type": "string"
          },
          "default_country": {
            "default": "US",
            "type": "string"
          },
          "default_language": {
            "default": "en",
            "type": "string"
          },
          "timezone": {
            "default": "UTC",
            "type": "string"
          }
        },
        "type": "object"
      },
      "LoginBody": {
        "properties": {
          "email": {
            "type": "string"
          },
          "password": {
            "type": "string"
          }
        },
        "required": [
          "email",
          "password"
        ],
        "type": "object"
      },
      "LoginStart": {
        "properties": {
          "email": {
            "type": "string"
          }
        },
        "required": [
          "email"
        ],
        "type": "object"
      },
      "Maintenance": {
        "properties": {
          "enabled": {
            "default": false,
            "type": "boolean"
          },
          "message": {
            "default": "",
            "type": "string"
          },
          "redirect_url": {
            "default": "",
            "type": "string"
          }
        },
        "type": "object"
      },
      "MarginRule": {
        "properties": {
          "fixed": {
            "type": "string"
          },
          "min_margin": {
            "type": "string"
          },
          "percent": {
            "type": "string"
          },
          "rounding": {
            "description": "`cent` (half-up to 0.01), `whole` (up to 1.00) or `ninety_nine` (up to x.99).",
            "type": "string"
          },
          "tld": {
            "description": "TLD without dot, or `*` for the default rule.",
            "type": "string"
          }
        },
        "required": [
          "tld",
          "percent",
          "rounding"
        ],
        "type": "object"
      },
      "MarkupBody": {
        "properties": {
          "markup_percent": {
            "type": "string"
          }
        },
        "required": [
          "markup_percent"
        ],
        "type": "object"
      },
      "MassBody": {
        "additionalProperties": false,
        "properties": {
          "action": {
            "description": "customers: set_status | set_group · services: suspend | unsuspend | terminate | cancel ·\ntickets: set_status | set_priority | assign · domains: auto_renew_on | auto_renew_off",
            "type": "string"
          },
          "ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "value": {
            "description": "Status, priority, group id or staff id (null clears group / assignee)."
          }
        },
        "required": [
          "ids",
          "action"
        ],
        "type": "object"
      },
      "MassPay": {
        "additionalProperties": false,
        "properties": {
          "ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "ids"
        ],
        "type": "object"
      },
      "Material": {
        "properties": {
          "active": {
            "type": "boolean"
          },
          "body": {
            "type": "string"
          },
          "created_at": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "image_url": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "sort_order": {
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "kind",
          "title",
          "body",
          "image_url",
          "sort_order",
          "active",
          "created_at"
        ],
        "type": "object"
      },
      "MaterialInput": {
        "additionalProperties": false,
        "properties": {
          "active": {
            "type": "boolean"
          },
          "body": {
            "type": "string"
          },
          "image_url": {
            "type": "string"
          },
          "kind": {
            "description": "`banner` | `text`",
            "type": "string"
          },
          "sort_order": {
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "kind",
          "title"
        ],
        "type": "object"
      },
      "MeResponse": {
        "properties": {
          "avatar_version": {
            "format": "int64",
            "type": [
              "integer",
              "null"
            ]
          },
          "csrf_token": {
            "type": "string"
          },
          "display_name": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "email_verified": {
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "locale": {
            "type": [
              "string",
              "null"
            ]
          },
          "mfa_enabled": {
            "type": "boolean"
          },
          "permissions": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "roles": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "id",
          "email",
          "display_name",
          "email_verified",
          "mfa_enabled",
          "roles",
          "permissions",
          "csrf_token"
        ],
        "type": "object"
      },
      "MemberBody": {
        "properties": {
          "email": {
            "type": "string"
          }
        },
        "required": [
          "email"
        ],
        "type": "object"
      },
      "MergeBody": {
        "properties": {
          "target_id": {
            "description": "Ticket that receives this ticket's messages.",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "target_id"
        ],
        "type": "object"
      },
      "Message": {
        "properties": {
          "author": {
            "type": "string"
          },
          "body": {
            "type": "string"
          },
          "created_at": {
            "type": "string"
          },
          "id": {
            "format": "int64",
            "type": "integer"
          },
          "staff_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "staff_user_id": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "author",
          "body",
          "created_at"
        ],
        "type": "object"
      },
      "MetricInput": {
        "properties": {
          "active": {
            "type": "boolean"
          },
          "aggregate": {
            "type": "string"
          },
          "included_quantity": {
            "type": "string"
          },
          "key": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "product_id": {
            "format": "uuid",
            "type": "string"
          },
          "source_divisor": {
            "type": "string"
          },
          "source_key": {
            "type": "string"
          },
          "unit": {
            "type": "string"
          },
          "unit_price": {
            "type": "string"
          }
        },
        "required": [
          "product_id",
          "key",
          "name",
          "unit_price"
        ],
        "type": "object"
      },
      "MfaStatus": {
        "properties": {
          "available": {
            "description": "Whether the server can enrol new devices (encryption key configured).",
            "type": "boolean"
          },
          "backup_codes_remaining": {
            "format": "int64",
            "type": "integer"
          },
          "enabled": {
            "type": "boolean"
          }
        },
        "required": [
          "enabled",
          "backup_codes_remaining",
          "available"
        ],
        "type": "object"
      },
      "ModuleAction": {
        "additionalProperties": false,
        "properties": {
          "action": {
            "type": "string"
          }
        },
        "required": [
          "action"
        ],
        "type": "object"
      },
      "MoneyPoint": {
        "properties": {
          "amount": {
            "type": "string"
          },
          "count": {
            "format": "int64",
            "type": "integer"
          },
          "currency": {
            "type": "string"
          },
          "month": {
            "type": "string"
          }
        },
        "required": [
          "month",
          "currency",
          "amount",
          "count"
        ],
        "type": "object"
      },
      "MonthRevenue": {
        "properties": {
          "amount": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "month": {
            "description": "`YYYY-MM`",
            "type": "string"
          }
        },
        "required": [
          "month",
          "currency",
          "amount"
        ],
        "type": "object"
      },
      "NewContact": {
        "additionalProperties": false,
        "properties": {
          "email": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "password": {
            "type": "string"
          },
          "permissions": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "email",
          "name",
          "password"
        ],
        "type": "object"
      },
      "NewCustom": {
        "properties": {
          "name": {
            "type": "string"
          },
          "slug": {
            "description": "Slug; the gateway id becomes `custom-<slug>`.",
            "type": "string"
          }
        },
        "required": [
          "slug",
          "name"
        ],
        "type": "object"
      },
      "NewLink": {
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "target_url": {
            "type": "string"
          }
        },
        "required": [
          "slug",
          "name",
          "target_url"
        ],
        "type": "object"
      },
      "NewQuestion": {
        "additionalProperties": false,
        "properties": {
          "question": {
            "type": "string"
          }
        },
        "required": [
          "question"
        ],
        "type": "object"
      },
      "NoteBody": {
        "additionalProperties": false,
        "properties": {
          "body": {
            "type": "string"
          }
        },
        "required": [
          "body"
        ],
        "type": "object"
      },
      "NoteInput": {
        "properties": {
          "body": {
            "type": "string"
          },
          "sticky": {
            "type": "boolean"
          }
        },
        "required": [
          "body"
        ],
        "type": "object"
      },
      "NotesBody": {
        "additionalProperties": false,
        "properties": {
          "admin_notes": {
            "type": "string"
          },
          "client_notes": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "Notice": {
        "properties": {
          "author_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "author_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "body": {
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "pinned": {
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "body",
          "pinned",
          "created_at"
        ],
        "type": "object"
      },
      "NoticeBody": {
        "additionalProperties": false,
        "properties": {
          "body": {
            "type": "string"
          },
          "pinned": {
            "type": "boolean"
          }
        },
        "required": [
          "body"
        ],
        "type": "object"
      },
      "NsBody": {
        "properties": {
          "nameservers": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "nameservers"
        ],
        "type": "object"
      },
      "OpenBody": {
        "properties": {
          "attachment_ids": {
            "description": "Ids returned by the attachment upload endpoint.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "body": {
            "type": "string"
          },
          "customer_id": {
            "description": "Staff only: open on behalf of this customer.",
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "department_id": {
            "format": "uuid",
            "type": "string"
          },
          "priority": {
            "type": [
              "string",
              "null"
            ]
          },
          "service_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "subject": {
            "type": "string"
          }
        },
        "required": [
          "department_id",
          "subject",
          "body"
        ],
        "type": "object"
      },
      "OptionInput": {
        "properties": {
          "choices": {
            "items": {
              "$ref": "#/components/schemas/ChoiceInput"
            },
            "type": "array"
          },
          "name": {
            "type": "string"
          },
          "option_type": {
            "description": "dropdown | radio | quantity | yesno",
            "type": "string"
          },
          "qty_max": {
            "format": "int32",
            "type": "integer"
          },
          "qty_min": {
            "format": "int32",
            "type": "integer"
          },
          "required": {
            "type": "boolean"
          }
        },
        "required": [
          "name",
          "choices"
        ],
        "type": "object"
      },
      "OrderBody": {
        "properties": {
          "auth_code": {
            "description": "EPP code (transfers only); sealed at rest.",
            "type": "string"
          },
          "contact": {
            "type": "object"
          },
          "coupon": {
            "description": "Promo code valid for domains.",
            "type": [
              "string",
              "null"
            ]
          },
          "dns_management": {
            "type": "boolean"
          },
          "extra_fields": {
            "description": "Values for the TLD's additional fields.",
            "type": "object"
          },
          "free_order_item_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "free_service_id": {
            "description": "Claim the free domain of this service or pending order item.",
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "kind": {
            "description": "`register` or `transfer`.",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "nameservers": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "privacy": {
            "type": "boolean"
          },
          "years": {
            "format": "int32",
            "type": "integer"
          }
        },
        "required": [
          "name",
          "kind",
          "contact"
        ],
        "type": "object"
      },
      "Ordering": {
        "properties": {
          "allow_domain_only": {
            "default": true,
            "type": "boolean"
          },
          "default_order_form": {
            "default": "standard",
            "type": "string"
          },
          "enable_promo_field": {
            "default": true,
            "type": "boolean"
          },
          "grace_days": {
            "default": 0,
            "format": "int32",
            "minimum": 0,
            "type": "integer"
          },
          "show_cart_after_add": {
            "default": true,
            "type": "boolean"
          },
          "tos_required": {
            "default": true,
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "OrdersBulk": {
        "additionalProperties": false,
        "properties": {
          "action": {
            "description": "`approve` | `cancel`",
            "type": "string"
          },
          "ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "ids",
          "action"
        ],
        "type": "object"
      },
      "OverdueSettings": {
        "additionalProperties": false,
        "properties": {
          "cancel_unpaid_days": {
            "default": 0,
            "description": "Days overdue before an unpaid invoice that received no money is voided\n(0 = never; WHMCS \"Invoice Auto Cancellation\").",
            "format": "int32",
            "type": "integer"
          },
          "enabled": {
            "default": false,
            "type": "boolean"
          },
          "late_fee_days": {
            "default": 0,
            "description": "Days overdue before the late fee is charged (0 = never).",
            "format": "int32",
            "type": "integer"
          },
          "late_fee_fixed": {
            "default": "0",
            "type": "string"
          },
          "late_fee_percent": {
            "default": "0",
            "description": "Percent of the open balance.",
            "type": "string"
          },
          "reminder_days": {
            "default": [
              1,
              7,
              14
            ],
            "description": "Days after the due date on which a reminder is sent.",
            "items": {
              "format": "int32",
              "type": "integer"
            },
            "type": "array"
          },
          "suspend_days": {
            "default": 14,
            "description": "Days overdue before linked services are suspended (0 = never).",
            "format": "int32",
            "type": "integer"
          },
          "terminate_days": {
            "default": 0,
            "description": "Days overdue before services suspended by this automation are\nterminated (0 = never; WHMCS \"Termination Days\").",
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "OverrideBody": {
        "properties": {
          "note": {
            "type": "string"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "status"
        ],
        "type": "object"
      },
      "PayBody": {
        "additionalProperties": false,
        "properties": {
          "gateway": {
            "type": "string"
          }
        },
        "required": [
          "gateway"
        ],
        "type": "object"
      },
      "PaymentMethod": {
        "properties": {
          "brand": {
            "type": "string"
          },
          "created_at": {
            "type": "string"
          },
          "customer_id": {
            "format": "uuid",
            "type": "string"
          },
          "exp_month": {
            "format": "int32",
            "type": "integer"
          },
          "exp_year": {
            "format": "int32",
            "type": "integer"
          },
          "gateway": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "is_default": {
            "type": "boolean"
          },
          "last4": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "customer_id",
          "gateway",
          "brand",
          "last4",
          "exp_month",
          "exp_year",
          "is_default",
          "created_at"
        ],
        "type": "object"
      },
      "PayoutBody": {
        "additionalProperties": false,
        "properties": {
          "amount": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          }
        },
        "required": [
          "currency",
          "amount"
        ],
        "type": "object"
      },
      "PlaceOrder": {
        "additionalProperties": false,
        "properties": {
          "bundle_id": {
            "description": "Bundle the cart fulfils (discount applies when every item is present).",
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "coupon": {
            "description": "Optional promo code.",
            "type": [
              "string",
              "null"
            ]
          },
          "currency": {
            "description": "Defaults to the customer's currency.",
            "type": [
              "string",
              "null"
            ]
          },
          "form_answers": {
            "type": "object"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/CartItem"
            },
            "type": "array"
          },
          "order_form_id": {
            "description": "Order form template used (validates products and extra fields).",
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "PrefBody": {
        "properties": {
          "opt_out": {
            "type": "boolean"
          }
        },
        "required": [
          "opt_out"
        ],
        "type": "object"
      },
      "Prefs": {
        "properties": {
          "quick_links": {
            "items": {
              "$ref": "#/components/schemas/QuickLink"
            },
            "type": "array"
          },
          "widgets": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "widgets",
          "quick_links"
        ],
        "type": "object"
      },
      "PremiumSettings": {
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "markup_percent": {
            "description": "Markup on the registry premium price, percent.",
            "type": "string"
          },
          "max_price": {
            "description": "Refuse premium names above this register sell price (0 = no cap).",
            "type": "string"
          }
        },
        "required": [
          "enabled",
          "markup_percent",
          "max_price"
        ],
        "type": "object"
      },
      "PreviewBody": {
        "properties": {
          "event": {
            "type": "string"
          },
          "provider": {
            "type": "string"
          }
        },
        "required": [
          "provider",
          "event"
        ],
        "type": "object"
      },
      "Price": {
        "properties": {
          "amount": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "cycle": {
            "type": "string"
          },
          "product_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "setup_fee": {
            "type": "string"
          }
        },
        "required": [
          "currency",
          "cycle",
          "amount"
        ],
        "type": "object"
      },
      "PricesBody": {
        "properties": {
          "prices": {
            "items": {
              "$ref": "#/components/schemas/Price"
            },
            "type": "array"
          }
        },
        "required": [
          "prices"
        ],
        "type": "object"
      },
      "ProcessBody": {
        "additionalProperties": false,
        "properties": {
          "note": {
            "type": "string"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "status"
        ],
        "type": "object"
      },
      "ProductBilling": {
        "properties": {
          "invoice_days_before": {
            "description": "Days before the due date to generate the renewal invoice; null = default.",
            "format": "int32",
            "type": [
              "integer",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "ProductInput": {
        "additionalProperties": false,
        "properties": {
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "group_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "module": {
            "description": "Provisioning module id (plugin), or empty string to clear.",
            "type": [
              "string",
              "null"
            ]
          },
          "module_config": {},
          "name": {
            "type": [
              "string",
              "null"
            ]
          },
          "slug": {
            "type": [
              "string",
              "null"
            ]
          },
          "sort_order": {
            "format": "int32",
            "type": [
              "integer",
              "null"
            ]
          },
          "status": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "ProductModule": {
        "additionalProperties": false,
        "properties": {
          "config": {
            "type": "object"
          },
          "module": {
            "type": [
              "string",
              "null"
            ]
          },
          "server_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "ProductRate": {
        "properties": {
          "currency": {
            "description": "Required for `fixed`.",
            "type": [
              "string",
              "null"
            ]
          },
          "kind": {
            "description": "`percent` | `fixed`",
            "type": "string"
          },
          "product_id": {
            "format": "uuid",
            "type": "string"
          },
          "product_name": {
            "type": "string"
          },
          "value": {
            "type": "string"
          }
        },
        "required": [
          "product_id",
          "kind",
          "value"
        ],
        "type": "object"
      },
      "ProductStock": {
        "properties": {
          "allow_backorder": {
            "type": "boolean"
          },
          "stock_enabled": {
            "type": "boolean"
          },
          "stock_qty": {
            "format": "int32",
            "type": "integer"
          }
        },
        "required": [
          "stock_enabled",
          "stock_qty",
          "allow_backorder"
        ],
        "type": "object"
      },
      "Profile": {
        "additionalProperties": false,
        "description": "Editable profile fields (customer and staff).",
        "properties": {
          "address_line1": {
            "type": [
              "string",
              "null"
            ]
          },
          "address_line2": {
            "type": [
              "string",
              "null"
            ]
          },
          "city": {
            "type": [
              "string",
              "null"
            ]
          },
          "country": {
            "type": [
              "string",
              "null"
            ]
          },
          "currency": {
            "type": [
              "string",
              "null"
            ]
          },
          "first_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "last_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "organization": {
            "type": [
              "string",
              "null"
            ]
          },
          "phone": {
            "type": [
              "string",
              "null"
            ]
          },
          "postal_code": {
            "type": [
              "string",
              "null"
            ]
          },
          "region": {
            "type": [
              "string",
              "null"
            ]
          },
          "tax_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "vat_number": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "Proforma": {
        "additionalProperties": false,
        "properties": {
          "enabled": {
            "description": "Unpaid invoices carry no legal number; the next sequential number is assigned on payment.",
            "type": "boolean"
          }
        },
        "required": [
          "enabled"
        ],
        "type": "object"
      },
      "ProjectInput": {
        "properties": {
          "client_visible": {
            "type": "boolean"
          },
          "customer_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": "string"
          },
          "due_date": {
            "type": [
              "string",
              "null"
            ]
          },
          "hourly_rate": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "title"
        ],
        "type": "object"
      },
      "PutBody": {
        "properties": {
          "key": {
            "type": "string"
          },
          "lang": {
            "type": "string"
          },
          "value": {
            "type": "string"
          }
        },
        "required": [
          "lang",
          "key",
          "value"
        ],
        "type": "object"
      },
      "Question": {
        "properties": {
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "question": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "question"
        ],
        "type": "object"
      },
      "QuickLink": {
        "properties": {
          "label": {
            "type": "string"
          },
          "url": {
            "type": "string"
          }
        },
        "required": [
          "label",
          "url"
        ],
        "type": "object"
      },
      "QuoteInput": {
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string"
          },
          "customer_id": {
            "format": "uuid",
            "type": "string"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/QuoteItem"
            },
            "type": "array"
          },
          "notes": {
            "type": "string"
          },
          "subject": {
            "type": "string"
          },
          "valid_until": {
            "type": "string"
          }
        },
        "required": [
          "customer_id",
          "currency",
          "subject",
          "valid_until",
          "items"
        ],
        "type": "object"
      },
      "QuoteItem": {
        "properties": {
          "description": {
            "type": "string"
          },
          "quantity": {
            "type": "string"
          },
          "tax_rate": {
            "type": "string"
          },
          "unit_price": {
            "type": "string"
          }
        },
        "required": [
          "description",
          "quantity",
          "unit_price"
        ],
        "type": "object"
      },
      "RateBody": {
        "properties": {
          "comment": {
            "type": "string"
          },
          "rating": {
            "format": "int32",
            "type": "integer"
          }
        },
        "required": [
          "rating"
        ],
        "type": "object"
      },
      "RateSettingsInput": {
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "markup_percent": {
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "update_prices": {
            "type": "boolean"
          },
          "url": {
            "type": "string"
          }
        },
        "required": [
          "enabled",
          "source",
          "url",
          "markup_percent"
        ],
        "type": "object"
      },
      "Recommendations": {
        "properties": {
          "cross_sell": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "upsell": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "RecordBody": {
        "properties": {
          "idempotency_key": {
            "type": "string"
          },
          "metric": {
            "type": "string"
          },
          "quantity": {
            "type": "string"
          },
          "recorded_at": {
            "description": "Defaults to now; RFC 3339.",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "metric",
          "quantity",
          "idempotency_key"
        ],
        "type": "object"
      },
      "RecordPayment": {
        "additionalProperties": false,
        "properties": {
          "amount": {
            "type": "string"
          },
          "gateway": {
            "type": "string"
          },
          "idempotency_key": {
            "description": "Client-chosen key; replays with the same key are no-ops.",
            "type": "string"
          },
          "reference": {
            "description": "Bank reference etc.",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "amount",
          "idempotency_key"
        ],
        "type": "object"
      },
      "RedeemBody": {
        "additionalProperties": false,
        "properties": {
          "code": {
            "type": "string"
          }
        },
        "required": [
          "code"
        ],
        "type": "object"
      },
      "Refund": {
        "properties": {
          "amount": {
            "type": "string"
          },
          "created_at": {
            "type": "string"
          },
          "credit_note_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "currency": {
            "type": "string"
          },
          "customer_id": {
            "format": "uuid",
            "type": "string"
          },
          "error": {
            "type": [
              "string",
              "null"
            ]
          },
          "gateway": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "invoice_id": {
            "format": "uuid",
            "type": "string"
          },
          "payment_id": {
            "format": "uuid",
            "type": "string"
          },
          "provider_ref": {
            "type": [
              "string",
              "null"
            ]
          },
          "reason": {
            "type": "string"
          },
          "reversal": {
            "description": "Chargeback/reversal recorded by staff; the gateway was not called.",
            "type": "boolean"
          },
          "status": {
            "type": "string"
          },
          "to_credit": {
            "description": "Settled as account credit instead of through the gateway.",
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "payment_id",
          "invoice_id",
          "customer_id",
          "gateway",
          "amount",
          "currency",
          "status",
          "reason",
          "to_credit",
          "reversal",
          "created_at"
        ],
        "type": "object"
      },
      "RefundBody": {
        "additionalProperties": false,
        "properties": {
          "amount": {
            "description": "Omit for a full refund of what is left on the payment.",
            "type": [
              "string",
              "null"
            ]
          },
          "idempotency_key": {
            "description": "Client-chosen; replays with the same key return the same refund.",
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "reopen_invoice": {
            "description": "Reversal only: reopen the invoice as unpaid instead of issuing a\ncredit note. Defaults to the `billing.reversal` setting.",
            "type": [
              "boolean",
              "null"
            ]
          },
          "reversal": {
            "description": "Record a chargeback/reversal: the money is already gone, so the\ngateway is not called. Not combinable with `to_credit`.",
            "type": "boolean"
          },
          "suspend_services": {
            "description": "Reversal only, with reopen: suspend the invoice's services.",
            "type": [
              "boolean",
              "null"
            ]
          },
          "to_credit": {
            "description": "Add the refund to the customer's credit balance instead of the gateway.",
            "type": "boolean"
          }
        },
        "required": [
          "idempotency_key"
        ],
        "type": "object"
      },
      "RegisterBody": {
        "properties": {
          "display_name": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "password": {
            "type": "string"
          }
        },
        "required": [
          "email",
          "password"
        ],
        "type": "object"
      },
      "RegisterFinish": {
        "properties": {
          "challenge_id": {
            "format": "uuid",
            "type": "string"
          },
          "credential": {
            "type": "object"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "challenge_id",
          "name",
          "credential"
        ],
        "type": "object"
      },
      "RegisterStart": {
        "properties": {
          "code": {
            "type": "string"
          },
          "password": {
            "type": "string"
          }
        },
        "required": [
          "password"
        ],
        "type": "object"
      },
      "RejectBody": {
        "properties": {
          "note": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "RenewBody": {
        "properties": {
          "years": {
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "RenewalSettings": {
        "additionalProperties": false,
        "properties": {
          "enabled": {
            "description": "Clients may renew early from their service page.",
            "type": "boolean"
          },
          "max_days_ahead": {
            "description": "How many days before the due date (0 = any time).",
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "ReplyBody": {
        "properties": {
          "attachment_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "body": {
            "type": "string"
          },
          "internal": {
            "description": "Staff only: note invisible to the customer.",
            "type": "boolean"
          }
        },
        "required": [
          "body"
        ],
        "type": "object"
      },
      "Report": {
        "properties": {
          "churn": {
            "items": {
              "$ref": "#/components/schemas/ChurnPoint"
            },
            "type": "array"
          },
          "from": {
            "type": "string"
          },
          "mrr": {
            "items": {
              "$ref": "#/components/schemas/MoneyPoint"
            },
            "type": "array"
          },
          "refunds": {
            "items": {
              "$ref": "#/components/schemas/MoneyPoint"
            },
            "type": "array"
          },
          "revenue": {
            "items": {
              "$ref": "#/components/schemas/MoneyPoint"
            },
            "type": "array"
          },
          "to": {
            "type": "string"
          }
        },
        "required": [
          "from",
          "to",
          "revenue",
          "refunds",
          "mrr",
          "churn"
        ],
        "type": "object"
      },
      "Request": {
        "properties": {
          "decided_at": {
            "format": "date-time",
            "type": [
              "string",
              "null"
            ]
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "note": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "requested_at": {
            "format": "date-time",
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "subject_ref": {
            "type": "string"
          },
          "user_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "subject_ref",
          "status",
          "reason",
          "note",
          "requested_at"
        ],
        "type": "object"
      },
      "ResetBody": {
        "properties": {
          "password": {
            "type": "string"
          },
          "token": {
            "type": "string"
          }
        },
        "required": [
          "token",
          "password"
        ],
        "type": "object"
      },
      "ReversalSettings": {
        "additionalProperties": false,
        "properties": {
          "reopen_invoice": {
            "type": "boolean"
          },
          "suspend_services": {
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "ReviewBody": {
        "properties": {
          "approve": {
            "type": "boolean"
          },
          "note": {
            "type": "string"
          }
        },
        "required": [
          "approve"
        ],
        "type": "object"
      },
      "RoleInput": {
        "properties": {
          "description": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "permissions": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "RolesBody": {
        "properties": {
          "roles": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "roles"
        ],
        "type": "object"
      },
      "RuleBody": {
        "properties": {
          "add_tag": {
            "type": [
              "string",
              "null"
            ]
          },
          "after_minutes": {
            "format": "int32",
            "type": "integer"
          },
          "assign_to": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "department_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "is_active": {
            "type": "boolean"
          },
          "name": {
            "type": "string"
          },
          "priority": {
            "type": [
              "string",
              "null"
            ]
          },
          "set_department": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "set_priority": {
            "type": [
              "string",
              "null"
            ]
          },
          "statuses": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "name",
          "after_minutes"
        ],
        "type": "object"
      },
      "RuleInput": {
        "additionalProperties": false,
        "properties": {
          "compound": {
            "type": "boolean"
          },
          "country": {
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "is_vat": {
            "type": "boolean"
          },
          "name": {
            "type": "string"
          },
          "priority": {
            "format": "int32",
            "type": "integer"
          },
          "rate": {
            "type": "string"
          },
          "region": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "rate"
        ],
        "type": "object"
      },
      "RunBody": {
        "additionalProperties": false,
        "properties": {
          "date": {
            "description": "Run as of this date (YYYY-MM-DD); defaults to today.",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "RvAction": {
        "properties": {
          "action": {
            "description": "`verify` (staff confirmed it), `resend`, or `restart` (new request, new deadline).",
            "type": "string"
          }
        },
        "required": [
          "action"
        ],
        "type": "object"
      },
      "RvSettings": {
        "properties": {
          "enabled": {
            "type": "boolean"
          }
        },
        "required": [
          "enabled"
        ],
        "type": "object"
      },
      "ScheduleBody": {
        "properties": {
          "send_at": {
            "description": "RFC 3339 time in the future.",
            "type": "string"
          }
        },
        "required": [
          "send_at"
        ],
        "type": "object"
      },
      "Segment": {
        "properties": {
          "client_group_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "country": {
            "type": [
              "string",
              "null"
            ]
          },
          "currency": {
            "type": [
              "string",
              "null"
            ]
          },
          "customer_ids": {
            "description": "Mail merge to an explicit selection (e.g. from the clients list).",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "product_ids": {
            "description": "Customers with an active service of any of these products.",
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "statuses": {
            "description": "Customer statuses (default: active).",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "with_active_service": {
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "Server": {
        "properties": {
          "base_url": {
            "type": "string"
          },
          "config": {},
          "created_at": {
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "max_services": {
            "format": "int32",
            "type": [
              "integer",
              "null"
            ]
          },
          "module": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "services": {
            "format": "int64",
            "type": "integer"
          }
        },
        "required": [
          "id",
          "name",
          "module",
          "base_url",
          "config",
          "enabled",
          "services",
          "created_at"
        ],
        "type": "object"
      },
      "ServerInput": {
        "additionalProperties": false,
        "properties": {
          "api_key": {
            "description": "Required on create; omit on update to keep the stored key.",
            "type": [
              "string",
              "null"
            ]
          },
          "base_url": {
            "type": "string"
          },
          "config": {},
          "enabled": {
            "type": "boolean"
          },
          "max_services": {
            "format": "int32",
            "type": [
              "integer",
              "null"
            ]
          },
          "module": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "module",
          "base_url"
        ],
        "type": "object"
      },
      "ServiceAction": {
        "additionalProperties": false,
        "properties": {
          "action": {
            "description": "activate | suspend | unsuspend | terminate | cancel | fraud",
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "action"
        ],
        "type": "object"
      },
      "Session": {
        "properties": {
          "assigned_to": {
            "type": [
              "string",
              "null"
            ]
          },
          "created_at": {
            "type": "string"
          },
          "customer_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "email": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "last_body": {
            "type": [
              "string",
              "null"
            ]
          },
          "last_message_at": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "page": {
            "type": "string"
          },
          "staff_unread": {
            "format": "int32",
            "type": "integer"
          },
          "status": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "email",
          "page",
          "status",
          "staff_unread",
          "created_at",
          "last_message_at"
        ],
        "type": "object"
      },
      "SetAnswer": {
        "additionalProperties": false,
        "properties": {
          "answer": {
            "type": "string"
          },
          "password": {
            "description": "Current account password.",
            "type": "string"
          },
          "question_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "question_id",
          "answer",
          "password"
        ],
        "type": "object"
      },
      "SetPlugin": {
        "properties": {
          "enabled": {
            "type": "boolean"
          }
        },
        "required": [
          "enabled"
        ],
        "type": "object"
      },
      "Settings": {
        "additionalProperties": false,
        "properties": {
          "enabled": {
            "default": false,
            "type": "boolean"
          },
          "inactive_days": {
            "default": 0,
            "description": "Days without any activity (0 when disabled, else 365..=3650).",
            "format": "int32",
            "type": "integer"
          },
          "max_per_run": {
            "default": 0,
            "description": "Upper bound per run (1..=500).",
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "SetupResponse": {
        "properties": {
          "otpauth_url": {
            "type": "string"
          },
          "secret": {
            "description": "Base32 seed, shown once to the enrolling user only.",
            "type": "string"
          }
        },
        "required": [
          "secret",
          "otpauth_url"
        ],
        "type": "object"
      },
      "SmtpInput": {
        "additionalProperties": false,
        "properties": {
          "clear_password": {
            "description": "Remove the stored password.",
            "type": "boolean"
          },
          "enabled": {
            "type": "boolean"
          },
          "from_address": {
            "type": "string"
          },
          "from_name": {
            "type": "string"
          },
          "host": {
            "type": "string"
          },
          "password": {
            "description": "New password. Omit or null to keep the stored one.",
            "type": [
              "string",
              "null"
            ]
          },
          "port": {
            "format": "int32",
            "minimum": 0,
            "type": "integer"
          },
          "security": {
            "type": "string"
          },
          "username": {
            "type": "string"
          }
        },
        "required": [
          "enabled",
          "host",
          "port",
          "security",
          "from_address"
        ],
        "type": "object"
      },
      "SmtpTest": {
        "properties": {
          "to": {
            "type": "string"
          }
        },
        "required": [
          "to"
        ],
        "type": "object"
      },
      "SmtpTestResult": {
        "properties": {
          "error": {
            "description": "Transport error text when `ok` is false.",
            "type": [
              "string",
              "null"
            ]
          },
          "ok": {
            "type": "boolean"
          }
        },
        "required": [
          "ok"
        ],
        "type": "object"
      },
      "SmtpView": {
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "encryption_available": {
            "description": "False when PELTY_ENCRYPTION_KEY is unset (passwords cannot be stored).",
            "type": "boolean"
          },
          "from_address": {
            "type": "string"
          },
          "from_name": {
            "type": "string"
          },
          "host": {
            "type": "string"
          },
          "password_set": {
            "type": "boolean"
          },
          "port": {
            "format": "int32",
            "minimum": 0,
            "type": "integer"
          },
          "security": {
            "description": "`tls` | `starttls` | `none`",
            "type": "string"
          },
          "source": {
            "description": "Which transport is live now: `settings`, `env` or `log`.",
            "type": "string"
          },
          "username": {
            "type": "string"
          }
        },
        "required": [
          "enabled",
          "host",
          "port",
          "security",
          "username",
          "password_set",
          "from_address",
          "from_name",
          "source",
          "encryption_available"
        ],
        "type": "object"
      },
      "SplitBody": {
        "properties": {
          "message_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "type": "array"
          },
          "subject": {
            "type": "string"
          }
        },
        "required": [
          "message_ids",
          "subject"
        ],
        "type": "object"
      },
      "SslCheck": {
        "properties": {
          "checked_at": {
            "type": "string"
          },
          "customer_id": {
            "format": "uuid",
            "type": "string"
          },
          "domain": {
            "type": "string"
          },
          "domain_id": {
            "format": "uuid",
            "type": "string"
          },
          "error": {
            "type": "string"
          },
          "expires_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "issuer": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "valid_from": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "domain_id",
          "domain",
          "customer_id",
          "status",
          "issuer",
          "error",
          "checked_at"
        ],
        "type": "object"
      },
      "StartBody": {
        "properties": {
          "challenge": {
            "type": "string"
          }
        },
        "required": [
          "challenge"
        ],
        "type": "object"
      },
      "StatusInput": {
        "properties": {
          "awaiting_staff": {
            "type": "boolean"
          },
          "color": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "sort_order": {
            "format": "int32",
            "type": "integer"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "Step": {
        "properties": {
          "done": {
            "type": "boolean"
          },
          "href": {
            "description": "Admin route that configures it.",
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "optional": {
            "description": "Optional steps don't block \"complete\".",
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "done",
          "optional",
          "href"
        ],
        "type": "object"
      },
      "Support": {
        "properties": {
          "attachment_max_mb": {
            "default": 5,
            "description": "Max size per ticket attachment, in MiB (1..=50).",
            "format": "int32",
            "minimum": 0,
            "type": "integer"
          },
          "attachments_per_message": {
            "default": 5,
            "description": "Max files per ticket message (1..=20).",
            "format": "int32",
            "minimum": 0,
            "type": "integer"
          },
          "live_chat": {
            "default": false,
            "description": "Show the public live-chat widget.",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "SyncBody": {
        "properties": {
          "only_missing": {
            "description": "Keep prices that already exist in the target currency.",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "SyncLine": {
        "properties": {
          "action": {
            "description": "`updated`, `unchanged`, `no_rule`, `not_listed` (TLD not in our price list for this registrar/currency).",
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "new_register": {
            "type": [
              "string",
              "null"
            ]
          },
          "new_renew": {
            "type": [
              "string",
              "null"
            ]
          },
          "new_transfer": {
            "type": [
              "string",
              "null"
            ]
          },
          "old_register": {
            "type": [
              "string",
              "null"
            ]
          },
          "old_renew": {
            "type": [
              "string",
              "null"
            ]
          },
          "old_transfer": {
            "type": [
              "string",
              "null"
            ]
          },
          "tld": {
            "type": "string"
          }
        },
        "required": [
          "tld",
          "currency",
          "action"
        ],
        "type": "object"
      },
      "SystemUrls": {
        "properties": {
          "privacy_url": {
            "default": "",
            "type": "string"
          },
          "support_url": {
            "default": "",
            "type": "string"
          },
          "system_url": {
            "default": "",
            "type": "string"
          },
          "terms_url": {
            "default": "",
            "type": "string"
          }
        },
        "type": "object"
      },
      "TagsBody": {
        "properties": {
          "tags": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "tags"
        ],
        "type": "object"
      },
      "TaskInput": {
        "properties": {
          "assignee_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "due_date": {
            "type": [
              "string",
              "null"
            ]
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "title"
        ],
        "type": "object"
      },
      "TaskState": {
        "properties": {
          "done": {
            "type": "boolean"
          }
        },
        "required": [
          "done"
        ],
        "type": "object"
      },
      "TaxReport": {
        "properties": {
          "from": {
            "type": "string"
          },
          "rows": {
            "items": {
              "$ref": "#/components/schemas/TaxRow"
            },
            "type": "array"
          },
          "to": {
            "type": "string"
          },
          "totals": {
            "description": "Per-currency totals (currencies are never summed together).",
            "items": {
              "$ref": "#/components/schemas/TaxTotal"
            },
            "type": "array"
          }
        },
        "required": [
          "from",
          "to",
          "rows",
          "totals"
        ],
        "type": "object"
      },
      "TaxRow": {
        "properties": {
          "country": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "documents": {
            "format": "int64",
            "type": "integer"
          },
          "gross": {
            "type": "string"
          },
          "net": {
            "type": "string"
          },
          "period": {
            "description": "`YYYY-MM`",
            "type": "string"
          },
          "rate": {
            "type": "string"
          },
          "reverse_charge": {
            "type": "boolean"
          },
          "tax": {
            "type": "string"
          }
        },
        "required": [
          "period",
          "country",
          "currency",
          "rate",
          "reverse_charge",
          "documents",
          "net",
          "tax",
          "gross"
        ],
        "type": "object"
      },
      "TaxRule": {
        "properties": {
          "compound": {
            "type": "boolean"
          },
          "country": {
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "is_vat": {
            "type": "boolean"
          },
          "name": {
            "type": "string"
          },
          "priority": {
            "format": "int32",
            "type": "integer"
          },
          "rate": {
            "type": "string"
          },
          "region": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "country",
          "region",
          "rate",
          "compound",
          "is_vat",
          "priority",
          "enabled"
        ],
        "type": "object"
      },
      "TaxSettings": {
        "additionalProperties": false,
        "properties": {
          "enabled": {
            "default": false,
            "description": "Apply tax rules to invoices at all.",
            "type": "boolean"
          },
          "home_country": {
            "default": "",
            "description": "Seller country (ISO 3166-1 alpha-2), used for EU reverse charge.",
            "type": "string"
          },
          "inclusive": {
            "default": false,
            "description": "Catalog prices are gross (tax included).",
            "type": "boolean"
          },
          "require_vies": {
            "default": false,
            "description": "Reverse charge only for VAT numbers verified valid in VIES (not just\nwell-formed).",
            "type": "boolean"
          },
          "reverse_charge": {
            "default": false,
            "description": "Apply EU VAT reverse charge to cross-border B2B customers.",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "TaxTotal": {
        "properties": {
          "currency": {
            "type": "string"
          },
          "gross": {
            "type": "string"
          },
          "net": {
            "type": "string"
          },
          "tax": {
            "type": "string"
          }
        },
        "required": [
          "currency",
          "net",
          "tax",
          "gross"
        ],
        "type": "object"
      },
      "TemplateBody": {
        "properties": {
          "body": {
            "type": "string"
          },
          "subject": {
            "type": "string"
          }
        },
        "required": [
          "subject",
          "body"
        ],
        "type": "object"
      },
      "TestWebhook": {
        "properties": {
          "body": {
            "type": "string"
          },
          "headers": {
            "additionalProperties": {
              "type": "string"
            },
            "propertyNames": {
              "type": "string"
            },
            "type": "object"
          },
          "now": {
            "description": "Unix seconds used for timestamp checks (default: now).",
            "format": "int64",
            "type": [
              "integer",
              "null"
            ]
          }
        },
        "required": [
          "body"
        ],
        "type": "object"
      },
      "TicketStatus": {
        "properties": {
          "awaiting_staff": {
            "type": "boolean"
          },
          "builtin": {
            "type": "boolean"
          },
          "color": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "sort_order": {
            "format": "int32",
            "type": "integer"
          }
        },
        "required": [
          "slug",
          "name",
          "color",
          "sort_order",
          "awaiting_staff",
          "builtin"
        ],
        "type": "object"
      },
      "Tier": {
        "properties": {
          "commission_percent": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "min_referrals": {
            "format": "int32",
            "type": "integer"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "min_referrals",
          "commission_percent"
        ],
        "type": "object"
      },
      "TierInput": {
        "additionalProperties": false,
        "properties": {
          "commission_percent": {
            "type": "string"
          },
          "min_referrals": {
            "format": "int32",
            "type": "integer"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "min_referrals",
          "commission_percent"
        ],
        "type": "object"
      },
      "TimeInput": {
        "properties": {
          "billable": {
            "type": "boolean"
          },
          "minutes": {
            "format": "int32",
            "type": "integer"
          },
          "note": {
            "type": "string"
          },
          "spent_on": {
            "type": [
              "string",
              "null"
            ]
          },
          "task_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "minutes"
        ],
        "type": "object"
      },
      "TldField": {
        "properties": {
          "id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "key": {
            "type": "string"
          },
          "kind": {
            "description": "`text`, `select` or `checkbox`.",
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "max_length": {
            "format": "int32",
            "type": "integer"
          },
          "options": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "required": {
            "type": "boolean"
          },
          "sort_order": {
            "format": "int32",
            "type": "integer"
          },
          "tld": {
            "type": "string"
          }
        },
        "required": [
          "tld",
          "key",
          "label",
          "kind"
        ],
        "type": "object"
      },
      "TodoInput": {
        "properties": {
          "assigned_to": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": "string"
          },
          "due_date": {
            "description": "YYYY-MM-DD",
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string"
          },
          "title": {
            "type": "string"
          }
        },
        "required": [
          "title"
        ],
        "type": "object"
      },
      "TokenBody": {
        "properties": {
          "token": {
            "type": "string"
          }
        },
        "required": [
          "token"
        ],
        "type": "object"
      },
      "TrackBody": {
        "additionalProperties": false,
        "properties": {
          "code": {
            "type": "string"
          }
        },
        "required": [
          "code"
        ],
        "type": "object"
      },
      "TrustedProxies": {
        "additionalProperties": false,
        "properties": {
          "proxies": {
            "description": "IP addresses or CIDR ranges of reverse proxies / load balancers.",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "proxies"
        ],
        "type": "object"
      },
      "TwoFaBody": {
        "properties": {
          "required": {
            "type": "boolean"
          }
        },
        "required": [
          "required"
        ],
        "type": "object"
      },
      "TxNote": {
        "properties": {
          "note": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "UpcomingService": {
        "properties": {
          "currency": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "next_due_date": {
            "type": "string"
          },
          "product_name": {
            "type": "string"
          },
          "recurring_amount": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "product_name",
          "next_due_date",
          "currency",
          "recurring_amount"
        ],
        "type": "object"
      },
      "UpdateBody": {
        "properties": {
          "assigned_to": {
            "description": "`null` unassigns; omit to keep.",
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "department_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "priority": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "UpdateConfig": {
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "url": {
            "description": "Empty = the official release feed.",
            "type": "string"
          }
        },
        "required": [
          "enabled"
        ],
        "type": "object"
      },
      "UpdateGateway": {
        "properties": {
          "config": {
            "type": "object"
          },
          "enabled": {
            "type": "boolean"
          },
          "secret_refs": {
            "description": "Secret name → environment variable NAME (never the secret value).",
            "type": "object"
          }
        },
        "required": [
          "enabled",
          "config"
        ],
        "type": "object"
      },
      "ValuesBody": {
        "properties": {
          "values": {
            "type": "object"
          }
        },
        "required": [
          "values"
        ],
        "type": "object"
      },
      "VerifyBody": {
        "properties": {
          "directory": {
            "type": [
              "string",
              "null"
            ]
          },
          "domain": {
            "type": [
              "string",
              "null"
            ]
          },
          "ip": {
            "type": [
              "string",
              "null"
            ]
          },
          "key": {
            "type": "string"
          }
        },
        "required": [
          "key"
        ],
        "type": "object"
      },
      "VoteBody": {
        "properties": {
          "helpful": {
            "type": "boolean"
          }
        },
        "required": [
          "helpful"
        ],
        "type": "object"
      },
      "WebhookBody": {
        "properties": {
          "url": {
            "description": "Empty or null clears the override.",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "Wizard": {
        "properties": {
          "complete": {
            "type": "boolean"
          },
          "dismissed": {
            "type": "boolean"
          },
          "show": {
            "description": "Show the wizard: not dismissed and required steps open.",
            "type": "boolean"
          },
          "steps": {
            "items": {
              "$ref": "#/components/schemas/Step"
            },
            "type": "array"
          }
        },
        "required": [
          "steps",
          "complete",
          "dismissed",
          "show"
        ],
        "type": "object"
      }
    },
    "securitySchemes": {
      "api_key": {
        "bearerFormat": "pelty_…",
        "scheme": "bearer",
        "type": "http"
      },
      "session": {
        "in": "cookie",
        "name": "pelty_session",
        "type": "apiKey"
      }
    }
  },
  "info": {
    "description": "",
    "license": {
      "identifier": "Proprietary",
      "name": "Proprietary"
    },
    "title": "PeltyCMS API",
    "version": "1"
  },
  "openapi": "3.1.0",
  "paths": {
    "/.well-known/openid-configuration": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "discovery",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "discovery",
        "tags": [
          ".well-known"
        ],
        "x-handler": "discovery",
        "x-source": "crates/pelty-api/src/oidc_provider.rs",
        "x-undocumented": true
      }
    },
    "/api/openapi.json": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "routes_openapi_spec",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "spec",
        "tags": [
          "api"
        ],
        "x-handler": "routes::openapi::spec",
        "x-source": "crates/pelty-api/src/lib.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/account/identities": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "list_identities",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "list identities",
        "tags": [
          "account"
        ],
        "x-handler": "list_identities",
        "x-source": "crates/pelty-api/src/oauth.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/account/identities/{id}": {
      "delete": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "unlink",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "unlink",
        "tags": [
          "account"
        ],
        "x-handler": "unlink",
        "x-source": "crates/pelty-api/src/oauth.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/account/oauth-apps": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "my_apps",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "my apps",
        "tags": [
          "account"
        ],
        "x-handler": "my_apps",
        "x-source": "crates/pelty-api/src/oidc_provider.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/account/oauth-apps/{id}": {
      "delete": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "my_revoke",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "my revoke",
        "tags": [
          "account"
        ],
        "x-handler": "my_revoke",
        "x-source": "crates/pelty-api/src/oidc_provider.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/account/privacy/erasure": {
      "delete": {
        "operationId": "cancel_erasure",
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::gdpr"
        ],
        "x-handler": "cancel_erasure",
        "x-source": "crates/pelty-api/src/routes/gdpr.rs"
      },
      "get": {
        "operationId": "my_request",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::gdpr"
        ],
        "x-handler": "my_request",
        "x-source": "crates/pelty-api/src/routes/gdpr.rs"
      },
      "post": {
        "operationId": "request_erasure",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ErasureBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::gdpr"
        ],
        "x-handler": "request_erasure",
        "x-source": "crates/pelty-api/src/routes/gdpr.rs"
      }
    },
    "/api/v1/account/privacy/export": {
      "get": {
        "operationId": "export_me",
        "responses": {
          "200": {
            "description": "JSON download of all personal data"
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::gdpr"
        ],
        "x-handler": "export_me",
        "x-source": "crates/pelty-api/src/routes/gdpr.rs"
      }
    },
    "/api/v1/account/security-question": {
      "delete": {
        "operationId": "clear_mine",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::security_questions"
        ],
        "x-handler": "clear_mine",
        "x-source": "crates/pelty-api/src/routes/security_questions.rs"
      },
      "get": {
        "operationId": "my_question",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::security_questions"
        ],
        "x-handler": "my_question",
        "x-source": "crates/pelty-api/src/routes/security_questions.rs"
      },
      "put": {
        "operationId": "set_mine",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetAnswer"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          },
          "429": {
            "description": ""
          }
        },
        "tags": [
          "super::security_questions"
        ],
        "x-handler": "set_mine",
        "x-source": "crates/pelty-api/src/routes/security_questions.rs"
      }
    },
    "/api/v1/account/tos": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "my_tos",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "my tos",
        "tags": [
          "account"
        ],
        "x-handler": "my_tos",
        "x-source": "crates/pelty-api/src/security.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/account/tos/accept": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "accept_tos",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "accept tos",
        "tags": [
          "account"
        ],
        "x-handler": "accept_tos",
        "x-source": "crates/pelty-api/src/security.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/addons/{id}/ui-token": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "ui_token",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "ui token",
        "tags": [
          "addons"
        ],
        "x-handler": "ui_token",
        "x-source": "crates/pelty-api/src/addon_ext.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/addons/{id}/{*rest}": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "dispatch",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "dispatch",
        "tags": [
          "addons"
        ],
        "x-handler": "dispatch",
        "x-source": "crates/pelty-api/src/addon_ext.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/addons": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "list",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "list",
        "tags": [
          "addons"
        ],
        "x-handler": "list",
        "x-source": "crates/pelty-api/src/addons.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/addons/mixins": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "mixins_list",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "mixins list",
        "tags": [
          "addons"
        ],
        "x-handler": "mixins_list",
        "x-source": "crates/pelty-api/src/addons.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/addons/registry": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "registry_index",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "registry index",
        "tags": [
          "addons"
        ],
        "x-handler": "registry_index",
        "x-source": "crates/pelty-api/src/addons.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/addons/registry/settings": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "registry_settings",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "registry settings",
        "tags": [
          "addons"
        ],
        "x-handler": "registry_settings",
        "x-source": "crates/pelty-api/src/addons.rs",
        "x-undocumented": true
      },
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "put_registry_settings",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "put registry settings",
        "tags": [
          "addons"
        ],
        "x-handler": "put_registry_settings",
        "x-source": "crates/pelty-api/src/addons.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/addons/registry/{id}/install": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "registry_install",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "registry install",
        "tags": [
          "addons"
        ],
        "x-handler": "registry_install",
        "x-source": "crates/pelty-api/src/addons.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/addons/upload": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "upload",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "upload",
        "tags": [
          "addons"
        ],
        "x-handler": "upload",
        "x-source": "crates/pelty-api/src/addons.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/addons/{id}": {
      "delete": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "uninstall",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "uninstall",
        "tags": [
          "addons"
        ],
        "x-handler": "uninstall",
        "x-source": "crates/pelty-api/src/addons.rs",
        "x-undocumented": true
      },
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "detail",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "detail",
        "tags": [
          "addons"
        ],
        "x-handler": "detail",
        "x-source": "crates/pelty-api/src/addons.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/addons/{id}/disable": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "disable",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "disable",
        "tags": [
          "addons"
        ],
        "x-handler": "disable",
        "x-source": "crates/pelty-api/src/addons.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/addons/{id}/enable": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "enable",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "enable",
        "tags": [
          "addons"
        ],
        "x-handler": "enable",
        "x-source": "crates/pelty-api/src/addons.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/addons/{id}/install": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "install",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "install",
        "tags": [
          "addons"
        ],
        "x-handler": "install",
        "x-source": "crates/pelty-api/src/addons.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/addons/{id}/mixins": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "mixins_toggle",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "mixins toggle",
        "tags": [
          "addons"
        ],
        "x-handler": "mixins_toggle",
        "x-source": "crates/pelty-api/src/addons.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/addons/{id}/settings": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "get_settings",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "get settings",
        "tags": [
          "addons"
        ],
        "x-handler": "get_settings",
        "x-source": "crates/pelty-api/src/addons.rs",
        "x-undocumented": true
      },
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "put_settings",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "put settings",
        "tags": [
          "addons"
        ],
        "x-handler": "put_settings",
        "x-source": "crates/pelty-api/src/addons.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/affiliates": {
      "get": {
        "operationId": "admin_list",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::affiliates"
        ],
        "x-handler": "admin_list",
        "x-source": "crates/pelty-api/src/routes/affiliates.rs"
      }
    },
    "/api/v1/admin/affiliates/materials": {
      "get": {
        "operationId": "materials_list",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::affiliate_extras"
        ],
        "x-handler": "materials_list",
        "x-source": "crates/pelty-api/src/routes/affiliate_extras.rs"
      },
      "post": {
        "operationId": "materials_create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MaterialInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::affiliate_extras"
        ],
        "x-handler": "materials_create",
        "x-source": "crates/pelty-api/src/routes/affiliate_extras.rs"
      }
    },
    "/api/v1/admin/affiliates/materials/{id}": {
      "delete": {
        "operationId": "materials_delete",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::affiliate_extras"
        ],
        "x-handler": "materials_delete",
        "x-source": "crates/pelty-api/src/routes/affiliate_extras.rs"
      },
      "put": {
        "operationId": "materials_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MaterialInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::affiliate_extras"
        ],
        "x-handler": "materials_update",
        "x-source": "crates/pelty-api/src/routes/affiliate_extras.rs"
      }
    },
    "/api/v1/admin/affiliates/payouts": {
      "get": {
        "operationId": "admin_payouts",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::affiliates"
        ],
        "x-handler": "admin_payouts",
        "x-source": "crates/pelty-api/src/routes/affiliates.rs"
      }
    },
    "/api/v1/admin/affiliates/payouts/{id}": {
      "post": {
        "operationId": "admin_process",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProcessBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::affiliates"
        ],
        "x-handler": "admin_process",
        "x-source": "crates/pelty-api/src/routes/affiliates.rs"
      }
    },
    "/api/v1/admin/affiliates/product-rates": {
      "get": {
        "operationId": "rates_list",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::affiliate_extras"
        ],
        "x-handler": "rates_list",
        "x-source": "crates/pelty-api/src/routes/affiliate_extras.rs"
      },
      "put": {
        "operationId": "rates_set",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductRate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::affiliate_extras"
        ],
        "x-handler": "rates_set",
        "x-source": "crates/pelty-api/src/routes/affiliate_extras.rs"
      }
    },
    "/api/v1/admin/affiliates/product-rates/{product_id}": {
      "delete": {
        "operationId": "rates_delete",
        "parameters": [
          {
            "in": "path",
            "name": "product_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::affiliate_extras"
        ],
        "x-handler": "rates_delete",
        "x-source": "crates/pelty-api/src/routes/affiliate_extras.rs"
      }
    },
    "/api/v1/admin/affiliates/tiers": {
      "get": {
        "operationId": "tiers_list",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::affiliate_extras"
        ],
        "x-handler": "tiers_list",
        "x-source": "crates/pelty-api/src/routes/affiliate_extras.rs"
      },
      "post": {
        "operationId": "tiers_create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TierInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::affiliate_extras"
        ],
        "x-handler": "tiers_create",
        "x-source": "crates/pelty-api/src/routes/affiliate_extras.rs"
      }
    },
    "/api/v1/admin/affiliates/tiers/{id}": {
      "delete": {
        "operationId": "tiers_delete",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::affiliate_extras"
        ],
        "x-handler": "tiers_delete",
        "x-source": "crates/pelty-api/src/routes/affiliate_extras.rs"
      }
    },
    "/api/v1/admin/affiliates/{id}": {
      "put": {
        "operationId": "admin_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AffiliateUpdate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::affiliates"
        ],
        "x-handler": "admin_update",
        "x-source": "crates/pelty-api/src/routes/affiliates.rs"
      }
    },
    "/api/v1/admin/announcements": {
      "get": {
        "operationId": "admin_announcements",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::content"
        ],
        "x-handler": "admin_announcements",
        "x-source": "crates/pelty-api/src/routes/content.rs"
      },
      "post": {
        "operationId": "create_announcement",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnnouncementBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::content"
        ],
        "x-handler": "create_announcement",
        "x-source": "crates/pelty-api/src/routes/content.rs"
      }
    },
    "/api/v1/admin/announcements/{id}": {
      "delete": {
        "operationId": "delete_announcement",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::content"
        ],
        "x-handler": "delete_announcement",
        "x-source": "crates/pelty-api/src/routes/content.rs"
      },
      "put": {
        "operationId": "update_announcement",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnnouncementBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::content"
        ],
        "x-handler": "update_announcement",
        "x-source": "crates/pelty-api/src/routes/content.rs"
      }
    },
    "/api/v1/admin/api-keys": {
      "get": {
        "operationId": "admin_list",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "description": "Only keys that are neither revoked nor expired.",
            "in": "query",
            "name": "active",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "user_id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "description": "Matches owner email, key name or exact prefix.",
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::api_keys"
        ],
        "x-handler": "admin_list",
        "x-source": "crates/pelty-api/src/routes/api_keys.rs"
      }
    },
    "/api/v1/admin/api-keys/{id}": {
      "delete": {
        "operationId": "admin_revoke",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::api_keys"
        ],
        "x-handler": "admin_revoke",
        "x-source": "crates/pelty-api/src/routes/api_keys.rs"
      }
    },
    "/api/v1/admin/audit-logs": {
      "get": {
        "operationId": "list_audit",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "description": "Action prefix, e.g. `invoice.`.",
            "in": "query",
            "name": "action",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "description": "Actor email substring.",
            "in": "query",
            "name": "actor",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "target",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::admin"
        ],
        "x-handler": "list_audit",
        "x-source": "crates/pelty-api/src/routes/admin.rs"
      }
    },
    "/api/v1/admin/automation": {
      "get": {
        "operationId": "overview",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::automation"
        ],
        "x-handler": "overview",
        "x-source": "crates/pelty-api/src/routes/automation.rs"
      }
    },
    "/api/v1/admin/automation/{kind}/run": {
      "post": {
        "operationId": "run_now",
        "parameters": [
          {
            "in": "path",
            "name": "kind",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::automation"
        ],
        "x-handler": "run_now",
        "x-source": "crates/pelty-api/src/routes/automation.rs"
      }
    },
    "/api/v1/admin/automation/{kind}/settings": {
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "put_setting",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "put setting",
        "tags": [
          "automation"
        ],
        "x-handler": "put_setting",
        "x-source": "crates/pelty-api/src/routes/automation.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/autopay/run": {
      "post": {
        "operationId": "run_now",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RunBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "summary": "Run auto-pay now (idempotent with the daily job).",
        "tags": [
          "super::payment_methods"
        ],
        "x-handler": "run_now",
        "x-source": "crates/pelty-api/src/routes/payment_methods.rs"
      }
    },
    "/api/v1/admin/backups": {
      "get": {
        "operationId": "list_backups",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_ops"
        ],
        "x-handler": "list_backups",
        "x-source": "crates/pelty-api/src/routes/admin_ops.rs"
      },
      "post": {
        "operationId": "create_backup",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_ops"
        ],
        "x-handler": "create_backup",
        "x-source": "crates/pelty-api/src/routes/admin_ops.rs"
      }
    },
    "/api/v1/admin/backups/{id}": {
      "delete": {
        "operationId": "delete_backup",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_ops"
        ],
        "x-handler": "delete_backup",
        "x-source": "crates/pelty-api/src/routes/admin_ops.rs"
      }
    },
    "/api/v1/admin/backups/{id}/download": {
      "get": {
        "operationId": "download_backup",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_ops"
        ],
        "x-handler": "download_backup",
        "x-source": "crates/pelty-api/src/routes/admin_ops.rs"
      }
    },
    "/api/v1/admin/banned-emails": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "list",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "list",
        "tags": [
          "banned-emails"
        ],
        "x-handler": "list",
        "x-source": "crates/pelty-api/src/routes/banned_emails.rs",
        "x-undocumented": true
      },
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "add",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "add",
        "tags": [
          "banned-emails"
        ],
        "x-handler": "add",
        "x-source": "crates/pelty-api/src/routes/banned_emails.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/banned-emails/{domain}": {
      "delete": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "remove",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "remove",
        "tags": [
          "banned-emails"
        ],
        "x-handler": "remove",
        "x-source": "crates/pelty-api/src/routes/banned_emails.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/billable-items": {
      "get": {
        "operationId": "list",
        "parameters": [
          {
            "in": "query",
            "name": "customer_id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::billable"
        ],
        "x-handler": "list",
        "x-source": "crates/pelty-api/src/routes/billable.rs"
      },
      "post": {
        "operationId": "create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BillableInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::billable"
        ],
        "x-handler": "create",
        "x-source": "crates/pelty-api/src/routes/billable.rs"
      }
    },
    "/api/v1/admin/billable-items/{id}": {
      "delete": {
        "operationId": "remove",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::billable"
        ],
        "x-handler": "remove",
        "x-source": "crates/pelty-api/src/routes/billable.rs"
      }
    },
    "/api/v1/admin/bundles": {
      "get": {
        "operationId": "admin_list",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::bundles"
        ],
        "x-handler": "admin_list",
        "x-source": "crates/pelty-api/src/routes/bundles.rs"
      },
      "post": {
        "operationId": "admin_create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BundleInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::bundles"
        ],
        "x-handler": "admin_create",
        "x-source": "crates/pelty-api/src/routes/bundles.rs"
      }
    },
    "/api/v1/admin/bundles/{id}": {
      "delete": {
        "operationId": "admin_delete",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::bundles"
        ],
        "x-handler": "admin_delete",
        "x-source": "crates/pelty-api/src/routes/bundles.rs"
      },
      "put": {
        "operationId": "admin_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BundleInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::bundles"
        ],
        "x-handler": "admin_update",
        "x-source": "crates/pelty-api/src/routes/bundles.rs"
      }
    },
    "/api/v1/admin/calendar": {
      "get": {
        "operationId": "calendar",
        "parameters": [
          {
            "in": "query",
            "name": "month",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_ops"
        ],
        "x-handler": "calendar",
        "x-source": "crates/pelty-api/src/routes/admin_ops.rs"
      }
    },
    "/api/v1/admin/campaigns": {
      "get": {
        "operationId": "list",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::campaigns"
        ],
        "x-handler": "list",
        "x-source": "crates/pelty-api/src/routes/campaigns.rs"
      },
      "post": {
        "operationId": "create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CampaignInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::campaigns"
        ],
        "x-handler": "create",
        "x-source": "crates/pelty-api/src/routes/campaigns.rs"
      }
    },
    "/api/v1/admin/campaigns/preview": {
      "post": {
        "operationId": "preview",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Segment"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::campaigns"
        ],
        "x-handler": "preview",
        "x-source": "crates/pelty-api/src/routes/campaigns.rs"
      }
    },
    "/api/v1/admin/campaigns/{id}": {
      "delete": {
        "operationId": "remove",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::campaigns"
        ],
        "x-handler": "remove",
        "x-source": "crates/pelty-api/src/routes/campaigns.rs"
      },
      "get": {
        "operationId": "detail",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::campaigns"
        ],
        "x-handler": "detail",
        "x-source": "crates/pelty-api/src/routes/campaigns.rs"
      },
      "put": {
        "operationId": "update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CampaignInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::campaigns"
        ],
        "x-handler": "update",
        "x-source": "crates/pelty-api/src/routes/campaigns.rs"
      }
    },
    "/api/v1/admin/campaigns/{id}/cancel": {
      "post": {
        "operationId": "cancel",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::campaigns"
        ],
        "x-handler": "cancel",
        "x-source": "crates/pelty-api/src/routes/campaigns.rs"
      }
    },
    "/api/v1/admin/campaigns/{id}/schedule": {
      "delete": {
        "operationId": "unschedule",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::campaigns"
        ],
        "x-handler": "unschedule",
        "x-source": "crates/pelty-api/src/routes/campaigns.rs"
      },
      "post": {
        "operationId": "schedule",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScheduleBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Hold a draft until `send_at`; the worker snapshots recipients then.",
        "tags": [
          "super::campaigns"
        ],
        "x-handler": "schedule",
        "x-source": "crates/pelty-api/src/routes/campaigns.rs"
      }
    },
    "/api/v1/admin/campaigns/{id}/send": {
      "post": {
        "operationId": "send",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::campaigns"
        ],
        "x-handler": "send",
        "x-source": "crates/pelty-api/src/routes/campaigns.rs"
      }
    },
    "/api/v1/admin/cancellations": {
      "get": {
        "operationId": "admin_cancellations",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::service_changes"
        ],
        "x-handler": "admin_cancellations",
        "x-source": "crates/pelty-api/src/routes/service_changes.rs"
      }
    },
    "/api/v1/admin/cancellations/{id}/decide": {
      "post": {
        "operationId": "admin_decide",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DecideBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::service_changes"
        ],
        "x-handler": "admin_decide",
        "x-source": "crates/pelty-api/src/routes/service_changes.rs"
      }
    },
    "/api/v1/admin/catalog/addons": {
      "get": {
        "operationId": "admin_addons",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::catalog"
        ],
        "x-handler": "admin_addons",
        "x-source": "crates/pelty-api/src/routes/catalog.rs"
      },
      "post": {
        "operationId": "create_addon",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddonInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::catalog"
        ],
        "x-handler": "create_addon",
        "x-source": "crates/pelty-api/src/routes/catalog.rs"
      }
    },
    "/api/v1/admin/catalog/addons/{id}": {
      "put": {
        "operationId": "update_addon",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddonInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::catalog"
        ],
        "x-handler": "update_addon",
        "x-source": "crates/pelty-api/src/routes/catalog.rs"
      }
    },
    "/api/v1/admin/catalog/groups": {
      "get": {
        "operationId": "admin_groups",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::catalog"
        ],
        "x-handler": "admin_groups",
        "x-source": "crates/pelty-api/src/routes/catalog.rs"
      },
      "post": {
        "operationId": "create_group",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GroupBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::catalog"
        ],
        "x-handler": "create_group",
        "x-source": "crates/pelty-api/src/routes/catalog.rs"
      }
    },
    "/api/v1/admin/catalog/products": {
      "get": {
        "operationId": "admin_products",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::catalog"
        ],
        "x-handler": "admin_products",
        "x-source": "crates/pelty-api/src/routes/catalog.rs"
      },
      "post": {
        "operationId": "create_product",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::catalog"
        ],
        "x-handler": "create_product",
        "x-source": "crates/pelty-api/src/routes/catalog.rs"
      }
    },
    "/api/v1/admin/catalog/products/{id}": {
      "patch": {
        "operationId": "update_product",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::catalog"
        ],
        "x-handler": "update_product",
        "x-source": "crates/pelty-api/src/routes/catalog.rs"
      }
    },
    "/api/v1/admin/catalog/products/{id}/billing": {
      "get": {
        "operationId": "product_billing",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::billable"
        ],
        "x-handler": "product_billing",
        "x-source": "crates/pelty-api/src/routes/billable.rs"
      },
      "put": {
        "operationId": "set_product_billing",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductBilling"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::billable"
        ],
        "x-handler": "set_product_billing",
        "x-source": "crates/pelty-api/src/routes/billable.rs"
      }
    },
    "/api/v1/admin/catalog/products/{id}/fields": {
      "get": {
        "operationId": "admin_fields",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::catalog"
        ],
        "x-handler": "admin_fields",
        "x-source": "crates/pelty-api/src/routes/catalog.rs"
      },
      "post": {
        "operationId": "create_field",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FieldInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::catalog"
        ],
        "x-handler": "create_field",
        "x-source": "crates/pelty-api/src/routes/catalog.rs"
      }
    },
    "/api/v1/admin/catalog/products/{id}/fields/{field}": {
      "delete": {
        "operationId": "delete_field",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "field",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::catalog"
        ],
        "x-handler": "delete_field",
        "x-source": "crates/pelty-api/src/routes/catalog.rs"
      },
      "put": {
        "operationId": "update_field",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "field",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FieldInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::catalog"
        ],
        "x-handler": "update_field",
        "x-source": "crates/pelty-api/src/routes/catalog.rs"
      }
    },
    "/api/v1/admin/catalog/products/{id}/fixed-term": {
      "get": {
        "operationId": "product_fixed_term",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::billable"
        ],
        "x-handler": "product_fixed_term",
        "x-source": "crates/pelty-api/src/routes/billable.rs"
      },
      "put": {
        "operationId": "set_product_fixed_term",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FixedTerm"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::billable"
        ],
        "x-handler": "set_product_fixed_term",
        "x-source": "crates/pelty-api/src/routes/billable.rs"
      }
    },
    "/api/v1/admin/catalog/products/{id}/options": {
      "post": {
        "operationId": "add_option",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OptionInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::catalog"
        ],
        "x-handler": "add_option",
        "x-source": "crates/pelty-api/src/routes/catalog.rs"
      }
    },
    "/api/v1/admin/catalog/products/{id}/options/{option}": {
      "delete": {
        "operationId": "delete_option",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "option",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::catalog"
        ],
        "x-handler": "delete_option",
        "x-source": "crates/pelty-api/src/routes/catalog.rs"
      }
    },
    "/api/v1/admin/catalog/products/{id}/prices": {
      "put": {
        "operationId": "set_prices",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PricesBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::catalog"
        ],
        "x-handler": "set_prices",
        "x-source": "crates/pelty-api/src/routes/catalog.rs"
      }
    },
    "/api/v1/admin/catalog/products/{id}/recommendations": {
      "get": {
        "operationId": "admin_recs",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::bundles"
        ],
        "x-handler": "admin_recs",
        "x-source": "crates/pelty-api/src/routes/bundles.rs"
      },
      "put": {
        "operationId": "admin_set_recs",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Recommendations"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::bundles"
        ],
        "x-handler": "admin_set_recs",
        "x-source": "crates/pelty-api/src/routes/bundles.rs"
      }
    },
    "/api/v1/admin/catalog/products/{id}/stock": {
      "put": {
        "operationId": "set_product_stock",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductStock"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::billable"
        ],
        "x-handler": "set_product_stock",
        "x-source": "crates/pelty-api/src/routes/billable.rs"
      }
    },
    "/api/v1/admin/chats": {
      "get": {
        "operationId": "inbox",
        "parameters": [
          {
            "description": "open | closed (default: all)",
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::live_chat"
        ],
        "x-handler": "inbox",
        "x-source": "crates/pelty-api/src/routes/live_chat.rs"
      }
    },
    "/api/v1/admin/chats/{id}/close": {
      "post": {
        "operationId": "staff_close",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::live_chat"
        ],
        "x-handler": "staff_close",
        "x-source": "crates/pelty-api/src/routes/live_chat.rs"
      }
    },
    "/api/v1/admin/chats/{id}/messages": {
      "get": {
        "operationId": "staff_messages",
        "parameters": [
          {
            "in": "query",
            "name": "after",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::live_chat"
        ],
        "x-handler": "staff_messages",
        "x-source": "crates/pelty-api/src/routes/live_chat.rs"
      },
      "post": {
        "operationId": "staff_post",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChatPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::live_chat"
        ],
        "x-handler": "staff_post",
        "x-source": "crates/pelty-api/src/routes/live_chat.rs"
      }
    },
    "/api/v1/admin/client-fields": {
      "get": {
        "operationId": "list_fields",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::client_extras"
        ],
        "x-handler": "list_fields",
        "x-source": "crates/pelty-api/src/routes/client_extras.rs"
      },
      "post": {
        "operationId": "create_field",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FieldInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::client_extras"
        ],
        "x-handler": "create_field",
        "x-source": "crates/pelty-api/src/routes/client_extras.rs"
      }
    },
    "/api/v1/admin/client-fields/{id}": {
      "delete": {
        "operationId": "delete_field",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::client_extras"
        ],
        "x-handler": "delete_field",
        "x-source": "crates/pelty-api/src/routes/client_extras.rs"
      },
      "put": {
        "operationId": "update_field",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FieldInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::client_extras"
        ],
        "x-handler": "update_field",
        "x-source": "crates/pelty-api/src/routes/client_extras.rs"
      }
    },
    "/api/v1/admin/client-group-rules": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "list",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "list",
        "tags": [
          "client-group-rules"
        ],
        "x-handler": "list",
        "x-source": "crates/pelty-api/src/routes/client_group_rules.rs",
        "x-undocumented": true
      },
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "create",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "create",
        "tags": [
          "client-group-rules"
        ],
        "x-handler": "create",
        "x-source": "crates/pelty-api/src/routes/client_group_rules.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/client-group-rules/apply": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "apply",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "apply",
        "tags": [
          "client-group-rules"
        ],
        "x-handler": "apply",
        "x-source": "crates/pelty-api/src/routes/client_group_rules.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/client-group-rules/{id}": {
      "delete": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "remove",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "remove",
        "tags": [
          "client-group-rules"
        ],
        "x-handler": "remove",
        "x-source": "crates/pelty-api/src/routes/client_group_rules.rs",
        "x-undocumented": true
      },
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "update",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "update",
        "tags": [
          "client-group-rules"
        ],
        "x-handler": "update",
        "x-source": "crates/pelty-api/src/routes/client_group_rules.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/client-groups": {
      "get": {
        "operationId": "list",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::client_groups"
        ],
        "x-handler": "list",
        "x-source": "crates/pelty-api/src/routes/client_groups.rs"
      },
      "post": {
        "operationId": "create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GroupBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::client_groups"
        ],
        "x-handler": "create",
        "x-source": "crates/pelty-api/src/routes/client_groups.rs"
      }
    },
    "/api/v1/admin/client-groups/{id}": {
      "delete": {
        "operationId": "remove",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::client_groups"
        ],
        "x-handler": "remove",
        "x-source": "crates/pelty-api/src/routes/client_groups.rs"
      },
      "put": {
        "operationId": "update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GroupBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::client_groups"
        ],
        "x-handler": "update",
        "x-source": "crates/pelty-api/src/routes/client_groups.rs"
      }
    },
    "/api/v1/admin/client-groups/{id}/members": {
      "get": {
        "operationId": "members",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::client_groups"
        ],
        "x-handler": "members",
        "x-source": "crates/pelty-api/src/routes/client_groups.rs"
      },
      "post": {
        "operationId": "add_member",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MemberBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::client_groups"
        ],
        "x-handler": "add_member",
        "x-source": "crates/pelty-api/src/routes/client_groups.rs"
      }
    },
    "/api/v1/admin/client-groups/{id}/members/{customer_id}": {
      "delete": {
        "operationId": "remove_member",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "customer_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::client_groups"
        ],
        "x-handler": "remove_member",
        "x-source": "crates/pelty-api/src/routes/client_groups.rs"
      }
    },
    "/api/v1/admin/contact-messages": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "contact_list",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "contact list",
        "tags": [
          "contact-messages"
        ],
        "x-handler": "contact_list",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/contact-messages/{id}": {
      "delete": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "contact_del",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "contact del",
        "tags": [
          "contact-messages"
        ],
        "x-handler": "contact_del",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      },
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "contact_status",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "contact status",
        "tags": [
          "contact-messages"
        ],
        "x-handler": "contact_status",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/contact-messages/{id}/ticket": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "contact_to_ticket",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "contact to ticket",
        "tags": [
          "contact-messages"
        ],
        "x-handler": "contact_to_ticket",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/coupons": {
      "get": {
        "operationId": "admin_list",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::coupons"
        ],
        "x-handler": "admin_list",
        "x-source": "crates/pelty-api/src/routes/coupons.rs"
      },
      "post": {
        "operationId": "admin_create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CouponInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::coupons"
        ],
        "x-handler": "admin_create",
        "x-source": "crates/pelty-api/src/routes/coupons.rs"
      }
    },
    "/api/v1/admin/coupons/{id}": {
      "delete": {
        "operationId": "admin_delete",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::coupons"
        ],
        "x-handler": "admin_delete",
        "x-source": "crates/pelty-api/src/routes/coupons.rs"
      },
      "put": {
        "operationId": "admin_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CouponInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::coupons"
        ],
        "x-handler": "admin_update",
        "x-source": "crates/pelty-api/src/routes/coupons.rs"
      }
    },
    "/api/v1/admin/currencies": {
      "get": {
        "operationId": "list",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::currencies"
        ],
        "x-handler": "list",
        "x-source": "crates/pelty-api/src/routes/currencies.rs"
      },
      "post": {
        "operationId": "create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CurrencyInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::currencies"
        ],
        "x-handler": "create",
        "x-source": "crates/pelty-api/src/routes/currencies.rs"
      }
    },
    "/api/v1/admin/currencies/rates/history": {
      "get": {
        "operationId": "rate_history",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::currencies"
        ],
        "x-handler": "rate_history",
        "x-source": "crates/pelty-api/src/routes/currencies.rs"
      }
    },
    "/api/v1/admin/currencies/rates/settings": {
      "get": {
        "operationId": "rate_settings",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::currencies"
        ],
        "x-handler": "rate_settings",
        "x-source": "crates/pelty-api/src/routes/currencies.rs"
      },
      "put": {
        "operationId": "save_rate_settings",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RateSettingsInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::currencies"
        ],
        "x-handler": "save_rate_settings",
        "x-source": "crates/pelty-api/src/routes/currencies.rs"
      }
    },
    "/api/v1/admin/currencies/rates/update": {
      "post": {
        "operationId": "update_rates",
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::currencies"
        ],
        "x-handler": "update_rates",
        "x-source": "crates/pelty-api/src/routes/currencies.rs"
      }
    },
    "/api/v1/admin/currencies/sync-prices": {
      "post": {
        "operationId": "sync_prices",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SyncBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::currencies"
        ],
        "x-handler": "sync_prices",
        "x-source": "crates/pelty-api/src/routes/currencies.rs"
      }
    },
    "/api/v1/admin/currencies/{code}": {
      "put": {
        "operationId": "update",
        "parameters": [
          {
            "in": "path",
            "name": "code",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CurrencyInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::currencies"
        ],
        "x-handler": "update",
        "x-source": "crates/pelty-api/src/routes/currencies.rs"
      }
    },
    "/api/v1/admin/currencies/{code}/default": {
      "post": {
        "operationId": "make_default",
        "parameters": [
          {
            "in": "path",
            "name": "code",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::currencies"
        ],
        "x-handler": "make_default",
        "x-source": "crates/pelty-api/src/routes/currencies.rs"
      }
    },
    "/api/v1/admin/custom-code": {
      "get": {
        "operationId": "get_code",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomCode"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::general_settings"
        ],
        "x-handler": "get_code",
        "x-source": "crates/pelty-api/src/routes/general_settings.rs"
      },
      "put": {
        "operationId": "put_code",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomCode"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::general_settings"
        ],
        "x-handler": "put_code",
        "x-source": "crates/pelty-api/src/routes/general_settings.rs"
      }
    },
    "/api/v1/admin/customers": {
      "get": {
        "operationId": "admin_list",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::customers"
        ],
        "x-handler": "admin_list",
        "x-source": "crates/pelty-api/src/routes/customers.rs"
      },
      "post": {
        "operationId": "admin_create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateCustomer"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::customers"
        ],
        "x-handler": "admin_create",
        "x-source": "crates/pelty-api/src/routes/customers.rs"
      }
    },
    "/api/v1/admin/customers/{id}": {
      "get": {
        "operationId": "admin_get",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::customers"
        ],
        "x-handler": "admin_get",
        "x-source": "crates/pelty-api/src/routes/customers.rs"
      },
      "patch": {
        "operationId": "admin_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdminUpdate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::customers"
        ],
        "x-handler": "admin_update",
        "x-source": "crates/pelty-api/src/routes/customers.rs"
      }
    },
    "/api/v1/admin/customers/{id}/auto-pay": {
      "put": {
        "operationId": "admin_auto_pay",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AutoPayBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::payment_methods"
        ],
        "x-handler": "admin_auto_pay",
        "x-source": "crates/pelty-api/src/routes/payment_methods.rs"
      }
    },
    "/api/v1/admin/customers/{id}/billable-items/invoice": {
      "post": {
        "operationId": "invoice_pending",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::billable"
        ],
        "x-handler": "invoice_pending",
        "x-source": "crates/pelty-api/src/routes/billable.rs"
      }
    },
    "/api/v1/admin/customers/{id}/close": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "close_customer",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "close customer",
        "tags": [
          "customers"
        ],
        "x-handler": "close_customer",
        "x-source": "crates/pelty-api/src/security.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/customers/{id}/credit": {
      "get": {
        "operationId": "admin_credit",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::credit"
        ],
        "x-handler": "admin_credit",
        "x-source": "crates/pelty-api/src/routes/credit.rs"
      },
      "post": {
        "operationId": "admin_adjust",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdjustBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::credit"
        ],
        "x-handler": "admin_adjust",
        "x-source": "crates/pelty-api/src/routes/credit.rs"
      }
    },
    "/api/v1/admin/customers/{id}/emails": {
      "get": {
        "operationId": "customer_emails",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_ops"
        ],
        "x-handler": "customer_emails",
        "x-source": "crates/pelty-api/src/routes/admin_ops.rs"
      }
    },
    "/api/v1/admin/customers/{id}/fields": {
      "get": {
        "operationId": "admin_values",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::client_extras"
        ],
        "x-handler": "admin_values",
        "x-source": "crates/pelty-api/src/routes/client_extras.rs"
      },
      "put": {
        "operationId": "admin_set_values",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ValuesBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::client_extras"
        ],
        "x-handler": "admin_set_values",
        "x-source": "crates/pelty-api/src/routes/client_extras.rs"
      }
    },
    "/api/v1/admin/customers/{id}/group": {
      "post": {
        "operationId": "set_customer_group",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerGroupBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::client_groups"
        ],
        "x-handler": "set_customer_group",
        "x-source": "crates/pelty-api/src/routes/client_groups.rs"
      }
    },
    "/api/v1/admin/customers/{id}/kyc": {
      "get": {
        "operationId": "admin_customer",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::kyc"
        ],
        "x-handler": "admin_customer",
        "x-source": "crates/pelty-api/src/routes/kyc.rs"
      },
      "put": {
        "operationId": "admin_override",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OverrideBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::kyc"
        ],
        "x-handler": "admin_override",
        "x-source": "crates/pelty-api/src/routes/kyc.rs"
      }
    },
    "/api/v1/admin/customers/{id}/legal-entity": {
      "get": {
        "operationId": "customer_entity",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssignBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::legal_entities"
        ],
        "x-handler": "customer_entity",
        "x-source": "crates/pelty-api/src/routes/legal_entities.rs"
      },
      "put": {
        "operationId": "assign",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssignBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssignBody"
                }
              }
            },
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::legal_entities"
        ],
        "x-handler": "assign",
        "x-source": "crates/pelty-api/src/routes/legal_entities.rs"
      }
    },
    "/api/v1/admin/customers/{id}/login-as": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "login_as_customer",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "login as customer",
        "tags": [
          "customers"
        ],
        "x-handler": "login_as_customer",
        "x-source": "crates/pelty-api/src/security.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/customers/{id}/merge": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "merge_customer",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "merge customer",
        "tags": [
          "customers"
        ],
        "x-handler": "merge_customer",
        "x-source": "crates/pelty-api/src/security.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/customers/{id}/mergeable-invoices": {
      "get": {
        "operationId": "admin_mergeable",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::invoice_ops"
        ],
        "x-handler": "admin_mergeable",
        "x-source": "crates/pelty-api/src/routes/invoice_ops.rs"
      }
    },
    "/api/v1/admin/customers/{id}/notes": {
      "get": {
        "operationId": "list_notes",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::client_extras"
        ],
        "x-handler": "list_notes",
        "x-source": "crates/pelty-api/src/routes/client_extras.rs"
      },
      "post": {
        "operationId": "add_note",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NoteInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::client_extras"
        ],
        "x-handler": "add_note",
        "x-source": "crates/pelty-api/src/routes/client_extras.rs"
      }
    },
    "/api/v1/admin/customers/{id}/notes/{note}": {
      "delete": {
        "operationId": "delete_note",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "note",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::client_extras"
        ],
        "x-handler": "delete_note",
        "x-source": "crates/pelty-api/src/routes/client_extras.rs"
      },
      "put": {
        "operationId": "update_note",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "note",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NoteInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::client_extras"
        ],
        "x-handler": "update_note",
        "x-source": "crates/pelty-api/src/routes/client_extras.rs"
      }
    },
    "/api/v1/admin/customers/{id}/payment-methods": {
      "get": {
        "operationId": "admin_list",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::payment_methods"
        ],
        "x-handler": "admin_list",
        "x-source": "crates/pelty-api/src/routes/payment_methods.rs"
      }
    },
    "/api/v1/admin/customers/{id}/security-question": {
      "get": {
        "operationId": "admin_status",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "Which question the client chose (not the answer).",
        "tags": [
          "super::security_questions"
        ],
        "x-handler": "admin_status",
        "x-source": "crates/pelty-api/src/routes/security_questions.rs"
      }
    },
    "/api/v1/admin/customers/{id}/security-question/verify": {
      "post": {
        "operationId": "admin_verify",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VerifyBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "429": {
            "description": ""
          }
        },
        "summary": "Check a caller's answer. Rate limited per customer and audited.",
        "tags": [
          "super::security_questions"
        ],
        "x-handler": "admin_verify",
        "x-source": "crates/pelty-api/src/routes/security_questions.rs"
      }
    },
    "/api/v1/admin/customers/{id}/subaccounts": {
      "get": {
        "operationId": "admin_contacts",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "summary": "Staff view of an account's sub-accounts (WHMCS \"Users\" tab).",
        "tags": [
          "super::store"
        ],
        "x-handler": "admin_contacts",
        "x-source": "crates/pelty-api/src/routes/store.rs"
      }
    },
    "/api/v1/admin/customers/{id}/summary": {
      "get": {
        "operationId": "customer_summary",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "Client summary page (all tabs) for one customer.",
        "tags": [
          "super::admin_tools"
        ],
        "x-handler": "customer_summary",
        "x-source": "crates/pelty-api/src/routes/admin_tools.rs"
      }
    },
    "/api/v1/admin/customers/{id}/vat/verify": {
      "post": {
        "operationId": "admin_verify_vat",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::tax"
        ],
        "x-handler": "admin_verify_vat",
        "x-source": "crates/pelty-api/src/routes/tax.rs"
      }
    },
    "/api/v1/admin/dashboard": {
      "get": {
        "operationId": "admin_dashboard",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AdminDashboard"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_dashboard",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/domains": {
      "get": {
        "operationId": "admin_list",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "admin_list",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/admin/domains/bulk": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_bulk",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin bulk",
        "tags": [
          "domains"
        ],
        "x-handler": "admin_bulk",
        "x-source": "crates/pelty-api/src/routes/domains.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/domains/costs": {
      "get": {
        "operationId": "costs",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::domain_pricing"
        ],
        "x-handler": "costs",
        "x-source": "crates/pelty-api/src/routes/domain_pricing.rs"
      }
    },
    "/api/v1/admin/domains/margins": {
      "get": {
        "operationId": "margins",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/MarginRule"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "super::domain_pricing"
        ],
        "x-handler": "margins",
        "x-source": "crates/pelty-api/src/routes/domain_pricing.rs"
      },
      "put": {
        "operationId": "set_margins",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "items": {
                  "$ref": "#/components/schemas/MarginRule"
                },
                "type": "array"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/MarginRule"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::domain_pricing"
        ],
        "x-handler": "set_margins",
        "x-source": "crates/pelty-api/src/routes/domain_pricing.rs"
      }
    },
    "/api/v1/admin/domains/premium-settings": {
      "get": {
        "operationId": "premium",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PremiumSettings"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "super::domain_pricing"
        ],
        "x-handler": "premium",
        "x-source": "crates/pelty-api/src/routes/domain_pricing.rs"
      },
      "put": {
        "operationId": "set_premium",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PremiumSettings"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PremiumSettings"
                }
              }
            },
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::domain_pricing"
        ],
        "x-handler": "set_premium",
        "x-source": "crates/pelty-api/src/routes/domain_pricing.rs"
      }
    },
    "/api/v1/admin/domains/run": {
      "post": {
        "operationId": "admin_run",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "admin_run",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/admin/domains/sync-prices": {
      "post": {
        "operationId": "sync_prices",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SyncBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::domain_pricing"
        ],
        "x-handler": "sync_prices",
        "x-source": "crates/pelty-api/src/routes/domain_pricing.rs"
      }
    },
    "/api/v1/admin/domains/tld-fields": {
      "get": {
        "operationId": "all_fields",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/TldField"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "super::domain_pricing"
        ],
        "x-handler": "all_fields",
        "x-source": "crates/pelty-api/src/routes/domain_pricing.rs"
      }
    },
    "/api/v1/admin/domains/tld-fields/{tld}": {
      "put": {
        "operationId": "set_fields",
        "parameters": [
          {
            "in": "path",
            "name": "tld",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "items": {
                  "$ref": "#/components/schemas/TldField"
                },
                "type": "array"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/TldField"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::domain_pricing"
        ],
        "x-handler": "set_fields",
        "x-source": "crates/pelty-api/src/routes/domain_pricing.rs"
      }
    },
    "/api/v1/admin/domains/{id}": {
      "get": {
        "operationId": "admin_get",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "admin_get",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      },
      "patch": {
        "operationId": "admin_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdminUpdate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "admin_update",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/admin/domains/{id}/dns": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_dns",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin dns",
        "tags": [
          "domains"
        ],
        "x-handler": "admin_dns",
        "x-source": "crates/pelty-api/src/routes/domains.rs",
        "x-undocumented": true
      },
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_dns_put",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin dns put",
        "tags": [
          "domains"
        ],
        "x-handler": "admin_dns_put",
        "x-source": "crates/pelty-api/src/routes/domains.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/domains/{id}/registrant-verification": {
      "post": {
        "operationId": "admin_rv_action",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RvAction"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "admin_rv_action",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/admin/domains/{id}/ssl-check": {
      "post": {
        "operationId": "admin_check",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::ssl"
        ],
        "x-handler": "admin_check",
        "x-source": "crates/pelty-api/src/routes/ssl.rs"
      }
    },
    "/api/v1/admin/domains/{id}/sync": {
      "post": {
        "operationId": "admin_sync",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "admin_sync",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/admin/downloads": {
      "get": {
        "operationId": "admin_list",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::downloads"
        ],
        "x-handler": "admin_list",
        "x-source": "crates/pelty-api/src/routes/downloads.rs"
      },
      "post": {
        "operationId": "admin_upload",
        "parameters": [
          {
            "in": "query",
            "name": "title",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "filename",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "description",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Comma-separated product ids; empty = all customers.",
            "in": "query",
            "name": "products",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/octet-stream": {
              "schema": {
                "items": {
                  "format": "int32",
                  "minimum": 0,
                  "type": "integer"
                },
                "type": "array"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::downloads"
        ],
        "x-handler": "admin_upload",
        "x-source": "crates/pelty-api/src/routes/downloads.rs"
      }
    },
    "/api/v1/admin/downloads/{id}": {
      "delete": {
        "operationId": "admin_delete",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::downloads"
        ],
        "x-handler": "admin_delete",
        "x-source": "crates/pelty-api/src/routes/downloads.rs"
      },
      "get": {
        "operationId": "admin_file",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::downloads"
        ],
        "x-handler": "admin_file",
        "x-source": "crates/pelty-api/src/routes/downloads.rs"
      }
    },
    "/api/v1/admin/email-log": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_list",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin list",
        "tags": [
          "email-log"
        ],
        "x-handler": "admin_list",
        "x-source": "crates/pelty-api/src/routes/email_log.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/email-log/{id}": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_get",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin get",
        "tags": [
          "email-log"
        ],
        "x-handler": "admin_get",
        "x-source": "crates/pelty-api/src/routes/email_log.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/email-log/{id}/resend": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_resend",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin resend",
        "tags": [
          "email-log"
        ],
        "x-handler": "admin_resend",
        "x-source": "crates/pelty-api/src/routes/email_log.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/email-templates": {
      "get": {
        "operationId": "list",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::email_templates"
        ],
        "x-handler": "list",
        "x-source": "crates/pelty-api/src/routes/email_templates.rs"
      }
    },
    "/api/v1/admin/email-templates/{name}/enabled": {
      "put": {
        "operationId": "set_enabled",
        "parameters": [
          {
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnabledBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Switch a template on or off; disabled templates are never queued.",
        "tags": [
          "super::email_templates"
        ],
        "x-handler": "set_enabled",
        "x-source": "crates/pelty-api/src/routes/email_templates.rs"
      }
    },
    "/api/v1/admin/email-templates/{name}/{locale}": {
      "delete": {
        "operationId": "revert",
        "parameters": [
          {
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "locale",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::email_templates"
        ],
        "x-handler": "revert",
        "x-source": "crates/pelty-api/src/routes/email_templates.rs"
      },
      "put": {
        "operationId": "save",
        "parameters": [
          {
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "locale",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TemplateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::email_templates"
        ],
        "x-handler": "save",
        "x-source": "crates/pelty-api/src/routes/email_templates.rs"
      }
    },
    "/api/v1/admin/email-templates/{name}/{locale}/preview": {
      "post": {
        "operationId": "preview",
        "parameters": [
          {
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "locale",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TemplateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::email_templates"
        ],
        "x-handler": "preview",
        "x-source": "crates/pelty-api/src/routes/email_templates.rs"
      }
    },
    "/api/v1/admin/email-templates/{name}/{locale}/test": {
      "post": {
        "operationId": "send_test",
        "parameters": [
          {
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "locale",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "202": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "Queue the saved template, with sample data, to the signed-in admin.",
        "tags": [
          "super::email_templates"
        ],
        "x-handler": "send_test",
        "x-source": "crates/pelty-api/src/routes/email_templates.rs"
      }
    },
    "/api/v1/admin/emails/{job}/resend": {
      "post": {
        "operationId": "resend",
        "parameters": [
          {
            "in": "path",
            "name": "job",
            "required": true,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_ops"
        ],
        "x-handler": "resend",
        "x-source": "crates/pelty-api/src/routes/admin_ops.rs"
      }
    },
    "/api/v1/admin/exports/invoices.csv": {
      "get": {
        "operationId": "invoices_csv",
        "parameters": [
          {
            "description": "First month, `YYYY-MM`.",
            "in": "query",
            "name": "from",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "description": "Last month (inclusive), `YYYY-MM`.",
            "in": "query",
            "name": "to",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "text/csv": {}
            },
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::exports"
        ],
        "x-handler": "invoices_csv",
        "x-source": "crates/pelty-api/src/routes/exports.rs"
      }
    },
    "/api/v1/admin/exports/payments.csv": {
      "get": {
        "operationId": "payments_csv",
        "parameters": [
          {
            "description": "First month, `YYYY-MM`.",
            "in": "query",
            "name": "from",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "description": "Last month (inclusive), `YYYY-MM`.",
            "in": "query",
            "name": "to",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "text/csv": {}
            },
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::exports"
        ],
        "x-handler": "payments_csv",
        "x-source": "crates/pelty-api/src/routes/exports.rs"
      }
    },
    "/api/v1/admin/fraud/checks": {
      "get": {
        "operationId": "list_checks",
        "parameters": [
          {
            "in": "query",
            "name": "verdict",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::fraud"
        ],
        "x-handler": "list_checks",
        "x-source": "crates/pelty-api/src/routes/fraud.rs"
      }
    },
    "/api/v1/admin/gateways": {
      "get": {
        "operationId": "list_gateways",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "summary": "Built-in gateways plus operator-defined custom ones; never secret values.",
        "tags": [
          "super::gateways"
        ],
        "x-handler": "list_gateways",
        "x-source": "crates/pelty-api/src/routes/gateways.rs"
      }
    },
    "/api/v1/admin/gateways/custom": {
      "post": {
        "operationId": "create_custom",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NewCustom"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::gateways"
        ],
        "x-handler": "create_custom",
        "x-source": "crates/pelty-api/src/routes/gateways.rs"
      }
    },
    "/api/v1/admin/gateways/deliveries": {
      "get": {
        "operationId": "list_deliveries",
        "parameters": [
          {
            "in": "query",
            "name": "gateway",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::gateways"
        ],
        "x-handler": "list_deliveries",
        "x-source": "crates/pelty-api/src/routes/gateways.rs"
      }
    },
    "/api/v1/admin/gateways/{id}": {
      "delete": {
        "operationId": "delete_custom",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::gateways"
        ],
        "x-handler": "delete_custom",
        "x-source": "crates/pelty-api/src/routes/gateways.rs"
      },
      "put": {
        "operationId": "update_gateway",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateGateway"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::gateways"
        ],
        "x-handler": "update_gateway",
        "x-source": "crates/pelty-api/src/routes/gateways.rs"
      }
    },
    "/api/v1/admin/gateways/{id}/rules": {
      "get": {
        "operationId": "get_gateway_rules",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GatewayRules"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "Fee, amount-limit and currency rules for one gateway.",
        "tags": [
          "super::extensions"
        ],
        "x-handler": "get_gateway_rules",
        "x-source": "crates/pelty-api/src/routes/extensions.rs"
      },
      "put": {
        "operationId": "put_gateway_rules",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GatewayRules"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GatewayRules"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::extensions"
        ],
        "x-handler": "put_gateway_rules",
        "x-source": "crates/pelty-api/src/routes/extensions.rs"
      }
    },
    "/api/v1/admin/gateways/{id}/test-webhook": {
      "post": {
        "operationId": "test_webhook",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TestWebhook"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "Verify + parse a pasted webhook without applying it (logged as a test).",
        "tags": [
          "super::gateways"
        ],
        "x-handler": "test_webhook",
        "x-source": "crates/pelty-api/src/routes/gateways.rs"
      }
    },
    "/api/v1/admin/gdpr/requests": {
      "get": {
        "operationId": "list",
        "parameters": [
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::gdpr"
        ],
        "x-handler": "list",
        "x-source": "crates/pelty-api/src/routes/gdpr.rs"
      }
    },
    "/api/v1/admin/gdpr/requests/{id}/approve": {
      "post": {
        "operationId": "approve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::gdpr"
        ],
        "x-handler": "approve",
        "x-source": "crates/pelty-api/src/routes/gdpr.rs"
      }
    },
    "/api/v1/admin/gdpr/requests/{id}/reject": {
      "post": {
        "operationId": "reject",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RejectBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::gdpr"
        ],
        "x-handler": "reject",
        "x-source": "crates/pelty-api/src/routes/gdpr.rs"
      }
    },
    "/api/v1/admin/gdpr/users/{id}/export": {
      "get": {
        "operationId": "export_user",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::gdpr"
        ],
        "x-handler": "export_user",
        "x-source": "crates/pelty-api/src/routes/gdpr.rs"
      }
    },
    "/api/v1/admin/general-settings": {
      "get": {
        "operationId": "get_settings",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GeneralSettings"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::general_settings"
        ],
        "x-handler": "get_settings",
        "x-source": "crates/pelty-api/src/routes/general_settings.rs"
      },
      "put": {
        "operationId": "put_settings",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralSettings"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::general_settings"
        ],
        "x-handler": "put_settings",
        "x-source": "crates/pelty-api/src/routes/general_settings.rs"
      }
    },
    "/api/v1/admin/gift-cards": {
      "get": {
        "operationId": "gift_list",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::invoice_ops"
        ],
        "x-handler": "gift_list",
        "x-source": "crates/pelty-api/src/routes/invoice_ops.rs"
      },
      "post": {
        "operationId": "gift_create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GiftBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::invoice_ops"
        ],
        "x-handler": "gift_create",
        "x-source": "crates/pelty-api/src/routes/invoice_ops.rs"
      }
    },
    "/api/v1/admin/gift-cards/{id}/disable": {
      "post": {
        "operationId": "gift_disable",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::invoice_ops"
        ],
        "x-handler": "gift_disable",
        "x-source": "crates/pelty-api/src/routes/invoice_ops.rs"
      }
    },
    "/api/v1/admin/import/csv/analyze": {
      "post": {
        "operationId": "analyze",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CsvAnalyze"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Headers, a 5-row preview, the target fields and a suggested mapping.",
        "tags": [
          "super::csv_import"
        ],
        "x-handler": "analyze",
        "x-source": "crates/pelty-api/src/routes/csv_import.rs"
      }
    },
    "/api/v1/admin/import/csv/run": {
      "post": {
        "operationId": "run",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CsvRun"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Validate every row; unless `dry_run`, import them all-or-nothing.",
        "tags": [
          "super::csv_import"
        ],
        "x-handler": "run",
        "x-source": "crates/pelty-api/src/routes/csv_import.rs"
      }
    },
    "/api/v1/admin/inactive-clients/preview": {
      "get": {
        "operationId": "preview_inactive",
        "parameters": [
          {
            "in": "query",
            "name": "days",
            "required": true,
            "schema": {
              "format": "int32",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Dry run: who would be anonymised with this many days of inactivity.",
        "tags": [
          "super::admin_ops"
        ],
        "x-handler": "preview_inactive",
        "x-source": "crates/pelty-api/src/routes/admin_ops.rs"
      }
    },
    "/api/v1/admin/inactive-clients/run": {
      "post": {
        "operationId": "run_inactive",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Run the erasure now with the saved settings (no-op when disabled).",
        "tags": [
          "super::admin_ops"
        ],
        "x-handler": "run_inactive",
        "x-source": "crates/pelty-api/src/routes/admin_ops.rs"
      }
    },
    "/api/v1/admin/invoices": {
      "get": {
        "operationId": "admin_invoices",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_invoices",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      },
      "post": {
        "operationId": "admin_create_invoice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateInvoice"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_create_invoice",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/invoices/bulk": {
      "post": {
        "operationId": "invoices_bulk",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvoicesBulk"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Apply one action to many invoices; returns a per-invoice result.",
        "tags": [
          "super::bulk"
        ],
        "x-handler": "invoices_bulk",
        "x-source": "crates/pelty-api/src/routes/bulk.rs"
      }
    },
    "/api/v1/admin/invoices/merge": {
      "post": {
        "operationId": "admin_merge",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MergeBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::invoice_ops"
        ],
        "x-handler": "admin_merge",
        "x-source": "crates/pelty-api/src/routes/invoice_ops.rs"
      }
    },
    "/api/v1/admin/invoices/{id}": {
      "get": {
        "operationId": "admin_invoice",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_invoice",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/invoices/{id}/apply-credit": {
      "post": {
        "operationId": "admin_apply",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApplyBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::credit"
        ],
        "x-handler": "admin_apply",
        "x-source": "crates/pelty-api/src/routes/credit.rs"
      }
    },
    "/api/v1/admin/invoices/{id}/credit-note": {
      "post": {
        "operationId": "admin_credit_note",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_credit_note",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/invoices/{id}/debit-note": {
      "post": {
        "operationId": "admin_debit_note",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DebitNoteBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Issue a debit note (extra charge) against an unpaid or paid invoice.\nThe note is numbered in its own DN sequence, taxed by the tax engine and\npayable like any invoice.",
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_debit_note",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/invoices/{id}/duplicate": {
      "post": {
        "operationId": "admin_duplicate",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::invoice_ops"
        ],
        "x-handler": "admin_duplicate",
        "x-source": "crates/pelty-api/src/routes/invoice_ops.rs"
      }
    },
    "/api/v1/admin/invoices/{id}/finalize": {
      "post": {
        "operationId": "admin_finalize",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_finalize",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/invoices/{id}/items": {
      "post": {
        "operationId": "add_lines",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinesBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::billable"
        ],
        "x-handler": "add_lines",
        "x-source": "crates/pelty-api/src/routes/billable.rs"
      }
    },
    "/api/v1/admin/invoices/{id}/notes": {
      "get": {
        "operationId": "admin_notes",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::invoice_ops"
        ],
        "x-handler": "admin_notes",
        "x-source": "crates/pelty-api/src/routes/invoice_ops.rs"
      },
      "put": {
        "operationId": "admin_set_notes",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NotesBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::invoice_ops"
        ],
        "x-handler": "admin_set_notes",
        "x-source": "crates/pelty-api/src/routes/invoice_ops.rs"
      }
    },
    "/api/v1/admin/invoices/{id}/payments": {
      "post": {
        "operationId": "admin_record_payment",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RecordPayment"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Record a manual payment (bank transfer…). Idempotent.",
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_record_payment",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/invoices/{id}/pdf": {
      "get": {
        "operationId": "admin_pdf",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/pdf": {}
            },
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::invoice_pdf"
        ],
        "x-handler": "admin_pdf",
        "x-source": "crates/pelty-api/src/routes/invoice_pdf.rs"
      }
    },
    "/api/v1/admin/invoices/{id}/refunds": {
      "get": {
        "operationId": "admin_list",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::refunds"
        ],
        "x-handler": "admin_list",
        "x-source": "crates/pelty-api/src/routes/refunds.rs"
      }
    },
    "/api/v1/admin/invoices/{id}/split": {
      "post": {
        "operationId": "admin_split",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SplitBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::invoice_ops"
        ],
        "x-handler": "admin_split",
        "x-source": "crates/pelty-api/src/routes/invoice_ops.rs"
      }
    },
    "/api/v1/admin/invoices/{id}/ubl": {
      "get": {
        "operationId": "admin_ubl",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/xml": {}
            },
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "summary": "UBL 2.1 (Peppol BIS 3.0 / CIUS-RO) XML of any issued invoice.",
        "tags": [
          "super::einvoice"
        ],
        "x-handler": "admin_ubl",
        "x-source": "crates/pelty-api/src/routes/einvoice.rs"
      }
    },
    "/api/v1/admin/invoices/{id}/void": {
      "post": {
        "operationId": "admin_void",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_void",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/jobs": {
      "get": {
        "operationId": "admin_jobs",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_jobs",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/jobs/recurring": {
      "post": {
        "operationId": "admin_run_recurring",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "summary": "Enqueue a recurring-billing run now (deduplicated per minute).",
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_run_recurring",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/jobs/{id}/retry": {
      "post": {
        "operationId": "admin_retry_job",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_retry_job",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/kb/articles": {
      "get": {
        "operationId": "admin_articles",
        "parameters": [
          {
            "in": "query",
            "name": "locale",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "category",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::content"
        ],
        "x-handler": "admin_articles",
        "x-source": "crates/pelty-api/src/routes/content.rs"
      },
      "post": {
        "operationId": "create_article",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ArticleBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::content"
        ],
        "x-handler": "create_article",
        "x-source": "crates/pelty-api/src/routes/content.rs"
      }
    },
    "/api/v1/admin/kb/articles/{id}": {
      "delete": {
        "operationId": "delete_article",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::content"
        ],
        "x-handler": "delete_article",
        "x-source": "crates/pelty-api/src/routes/content.rs"
      },
      "get": {
        "operationId": "admin_article",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::content"
        ],
        "x-handler": "admin_article",
        "x-source": "crates/pelty-api/src/routes/content.rs"
      },
      "put": {
        "operationId": "update_article",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ArticleBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::content"
        ],
        "x-handler": "update_article",
        "x-source": "crates/pelty-api/src/routes/content.rs"
      }
    },
    "/api/v1/admin/kb/articles/{id}/tags": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "get_tags",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "get tags",
        "tags": [
          "kb"
        ],
        "x-handler": "get_tags",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      },
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "put_tags",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "put tags",
        "tags": [
          "kb"
        ],
        "x-handler": "put_tags",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/kb/categories": {
      "get": {
        "operationId": "admin_categories",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::content"
        ],
        "x-handler": "admin_categories",
        "x-source": "crates/pelty-api/src/routes/content.rs"
      },
      "post": {
        "operationId": "create_category",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CategoryBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::content"
        ],
        "x-handler": "create_category",
        "x-source": "crates/pelty-api/src/routes/content.rs"
      }
    },
    "/api/v1/admin/kb/categories/{id}": {
      "delete": {
        "operationId": "delete_category",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::content"
        ],
        "x-handler": "delete_category",
        "x-source": "crates/pelty-api/src/routes/content.rs"
      },
      "put": {
        "operationId": "update_category",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CategoryBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::content"
        ],
        "x-handler": "update_category",
        "x-source": "crates/pelty-api/src/routes/content.rs"
      }
    },
    "/api/v1/admin/kyc": {
      "get": {
        "operationId": "admin_queue",
        "parameters": [
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::kyc"
        ],
        "x-handler": "admin_queue",
        "x-source": "crates/pelty-api/src/routes/kyc.rs"
      }
    },
    "/api/v1/admin/kyc/documents/{id}/download": {
      "get": {
        "operationId": "admin_download",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::kyc"
        ],
        "x-handler": "admin_download",
        "x-source": "crates/pelty-api/src/routes/kyc.rs"
      }
    },
    "/api/v1/admin/kyc/documents/{id}/review": {
      "post": {
        "operationId": "admin_review",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReviewBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::kyc"
        ],
        "x-handler": "admin_review",
        "x-source": "crates/pelty-api/src/routes/kyc.rs"
      }
    },
    "/api/v1/admin/kyc/settings": {
      "get": {
        "operationId": "settings_get",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::kyc"
        ],
        "x-handler": "settings_get",
        "x-source": "crates/pelty-api/src/routes/kyc.rs"
      },
      "put": {
        "operationId": "settings_put",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KycSettings"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::kyc"
        ],
        "x-handler": "settings_put",
        "x-source": "crates/pelty-api/src/routes/kyc.rs"
      }
    },
    "/api/v1/admin/legal-entities": {
      "get": {
        "operationId": "list",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/EntityView"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::legal_entities"
        ],
        "x-handler": "list",
        "x-source": "crates/pelty-api/src/routes/legal_entities.rs"
      },
      "post": {
        "operationId": "create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EntityInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EntityView"
                }
              }
            },
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::legal_entities"
        ],
        "x-handler": "create",
        "x-source": "crates/pelty-api/src/routes/legal_entities.rs"
      }
    },
    "/api/v1/admin/legal-entities/default": {
      "delete": {
        "operationId": "clear_default",
        "responses": {
          "204": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::legal_entities"
        ],
        "x-handler": "clear_default",
        "x-source": "crates/pelty-api/src/routes/legal_entities.rs"
      }
    },
    "/api/v1/admin/legal-entities/{id}": {
      "delete": {
        "operationId": "remove",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::legal_entities"
        ],
        "x-handler": "remove",
        "x-source": "crates/pelty-api/src/routes/legal_entities.rs"
      },
      "put": {
        "operationId": "update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EntityInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EntityView"
                }
              }
            },
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::legal_entities"
        ],
        "x-handler": "update",
        "x-source": "crates/pelty-api/src/routes/legal_entities.rs"
      }
    },
    "/api/v1/admin/legal-entities/{id}/default": {
      "post": {
        "operationId": "make_default",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::legal_entities"
        ],
        "x-handler": "make_default",
        "x-source": "crates/pelty-api/src/routes/legal_entities.rs"
      }
    },
    "/api/v1/admin/login-history": {
      "get": {
        "operationId": "login_history",
        "parameters": [
          {
            "in": "query",
            "name": "user_id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_ops"
        ],
        "x-handler": "login_history",
        "x-source": "crates/pelty-api/src/routes/admin_ops.rs"
      }
    },
    "/api/v1/admin/mass/customers": {
      "post": {
        "operationId": "customers",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MassBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::mass"
        ],
        "x-handler": "customers",
        "x-source": "crates/pelty-api/src/routes/mass.rs"
      }
    },
    "/api/v1/admin/mass/domains": {
      "post": {
        "operationId": "domains",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MassBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::mass"
        ],
        "x-handler": "domains",
        "x-source": "crates/pelty-api/src/routes/mass.rs"
      }
    },
    "/api/v1/admin/mass/services": {
      "post": {
        "operationId": "services",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MassBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::mass"
        ],
        "x-handler": "services",
        "x-source": "crates/pelty-api/src/routes/mass.rs"
      }
    },
    "/api/v1/admin/mass/tickets": {
      "post": {
        "operationId": "tickets",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MassBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::mass"
        ],
        "x-handler": "tickets",
        "x-source": "crates/pelty-api/src/routes/mass.rs"
      }
    },
    "/api/v1/admin/module-log": {
      "get": {
        "operationId": "log_list",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::modules_ext"
        ],
        "x-handler": "log_list",
        "x-source": "crates/pelty-api/src/routes/modules_ext.rs"
      }
    },
    "/api/v1/admin/module-queue": {
      "get": {
        "operationId": "queue",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::modules_ext"
        ],
        "x-handler": "queue",
        "x-source": "crates/pelty-api/src/routes/modules_ext.rs"
      }
    },
    "/api/v1/admin/module-queue/{id}/retry": {
      "post": {
        "operationId": "queue_retry",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::modules_ext"
        ],
        "x-handler": "queue_retry",
        "x-source": "crates/pelty-api/src/routes/modules_ext.rs"
      }
    },
    "/api/v1/admin/my-notes": {
      "get": {
        "operationId": "get_notes",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_tools"
        ],
        "x-handler": "get_notes",
        "x-source": "crates/pelty-api/src/routes/admin_tools.rs"
      },
      "put": {
        "operationId": "put_notes",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NotesBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_tools"
        ],
        "x-handler": "put_notes",
        "x-source": "crates/pelty-api/src/routes/admin_tools.rs"
      }
    },
    "/api/v1/admin/network-issues": {
      "get": {
        "operationId": "admin_list",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::network_status"
        ],
        "x-handler": "admin_list",
        "x-source": "crates/pelty-api/src/routes/network_status.rs"
      },
      "post": {
        "operationId": "create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IssueBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::network_status"
        ],
        "x-handler": "create",
        "x-source": "crates/pelty-api/src/routes/network_status.rs"
      }
    },
    "/api/v1/admin/network-issues/{id}": {
      "delete": {
        "operationId": "remove",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::network_status"
        ],
        "x-handler": "remove",
        "x-source": "crates/pelty-api/src/routes/network_status.rs"
      },
      "put": {
        "operationId": "update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IssueBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::network_status"
        ],
        "x-handler": "update",
        "x-source": "crates/pelty-api/src/routes/network_status.rs"
      }
    },
    "/api/v1/admin/network-issues/{id}/updates": {
      "post": {
        "operationId": "add_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::network_status"
        ],
        "x-handler": "add_update",
        "x-source": "crates/pelty-api/src/routes/network_status.rs"
      }
    },
    "/api/v1/admin/noticeboard": {
      "get": {
        "operationId": "list_notices",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_tools"
        ],
        "x-handler": "list_notices",
        "x-source": "crates/pelty-api/src/routes/admin_tools.rs"
      },
      "post": {
        "operationId": "create_notice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NoticeBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_tools"
        ],
        "x-handler": "create_notice",
        "x-source": "crates/pelty-api/src/routes/admin_tools.rs"
      }
    },
    "/api/v1/admin/noticeboard/{id}": {
      "delete": {
        "operationId": "delete_notice",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "Authors delete their own notices; staff with settings access can delete any.",
        "tags": [
          "super::admin_tools"
        ],
        "x-handler": "delete_notice",
        "x-source": "crates/pelty-api/src/routes/admin_tools.rs"
      }
    },
    "/api/v1/admin/notification-rules": {
      "get": {
        "operationId": "list_rules",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_tools"
        ],
        "x-handler": "list_rules",
        "x-source": "crates/pelty-api/src/routes/admin_tools.rs"
      },
      "post": {
        "operationId": "create_rule",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RuleBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_tools"
        ],
        "x-handler": "create_rule",
        "x-source": "crates/pelty-api/src/routes/admin_tools.rs"
      }
    },
    "/api/v1/admin/notification-rules/preview": {
      "post": {
        "operationId": "preview",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PreviewBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Payload that would be POSTed for an event (no network call).",
        "tags": [
          "super::admin_tools"
        ],
        "x-handler": "preview",
        "x-source": "crates/pelty-api/src/routes/admin_tools.rs"
      }
    },
    "/api/v1/admin/notification-rules/{id}": {
      "delete": {
        "operationId": "delete_rule",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_tools"
        ],
        "x-handler": "delete_rule",
        "x-source": "crates/pelty-api/src/routes/admin_tools.rs"
      },
      "put": {
        "operationId": "update_rule",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RuleBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_tools"
        ],
        "x-handler": "update_rule",
        "x-source": "crates/pelty-api/src/routes/admin_tools.rs"
      }
    },
    "/api/v1/admin/notification-rules/{id}/deliveries": {
      "get": {
        "operationId": "rule_deliveries",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "summary": "Delivery log for one rule (latest 100 attempts' outcome).",
        "tags": [
          "super::admin_tools"
        ],
        "x-handler": "rule_deliveries",
        "x-source": "crates/pelty-api/src/routes/admin_tools.rs"
      }
    },
    "/api/v1/admin/notification-rules/{id}/secret": {
      "delete": {
        "operationId": "clear_secret",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "Stop signing a webhook.",
        "tags": [
          "super::admin_tools"
        ],
        "x-handler": "clear_secret",
        "x-source": "crates/pelty-api/src/routes/admin_tools.rs"
      },
      "post": {
        "operationId": "rotate_secret",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Rotate the HMAC signing secret of a generic webhook; returned once.",
        "tags": [
          "super::admin_tools"
        ],
        "x-handler": "rotate_secret",
        "x-source": "crates/pelty-api/src/routes/admin_tools.rs"
      }
    },
    "/api/v1/admin/notification-rules/{id}/test": {
      "post": {
        "operationId": "test_rule",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "Queue a test delivery through the real channel.",
        "tags": [
          "super::admin_tools"
        ],
        "x-handler": "test_rule",
        "x-source": "crates/pelty-api/src/routes/admin_tools.rs"
      }
    },
    "/api/v1/admin/oauth-clients": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_list",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin list",
        "tags": [
          "oauth-clients"
        ],
        "x-handler": "admin_list",
        "x-source": "crates/pelty-api/src/oidc_provider.rs",
        "x-undocumented": true
      },
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_create",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin create",
        "tags": [
          "oauth-clients"
        ],
        "x-handler": "admin_create",
        "x-source": "crates/pelty-api/src/oidc_provider.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/oauth-clients/{id}": {
      "delete": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_delete",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin delete",
        "tags": [
          "oauth-clients"
        ],
        "x-handler": "admin_delete",
        "x-source": "crates/pelty-api/src/oidc_provider.rs",
        "x-undocumented": true
      },
      "patch": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_update",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin update",
        "tags": [
          "oauth-clients"
        ],
        "x-handler": "admin_update",
        "x-source": "crates/pelty-api/src/oidc_provider.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/oauth-clients/{id}/secret": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_rotate",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin rotate",
        "tags": [
          "oauth-clients"
        ],
        "x-handler": "admin_rotate",
        "x-source": "crates/pelty-api/src/oidc_provider.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/order-forms": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_list",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin list",
        "tags": [
          "order-forms"
        ],
        "x-handler": "admin_list",
        "x-source": "crates/pelty-api/src/routes/order_forms.rs",
        "x-undocumented": true
      },
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_create",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin create",
        "tags": [
          "order-forms"
        ],
        "x-handler": "admin_create",
        "x-source": "crates/pelty-api/src/routes/order_forms.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/order-forms/{id}": {
      "delete": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_delete",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin delete",
        "tags": [
          "order-forms"
        ],
        "x-handler": "admin_delete",
        "x-source": "crates/pelty-api/src/routes/order_forms.rs",
        "x-undocumented": true
      },
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_update",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin update",
        "tags": [
          "order-forms"
        ],
        "x-handler": "admin_update",
        "x-source": "crates/pelty-api/src/routes/order_forms.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/orders": {
      "get": {
        "operationId": "admin_orders",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_orders",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      },
      "post": {
        "operationId": "admin_create_order",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdminOrderBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Manual order for a customer, priced from the catalog like a client order.",
        "tags": [
          "super::store"
        ],
        "x-handler": "super::store::admin_create_order",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/orders/approval-queue": {
      "get": {
        "operationId": "queue",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::bulk"
        ],
        "x-handler": "queue",
        "x-source": "crates/pelty-api/src/routes/bulk.rs"
      }
    },
    "/api/v1/admin/orders/bulk": {
      "post": {
        "operationId": "orders_bulk",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OrdersBulk"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::bulk"
        ],
        "x-handler": "orders_bulk",
        "x-source": "crates/pelty-api/src/routes/bulk.rs"
      }
    },
    "/api/v1/admin/orders/{id}": {
      "delete": {
        "operationId": "admin_delete_order",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_delete_order",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      },
      "get": {
        "operationId": "admin_order",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_order",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/orders/{id}/approve": {
      "post": {
        "operationId": "admin_approve",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_approve",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/orders/{id}/cancel": {
      "post": {
        "operationId": "admin_cancel",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CancelBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_cancel",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/orders/{id}/notes": {
      "post": {
        "operationId": "admin_add_note",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NoteBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::store"
        ],
        "x-handler": "super::store::admin_add_note",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/orders/{id}/pending": {
      "post": {
        "operationId": "admin_pending_order",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_pending_order",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/orders/{id}/refund": {
      "post": {
        "operationId": "admin_refund_order",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "summary": "Refund an order: credit the paid invoice in full (credit note) and close\nthe order. Unpaid orders must be cancelled instead.",
        "tags": [
          "super::store"
        ],
        "x-handler": "super::store::admin_refund_order",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/overdue/run": {
      "post": {
        "operationId": "run_now",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "summary": "Run today's overdue automation now (idempotent with the daily job).",
        "tags": [
          "super::overdue"
        ],
        "x-handler": "run_now",
        "x-source": "crates/pelty-api/src/routes/overdue.rs"
      }
    },
    "/api/v1/admin/payments/{id}/refunds": {
      "post": {
        "operationId": "admin_refund",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefundBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Refund"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::refunds"
        ],
        "x-handler": "admin_refund",
        "x-source": "crates/pelty-api/src/routes/refunds.rs"
      }
    },
    "/api/v1/admin/plugins": {
      "get": {
        "operationId": "list_plugins",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::extensions"
        ],
        "x-handler": "list_plugins",
        "x-source": "crates/pelty-api/src/routes/extensions.rs"
      }
    },
    "/api/v1/admin/plugins/{id}": {
      "put": {
        "operationId": "set_plugin",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetPlugin"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::extensions"
        ],
        "x-handler": "set_plugin",
        "x-source": "crates/pelty-api/src/routes/extensions.rs"
      }
    },
    "/api/v1/admin/plugins/{id}/deliveries": {
      "get": {
        "operationId": "list_deliveries",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::plugins"
        ],
        "x-handler": "list_deliveries",
        "x-source": "crates/pelty-api/src/routes/plugins.rs"
      }
    },
    "/api/v1/admin/plugins/{id}/deliveries/{did}/redeliver": {
      "post": {
        "operationId": "redeliver",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "did",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::plugins"
        ],
        "x-handler": "redeliver",
        "x-source": "crates/pelty-api/src/routes/plugins.rs"
      }
    },
    "/api/v1/admin/plugins/{id}/settings": {
      "get": {
        "operationId": "get_settings",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::plugins"
        ],
        "x-handler": "get_settings",
        "x-source": "crates/pelty-api/src/routes/plugins.rs"
      },
      "put": {
        "operationId": "put_settings",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::plugins"
        ],
        "x-handler": "put_settings",
        "x-source": "crates/pelty-api/src/routes/plugins.rs"
      }
    },
    "/api/v1/admin/plugins/{id}/webhook": {
      "get": {
        "operationId": "get_webhook",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::plugins"
        ],
        "x-handler": "get_webhook",
        "x-source": "crates/pelty-api/src/routes/plugins.rs"
      },
      "put": {
        "operationId": "put_webhook",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::plugins"
        ],
        "x-handler": "put_webhook",
        "x-source": "crates/pelty-api/src/routes/plugins.rs"
      }
    },
    "/api/v1/admin/plugins/{id}/webhook/secret": {
      "post": {
        "operationId": "rotate_secret",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "summary": "Generate a new signing secret and return it once.",
        "tags": [
          "super::plugins"
        ],
        "x-handler": "rotate_secret",
        "x-source": "crates/pelty-api/src/routes/plugins.rs"
      }
    },
    "/api/v1/admin/prefs": {
      "get": {
        "operationId": "get_prefs",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Prefs"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_ops"
        ],
        "x-handler": "get_prefs",
        "x-source": "crates/pelty-api/src/routes/admin_ops.rs"
      },
      "put": {
        "operationId": "put_prefs",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Prefs"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_ops"
        ],
        "x-handler": "put_prefs",
        "x-source": "crates/pelty-api/src/routes/admin_ops.rs"
      }
    },
    "/api/v1/admin/product-groups/{id}/order-form": {
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_set_group",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin set group",
        "tags": [
          "product-groups"
        ],
        "x-handler": "admin_set_group",
        "x-source": "crates/pelty-api/src/routes/order_forms.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/products/{id}/free-domain": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_free_get",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin free get",
        "tags": [
          "products"
        ],
        "x-handler": "admin_free_get",
        "x-source": "crates/pelty-api/src/routes/order_forms.rs",
        "x-undocumented": true
      },
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_free_put",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin free put",
        "tags": [
          "products"
        ],
        "x-handler": "admin_free_put",
        "x-source": "crates/pelty-api/src/routes/order_forms.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/products/{id}/module": {
      "get": {
        "operationId": "product_get",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::provisioning"
        ],
        "x-handler": "product_get",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs"
      },
      "put": {
        "operationId": "product_set",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductModule"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::provisioning"
        ],
        "x-handler": "product_set",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs"
      }
    },
    "/api/v1/admin/products/{id}/server-group": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "product_group_get",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "product group get",
        "tags": [
          "products"
        ],
        "x-handler": "product_group_get",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs",
        "x-undocumented": true
      },
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "product_group_set",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "product group set",
        "tags": [
          "products"
        ],
        "x-handler": "product_group_set",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/projects": {
      "get": {
        "operationId": "list",
        "parameters": [
          {
            "in": "query",
            "name": "customer_id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::projects"
        ],
        "x-handler": "list",
        "x-source": "crates/pelty-api/src/routes/projects.rs"
      },
      "post": {
        "operationId": "create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::projects"
        ],
        "x-handler": "create",
        "x-source": "crates/pelty-api/src/routes/projects.rs"
      }
    },
    "/api/v1/admin/projects/{id}": {
      "delete": {
        "operationId": "remove",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::projects"
        ],
        "x-handler": "remove",
        "x-source": "crates/pelty-api/src/routes/projects.rs"
      },
      "get": {
        "operationId": "detail",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::projects"
        ],
        "x-handler": "detail",
        "x-source": "crates/pelty-api/src/routes/projects.rs"
      },
      "put": {
        "operationId": "update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::projects"
        ],
        "x-handler": "update",
        "x-source": "crates/pelty-api/src/routes/projects.rs"
      }
    },
    "/api/v1/admin/projects/{id}/invoice-time": {
      "post": {
        "operationId": "invoice_time",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "summary": "Bill all unbilled billable time on one invoice.",
        "tags": [
          "super::projects"
        ],
        "x-handler": "invoice_time",
        "x-source": "crates/pelty-api/src/routes/projects.rs"
      }
    },
    "/api/v1/admin/projects/{id}/links": {
      "delete": {
        "operationId": "unlink",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinkBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::projects"
        ],
        "x-handler": "unlink",
        "x-source": "crates/pelty-api/src/routes/projects.rs"
      },
      "post": {
        "operationId": "link",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinkBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::projects"
        ],
        "x-handler": "link",
        "x-source": "crates/pelty-api/src/routes/projects.rs"
      }
    },
    "/api/v1/admin/projects/{id}/tasks": {
      "post": {
        "operationId": "add_task",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TaskInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::projects"
        ],
        "x-handler": "add_task",
        "x-source": "crates/pelty-api/src/routes/projects.rs"
      }
    },
    "/api/v1/admin/projects/{id}/tasks/{task}": {
      "delete": {
        "operationId": "delete_task",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "task",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::projects"
        ],
        "x-handler": "delete_task",
        "x-source": "crates/pelty-api/src/routes/projects.rs"
      },
      "put": {
        "operationId": "set_task",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "task",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TaskState"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::projects"
        ],
        "x-handler": "set_task",
        "x-source": "crates/pelty-api/src/routes/projects.rs"
      }
    },
    "/api/v1/admin/projects/{id}/time": {
      "post": {
        "operationId": "add_time",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TimeInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::projects"
        ],
        "x-handler": "add_time",
        "x-source": "crates/pelty-api/src/routes/projects.rs"
      }
    },
    "/api/v1/admin/projects/{id}/time/{entry}": {
      "delete": {
        "operationId": "delete_time",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "entry",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::projects"
        ],
        "x-handler": "delete_time",
        "x-source": "crates/pelty-api/src/routes/projects.rs"
      }
    },
    "/api/v1/admin/provisioning/modules": {
      "get": {
        "operationId": "modules",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::provisioning"
        ],
        "x-handler": "modules",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs"
      }
    },
    "/api/v1/admin/quotes": {
      "get": {
        "operationId": "admin_list",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::quotes"
        ],
        "x-handler": "admin_list",
        "x-source": "crates/pelty-api/src/routes/quotes.rs"
      },
      "post": {
        "operationId": "admin_create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QuoteInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::quotes"
        ],
        "x-handler": "admin_create",
        "x-source": "crates/pelty-api/src/routes/quotes.rs"
      }
    },
    "/api/v1/admin/quotes/{id}": {
      "delete": {
        "operationId": "admin_delete",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::quotes"
        ],
        "x-handler": "admin_delete",
        "x-source": "crates/pelty-api/src/routes/quotes.rs"
      },
      "get": {
        "operationId": "admin_get",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::quotes"
        ],
        "x-handler": "admin_get",
        "x-source": "crates/pelty-api/src/routes/quotes.rs"
      },
      "put": {
        "operationId": "admin_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QuoteInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::quotes"
        ],
        "x-handler": "admin_update",
        "x-source": "crates/pelty-api/src/routes/quotes.rs"
      }
    },
    "/api/v1/admin/quotes/{id}/pdf": {
      "get": {
        "operationId": "admin_pdf",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/pdf": {}
            },
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::quote_pdf"
        ],
        "x-handler": "admin_pdf",
        "x-source": "crates/pelty-api/src/routes/quote_pdf.rs"
      }
    },
    "/api/v1/admin/quotes/{id}/send": {
      "post": {
        "operationId": "admin_send",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::quotes"
        ],
        "x-handler": "admin_send",
        "x-source": "crates/pelty-api/src/routes/quotes.rs"
      }
    },
    "/api/v1/admin/registrars": {
      "get": {
        "operationId": "admin_registrars",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "admin_registrars",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/admin/reports": {
      "get": {
        "operationId": "get_report",
        "parameters": [
          {
            "description": "First month, `YYYY-MM` (default: 11 months before `to`).",
            "in": "query",
            "name": "from",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "description": "Last month, `YYYY-MM` (default: current month).",
            "in": "query",
            "name": "to",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Report"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::reports"
        ],
        "x-handler": "get_report",
        "x-source": "crates/pelty-api/src/routes/reports.rs"
      }
    },
    "/api/v1/admin/reports/library": {
      "get": {
        "operationId": "library",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "summary": "Available reports grouped by category.",
        "tags": [
          "super::reports"
        ],
        "x-handler": "library",
        "x-source": "crates/pelty-api/src/routes/reports.rs"
      }
    },
    "/api/v1/admin/reports/library/{key}": {
      "get": {
        "operationId": "run_report",
        "parameters": [
          {
            "in": "query",
            "name": "from",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "to",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "description": "`json` (default) or `csv`.",
            "in": "query",
            "name": "format",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "path",
            "name": "key",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Run one report over whole months `[from, to]` as JSON or CSV.",
        "tags": [
          "super::reports"
        ],
        "x-handler": "run_report",
        "x-source": "crates/pelty-api/src/routes/reports.rs"
      }
    },
    "/api/v1/admin/reports/tax": {
      "get": {
        "operationId": "tax",
        "parameters": [
          {
            "description": "First month, `YYYY-MM`.",
            "in": "query",
            "name": "from",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "description": "Last month (inclusive), `YYYY-MM`.",
            "in": "query",
            "name": "to",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TaxReport"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::exports"
        ],
        "x-handler": "tax",
        "x-source": "crates/pelty-api/src/routes/exports.rs"
      }
    },
    "/api/v1/admin/reports/tax.csv": {
      "get": {
        "operationId": "tax_csv",
        "parameters": [
          {
            "description": "First month, `YYYY-MM`.",
            "in": "query",
            "name": "from",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "description": "Last month (inclusive), `YYYY-MM`.",
            "in": "query",
            "name": "to",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "text/csv": {}
            },
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::exports"
        ],
        "x-handler": "tax_csv",
        "x-source": "crates/pelty-api/src/routes/exports.rs"
      }
    },
    "/api/v1/admin/roles": {
      "get": {
        "operationId": "list_roles",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::staff"
        ],
        "x-handler": "list_roles",
        "x-source": "crates/pelty-api/src/routes/staff.rs"
      },
      "post": {
        "operationId": "create_role",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RoleInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::staff"
        ],
        "x-handler": "create_role",
        "x-source": "crates/pelty-api/src/routes/staff.rs"
      }
    },
    "/api/v1/admin/roles/{id}": {
      "delete": {
        "operationId": "delete_role",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::staff"
        ],
        "x-handler": "delete_role",
        "x-source": "crates/pelty-api/src/routes/staff.rs"
      },
      "put": {
        "operationId": "update_role",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RoleInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::staff"
        ],
        "x-handler": "update_role",
        "x-source": "crates/pelty-api/src/routes/staff.rs"
      }
    },
    "/api/v1/admin/saml/idps": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_list",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin list",
        "tags": [
          "saml"
        ],
        "x-handler": "admin_list",
        "x-source": "crates/pelty-api/src/saml.rs",
        "x-undocumented": true
      },
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_create",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin create",
        "tags": [
          "saml"
        ],
        "x-handler": "admin_create",
        "x-source": "crates/pelty-api/src/saml.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/saml/idps/{id}": {
      "delete": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_delete",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin delete",
        "tags": [
          "saml"
        ],
        "x-handler": "admin_delete",
        "x-source": "crates/pelty-api/src/saml.rs",
        "x-undocumented": true
      },
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_get",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin get",
        "tags": [
          "saml"
        ],
        "x-handler": "admin_get",
        "x-source": "crates/pelty-api/src/saml.rs",
        "x-undocumented": true
      },
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_update",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin update",
        "tags": [
          "saml"
        ],
        "x-handler": "admin_update",
        "x-source": "crates/pelty-api/src/saml.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/saml/idps/{id}/rotate-key": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_rotate_key",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin rotate key",
        "tags": [
          "saml"
        ],
        "x-handler": "admin_rotate_key",
        "x-source": "crates/pelty-api/src/saml.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/saml/idps/{id}/validate": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_validate",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin validate",
        "tags": [
          "saml"
        ],
        "x-handler": "admin_validate",
        "x-source": "crates/pelty-api/src/saml.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/saml/metadata": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_parse_metadata",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin parse metadata",
        "tags": [
          "saml"
        ],
        "x-handler": "admin_parse_metadata",
        "x-source": "crates/pelty-api/src/saml.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/search": {
      "get": {
        "operationId": "search",
        "parameters": [
          {
            "in": "query",
            "name": "q",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Global search across clients, invoices, services, tickets, domains, orders.",
        "tags": [
          "super::admin_tools"
        ],
        "x-handler": "search",
        "x-source": "crates/pelty-api/src/routes/admin_tools.rs"
      }
    },
    "/api/v1/admin/security-questions": {
      "get": {
        "operationId": "admin_list",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::security_questions"
        ],
        "x-handler": "admin_list",
        "x-source": "crates/pelty-api/src/routes/security_questions.rs"
      },
      "post": {
        "operationId": "admin_create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NewQuestion"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::security_questions"
        ],
        "x-handler": "admin_create",
        "x-source": "crates/pelty-api/src/routes/security_questions.rs"
      }
    },
    "/api/v1/admin/security-questions/{id}": {
      "delete": {
        "operationId": "admin_delete",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::security_questions"
        ],
        "x-handler": "admin_delete",
        "x-source": "crates/pelty-api/src/routes/security_questions.rs"
      }
    },
    "/api/v1/admin/security/captcha": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "get_policy",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "get policy",
        "tags": [
          "security"
        ],
        "x-handler": "get_policy",
        "x-source": "crates/pelty-api/src/captcha.rs",
        "x-undocumented": true
      },
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "put_policy",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "put policy",
        "tags": [
          "security"
        ],
        "x-handler": "put_policy",
        "x-source": "crates/pelty-api/src/captcha.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/security/duo": {
      "get": {
        "operationId": "admin_get",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "crate::duo"
        ],
        "x-handler": "admin_get",
        "x-source": "crates/pelty-api/src/duo.rs"
      },
      "put": {
        "operationId": "admin_put",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DuoBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "crate::duo"
        ],
        "x-handler": "admin_put",
        "x-source": "crates/pelty-api/src/duo.rs"
      }
    },
    "/api/v1/admin/security/duo/test": {
      "post": {
        "operationId": "admin_test",
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "crate::duo"
        ],
        "x-handler": "admin_test",
        "x-source": "crates/pelty-api/src/duo.rs"
      }
    },
    "/api/v1/admin/security/ip-rules": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "list_rules",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "list rules",
        "tags": [
          "security"
        ],
        "x-handler": "list_rules",
        "x-source": "crates/pelty-api/src/security.rs",
        "x-undocumented": true
      },
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "add_rule",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "add rule",
        "tags": [
          "security"
        ],
        "x-handler": "add_rule",
        "x-source": "crates/pelty-api/src/security.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/security/ip-rules/{id}": {
      "delete": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "delete_rule",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "delete rule",
        "tags": [
          "security"
        ],
        "x-handler": "delete_rule",
        "x-source": "crates/pelty-api/src/security.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/security/policy": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "get_policy",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "get policy",
        "tags": [
          "security"
        ],
        "x-handler": "get_policy",
        "x-source": "crates/pelty-api/src/security.rs",
        "x-undocumented": true
      },
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "put_policy",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "put policy",
        "tags": [
          "security"
        ],
        "x-handler": "put_policy",
        "x-source": "crates/pelty-api/src/security.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/security/staff-2fa": {
      "get": {
        "operationId": "get_2fa",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::staff"
        ],
        "x-handler": "get_2fa",
        "x-source": "crates/pelty-api/src/routes/staff.rs"
      },
      "put": {
        "operationId": "put_2fa",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TwoFaBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "summary": "Turning the policy on requires the actor to have 2FA (no self lock-out).",
        "tags": [
          "super::staff"
        ],
        "x-handler": "put_2fa",
        "x-source": "crates/pelty-api/src/routes/staff.rs"
      }
    },
    "/api/v1/admin/security/tos": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "list_tos",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "list tos",
        "tags": [
          "security"
        ],
        "x-handler": "list_tos",
        "x-source": "crates/pelty-api/src/security.rs",
        "x-undocumented": true
      },
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "publish_tos",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "publish tos",
        "tags": [
          "security"
        ],
        "x-handler": "publish_tos",
        "x-source": "crates/pelty-api/src/security.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/security/trusted-proxies": {
      "get": {
        "operationId": "get_cfg",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "crate::trusted_proxy"
        ],
        "x-handler": "crate::trusted_proxy::get_cfg",
        "x-source": "crates/pelty-api/src/security.rs"
      },
      "put": {
        "operationId": "put_cfg",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TrustedProxies"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "crate::trusted_proxy"
        ],
        "x-handler": "crate::trusted_proxy::put_cfg",
        "x-source": "crates/pelty-api/src/security.rs"
      }
    },
    "/api/v1/admin/server-groups": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "groups_list",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "groups list",
        "tags": [
          "server-groups"
        ],
        "x-handler": "groups_list",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs",
        "x-undocumented": true
      },
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "groups_create",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "groups create",
        "tags": [
          "server-groups"
        ],
        "x-handler": "groups_create",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/server-groups/{id}": {
      "delete": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "groups_delete",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "groups delete",
        "tags": [
          "server-groups"
        ],
        "x-handler": "groups_delete",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs",
        "x-undocumented": true
      },
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "groups_update",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "groups update",
        "tags": [
          "server-groups"
        ],
        "x-handler": "groups_update",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/server-groups/{id}/servers": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "groups_members",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "groups members",
        "tags": [
          "server-groups"
        ],
        "x-handler": "groups_members",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs",
        "x-undocumented": true
      },
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "groups_set_members",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "groups set members",
        "tags": [
          "server-groups"
        ],
        "x-handler": "groups_set_members",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/servers": {
      "get": {
        "operationId": "list",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::provisioning"
        ],
        "x-handler": "list",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs"
      },
      "post": {
        "operationId": "create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServerInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::provisioning"
        ],
        "x-handler": "create",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs"
      }
    },
    "/api/v1/admin/servers/health": {
      "get": {
        "operationId": "health",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::modules_ext"
        ],
        "x-handler": "health",
        "x-source": "crates/pelty-api/src/routes/modules_ext.rs"
      }
    },
    "/api/v1/admin/servers/health/check": {
      "post": {
        "operationId": "check_all",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::modules_ext"
        ],
        "x-handler": "check_all",
        "x-source": "crates/pelty-api/src/routes/modules_ext.rs"
      }
    },
    "/api/v1/admin/servers/{id}": {
      "delete": {
        "operationId": "remove",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::provisioning"
        ],
        "x-handler": "remove",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs"
      },
      "put": {
        "operationId": "update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServerInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::provisioning"
        ],
        "x-handler": "update",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs"
      }
    },
    "/api/v1/admin/servers/{id}/accounts": {
      "get": {
        "operationId": "accounts",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "summary": "Accounts on the panel, each with the service it is linked to (if any).",
        "tags": [
          "super::provisioning"
        ],
        "x-handler": "accounts",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs"
      }
    },
    "/api/v1/admin/servers/{id}/import": {
      "post": {
        "operationId": "import",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImportBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Create services for panel accounts (no provisioning call; status `ok`).",
        "tags": [
          "super::provisioning"
        ],
        "x-handler": "import",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs"
      }
    },
    "/api/v1/admin/servers/{id}/test": {
      "post": {
        "operationId": "test",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "Check the stored credentials against the panel. Returns `{ok, error?}`\nwith a stable error code; never echoes the key.",
        "tags": [
          "super::provisioning"
        ],
        "x-handler": "test",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs"
      }
    },
    "/api/v1/admin/servers/{id}/vendor-catalog/sync": {
      "post": {
        "operationId": "sync",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "summary": "Pull the vendor catalog through the server's module.",
        "tags": [
          "super::vendor"
        ],
        "x-handler": "sync",
        "x-source": "crates/pelty-api/src/routes/vendor.rs"
      }
    },
    "/api/v1/admin/services": {
      "get": {
        "operationId": "admin_services",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_services",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/services/{id}": {
      "get": {
        "operationId": "admin_service",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_service",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/services/{id}/action": {
      "post": {
        "operationId": "admin_service_action",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServiceAction"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "admin_service_action",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/admin/services/{id}/change": {
      "delete": {
        "operationId": "admin_cancel_change",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::service_changes"
        ],
        "x-handler": "admin_cancel_change",
        "x-source": "crates/pelty-api/src/routes/service_changes.rs"
      },
      "post": {
        "operationId": "admin_change",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::service_changes"
        ],
        "x-handler": "admin_change",
        "x-source": "crates/pelty-api/src/routes/service_changes.rs"
      }
    },
    "/api/v1/admin/services/{id}/lifecycle": {
      "get": {
        "operationId": "admin_lifecycle",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::service_changes"
        ],
        "x-handler": "admin_lifecycle",
        "x-source": "crates/pelty-api/src/routes/service_changes.rs"
      }
    },
    "/api/v1/admin/services/{id}/module": {
      "post": {
        "operationId": "service_action",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ModuleAction"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Manually (re)run a module action. Does not change the billing status.",
        "tags": [
          "super::provisioning"
        ],
        "x-handler": "service_action",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs"
      }
    },
    "/api/v1/admin/services/{id}/module/custom": {
      "post": {
        "operationId": "admin_custom",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::modules_ext"
        ],
        "x-handler": "admin_custom",
        "x-source": "crates/pelty-api/src/routes/modules_ext.rs"
      }
    },
    "/api/v1/admin/services/{id}/module/usage": {
      "get": {
        "operationId": "admin_usage",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::modules_ext"
        ],
        "x-handler": "admin_usage",
        "x-source": "crates/pelty-api/src/routes/modules_ext.rs"
      }
    },
    "/api/v1/admin/services/{id}/provisioning": {
      "get": {
        "operationId": "service_state",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::provisioning"
        ],
        "x-handler": "service_state",
        "x-source": "crates/pelty-api/src/routes/provisioning.rs"
      }
    },
    "/api/v1/admin/services/{id}/renew-now": {
      "post": {
        "operationId": "admin_renew",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EarlyRenewal"
                }
              }
            },
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::renewals"
        ],
        "x-handler": "admin_renew",
        "x-source": "crates/pelty-api/src/routes/renewals.rs"
      }
    },
    "/api/v1/admin/services/{id}/usage": {
      "get": {
        "operationId": "admin_usage",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::usage"
        ],
        "x-handler": "admin_usage",
        "x-source": "crates/pelty-api/src/routes/usage.rs"
      },
      "post": {
        "operationId": "record",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RecordBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::usage"
        ],
        "x-handler": "record",
        "x-source": "crates/pelty-api/src/routes/usage.rs"
      }
    },
    "/api/v1/admin/settings/add-funds": {
      "get": {
        "operationId": "get_add_funds",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AddFundsSettings"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::credit"
        ],
        "x-handler": "get_add_funds",
        "x-source": "crates/pelty-api/src/routes/credit.rs"
      },
      "put": {
        "operationId": "put_add_funds",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddFundsSettings"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AddFundsSettings"
                }
              }
            },
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::credit"
        ],
        "x-handler": "put_add_funds",
        "x-source": "crates/pelty-api/src/routes/credit.rs"
      }
    },
    "/api/v1/admin/settings/autopay": {
      "get": {
        "operationId": "get_settings",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AutopaySettings"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::payment_methods"
        ],
        "x-handler": "get_settings",
        "x-source": "crates/pelty-api/src/routes/payment_methods.rs"
      },
      "put": {
        "operationId": "put_settings",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AutopaySettings"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AutopaySettings"
                }
              }
            },
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::payment_methods"
        ],
        "x-handler": "put_settings",
        "x-source": "crates/pelty-api/src/routes/payment_methods.rs"
      }
    },
    "/api/v1/admin/settings/bank-transfer": {
      "get": {
        "operationId": "get_bank",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BankTransfer"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::settings"
        ],
        "x-handler": "get_bank",
        "x-source": "crates/pelty-api/src/routes/settings.rs"
      },
      "put": {
        "operationId": "put_bank",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BankTransfer"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BankTransfer"
                }
              }
            },
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::settings"
        ],
        "x-handler": "put_bank",
        "x-source": "crates/pelty-api/src/routes/settings.rs"
      }
    },
    "/api/v1/admin/settings/domain-defaults": {
      "get": {
        "operationId": "get_defaults",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "get_defaults",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      },
      "put": {
        "operationId": "put_defaults",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DomainDefaults"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "put_defaults",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/admin/settings/due-reminders": {
      "get": {
        "operationId": "due_get",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::bulk"
        ],
        "x-handler": "due_get",
        "x-source": "crates/pelty-api/src/routes/bulk.rs"
      },
      "put": {
        "operationId": "due_put",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DueReminderSettings"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::bulk"
        ],
        "x-handler": "due_put",
        "x-source": "crates/pelty-api/src/routes/bulk.rs"
      }
    },
    "/api/v1/admin/settings/einvoice": {
      "get": {
        "operationId": "get_settings",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Settings"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::einvoice"
        ],
        "x-handler": "get_settings",
        "x-source": "crates/pelty-api/src/routes/einvoice.rs"
      },
      "put": {
        "operationId": "put_settings",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Settings"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Settings"
                }
              }
            },
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::einvoice"
        ],
        "x-handler": "put_settings",
        "x-source": "crates/pelty-api/src/routes/einvoice.rs"
      }
    },
    "/api/v1/admin/settings/fraud": {
      "get": {
        "operationId": "get_settings",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FraudSettings"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::fraud"
        ],
        "x-handler": "get_settings",
        "x-source": "crates/pelty-api/src/routes/fraud.rs"
      },
      "put": {
        "operationId": "put_settings",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FraudSettings"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FraudSettings"
                }
              }
            },
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::fraud"
        ],
        "x-handler": "put_settings",
        "x-source": "crates/pelty-api/src/routes/fraud.rs"
      }
    },
    "/api/v1/admin/settings/housekeeping": {
      "get": {
        "operationId": "get_housekeeping",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_ops"
        ],
        "x-handler": "get_housekeeping",
        "x-source": "crates/pelty-api/src/routes/admin_ops.rs"
      },
      "put": {
        "operationId": "put_housekeeping",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HousekeepingSettings"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_ops"
        ],
        "x-handler": "put_housekeeping",
        "x-source": "crates/pelty-api/src/routes/admin_ops.rs"
      }
    },
    "/api/v1/admin/settings/inactive-clients": {
      "get": {
        "operationId": "get_inactive",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Settings"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "super::admin_ops"
        ],
        "x-handler": "get_inactive",
        "x-source": "crates/pelty-api/src/routes/admin_ops.rs"
      },
      "put": {
        "operationId": "put_inactive",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Settings"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_ops"
        ],
        "x-handler": "put_inactive",
        "x-source": "crates/pelty-api/src/routes/admin_ops.rs"
      }
    },
    "/api/v1/admin/settings/invoice-branding": {
      "get": {
        "operationId": "get_branding",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceBranding"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::invoice_pdf"
        ],
        "x-handler": "get_branding",
        "x-source": "crates/pelty-api/src/routes/invoice_pdf.rs"
      },
      "put": {
        "operationId": "put_branding",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvoiceBranding"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceBranding"
                }
              }
            },
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::invoice_pdf"
        ],
        "x-handler": "put_branding",
        "x-source": "crates/pelty-api/src/routes/invoice_pdf.rs"
      }
    },
    "/api/v1/admin/settings/on-demand-renewals": {
      "get": {
        "operationId": "get_cfg",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RenewalSettings"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "super::renewals"
        ],
        "x-handler": "get_cfg",
        "x-source": "crates/pelty-api/src/routes/renewals.rs"
      },
      "put": {
        "operationId": "put_cfg",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RenewalSettings"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RenewalSettings"
                }
              }
            },
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::renewals"
        ],
        "x-handler": "put_cfg",
        "x-source": "crates/pelty-api/src/routes/renewals.rs"
      }
    },
    "/api/v1/admin/settings/order-approval": {
      "get": {
        "operationId": "rules_get",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::bulk"
        ],
        "x-handler": "rules_get",
        "x-source": "crates/pelty-api/src/routes/bulk.rs"
      },
      "put": {
        "operationId": "rules_put",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApprovalRules"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::bulk"
        ],
        "x-handler": "rules_put",
        "x-source": "crates/pelty-api/src/routes/bulk.rs"
      }
    },
    "/api/v1/admin/settings/overdue": {
      "get": {
        "operationId": "get_settings",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OverdueSettings"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::overdue"
        ],
        "x-handler": "get_settings",
        "x-source": "crates/pelty-api/src/routes/overdue.rs"
      },
      "put": {
        "operationId": "put_settings",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OverdueSettings"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OverdueSettings"
                }
              }
            },
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::overdue"
        ],
        "x-handler": "put_settings",
        "x-source": "crates/pelty-api/src/routes/overdue.rs"
      }
    },
    "/api/v1/admin/settings/proforma": {
      "get": {
        "operationId": "get_proforma",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_ops"
        ],
        "x-handler": "get_proforma",
        "x-source": "crates/pelty-api/src/routes/admin_ops.rs"
      },
      "put": {
        "operationId": "put_proforma",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Proforma"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_ops"
        ],
        "x-handler": "put_proforma",
        "x-source": "crates/pelty-api/src/routes/admin_ops.rs"
      }
    },
    "/api/v1/admin/settings/registrant-verification": {
      "get": {
        "operationId": "admin_rv_settings",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "admin_rv_settings",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      },
      "put": {
        "operationId": "admin_rv_settings_put",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RvSettings"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "admin_rv_settings_put",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/admin/settings/reversal": {
      "get": {
        "operationId": "get_reversal",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReversalSettings"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "super::refunds"
        ],
        "x-handler": "get_reversal",
        "x-source": "crates/pelty-api/src/routes/refunds.rs"
      },
      "put": {
        "operationId": "put_reversal",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReversalSettings"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReversalSettings"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "super::refunds"
        ],
        "x-handler": "put_reversal",
        "x-source": "crates/pelty-api/src/routes/refunds.rs"
      }
    },
    "/api/v1/admin/settings/smtp": {
      "get": {
        "operationId": "get_smtp",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SmtpView"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::smtp"
        ],
        "x-handler": "get_smtp",
        "x-source": "crates/pelty-api/src/routes/smtp.rs"
      },
      "put": {
        "operationId": "put_smtp",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SmtpInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SmtpView"
                }
              }
            },
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::smtp"
        ],
        "x-handler": "put_smtp",
        "x-source": "crates/pelty-api/src/routes/smtp.rs"
      }
    },
    "/api/v1/admin/settings/smtp/test": {
      "post": {
        "operationId": "test_smtp",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SmtpTest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SmtpTestResult"
                }
              }
            },
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Send a test mail synchronously with the *saved* settings.",
        "tags": [
          "super::smtp"
        ],
        "x-handler": "test_smtp",
        "x-source": "crates/pelty-api/src/routes/smtp.rs"
      }
    },
    "/api/v1/admin/settings/tax": {
      "get": {
        "operationId": "get_settings",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TaxSettings"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::tax"
        ],
        "x-handler": "get_settings",
        "x-source": "crates/pelty-api/src/routes/tax.rs"
      },
      "put": {
        "operationId": "put_settings",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TaxSettings"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TaxSettings"
                }
              }
            },
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::tax"
        ],
        "x-handler": "put_settings",
        "x-source": "crates/pelty-api/src/routes/tax.rs"
      }
    },
    "/api/v1/admin/settings/ticket-auto-close": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "auto_close_get",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "auto close get",
        "tags": [
          "settings"
        ],
        "x-handler": "auto_close_get",
        "x-source": "crates/pelty-api/src/routes/support.rs",
        "x-undocumented": true
      },
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "auto_close_put",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "auto close put",
        "tags": [
          "settings"
        ],
        "x-handler": "auto_close_put",
        "x-source": "crates/pelty-api/src/routes/support.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/setup-wizard": {
      "get": {
        "operationId": "status",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Wizard"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::setup_wizard"
        ],
        "x-handler": "status",
        "x-source": "crates/pelty-api/src/routes/setup_wizard.rs"
      }
    },
    "/api/v1/admin/setup-wizard/dismissed": {
      "put": {
        "operationId": "dismiss",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DismissBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Wizard"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "super::setup_wizard"
        ],
        "x-handler": "dismiss",
        "x-source": "crates/pelty-api/src/routes/setup_wizard.rs"
      }
    },
    "/api/v1/admin/site": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_get",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin get",
        "tags": [
          "site"
        ],
        "x-handler": "admin_get",
        "x-source": "crates/pelty-api/src/routes/site.rs",
        "x-undocumented": true
      },
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_put",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin put",
        "tags": [
          "site"
        ],
        "x-handler": "admin_put",
        "x-source": "crates/pelty-api/src/routes/site.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/site/pages": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_pages",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin pages",
        "tags": [
          "site"
        ],
        "x-handler": "admin_pages",
        "x-source": "crates/pelty-api/src/routes/site.rs",
        "x-undocumented": true
      },
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_create",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin create",
        "tags": [
          "site"
        ],
        "x-handler": "admin_create",
        "x-source": "crates/pelty-api/src/routes/site.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/site/pages/{id}": {
      "delete": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_delete",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin delete",
        "tags": [
          "site"
        ],
        "x-handler": "admin_delete",
        "x-source": "crates/pelty-api/src/routes/site.rs",
        "x-undocumented": true
      },
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_page",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin page",
        "tags": [
          "site"
        ],
        "x-handler": "admin_page",
        "x-source": "crates/pelty-api/src/routes/site.rs",
        "x-undocumented": true
      },
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_update",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin update",
        "tags": [
          "site"
        ],
        "x-handler": "admin_update",
        "x-source": "crates/pelty-api/src/routes/site.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/ssl": {
      "get": {
        "operationId": "admin_list",
        "parameters": [
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::ssl"
        ],
        "x-handler": "admin_list",
        "x-source": "crates/pelty-api/src/routes/ssl.rs"
      }
    },
    "/api/v1/admin/staff": {
      "get": {
        "operationId": "list_staff",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::staff"
        ],
        "x-handler": "list_staff",
        "x-source": "crates/pelty-api/src/routes/staff.rs"
      }
    },
    "/api/v1/admin/staff-online": {
      "get": {
        "operationId": "staff_online",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_ops"
        ],
        "x-handler": "staff_online",
        "x-source": "crates/pelty-api/src/routes/admin_ops.rs"
      }
    },
    "/api/v1/admin/support/departments": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "departments",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "departments",
        "tags": [
          "support"
        ],
        "x-handler": "departments",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/support/departments/{id}": {
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "update_department",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "update department",
        "tags": [
          "support"
        ],
        "x-handler": "update_department",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/support/departments/{id}/pipe": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "pipe_now",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "pipe now",
        "tags": [
          "support"
        ],
        "x-handler": "pipe_now",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/support/spam-rules": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "spam_rules",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "spam rules",
        "tags": [
          "support"
        ],
        "x-handler": "spam_rules",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      },
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "add_spam",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "add spam",
        "tags": [
          "support"
        ],
        "x-handler": "add_spam",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/support/spam-rules/{id}": {
      "delete": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "del_spam",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "del spam",
        "tags": [
          "support"
        ],
        "x-handler": "del_spam",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/system-health": {
      "get": {
        "operationId": "health",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::admin_tools"
        ],
        "x-handler": "health",
        "x-source": "crates/pelty-api/src/routes/admin_tools.rs"
      }
    },
    "/api/v1/admin/system/updates": {
      "get": {
        "operationId": "get_status",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "crate::updates"
        ],
        "x-handler": "get_status",
        "x-source": "crates/pelty-api/src/updates.rs"
      },
      "put": {
        "operationId": "put_config",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateConfig"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "crate::updates"
        ],
        "x-handler": "put_config",
        "x-source": "crates/pelty-api/src/updates.rs"
      }
    },
    "/api/v1/admin/system/updates/check": {
      "post": {
        "operationId": "check_now",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "crate::updates"
        ],
        "x-handler": "check_now",
        "x-source": "crates/pelty-api/src/updates.rs"
      }
    },
    "/api/v1/admin/tax-rules": {
      "get": {
        "operationId": "list_rules",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::tax"
        ],
        "x-handler": "list_rules",
        "x-source": "crates/pelty-api/src/routes/tax.rs"
      },
      "post": {
        "operationId": "create_rule",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RuleInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TaxRule"
                }
              }
            },
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::tax"
        ],
        "x-handler": "create_rule",
        "x-source": "crates/pelty-api/src/routes/tax.rs"
      }
    },
    "/api/v1/admin/tax-rules/{id}": {
      "delete": {
        "operationId": "delete_rule",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::tax"
        ],
        "x-handler": "delete_rule",
        "x-source": "crates/pelty-api/src/routes/tax.rs"
      },
      "put": {
        "operationId": "update_rule",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RuleInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TaxRule"
                }
              }
            },
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::tax"
        ],
        "x-handler": "update_rule",
        "x-source": "crates/pelty-api/src/routes/tax.rs"
      }
    },
    "/api/v1/admin/themes/active": {
      "put": {
        "operationId": "set_active_theme",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ActivateTheme"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::extensions"
        ],
        "x-handler": "set_active_theme",
        "x-source": "crates/pelty-api/src/routes/extensions.rs"
      }
    },
    "/api/v1/admin/ticket-canned": {
      "get": {
        "operationId": "canned_list",
        "parameters": [
          {
            "in": "query",
            "name": "department_id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::support"
        ],
        "x-handler": "canned_list",
        "x-source": "crates/pelty-api/src/routes/support.rs"
      },
      "post": {
        "operationId": "canned_create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CannedBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::support"
        ],
        "x-handler": "canned_create",
        "x-source": "crates/pelty-api/src/routes/support.rs"
      }
    },
    "/api/v1/admin/ticket-canned/{id}": {
      "delete": {
        "operationId": "canned_delete",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::support"
        ],
        "x-handler": "canned_delete",
        "x-source": "crates/pelty-api/src/routes/support.rs"
      },
      "put": {
        "operationId": "canned_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CannedBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::support"
        ],
        "x-handler": "canned_update",
        "x-source": "crates/pelty-api/src/routes/support.rs"
      }
    },
    "/api/v1/admin/ticket-departments": {
      "get": {
        "operationId": "admin_departments",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::tickets"
        ],
        "x-handler": "admin_departments",
        "x-source": "crates/pelty-api/src/routes/tickets.rs"
      },
      "post": {
        "operationId": "admin_create_department",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DepartmentBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::tickets"
        ],
        "x-handler": "admin_create_department",
        "x-source": "crates/pelty-api/src/routes/tickets.rs"
      }
    },
    "/api/v1/admin/ticket-departments-sla": {
      "get": {
        "operationId": "department_slas",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::support"
        ],
        "x-handler": "department_slas",
        "x-source": "crates/pelty-api/src/routes/support.rs"
      }
    },
    "/api/v1/admin/ticket-departments/{id}": {
      "put": {
        "operationId": "admin_update_department",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DepartmentBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::tickets"
        ],
        "x-handler": "admin_update_department",
        "x-source": "crates/pelty-api/src/routes/tickets.rs"
      }
    },
    "/api/v1/admin/ticket-departments/{id}/sla": {
      "put": {
        "operationId": "set_department_sla",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DepartmentSlaBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::support"
        ],
        "x-handler": "set_department_sla",
        "x-source": "crates/pelty-api/src/routes/support.rs"
      }
    },
    "/api/v1/admin/ticket-escalations": {
      "get": {
        "operationId": "rules",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::support"
        ],
        "x-handler": "rules",
        "x-source": "crates/pelty-api/src/routes/support.rs"
      },
      "post": {
        "operationId": "rule_create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RuleBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::support"
        ],
        "x-handler": "rule_create",
        "x-source": "crates/pelty-api/src/routes/support.rs"
      }
    },
    "/api/v1/admin/ticket-escalations/run": {
      "post": {
        "operationId": "rules_run",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Enqueue an escalation pass now (durable job; the worker also schedules one\nevery few minutes).",
        "tags": [
          "super::support"
        ],
        "x-handler": "rules_run",
        "x-source": "crates/pelty-api/src/routes/support.rs"
      }
    },
    "/api/v1/admin/ticket-escalations/{id}": {
      "delete": {
        "operationId": "rule_delete",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::support"
        ],
        "x-handler": "rule_delete",
        "x-source": "crates/pelty-api/src/routes/support.rs"
      },
      "put": {
        "operationId": "rule_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RuleBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::support"
        ],
        "x-handler": "rule_update",
        "x-source": "crates/pelty-api/src/routes/support.rs"
      }
    },
    "/api/v1/admin/ticket-satisfaction": {
      "get": {
        "operationId": "satisfaction",
        "parameters": [
          {
            "in": "query",
            "name": "days",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "department_id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "low",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "summary": "CSAT report: distribution, per department / staff, recent comments.",
        "tags": [
          "super::support"
        ],
        "x-handler": "satisfaction",
        "x-source": "crates/pelty-api/src/routes/support.rs"
      }
    },
    "/api/v1/admin/ticket-sla": {
      "get": {
        "operationId": "sla",
        "parameters": [
          {
            "in": "query",
            "name": "days",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::support"
        ],
        "x-handler": "sla",
        "x-source": "crates/pelty-api/src/routes/support.rs"
      }
    },
    "/api/v1/admin/ticket-staff": {
      "get": {
        "operationId": "staff",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::support"
        ],
        "x-handler": "staff",
        "x-source": "crates/pelty-api/src/routes/support.rs"
      }
    },
    "/api/v1/admin/ticket-statuses": {
      "post": {
        "operationId": "create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StatusInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::ticket_statuses"
        ],
        "x-handler": "create",
        "x-source": "crates/pelty-api/src/routes/ticket_statuses.rs"
      }
    },
    "/api/v1/admin/ticket-statuses/{slug}": {
      "delete": {
        "operationId": "delete",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::ticket_statuses"
        ],
        "x-handler": "delete",
        "x-source": "crates/pelty-api/src/routes/ticket_statuses.rs"
      },
      "put": {
        "operationId": "update",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StatusInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::ticket_statuses"
        ],
        "x-handler": "update",
        "x-source": "crates/pelty-api/src/routes/ticket_statuses.rs"
      }
    },
    "/api/v1/admin/tickets": {
      "get": {
        "operationId": "admin_list",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::tickets"
        ],
        "x-handler": "admin_list",
        "x-source": "crates/pelty-api/src/routes/tickets.rs"
      },
      "post": {
        "operationId": "admin_open",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OpenBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::tickets"
        ],
        "x-handler": "admin_open",
        "x-source": "crates/pelty-api/src/routes/tickets.rs"
      }
    },
    "/api/v1/admin/tickets/{id}": {
      "get": {
        "operationId": "admin_get",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::tickets"
        ],
        "x-handler": "admin_get",
        "x-source": "crates/pelty-api/src/routes/tickets.rs"
      },
      "patch": {
        "operationId": "admin_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::tickets"
        ],
        "x-handler": "admin_update",
        "x-source": "crates/pelty-api/src/routes/tickets.rs"
      }
    },
    "/api/v1/admin/tickets/{id}/merge": {
      "post": {
        "operationId": "merge",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MergeBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::support"
        ],
        "x-handler": "merge",
        "x-source": "crates/pelty-api/src/routes/support.rs"
      }
    },
    "/api/v1/admin/tickets/{id}/messages/{mid}": {
      "delete": {
        "operationId": "admin_delete_message",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "mid",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::tickets"
        ],
        "x-handler": "admin_delete_message",
        "x-source": "crates/pelty-api/src/routes/tickets.rs"
      },
      "put": {
        "operationId": "admin_edit_message",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "mid",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EditMessage"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::tickets"
        ],
        "x-handler": "admin_edit_message",
        "x-source": "crates/pelty-api/src/routes/tickets.rs"
      }
    },
    "/api/v1/admin/tickets/{id}/reply": {
      "post": {
        "operationId": "admin_reply",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReplyBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::tickets"
        ],
        "x-handler": "admin_reply",
        "x-source": "crates/pelty-api/src/routes/tickets.rs"
      }
    },
    "/api/v1/admin/tickets/{id}/split": {
      "post": {
        "operationId": "split",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SplitBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::support"
        ],
        "x-handler": "split",
        "x-source": "crates/pelty-api/src/routes/support.rs"
      }
    },
    "/api/v1/admin/tickets/{id}/tags": {
      "put": {
        "operationId": "set_tags",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagsBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::support"
        ],
        "x-handler": "set_tags",
        "x-source": "crates/pelty-api/src/routes/support.rs"
      }
    },
    "/api/v1/admin/tickets/{id}/time": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "time_list",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "time list",
        "tags": [
          "tickets"
        ],
        "x-handler": "time_list",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      },
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "time_add",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "time add",
        "tags": [
          "tickets"
        ],
        "x-handler": "time_add",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/tickets/{id}/time/{entry}": {
      "delete": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "time_del",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "time del",
        "tags": [
          "tickets"
        ],
        "x-handler": "time_del",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/tickets/{id}/watchers": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "get_watchers",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "get watchers",
        "tags": [
          "tickets"
        ],
        "x-handler": "get_watchers",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      },
      "put": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "put_watchers",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "put watchers",
        "tags": [
          "tickets"
        ],
        "x-handler": "put_watchers",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/tickets/{tid}/attachments/{id}": {
      "get": {
        "operationId": "admin_download",
        "parameters": [
          {
            "in": "path",
            "name": "tid",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::ticket_attachments"
        ],
        "x-handler": "admin_download",
        "x-source": "crates/pelty-api/src/routes/ticket_attachments.rs"
      }
    },
    "/api/v1/admin/tlds": {
      "get": {
        "operationId": "admin_tlds",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "admin_tlds",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      },
      "put": {
        "operationId": "admin_tld_upsert",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "admin_tld_upsert",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/admin/tlds/bulk-adjust": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_tld_adjust",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin tld adjust",
        "tags": [
          "tlds"
        ],
        "x-handler": "admin_tld_adjust",
        "x-source": "crates/pelty-api/src/routes/domains.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/tlds/copy-currency": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "admin_tld_copy",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "admin tld copy",
        "tags": [
          "tlds"
        ],
        "x-handler": "admin_tld_copy",
        "x-source": "crates/pelty-api/src/routes/domains.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/tlds/{tld}/{currency}": {
      "delete": {
        "operationId": "admin_tld_delete",
        "parameters": [
          {
            "in": "path",
            "name": "tld",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "currency",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "admin_tld_delete",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/admin/todos": {
      "get": {
        "operationId": "list_todos",
        "parameters": [
          {
            "description": "open | pending | in_progress | done (omit for all)",
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::client_extras"
        ],
        "x-handler": "list_todos",
        "x-source": "crates/pelty-api/src/routes/client_extras.rs"
      },
      "post": {
        "operationId": "create_todo",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TodoInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::client_extras"
        ],
        "x-handler": "create_todo",
        "x-source": "crates/pelty-api/src/routes/client_extras.rs"
      }
    },
    "/api/v1/admin/todos/{id}": {
      "delete": {
        "operationId": "delete_todo",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::client_extras"
        ],
        "x-handler": "delete_todo",
        "x-source": "crates/pelty-api/src/routes/client_extras.rs"
      },
      "put": {
        "operationId": "update_todo",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TodoInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::client_extras"
        ],
        "x-handler": "update_todo",
        "x-source": "crates/pelty-api/src/routes/client_extras.rs"
      }
    },
    "/api/v1/admin/tracked-links": {
      "get": {
        "operationId": "list",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::link_tracking"
        ],
        "x-handler": "list",
        "x-source": "crates/pelty-api/src/routes/link_tracking.rs"
      },
      "post": {
        "operationId": "create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NewLink"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::link_tracking"
        ],
        "x-handler": "create",
        "x-source": "crates/pelty-api/src/routes/link_tracking.rs"
      }
    },
    "/api/v1/admin/tracked-links/{id}": {
      "delete": {
        "operationId": "remove",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::link_tracking"
        ],
        "x-handler": "remove",
        "x-source": "crates/pelty-api/src/routes/link_tracking.rs"
      }
    },
    "/api/v1/admin/transactions": {
      "get": {
        "operationId": "admin_transactions",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "gateway",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "currency",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "customer_id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "description": "YYYY-MM-DD inclusive",
            "in": "query",
            "name": "from",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "description": "YYYY-MM-DD inclusive",
            "in": "query",
            "name": "to",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::invoice_ops"
        ],
        "x-handler": "admin_transactions",
        "x-source": "crates/pelty-api/src/routes/invoice_ops.rs"
      }
    },
    "/api/v1/admin/transactions/{id}": {
      "patch": {
        "operationId": "admin_update_transaction",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TxNote"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::invoice_ops"
        ],
        "x-handler": "admin_update_transaction",
        "x-source": "crates/pelty-api/src/routes/invoice_ops.rs"
      }
    },
    "/api/v1/admin/translations": {
      "delete": {
        "operationId": "remove",
        "parameters": [
          {
            "in": "query",
            "name": "lang",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "key",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "crate::translations"
        ],
        "x-handler": "remove",
        "x-source": "crates/pelty-api/src/translations.rs"
      },
      "get": {
        "operationId": "list",
        "parameters": [
          {
            "in": "query",
            "name": "lang",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "`all` (default), `overridden`, or `missing` (no shipped text in this language).",
            "in": "query",
            "name": "filter",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "crate::translations"
        ],
        "x-handler": "list",
        "x-source": "crates/pelty-api/src/translations.rs"
      },
      "put": {
        "operationId": "put",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PutBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "crate::translations"
        ],
        "x-handler": "put",
        "x-source": "crates/pelty-api/src/translations.rs"
      }
    },
    "/api/v1/admin/usage-metrics": {
      "get": {
        "operationId": "metrics",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::usage"
        ],
        "x-handler": "metrics",
        "x-source": "crates/pelty-api/src/routes/usage.rs"
      },
      "post": {
        "operationId": "metric_create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetricInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::usage"
        ],
        "x-handler": "metric_create",
        "x-source": "crates/pelty-api/src/routes/usage.rs"
      }
    },
    "/api/v1/admin/usage-metrics/{id}": {
      "delete": {
        "operationId": "metric_delete",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::usage"
        ],
        "x-handler": "metric_delete",
        "x-source": "crates/pelty-api/src/routes/usage.rs"
      },
      "put": {
        "operationId": "metric_update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MetricInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::usage"
        ],
        "x-handler": "metric_update",
        "x-source": "crates/pelty-api/src/routes/usage.rs"
      }
    },
    "/api/v1/admin/usage/bill": {
      "post": {
        "operationId": "bill_now",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::usage"
        ],
        "x-handler": "bill_now",
        "x-source": "crates/pelty-api/src/routes/usage.rs"
      }
    },
    "/api/v1/admin/usage/sample": {
      "post": {
        "operationId": "sample_now",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::usage"
        ],
        "x-handler": "sample_now",
        "x-source": "crates/pelty-api/src/routes/usage.rs"
      }
    },
    "/api/v1/admin/users": {
      "get": {
        "operationId": "list_users",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::admin"
        ],
        "x-handler": "list_users",
        "x-source": "crates/pelty-api/src/routes/admin.rs"
      }
    },
    "/api/v1/admin/users/{id}/api-keys/revoke-all": {
      "post": {
        "operationId": "admin_revoke_all",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::api_keys"
        ],
        "x-handler": "admin_revoke_all",
        "x-source": "crates/pelty-api/src/routes/api_keys.rs"
      }
    },
    "/api/v1/admin/users/{id}/login-as": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: staff.",
        "operationId": "login_as_user",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "login as user",
        "tags": [
          "users"
        ],
        "x-handler": "login_as_user",
        "x-source": "crates/pelty-api/src/security.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/admin/users/{id}/passkeys": {
      "delete": {
        "operationId": "admin_revoke",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Revoke every passkey of a user (lost device / compromised account).",
        "tags": [
          "super::passkeys"
        ],
        "x-handler": "admin_revoke",
        "x-source": "crates/pelty-api/src/routes/passkeys.rs"
      },
      "get": {
        "operationId": "admin_list",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::passkeys"
        ],
        "x-handler": "admin_list",
        "x-source": "crates/pelty-api/src/routes/passkeys.rs"
      }
    },
    "/api/v1/admin/users/{id}/roles": {
      "put": {
        "operationId": "set_roles",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RolesBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::staff"
        ],
        "x-handler": "set_roles",
        "x-source": "crates/pelty-api/src/routes/staff.rs"
      }
    },
    "/api/v1/admin/users/{id}/verify-email": {
      "post": {
        "operationId": "verify_email",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "Mark a user's email address as confirmed (staff override). Idempotent.",
        "tags": [
          "super::admin"
        ],
        "x-handler": "verify_email",
        "x-source": "crates/pelty-api/src/routes/admin.rs"
      }
    },
    "/api/v1/admin/vendor-catalog": {
      "get": {
        "operationId": "list",
        "parameters": [
          {
            "in": "query",
            "name": "server_id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::vendor"
        ],
        "x-handler": "list",
        "x-source": "crates/pelty-api/src/routes/vendor.rs"
      }
    },
    "/api/v1/admin/vendor-catalog/{id}/import": {
      "post": {
        "operationId": "import",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImportBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::vendor"
        ],
        "x-handler": "import",
        "x-source": "crates/pelty-api/src/routes/vendor.rs"
      }
    },
    "/api/v1/admin/vendor-catalog/{id}/markup": {
      "put": {
        "operationId": "reprice",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkupBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::vendor"
        ],
        "x-handler": "reprice",
        "x-source": "crates/pelty-api/src/routes/vendor.rs"
      }
    },
    "/api/v1/affiliates/r/{code}": {
      "get": {
        "operationId": "track",
        "parameters": [
          {
            "in": "path",
            "name": "code",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "303": {
            "description": ""
          }
        },
        "summary": "Referral link: remembers the code for 30 days, then sends the visitor to signup.",
        "tags": [
          "super::affiliates"
        ],
        "x-handler": "track",
        "x-source": "crates/pelty-api/src/routes/affiliates.rs"
      }
    },
    "/api/v1/affiliates/track": {
      "post": {
        "operationId": "track_json",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TrackBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "SPA landing (`/r/:code`): validates the code and sets the tracking cookie.",
        "tags": [
          "super::affiliates"
        ],
        "x-handler": "track_json",
        "x-source": "crates/pelty-api/src/routes/affiliates.rs"
      }
    },
    "/api/v1/api-keys": {
      "get": {
        "operationId": "list",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::api_keys"
        ],
        "x-handler": "list",
        "x-source": "crates/pelty-api/src/routes/api_keys.rs"
      },
      "post": {
        "operationId": "create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateKey"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::api_keys"
        ],
        "x-handler": "create",
        "x-source": "crates/pelty-api/src/routes/api_keys.rs"
      }
    },
    "/api/v1/api-keys/{id}": {
      "delete": {
        "operationId": "revoke",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::api_keys"
        ],
        "x-handler": "revoke",
        "x-source": "crates/pelty-api/src/routes/api_keys.rs"
      }
    },
    "/api/v1/auth/avatar": {
      "delete": {
        "operationId": "remove",
        "responses": {
          "204": {
            "description": ""
          }
        },
        "tags": [
          "super::avatars"
        ],
        "x-handler": "remove",
        "x-source": "crates/pelty-api/src/routes/avatars.rs"
      },
      "put": {
        "operationId": "upload",
        "requestBody": {
          "content": {
            "image/png": {
              "schema": {
                "items": {
                  "format": "int32",
                  "minimum": 0,
                  "type": "integer"
                },
                "type": "array"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "413": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::avatars"
        ],
        "x-handler": "upload",
        "x-source": "crates/pelty-api/src/routes/avatars.rs"
      }
    },
    "/api/v1/auth/duo/finish": {
      "post": {
        "operationId": "finish",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FinishBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "crate::duo"
        ],
        "x-handler": "finish",
        "x-source": "crates/pelty-api/src/duo.rs"
      }
    },
    "/api/v1/auth/duo/start": {
      "post": {
        "operationId": "start",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StartBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Swap the password-step challenge for a Duo authorize URL. Health-checks\nDuo first; if Duo is down the login fails closed.",
        "tags": [
          "crate::duo"
        ],
        "x-handler": "start",
        "x-source": "crates/pelty-api/src/duo.rs"
      }
    },
    "/api/v1/auth/email/resend": {
      "post": {
        "operationId": "resend",
        "responses": {
          "204": {
            "description": ""
          },
          "401": {
            "description": ""
          },
          "429": {
            "description": ""
          }
        },
        "tags": [
          "super::account"
        ],
        "x-handler": "resend",
        "x-source": "crates/pelty-api/src/routes/account.rs"
      }
    },
    "/api/v1/auth/email/verify": {
      "post": {
        "operationId": "verify",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TokenBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "422": {
            "description": ""
          },
          "429": {
            "description": ""
          }
        },
        "tags": [
          "super::account"
        ],
        "x-handler": "verify",
        "x-source": "crates/pelty-api/src/routes/account.rs"
      }
    },
    "/api/v1/auth/impersonation": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "impersonation_status",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "impersonation status",
        "tags": [
          "auth"
        ],
        "x-handler": "impersonation_status",
        "x-source": "crates/pelty-api/src/security.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/auth/impersonation/stop": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "stop_impersonation",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "stop impersonation",
        "tags": [
          "auth"
        ],
        "x-handler": "stop_impersonation",
        "x-source": "crates/pelty-api/src/security.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/auth/locale": {
      "put": {
        "operationId": "set_locale",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LocaleBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::auth"
        ],
        "x-handler": "set_locale",
        "x-source": "crates/pelty-api/src/routes/auth.rs"
      }
    },
    "/api/v1/auth/login": {
      "post": {
        "operationId": "login",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LoginBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "MeResponse, or `{mfa_required, challenge}` when 2FA is on"
          },
          "401": {
            "description": ""
          },
          "429": {
            "description": ""
          }
        },
        "tags": [
          "super::auth"
        ],
        "x-handler": "login",
        "x-source": "crates/pelty-api/src/routes/auth.rs"
      }
    },
    "/api/v1/auth/logout": {
      "post": {
        "operationId": "logout",
        "responses": {
          "204": {
            "description": ""
          },
          "401": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::auth"
        ],
        "x-handler": "logout",
        "x-source": "crates/pelty-api/src/routes/auth.rs"
      }
    },
    "/api/v1/auth/me": {
      "get": {
        "operationId": "me",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MeResponse"
                }
              }
            },
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::auth"
        ],
        "x-handler": "me",
        "x-source": "crates/pelty-api/src/routes/auth.rs"
      }
    },
    "/api/v1/auth/mfa": {
      "get": {
        "operationId": "status",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MfaStatus"
                }
              }
            },
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::mfa"
        ],
        "x-handler": "status",
        "x-source": "crates/pelty-api/src/routes/mfa.rs"
      }
    },
    "/api/v1/auth/mfa/backup-codes": {
      "post": {
        "operationId": "regenerate",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConfirmBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BackupCodes"
                }
              }
            },
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Replace all backup codes; returned once.",
        "tags": [
          "super::mfa"
        ],
        "x-handler": "regenerate",
        "x-source": "crates/pelty-api/src/routes/mfa.rs"
      }
    },
    "/api/v1/auth/mfa/disable": {
      "post": {
        "operationId": "disable",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConfirmBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Turn 2FA off; needs the password and a current code (or a backup code).",
        "tags": [
          "super::mfa"
        ],
        "x-handler": "disable",
        "x-source": "crates/pelty-api/src/routes/mfa.rs"
      }
    },
    "/api/v1/auth/mfa/enable": {
      "post": {
        "operationId": "enable",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CodeBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BackupCodes"
                }
              }
            },
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::mfa"
        ],
        "x-handler": "enable",
        "x-source": "crates/pelty-api/src/routes/mfa.rs"
      }
    },
    "/api/v1/auth/mfa/setup": {
      "post": {
        "operationId": "setup",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SetupResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "summary": "Start enrolment: a fresh pending secret, replaced on each call until enabled.",
        "tags": [
          "super::mfa"
        ],
        "x-handler": "setup",
        "x-source": "crates/pelty-api/src/routes/mfa.rs"
      }
    },
    "/api/v1/auth/mfa/verify": {
      "post": {
        "operationId": "verify",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VerifyBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MeResponse"
                }
              }
            },
            "description": ""
          },
          "401": {
            "description": ""
          },
          "429": {
            "description": ""
          }
        },
        "summary": "Second login step. Max 5 attempts per challenge, 5 minute lifetime.",
        "tags": [
          "super::mfa"
        ],
        "x-handler": "verify",
        "x-source": "crates/pelty-api/src/routes/mfa.rs"
      }
    },
    "/api/v1/auth/oauth/providers": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "providers",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "providers",
        "tags": [
          "auth"
        ],
        "x-handler": "providers",
        "x-source": "crates/pelty-api/src/oauth.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/auth/oauth/{id}/callback": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "callback",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "callback",
        "tags": [
          "auth"
        ],
        "x-handler": "callback",
        "x-source": "crates/pelty-api/src/oauth.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/auth/oauth/{id}/start": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "start",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "start",
        "tags": [
          "auth"
        ],
        "x-handler": "start",
        "x-source": "crates/pelty-api/src/oauth.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/auth/passkeys": {
      "get": {
        "operationId": "list",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::passkeys"
        ],
        "x-handler": "list",
        "x-source": "crates/pelty-api/src/routes/passkeys.rs"
      }
    },
    "/api/v1/auth/passkeys/discover/finish": {
      "post": {
        "operationId": "discover_finish",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssertBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::passkeys"
        ],
        "x-handler": "discover_finish",
        "x-source": "crates/pelty-api/src/routes/passkeys.rs"
      }
    },
    "/api/v1/auth/passkeys/discover/start": {
      "post": {
        "operationId": "discover_start",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Usernameless sign-in: empty `allowCredentials`, the authenticator picks a\ndiscoverable credential and returns its user handle. Used by the passkey\nbutton with an empty e-mail field and by browser autofill (conditional UI).",
        "tags": [
          "super::passkeys"
        ],
        "x-handler": "discover_start",
        "x-source": "crates/pelty-api/src/routes/passkeys.rs"
      }
    },
    "/api/v1/auth/passkeys/login/finish": {
      "post": {
        "operationId": "login_finish",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssertBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "summary": "Passwordless sign-in. A user-verified passkey counts as both factors.",
        "tags": [
          "super::passkeys"
        ],
        "x-handler": "login_finish",
        "x-source": "crates/pelty-api/src/routes/passkeys.rs"
      }
    },
    "/api/v1/auth/passkeys/login/start": {
      "post": {
        "operationId": "login_start",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LoginStart"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::passkeys"
        ],
        "x-handler": "login_start",
        "x-source": "crates/pelty-api/src/routes/passkeys.rs"
      }
    },
    "/api/v1/auth/passkeys/reauth/finish": {
      "post": {
        "operationId": "reauth_finish",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssertBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Step-up with a passkey instead of password + code.",
        "tags": [
          "super::passkeys"
        ],
        "x-handler": "reauth_finish",
        "x-source": "crates/pelty-api/src/routes/passkeys.rs"
      }
    },
    "/api/v1/auth/passkeys/reauth/start": {
      "post": {
        "operationId": "reauth_start",
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::passkeys"
        ],
        "x-handler": "reauth_start",
        "x-source": "crates/pelty-api/src/routes/passkeys.rs"
      }
    },
    "/api/v1/auth/passkeys/register/finish": {
      "post": {
        "operationId": "register_finish",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterFinish"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::passkeys"
        ],
        "x-handler": "register_finish",
        "x-source": "crates/pelty-api/src/routes/passkeys.rs"
      }
    },
    "/api/v1/auth/passkeys/register/start": {
      "post": {
        "operationId": "register_start",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterStart"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Enrolment needs the password (and 2FA code when enabled) again.",
        "tags": [
          "super::passkeys"
        ],
        "x-handler": "register_start",
        "x-source": "crates/pelty-api/src/routes/passkeys.rs"
      }
    },
    "/api/v1/auth/passkeys/{id}": {
      "delete": {
        "operationId": "remove",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::passkeys"
        ],
        "x-handler": "remove",
        "x-source": "crates/pelty-api/src/routes/passkeys.rs"
      }
    },
    "/api/v1/auth/password/change": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "change_password",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "change password",
        "tags": [
          "auth"
        ],
        "x-handler": "change_password",
        "x-source": "crates/pelty-api/src/routes/admin_security.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/auth/password/forgot": {
      "post": {
        "operationId": "forgot",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ForgotBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": "Always, whether or not the account exists"
          },
          "429": {
            "description": ""
          }
        },
        "tags": [
          "super::account"
        ],
        "x-handler": "forgot",
        "x-source": "crates/pelty-api/src/routes/account.rs"
      }
    },
    "/api/v1/auth/password/reset": {
      "post": {
        "operationId": "reset",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ResetBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "422": {
            "description": "Invalid/expired token or weak password"
          },
          "429": {
            "description": ""
          }
        },
        "tags": [
          "super::account"
        ],
        "x-handler": "reset",
        "x-source": "crates/pelty-api/src/routes/account.rs"
      }
    },
    "/api/v1/auth/reauth": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "reauth",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "reauth",
        "tags": [
          "auth"
        ],
        "x-handler": "reauth",
        "x-source": "crates/pelty-api/src/routes/admin_security.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/auth/register": {
      "post": {
        "operationId": "register",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          },
          "429": {
            "description": ""
          }
        },
        "tags": [
          "super::auth"
        ],
        "x-handler": "register",
        "x-source": "crates/pelty-api/src/routes/auth.rs"
      }
    },
    "/api/v1/auth/saml/logout": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "logout",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "logout",
        "tags": [
          "auth"
        ],
        "x-handler": "logout",
        "x-source": "crates/pelty-api/src/saml.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/auth/saml/providers": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "providers",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "providers",
        "tags": [
          "auth"
        ],
        "x-handler": "providers",
        "x-source": "crates/pelty-api/src/saml.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/auth/sessions": {
      "delete": {
        "operationId": "revoke_other_sessions",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "summary": "Sign out every other device; the calling session stays valid.",
        "tags": [
          "super::auth"
        ],
        "x-handler": "revoke_other_sessions",
        "x-source": "crates/pelty-api/src/routes/auth.rs"
      },
      "get": {
        "operationId": "list_sessions",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::auth"
        ],
        "x-handler": "list_sessions",
        "x-source": "crates/pelty-api/src/routes/auth.rs"
      }
    },
    "/api/v1/auth/sessions/{id}": {
      "delete": {
        "operationId": "revoke_session",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::auth"
        ],
        "x-handler": "revoke_session",
        "x-source": "crates/pelty-api/src/routes/auth.rs"
      }
    },
    "/api/v1/avatars/{id}": {
      "get": {
        "operationId": "serve",
        "parameters": [
          {
            "description": "`64` for the small variant; anything else serves 256px.",
            "in": "query",
            "name": "s",
            "required": false,
            "schema": {
              "format": "int32",
              "minimum": 0,
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "description": "Cache-busting version; when it matches, the response is cacheable for a day.",
            "in": "query",
            "name": "v",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "image/png": {}
            },
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "Any signed-in user may view avatars (staff lists, ticket threads).",
        "tags": [
          "super::avatars"
        ],
        "x-handler": "serve",
        "x-source": "crates/pelty-api/src/routes/avatars.rs"
      }
    },
    "/api/v1/captcha/challenge": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "challenge",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "challenge",
        "tags": [
          "captcha"
        ],
        "x-handler": "challenge",
        "x-source": "crates/pelty-api/src/captcha.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/captcha/config": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "public_config",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "public config",
        "tags": [
          "captcha"
        ],
        "x-handler": "public_config",
        "x-source": "crates/pelty-api/src/captcha.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/catalog": {
      "get": {
        "operationId": "public_catalog",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::catalog"
        ],
        "x-handler": "public_catalog",
        "x-source": "crates/pelty-api/src/routes/catalog.rs"
      }
    },
    "/api/v1/catalog/bundles": {
      "get": {
        "operationId": "public_bundles",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::bundles"
        ],
        "x-handler": "public_bundles",
        "x-source": "crates/pelty-api/src/routes/bundles.rs"
      }
    },
    "/api/v1/catalog/products/{id}/extras": {
      "get": {
        "operationId": "product_extras",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Addons and customer-visible custom fields offered for one product.",
        "tags": [
          "super::catalog"
        ],
        "x-handler": "product_extras",
        "x-source": "crates/pelty-api/src/routes/catalog.rs"
      }
    },
    "/api/v1/catalog/products/{id}/recommendations": {
      "get": {
        "operationId": "public_recs",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::bundles"
        ],
        "x-handler": "public_recs",
        "x-source": "crates/pelty-api/src/routes/bundles.rs"
      }
    },
    "/api/v1/chat/sessions": {
      "post": {
        "operationId": "start",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChatStart"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          },
          "429": {
            "description": ""
          }
        },
        "tags": [
          "super::live_chat"
        ],
        "x-handler": "start",
        "x-source": "crates/pelty-api/src/routes/live_chat.rs"
      }
    },
    "/api/v1/chat/sessions/{id}/close": {
      "post": {
        "operationId": "visitor_close",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::live_chat"
        ],
        "x-handler": "visitor_close",
        "x-source": "crates/pelty-api/src/routes/live_chat.rs"
      }
    },
    "/api/v1/chat/sessions/{id}/messages": {
      "get": {
        "operationId": "visitor_messages",
        "parameters": [
          {
            "in": "query",
            "name": "after",
            "required": false,
            "schema": {
              "format": "int64",
              "type": "integer"
            }
          },
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::live_chat"
        ],
        "x-handler": "visitor_messages",
        "x-source": "crates/pelty-api/src/routes/live_chat.rs"
      },
      "post": {
        "operationId": "visitor_post",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChatPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          },
          "429": {
            "description": ""
          }
        },
        "tags": [
          "super::live_chat"
        ],
        "x-handler": "visitor_post",
        "x-source": "crates/pelty-api/src/routes/live_chat.rs"
      }
    },
    "/api/v1/client/access": {
      "get": {
        "operationId": "client_access",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::store"
        ],
        "x-handler": "client_access",
        "x-source": "crates/pelty-api/src/routes/store.rs"
      }
    },
    "/api/v1/client/affiliate": {
      "get": {
        "operationId": "client_get",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::affiliates"
        ],
        "x-handler": "client_get",
        "x-source": "crates/pelty-api/src/routes/affiliates.rs"
      },
      "post": {
        "operationId": "client_enroll",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::affiliates"
        ],
        "x-handler": "client_enroll",
        "x-source": "crates/pelty-api/src/routes/affiliates.rs"
      }
    },
    "/api/v1/client/affiliate/materials": {
      "get": {
        "operationId": "client_materials",
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "Active materials plus the caller's effective commission percent and tiers.",
        "tags": [
          "super::affiliate_extras"
        ],
        "x-handler": "client_materials",
        "x-source": "crates/pelty-api/src/routes/affiliate_extras.rs"
      }
    },
    "/api/v1/client/affiliate/payouts": {
      "post": {
        "operationId": "client_payout",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PayoutBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::affiliates"
        ],
        "x-handler": "client_payout",
        "x-source": "crates/pelty-api/src/routes/affiliates.rs"
      }
    },
    "/api/v1/client/billing/auto-pay": {
      "put": {
        "operationId": "client_auto_pay",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AutoPayBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::payment_methods"
        ],
        "x-handler": "client_auto_pay",
        "x-source": "crates/pelty-api/src/routes/payment_methods.rs"
      }
    },
    "/api/v1/client/billing/payment-methods": {
      "get": {
        "operationId": "client_list",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::payment_methods"
        ],
        "x-handler": "client_list",
        "x-source": "crates/pelty-api/src/routes/payment_methods.rs"
      },
      "post": {
        "operationId": "client_add",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentMethod"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::payment_methods"
        ],
        "x-handler": "client_add",
        "x-source": "crates/pelty-api/src/routes/payment_methods.rs"
      }
    },
    "/api/v1/client/billing/payment-methods/{id}": {
      "delete": {
        "operationId": "client_remove",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::payment_methods"
        ],
        "x-handler": "client_remove",
        "x-source": "crates/pelty-api/src/routes/payment_methods.rs"
      }
    },
    "/api/v1/client/billing/payment-methods/{id}/default": {
      "post": {
        "operationId": "client_default",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::payment_methods"
        ],
        "x-handler": "client_default",
        "x-source": "crates/pelty-api/src/routes/payment_methods.rs"
      }
    },
    "/api/v1/client/checkout": {
      "post": {
        "operationId": "checkout",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CheckoutBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Turn a cart into an order + invoice for the signed-in customer. The\nclient then pays the invoice with the chosen gateway.",
        "tags": [
          "super::store"
        ],
        "x-handler": "checkout",
        "x-source": "crates/pelty-api/src/routes/store.rs"
      }
    },
    "/api/v1/client/contacts": {
      "get": {
        "operationId": "client_contacts",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::customers"
        ],
        "x-handler": "client_contacts",
        "x-source": "crates/pelty-api/src/routes/customers.rs"
      },
      "post": {
        "operationId": "client_add_contact",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ContactBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::customers"
        ],
        "x-handler": "client_add_contact",
        "x-source": "crates/pelty-api/src/routes/customers.rs"
      }
    },
    "/api/v1/client/contacts/{id}": {
      "delete": {
        "operationId": "client_delete_contact",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::customers"
        ],
        "x-handler": "client_delete_contact",
        "x-source": "crates/pelty-api/src/routes/customers.rs"
      }
    },
    "/api/v1/client/coupons/check": {
      "post": {
        "operationId": "client_check",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CheckBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Validate a code for the order form. Returns only what the customer needs.",
        "tags": [
          "super::coupons"
        ],
        "x-handler": "client_check",
        "x-source": "crates/pelty-api/src/routes/coupons.rs"
      }
    },
    "/api/v1/client/credit": {
      "get": {
        "operationId": "client_credit",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::credit"
        ],
        "x-handler": "client_credit",
        "x-source": "crates/pelty-api/src/routes/credit.rs"
      }
    },
    "/api/v1/client/credit/add-funds": {
      "get": {
        "operationId": "client_add_funds_info",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AddFundsSettings"
                }
              }
            },
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::credit"
        ],
        "x-handler": "client_add_funds_info",
        "x-source": "crates/pelty-api/src/routes/credit.rs"
      },
      "post": {
        "operationId": "client_add_funds",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddFundsBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Create a deposit invoice; once paid (any gateway) the amount is credited.",
        "tags": [
          "super::credit"
        ],
        "x-handler": "client_add_funds",
        "x-source": "crates/pelty-api/src/routes/credit.rs"
      }
    },
    "/api/v1/client/dashboard": {
      "get": {
        "operationId": "client_dashboard",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClientDashboard"
                }
              }
            },
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "client_dashboard",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/client/domains": {
      "get": {
        "operationId": "client_list",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "client_list",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      },
      "post": {
        "operationId": "client_order",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OrderBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "client_order",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/client/domains/bulk": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: customer.",
        "operationId": "client_bulk",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "client bulk",
        "tags": [
          "domains"
        ],
        "x-handler": "client_bulk",
        "x-source": "crates/pelty-api/src/routes/domains.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/client/domains/check": {
      "get": {
        "operationId": "client_check",
        "parameters": [
          {
            "in": "query",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "client_check",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/client/domains/fields": {
      "get": {
        "operationId": "client_fields",
        "parameters": [
          {
            "in": "query",
            "name": "tld",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/TldField"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "super::domain_pricing"
        ],
        "x-handler": "client_fields",
        "x-source": "crates/pelty-api/src/routes/domain_pricing.rs"
      }
    },
    "/api/v1/client/domains/tlds": {
      "get": {
        "operationId": "client_tlds",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "client_tlds",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/client/domains/{id}": {
      "get": {
        "operationId": "client_get",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "client_get",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/client/domains/{id}/addons": {
      "put": {
        "description": "Registered route without a hand-written schema. Access: customer.",
        "operationId": "client_addons",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "client addons",
        "tags": [
          "domains"
        ],
        "x-handler": "client_addons",
        "x-source": "crates/pelty-api/src/routes/domains.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/client/domains/{id}/auto-renew": {
      "put": {
        "operationId": "client_auto_renew",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AutoRenewBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "client_auto_renew",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/client/domains/{id}/contact": {
      "put": {
        "operationId": "client_contact",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ContactBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "client_contact",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/client/domains/{id}/dns": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: customer.",
        "operationId": "client_dns",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "client dns",
        "tags": [
          "domains"
        ],
        "x-handler": "client_dns",
        "x-source": "crates/pelty-api/src/routes/domains.rs",
        "x-undocumented": true
      },
      "put": {
        "description": "Registered route without a hand-written schema. Access: customer.",
        "operationId": "client_dns_put",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "client dns put",
        "tags": [
          "domains"
        ],
        "x-handler": "client_dns_put",
        "x-source": "crates/pelty-api/src/routes/domains.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/client/domains/{id}/epp": {
      "post": {
        "operationId": "client_epp",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Reveal the transfer-out (EPP) code. Audited; owner only, active domains.",
        "tags": [
          "super::domains"
        ],
        "x-handler": "client_epp",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/client/domains/{id}/nameservers": {
      "put": {
        "operationId": "client_ns",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NsBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "client_ns",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/client/domains/{id}/registrant-verification/resend": {
      "post": {
        "operationId": "client_rv_resend",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "client_rv_resend",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/client/domains/{id}/renew": {
      "post": {
        "operationId": "client_renew",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RenewBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::domains"
        ],
        "x-handler": "client_renew",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/client/downloads": {
      "get": {
        "operationId": "client_list",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::downloads"
        ],
        "x-handler": "client_list",
        "x-source": "crates/pelty-api/src/routes/downloads.rs"
      }
    },
    "/api/v1/client/downloads/{id}": {
      "get": {
        "operationId": "client_file",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::downloads"
        ],
        "x-handler": "client_file",
        "x-source": "crates/pelty-api/src/routes/downloads.rs"
      }
    },
    "/api/v1/client/email-preferences": {
      "get": {
        "operationId": "get_prefs",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::store"
        ],
        "x-handler": "get_prefs",
        "x-source": "crates/pelty-api/src/routes/store.rs"
      },
      "put": {
        "operationId": "put_prefs",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EmailPrefs"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::store"
        ],
        "x-handler": "put_prefs",
        "x-source": "crates/pelty-api/src/routes/store.rs"
      }
    },
    "/api/v1/client/emails": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: customer.",
        "operationId": "client_list",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "client list",
        "tags": [
          "emails"
        ],
        "x-handler": "client_list",
        "x-source": "crates/pelty-api/src/routes/email_log.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/client/emails/{id}": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: customer.",
        "operationId": "client_get",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "client get",
        "tags": [
          "emails"
        ],
        "x-handler": "client_get",
        "x-source": "crates/pelty-api/src/routes/email_log.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/client/fields": {
      "get": {
        "operationId": "client_values",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::client_extras"
        ],
        "x-handler": "client_values",
        "x-source": "crates/pelty-api/src/routes/client_extras.rs"
      },
      "put": {
        "operationId": "client_set_values",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ValuesBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::client_extras"
        ],
        "x-handler": "client_set_values",
        "x-source": "crates/pelty-api/src/routes/client_extras.rs"
      }
    },
    "/api/v1/client/gateways": {
      "get": {
        "operationId": "client_gateways",
        "parameters": [
          {
            "description": "Only gateways that accept this invoice's balance and currency.",
            "in": "query",
            "name": "invoice_id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Enabled payment gateways (ids only; never config or secrets). With\n`invoice_id`, gateways whose limits/currencies exclude the invoice are\nleft out and `fees` shows each gateway's processing fee.",
        "tags": [
          "super::billing"
        ],
        "x-handler": "client_gateways",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/client/gift-cards/redeem": {
      "post": {
        "operationId": "gift_redeem",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RedeemBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::invoice_ops"
        ],
        "x-handler": "gift_redeem",
        "x-source": "crates/pelty-api/src/routes/invoice_ops.rs"
      }
    },
    "/api/v1/client/home": {
      "get": {
        "operationId": "client_home",
        "parameters": [
          {
            "in": "query",
            "name": "locale",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::store"
        ],
        "x-handler": "client_home",
        "x-source": "crates/pelty-api/src/routes/store.rs"
      }
    },
    "/api/v1/client/invoices": {
      "get": {
        "operationId": "client_invoices",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "client_invoices",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/client/invoices/mass-pay": {
      "post": {
        "operationId": "mass_pay",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MassPay"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Pay several of my unpaid invoices from account credit, oldest due first.",
        "tags": [
          "super::bulk"
        ],
        "x-handler": "mass_pay",
        "x-source": "crates/pelty-api/src/routes/bulk.rs"
      }
    },
    "/api/v1/client/invoices/merge": {
      "post": {
        "operationId": "client_merge",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MergeBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Client-side merge (WHMCS \"mass payment\"): combine own unpaid invoices into\none so a single gateway payment (and one affiliate commission) covers all.",
        "tags": [
          "super::invoice_ops"
        ],
        "x-handler": "client_merge",
        "x-source": "crates/pelty-api/src/routes/invoice_ops.rs"
      }
    },
    "/api/v1/client/invoices/{id}": {
      "get": {
        "operationId": "client_invoice",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "client_invoice",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/client/invoices/{id}/apply-credit": {
      "post": {
        "operationId": "client_apply",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApplyBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::credit"
        ],
        "x-handler": "client_apply",
        "x-source": "crates/pelty-api/src/routes/credit.rs"
      }
    },
    "/api/v1/client/invoices/{id}/gateways": {
      "get": {
        "operationId": "client_invoice_gateways",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "Gateways usable for this invoice (currency + amount limits). Ids/names only.",
        "tags": [
          "super::gateways"
        ],
        "x-handler": "client_invoice_gateways",
        "x-source": "crates/pelty-api/src/routes/gateways.rs"
      }
    },
    "/api/v1/client/invoices/{id}/pay": {
      "post": {
        "operationId": "client_pay",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PayBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "summary": "Start paying an invoice with a gateway: redirect (Stripe) or manual\ninstructions. Repeated calls reuse the same pending payment.",
        "tags": [
          "super::billing"
        ],
        "x-handler": "client_pay",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/client/invoices/{id}/pdf": {
      "get": {
        "operationId": "client_pdf",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/pdf": {}
            },
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::invoice_pdf"
        ],
        "x-handler": "client_pdf",
        "x-source": "crates/pelty-api/src/routes/invoice_pdf.rs"
      }
    },
    "/api/v1/client/invoices/{id}/refunds": {
      "get": {
        "operationId": "client_list",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::refunds"
        ],
        "x-handler": "client_list",
        "x-source": "crates/pelty-api/src/routes/refunds.rs"
      }
    },
    "/api/v1/client/invoices/{id}/ubl": {
      "get": {
        "operationId": "client_ubl",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/xml": {}
            },
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "summary": "UBL 2.1 (Peppol BIS 3.0 / CIUS-RO) XML of one of the caller's issued invoices.",
        "tags": [
          "super::einvoice"
        ],
        "x-handler": "client_ubl",
        "x-source": "crates/pelty-api/src/routes/einvoice.rs"
      }
    },
    "/api/v1/client/kyc": {
      "get": {
        "operationId": "client_get",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::kyc"
        ],
        "x-handler": "client_get",
        "x-source": "crates/pelty-api/src/routes/kyc.rs"
      }
    },
    "/api/v1/client/kyc/documents": {
      "post": {
        "operationId": "client_upload",
        "parameters": [
          {
            "in": "query",
            "name": "kind",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "filename",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/octet-stream": {
              "schema": {
                "items": {
                  "format": "int32",
                  "minimum": 0,
                  "type": "integer"
                },
                "type": "array"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Raw body upload. PNG/JPEG/WebP/PDF only.",
        "tags": [
          "super::kyc"
        ],
        "x-handler": "client_upload",
        "x-source": "crates/pelty-api/src/routes/kyc.rs"
      }
    },
    "/api/v1/client/kyc/documents/{id}": {
      "delete": {
        "operationId": "client_delete",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::kyc"
        ],
        "x-handler": "client_delete",
        "x-source": "crates/pelty-api/src/routes/kyc.rs"
      }
    },
    "/api/v1/client/login-history": {
      "get": {
        "operationId": "login_history",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "The caller's own recent sign-ins, failures and lockouts.",
        "tags": [
          "super::store"
        ],
        "x-handler": "login_history",
        "x-source": "crates/pelty-api/src/routes/store.rs"
      }
    },
    "/api/v1/client/marketing": {
      "get": {
        "operationId": "my_pref",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::campaigns"
        ],
        "x-handler": "my_pref",
        "x-source": "crates/pelty-api/src/routes/campaigns.rs"
      },
      "put": {
        "operationId": "set_pref",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PrefBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::campaigns"
        ],
        "x-handler": "set_pref",
        "x-source": "crates/pelty-api/src/routes/campaigns.rs"
      }
    },
    "/api/v1/client/orders": {
      "get": {
        "operationId": "client_orders",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "client_orders",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      },
      "post": {
        "operationId": "client_place_order",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlaceOrder"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "client_place_order",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/client/orders/{id}": {
      "get": {
        "operationId": "client_order",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "Order status page for the customer.",
        "tags": [
          "super::store"
        ],
        "x-handler": "client_order",
        "x-source": "crates/pelty-api/src/routes/store.rs"
      }
    },
    "/api/v1/client/payments/{id}/complete": {
      "post": {
        "operationId": "client_complete",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompleteBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "Payer returned from the provider: capture/check and apply (idempotent).",
        "tags": [
          "super::gateways"
        ],
        "x-handler": "client_complete",
        "x-source": "crates/pelty-api/src/routes/gateways.rs"
      }
    },
    "/api/v1/client/profile": {
      "get": {
        "operationId": "client_profile",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::customers"
        ],
        "x-handler": "client_profile",
        "x-source": "crates/pelty-api/src/routes/customers.rs"
      },
      "put": {
        "operationId": "client_update",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Profile"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::customers"
        ],
        "x-handler": "client_update",
        "x-source": "crates/pelty-api/src/routes/customers.rs"
      }
    },
    "/api/v1/client/projects": {
      "get": {
        "operationId": "client_list",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::projects"
        ],
        "x-handler": "client_list",
        "x-source": "crates/pelty-api/src/routes/projects.rs"
      }
    },
    "/api/v1/client/projects/{id}": {
      "get": {
        "operationId": "client_detail",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::projects"
        ],
        "x-handler": "client_detail",
        "x-source": "crates/pelty-api/src/routes/projects.rs"
      }
    },
    "/api/v1/client/quotes": {
      "get": {
        "operationId": "client_list",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::quotes"
        ],
        "x-handler": "client_list",
        "x-source": "crates/pelty-api/src/routes/quotes.rs"
      }
    },
    "/api/v1/client/quotes/{id}": {
      "get": {
        "operationId": "client_get",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::quotes"
        ],
        "x-handler": "client_get",
        "x-source": "crates/pelty-api/src/routes/quotes.rs"
      }
    },
    "/api/v1/client/quotes/{id}/accept": {
      "post": {
        "operationId": "client_accept",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::quotes"
        ],
        "x-handler": "client_accept",
        "x-source": "crates/pelty-api/src/routes/quotes.rs"
      }
    },
    "/api/v1/client/quotes/{id}/decline": {
      "post": {
        "operationId": "client_decline",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::quotes"
        ],
        "x-handler": "client_decline",
        "x-source": "crates/pelty-api/src/routes/quotes.rs"
      }
    },
    "/api/v1/client/quotes/{id}/pdf": {
      "get": {
        "operationId": "client_pdf",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/pdf": {}
            },
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::quote_pdf"
        ],
        "x-handler": "client_pdf",
        "x-source": "crates/pelty-api/src/routes/quote_pdf.rs"
      }
    },
    "/api/v1/client/renewals/config": {
      "get": {
        "operationId": "client_cfg",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RenewalSettings"
                }
              }
            },
            "description": ""
          }
        },
        "tags": [
          "super::renewals"
        ],
        "x-handler": "client_cfg",
        "x-source": "crates/pelty-api/src/routes/renewals.rs"
      }
    },
    "/api/v1/client/search": {
      "get": {
        "operationId": "client_search",
        "parameters": [
          {
            "in": "query",
            "name": "q",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Client-area search over the caller's own invoices, services, tickets, domains, plus public KB.",
        "tags": [
          "super::admin_tools"
        ],
        "x-handler": "client_search",
        "x-source": "crates/pelty-api/src/routes/admin_tools.rs"
      }
    },
    "/api/v1/client/services": {
      "get": {
        "operationId": "client_services",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "client_services",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/client/services/{id}": {
      "get": {
        "operationId": "client_service",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::billing"
        ],
        "x-handler": "client_service",
        "x-source": "crates/pelty-api/src/routes/billing.rs"
      }
    },
    "/api/v1/client/services/{id}/cancellation": {
      "delete": {
        "operationId": "client_withdraw_cancel",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::service_changes"
        ],
        "x-handler": "client_withdraw_cancel",
        "x-source": "crates/pelty-api/src/routes/service_changes.rs"
      },
      "post": {
        "operationId": "client_request_cancel",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CancelBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::service_changes"
        ],
        "x-handler": "client_request_cancel",
        "x-source": "crates/pelty-api/src/routes/service_changes.rs"
      }
    },
    "/api/v1/client/services/{id}/change": {
      "delete": {
        "operationId": "client_cancel_change",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::service_changes"
        ],
        "x-handler": "client_cancel_change",
        "x-source": "crates/pelty-api/src/routes/service_changes.rs"
      },
      "post": {
        "operationId": "client_change",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::service_changes"
        ],
        "x-handler": "client_change",
        "x-source": "crates/pelty-api/src/routes/service_changes.rs"
      }
    },
    "/api/v1/client/services/{id}/lifecycle": {
      "get": {
        "operationId": "client_lifecycle",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::service_changes"
        ],
        "x-handler": "client_lifecycle",
        "x-source": "crates/pelty-api/src/routes/service_changes.rs"
      }
    },
    "/api/v1/client/services/{id}/module": {
      "get": {
        "operationId": "client_panel",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::modules_ext"
        ],
        "x-handler": "client_panel",
        "x-source": "crates/pelty-api/src/routes/modules_ext.rs"
      }
    },
    "/api/v1/client/services/{id}/module/{action}": {
      "post": {
        "operationId": "client_action",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "action",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::modules_ext"
        ],
        "x-handler": "client_action",
        "x-source": "crates/pelty-api/src/routes/modules_ext.rs"
      }
    },
    "/api/v1/client/services/{id}/renew-now": {
      "post": {
        "operationId": "client_renew",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EarlyRenewal"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::renewals"
        ],
        "x-handler": "client_renew",
        "x-source": "crates/pelty-api/src/routes/renewals.rs"
      }
    },
    "/api/v1/client/services/{id}/sso": {
      "post": {
        "operationId": "start",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "tags": [
          "super::sso"
        ],
        "x-handler": "start",
        "x-source": "crates/pelty-api/src/routes/sso.rs"
      }
    },
    "/api/v1/client/services/{id}/usage": {
      "get": {
        "operationId": "client_usage",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::usage"
        ],
        "x-handler": "client_usage",
        "x-source": "crates/pelty-api/src/routes/usage.rs"
      }
    },
    "/api/v1/client/ssl": {
      "get": {
        "operationId": "client_list",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::ssl"
        ],
        "x-handler": "client_list",
        "x-source": "crates/pelty-api/src/routes/ssl.rs"
      }
    },
    "/api/v1/client/subaccounts": {
      "get": {
        "operationId": "list_contacts",
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "tags": [
          "super::store"
        ],
        "x-handler": "list_contacts",
        "x-source": "crates/pelty-api/src/routes/store.rs"
      },
      "post": {
        "operationId": "add_contact",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NewContact"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Create a sub-account that signs in with its own email and password and\nsees only the granted areas of this account.",
        "tags": [
          "super::store"
        ],
        "x-handler": "add_contact",
        "x-source": "crates/pelty-api/src/routes/store.rs"
      }
    },
    "/api/v1/client/subaccounts/invite": {
      "post": {
        "operationId": "invite_contact",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InviteContact"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Invite a contact by email: the account is created with an unusable random\npassword and the invitee picks their own through a one-time link.",
        "tags": [
          "super::store"
        ],
        "x-handler": "invite_contact",
        "x-source": "crates/pelty-api/src/routes/store.rs"
      }
    },
    "/api/v1/client/subaccounts/{id}": {
      "delete": {
        "operationId": "remove_contact",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "Remove a contact: its access ends immediately (sessions revoked) and\nthe login is disabled.",
        "tags": [
          "super::store"
        ],
        "x-handler": "remove_contact",
        "x-source": "crates/pelty-api/src/routes/store.rs"
      },
      "put": {
        "operationId": "update_contact",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ContactPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::store"
        ],
        "x-handler": "update_contact",
        "x-source": "crates/pelty-api/src/routes/store.rs"
      }
    },
    "/api/v1/client/ticket-departments": {
      "get": {
        "operationId": "client_departments",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::tickets"
        ],
        "x-handler": "client_departments",
        "x-source": "crates/pelty-api/src/routes/tickets.rs"
      }
    },
    "/api/v1/client/tickets": {
      "get": {
        "operationId": "client_list",
        "parameters": [
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::tickets"
        ],
        "x-handler": "client_list",
        "x-source": "crates/pelty-api/src/routes/tickets.rs"
      },
      "post": {
        "operationId": "client_open",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OpenBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::tickets"
        ],
        "x-handler": "client_open",
        "x-source": "crates/pelty-api/src/routes/tickets.rs"
      }
    },
    "/api/v1/client/tickets/{id}": {
      "get": {
        "operationId": "client_get",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::tickets"
        ],
        "x-handler": "client_get",
        "x-source": "crates/pelty-api/src/routes/tickets.rs"
      }
    },
    "/api/v1/client/tickets/{id}/close": {
      "post": {
        "operationId": "client_close",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::tickets"
        ],
        "x-handler": "client_close",
        "x-source": "crates/pelty-api/src/routes/tickets.rs"
      }
    },
    "/api/v1/client/tickets/{id}/rate": {
      "post": {
        "operationId": "client_rate",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::support"
        ],
        "x-handler": "client_rate",
        "x-source": "crates/pelty-api/src/routes/support.rs"
      }
    },
    "/api/v1/client/tickets/{id}/reply": {
      "post": {
        "operationId": "client_reply",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReplyBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::tickets"
        ],
        "x-handler": "client_reply",
        "x-source": "crates/pelty-api/src/routes/tickets.rs"
      }
    },
    "/api/v1/client/tickets/{tid}/attachments/{id}": {
      "get": {
        "operationId": "client_download",
        "parameters": [
          {
            "in": "path",
            "name": "tid",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::ticket_attachments"
        ],
        "x-handler": "client_download",
        "x-source": "crates/pelty-api/src/routes/ticket_attachments.rs"
      }
    },
    "/api/v1/client/vat/verify": {
      "post": {
        "operationId": "client_verify_vat",
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::tax"
        ],
        "x-handler": "client_verify_vat",
        "x-source": "crates/pelty-api/src/routes/tax.rs"
      }
    },
    "/api/v1/compat/whmcs": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "handle",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "handle",
        "tags": [
          "compat"
        ],
        "x-handler": "handle",
        "x-source": "crates/pelty-api/src/whmcs_api.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/currencies": {
      "get": {
        "operationId": "list_currencies",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::catalog"
        ],
        "x-handler": "list_currencies",
        "x-source": "crates/pelty-api/src/routes/catalog.rs"
      }
    },
    "/api/v1/feeds/products/{slug}": {
      "get": {
        "operationId": "product_feed",
        "parameters": [
          {
            "description": "`name`, `description` or `price` (default `price`).",
            "in": "query",
            "name": "field",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "currency",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "description": "Billing cycle for `price` (default `monthly`).",
            "in": "query",
            "name": "cycle",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "path",
            "name": "slug",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/javascript": {}
            },
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "tags": [
          "super::data_feeds"
        ],
        "x-handler": "product_feed",
        "x-source": "crates/pelty-api/src/routes/data_feeds.rs"
      }
    },
    "/api/v1/feeds/tlds/{tld}": {
      "get": {
        "operationId": "tld_feed",
        "parameters": [
          {
            "description": "`name`, `description` or `price` (default `price`).",
            "in": "query",
            "name": "field",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "currency",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "description": "Billing cycle for `price` (default `monthly`).",
            "in": "query",
            "name": "cycle",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "path",
            "name": "tld",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/javascript": {}
            },
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Registration price for one year of a TLD.",
        "tags": [
          "super::data_feeds"
        ],
        "x-handler": "tld_feed",
        "x-source": "crates/pelty-api/src/routes/data_feeds.rs"
      }
    },
    "/api/v1/go/{slug}": {
      "get": {
        "operationId": "follow",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "303": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "Public: count the click and 303 to the stored target.",
        "tags": [
          "super::link_tracking"
        ],
        "x-handler": "follow",
        "x-source": "crates/pelty-api/src/routes/link_tracking.rs"
      }
    },
    "/api/v1/headless/carts": {
      "post": {
        "operationId": "create_cart",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HeadlessCart"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "403": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Create a server-side cart owned by the key's customer; the response holds\nthe live price/tax preview (or the validation error key).",
        "tags": [
          "headless"
        ],
        "x-handler": "create_cart",
        "x-source": "crates/pelty-api/src/routes/headless.rs"
      }
    },
    "/api/v1/headless/carts/{id}": {
      "get": {
        "operationId": "get_cart",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "headless"
        ],
        "x-handler": "get_cart",
        "x-source": "crates/pelty-api/src/routes/headless.rs"
      },
      "put": {
        "operationId": "update_cart",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HeadlessCart"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "tags": [
          "headless"
        ],
        "x-handler": "update_cart",
        "x-source": "crates/pelty-api/src/routes/headless.rs"
      }
    },
    "/api/v1/headless/carts/{id}/checkout": {
      "post": {
        "operationId": "checkout",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Turn the cart into an order and a finalized invoice (fraud screening,\ncoupons and taxes as in the web checkout).",
        "tags": [
          "headless"
        ],
        "x-handler": "checkout",
        "x-source": "crates/pelty-api/src/routes/headless.rs"
      }
    },
    "/api/v1/headless/catalog": {
      "get": {
        "operationId": "catalog",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          },
          "403": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Catalog, enabled currencies and payment gateways in one call.",
        "tags": [
          "headless"
        ],
        "x-handler": "catalog",
        "x-source": "crates/pelty-api/src/routes/headless.rs"
      }
    },
    "/api/v1/headless/invoices/{id}/pay": {
      "post": {
        "operationId": "pay",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PayBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Start a payment for an invoice; returns the gateway redirect/action.",
        "tags": [
          "headless"
        ],
        "x-handler": "pay",
        "x-source": "crates/pelty-api/src/routes/headless.rs"
      }
    },
    "/api/v1/headless/orders/{id}": {
      "get": {
        "operationId": "order_status",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "security": [
          {
            "api_key": []
          }
        ],
        "summary": "Order status with its invoice and provisioned services.",
        "tags": [
          "headless"
        ],
        "x-handler": "order_status",
        "x-source": "crates/pelty-api/src/routes/headless.rs"
      }
    },
    "/api/v1/i18n": {
      "get": {
        "operationId": "languages",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Available languages plus the one negotiated for this request.",
        "tags": [
          "super::i18n"
        ],
        "x-handler": "languages",
        "x-source": "crates/pelty-api/src/routes/i18n.rs"
      }
    },
    "/api/v1/i18n/{lang}": {
      "get": {
        "operationId": "messages",
        "parameters": [
          {
            "in": "path",
            "name": "lang",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "All messages for a language (falls back to `en` per key on the client).",
        "tags": [
          "super::i18n"
        ],
        "x-handler": "messages",
        "x-source": "crates/pelty-api/src/routes/i18n.rs"
      }
    },
    "/api/v1/licensing/verify": {
      "post": {
        "operationId": "license_verify",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VerifyBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "429": {
            "description": ""
          }
        },
        "summary": "Public. Bind on first use, then verify; the response is HMAC-signed with\nthe licensing server's secret so installs can trust a cached copy.",
        "tags": [
          "super::modules_ext"
        ],
        "x-handler": "license_verify",
        "x-source": "crates/pelty-api/src/routes/modules_ext.rs"
      }
    },
    "/api/v1/oauth/authorize": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "authorize_info",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "authorize info",
        "tags": [
          "oauth"
        ],
        "x-handler": "authorize_info",
        "x-source": "crates/pelty-api/src/oidc_provider.rs",
        "x-undocumented": true
      },
      "post": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "authorize_decide",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "authorize decide",
        "tags": [
          "oauth"
        ],
        "x-handler": "authorize_decide",
        "x-source": "crates/pelty-api/src/oidc_provider.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/openapi.json": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "spec",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "spec",
        "tags": [
          "openapi.json"
        ],
        "x-handler": "spec",
        "x-source": "crates/pelty-api/src/routes/openapi.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/plugins/event-logger/recent": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "event_logger_routes_{closure}",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "{closure}",
        "tags": [
          "plugins"
        ],
        "x-handler": "event_logger_routes::{closure}",
        "x-source": "crates/pelty-api/src/routes/plugins.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/plugins/event-logger/summary": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "event_logger_routes_{closure}",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "{closure}",
        "tags": [
          "plugins"
        ],
        "x-handler": "event_logger_routes::{closure}",
        "x-source": "crates/pelty-api/src/routes/plugins.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/plugins/ui": {
      "get": {
        "operationId": "ui_entries",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::plugins"
        ],
        "x-handler": "ui_entries",
        "x-source": "crates/pelty-api/src/routes/plugins.rs"
      }
    },
    "/api/v1/public/announcements": {
      "get": {
        "operationId": "public_announcements",
        "parameters": [
          {
            "in": "query",
            "name": "locale",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "per_page",
            "required": false,
            "schema": {
              "format": "int64",
              "type": [
                "integer",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::content"
        ],
        "x-handler": "public_announcements",
        "x-source": "crates/pelty-api/src/routes/content.rs"
      }
    },
    "/api/v1/public/announcements/rss.xml": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "rss",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "rss",
        "tags": [
          "announcements"
        ],
        "x-handler": "rss",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/public/announcements/{id}": {
      "get": {
        "operationId": "public_announcement",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::content"
        ],
        "x-handler": "public_announcement",
        "x-source": "crates/pelty-api/src/routes/content.rs"
      }
    },
    "/api/v1/public/contact": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "contact_submit",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "contact submit",
        "tags": [
          "contact"
        ],
        "x-handler": "contact_submit",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/public/domains/check": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "public_check",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "public check",
        "tags": [
          "domains"
        ],
        "x-handler": "public_check",
        "x-source": "crates/pelty-api/src/routes/domains.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/public/domains/tlds": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "public_tlds",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "public tlds",
        "tags": [
          "domains"
        ],
        "x-handler": "public_tlds",
        "x-source": "crates/pelty-api/src/routes/domains.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/public/domains/verify-registrant": {
      "post": {
        "operationId": "public_verify_registrant",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TokenBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "E-mail link target: confirms the registrant address (all its pending domains).",
        "tags": [
          "super::domains"
        ],
        "x-handler": "public_verify_registrant",
        "x-source": "crates/pelty-api/src/routes/domains.rs"
      }
    },
    "/api/v1/public/domains/whois": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "public_whois",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "public whois",
        "tags": [
          "domains"
        ],
        "x-handler": "public_whois",
        "x-source": "crates/pelty-api/src/routes/domains.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/public/general": {
      "get": {
        "operationId": "public_general",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Public subset: maintenance banner, localisation, ordering flags, social links, custom code.",
        "tags": [
          "super::general_settings"
        ],
        "x-handler": "public_general",
        "x-source": "crates/pelty-api/src/routes/general_settings.rs"
      }
    },
    "/api/v1/public/kb": {
      "get": {
        "operationId": "public_kb",
        "parameters": [
          {
            "in": "query",
            "name": "locale",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "category",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::content"
        ],
        "x-handler": "public_kb",
        "x-source": "crates/pelty-api/src/routes/content.rs"
      }
    },
    "/api/v1/public/kb/articles/{slug}": {
      "get": {
        "operationId": "public_article",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::content"
        ],
        "x-handler": "public_article",
        "x-source": "crates/pelty-api/src/routes/content.rs"
      }
    },
    "/api/v1/public/kb/articles/{slug}/vote": {
      "post": {
        "operationId": "public_vote",
        "parameters": [
          {
            "in": "path",
            "name": "slug",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VoteBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::content"
        ],
        "x-handler": "public_vote",
        "x-source": "crates/pelty-api/src/routes/content.rs"
      }
    },
    "/api/v1/public/kb/suggest": {
      "get": {
        "operationId": "public_suggest",
        "parameters": [
          {
            "in": "query",
            "name": "locale",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "category",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Up to 5 published articles related to `q` (used while opening a ticket).",
        "tags": [
          "super::content"
        ],
        "x-handler": "public_suggest",
        "x-source": "crates/pelty-api/src/routes/content.rs"
      }
    },
    "/api/v1/public/kb/tags": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "tag_cloud",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "tag cloud",
        "tags": [
          "kb"
        ],
        "x-handler": "tag_cloud",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/public/kb/tags/{tag}": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "by_tag",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "by tag",
        "tags": [
          "kb"
        ],
        "x-handler": "by_tag",
        "x-source": "crates/pelty-api/src/routes/support_ext.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/public/network-status": {
      "get": {
        "operationId": "public_status",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Public: open issues plus anything resolved in the last 14 days.",
        "tags": [
          "super::network_status"
        ],
        "x-handler": "public_status",
        "x-source": "crates/pelty-api/src/routes/network_status.rs"
      }
    },
    "/api/v1/public/site": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "public_site",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "public site",
        "tags": [
          "site"
        ],
        "x-handler": "public_site",
        "x-source": "crates/pelty-api/src/routes/site.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/public/site/pages/{slug}": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "public_page",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "public page",
        "tags": [
          "site"
        ],
        "x-handler": "public_page",
        "x-source": "crates/pelty-api/src/routes/site.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/sso/consume": {
      "post": {
        "operationId": "consume",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConsumeBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "summary": "Called by the panel. 200 with the claims the first time; 401 otherwise.",
        "tags": [
          "super::sso"
        ],
        "x-handler": "consume",
        "x-source": "crates/pelty-api/src/routes/sso.rs"
      }
    },
    "/api/v1/sso/saml/{id}/acs": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "acs",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "acs",
        "tags": [
          "sso"
        ],
        "x-handler": "acs",
        "x-source": "crates/pelty-api/src/saml.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/sso/saml/{id}/login": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "login",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "login",
        "tags": [
          "sso"
        ],
        "x-handler": "login",
        "x-source": "crates/pelty-api/src/saml.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/sso/saml/{id}/metadata": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "metadata",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "metadata",
        "tags": [
          "sso"
        ],
        "x-handler": "metadata",
        "x-source": "crates/pelty-api/src/saml.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/sso/saml/{id}/slo": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "slo",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "slo",
        "tags": [
          "sso"
        ],
        "x-handler": "slo",
        "x-source": "crates/pelty-api/src/saml.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/store/carts/{id}": {
      "get": {
        "operationId": "get_cart",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::store"
        ],
        "x-handler": "get_cart",
        "x-source": "crates/pelty-api/src/routes/store.rs"
      },
      "put": {
        "operationId": "put_cart",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CartBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "409": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Create or replace a cart. The id is an unguessable client-generated\nUUID v4 that acts as the cart token.",
        "tags": [
          "super::store"
        ],
        "x-handler": "put_cart",
        "x-source": "crates/pelty-api/src/routes/store.rs"
      }
    },
    "/api/v1/store/gateways": {
      "get": {
        "operationId": "store_gateways",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::store"
        ],
        "x-handler": "store_gateways",
        "x-source": "crates/pelty-api/src/routes/store.rs"
      }
    },
    "/api/v1/store/groups/{id}/order-form": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "public_group_form",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "public group form",
        "tags": [
          "store"
        ],
        "x-handler": "public_group_form",
        "x-source": "crates/pelty-api/src/routes/order_forms.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/store/order-forms/{slug}": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "public_form",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "public form",
        "tags": [
          "store"
        ],
        "x-handler": "public_form",
        "x-source": "crates/pelty-api/src/routes/order_forms.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/themes": {
      "get": {
        "operationId": "list_themes",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "super::extensions"
        ],
        "x-handler": "list_themes",
        "x-source": "crates/pelty-api/src/routes/extensions.rs"
      }
    },
    "/api/v1/themes/active": {
      "get": {
        "operationId": "active_theme",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Active theme, sanitized: whitelisted tokens with validated CSS values.",
        "tags": [
          "super::extensions"
        ],
        "x-handler": "active_theme",
        "x-source": "crates/pelty-api/src/routes/extensions.rs"
      }
    },
    "/api/v1/themes/{id}/assets/{*file}": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "theme_asset",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "theme asset",
        "tags": [
          "themes"
        ],
        "x-handler": "theme_asset",
        "x-source": "crates/pelty-api/src/routes/extensions.rs",
        "x-undocumented": true
      }
    },
    "/api/v1/ticket-statuses": {
      "get": {
        "operationId": "list",
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "tags": [
          "super::ticket_statuses"
        ],
        "x-handler": "list",
        "x-source": "crates/pelty-api/src/routes/ticket_statuses.rs"
      }
    },
    "/api/v1/tickets/attachments": {
      "post": {
        "operationId": "upload",
        "parameters": [
          {
            "in": "query",
            "name": "filename",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/octet-stream": {
              "schema": {
                "items": {
                  "format": "int32",
                  "minimum": 0,
                  "type": "integer"
                },
                "type": "array"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": ""
          },
          "422": {
            "description": ""
          }
        },
        "summary": "Upload a file (raw body). Returns an id to pass as `attachment_ids` when\nopening a ticket or replying. Max size is configurable (default 5 MiB); PNG/JPEG/GIF/WebP/PDF/plain text.",
        "tags": [
          "super::ticket_attachments"
        ],
        "x-handler": "upload",
        "x-source": "crates/pelty-api/src/routes/ticket_attachments.rs"
      }
    },
    "/api/v1/unsubscribe/{token}": {
      "get": {
        "operationId": "unsub_lookup",
        "parameters": [
          {
            "in": "path",
            "name": "token",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "Lookup only: link scanners prefetching the URL never unsubscribe anyone.",
        "tags": [
          "super::campaigns"
        ],
        "x-handler": "unsub_lookup",
        "x-source": "crates/pelty-api/src/routes/campaigns.rs"
      },
      "post": {
        "operationId": "unsub_apply",
        "parameters": [
          {
            "in": "path",
            "name": "token",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "summary": "No CSRF/session: the unguessable token is the credential.",
        "tags": [
          "super::campaigns"
        ],
        "x-handler": "unsub_apply",
        "x-source": "crates/pelty-api/src/routes/campaigns.rs"
      }
    },
    "/api/v1/webhooks/{gateway}": {
      "post": {
        "operationId": "receive",
        "parameters": [
          {
            "in": "path",
            "name": "gateway",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "string"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": ""
          },
          "404": {
            "description": ""
          }
        },
        "tags": [
          "super::webhooks"
        ],
        "x-handler": "receive",
        "x-source": "crates/pelty-api/src/routes/webhooks.rs"
      }
    },
    "/docs": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "root_router_{closure}",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "{closure}",
        "tags": [
          "docs"
        ],
        "x-handler": "root_router::{closure}",
        "x-source": "crates/pelty-api/src/dev_docs.rs",
        "x-undocumented": true
      }
    },
    "/docs/": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "serve",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "serve",
        "tags": [
          "docs"
        ],
        "x-handler": "serve",
        "x-source": "crates/pelty-api/src/dev_docs.rs",
        "x-undocumented": true
      }
    },
    "/docs/{*path}": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "serve",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "serve",
        "tags": [
          "docs"
        ],
        "x-handler": "serve",
        "x-source": "crates/pelty-api/src/dev_docs.rs",
        "x-undocumented": true
      }
    },
    "/healthz": {
      "get": {
        "operationId": "healthz",
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Liveness: process is up.",
        "tags": [
          "super::health"
        ],
        "x-handler": "healthz",
        "x-source": "crates/pelty-api/src/routes/health.rs"
      }
    },
    "/includes/api.php": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "handle",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "handle",
        "tags": [
          "includes"
        ],
        "x-handler": "handle",
        "x-source": "crates/pelty-api/src/whmcs_api.rs",
        "x-undocumented": true
      }
    },
    "/oauth/jwks": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "jwks",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "jwks",
        "tags": [
          "oauth"
        ],
        "x-handler": "jwks",
        "x-source": "crates/pelty-api/src/oidc_provider.rs",
        "x-undocumented": true
      }
    },
    "/oauth/revoke": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "revoke",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "revoke",
        "tags": [
          "oauth"
        ],
        "x-handler": "revoke",
        "x-source": "crates/pelty-api/src/oidc_provider.rs",
        "x-undocumented": true
      }
    },
    "/oauth/token": {
      "post": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "token",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "token",
        "tags": [
          "oauth"
        ],
        "x-handler": "token",
        "x-source": "crates/pelty-api/src/oidc_provider.rs",
        "x-undocumented": true
      }
    },
    "/oauth/userinfo": {
      "get": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "userinfo",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "userinfo",
        "tags": [
          "oauth"
        ],
        "x-handler": "userinfo",
        "x-source": "crates/pelty-api/src/oidc_provider.rs",
        "x-undocumented": true
      },
      "post": {
        "description": "Registered route without a hand-written schema. Access: public or per-handler.",
        "operationId": "userinfo",
        "responses": {
          "default": {
            "description": "See handler source"
          }
        },
        "summary": "userinfo",
        "tags": [
          "oauth"
        ],
        "x-handler": "userinfo",
        "x-source": "crates/pelty-api/src/oidc_provider.rs",
        "x-undocumented": true
      }
    },
    "/readyz": {
      "get": {
        "operationId": "readyz",
        "responses": {
          "200": {
            "description": ""
          },
          "503": {
            "description": ""
          }
        },
        "summary": "Readiness: database reachable.",
        "tags": [
          "super::health"
        ],
        "x-handler": "readyz",
        "x-source": "crates/pelty-api/src/routes/health.rs"
      }
    }
  },
  "servers": [
    {
      "url": "/"
    }
  ],
  "tags": [
    {
      "description": "Headless commerce: catalog → cart → checkout → pay → status, authenticated with a customer API key (Authorization: Bearer pelty_…). See `make docs`.",
      "name": "headless"
    }
  ]
}