{
  "openapi": "3.1.0",
  "info": {
    "title": "LXI Public API",
    "version": "1.0.0",
    "description": "Versioned API for LXI.be accounts, domains, hosting services, AI chat, translations and Maker projects.",
    "contact": {"name": "LXI Support", "url": "https://lxi.be/support"}
  },
  "servers": [{"url": "https://lxi.be/api/v1", "description": "Production"}],
  "security": [{"bearerAuth": []}],
  "tags": [
    {"name": "Authentication"}, {"name": "Account"}, {"name": "Domains"}, {"name": "Hosting"}, {"name": "Mail"}, {"name": "Billing"}, {"name": "Webhooks"}, {"name": "AI"}, {"name": "Maker"}
  ],
  "paths": {
    "/": {"get": {"security": [], "summary": "Discover the API", "operationId": "discoverApi", "responses": {"200": {"description": "API metadata", "content": {"application/json": {"schema": {"type": "object"}}}}}}},
    "/device/authorization": {"post": {"security": [], "tags": ["Authentication"], "summary": "Start CLI device authorization", "operationId": "startDeviceAuthorization", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"token_name": {"type": "string"}, "scopes": {"type": "array", "items": {"type": "string"}}}}}}}, "responses": {"201": {"description": "Device and user codes"}, "429": {"$ref": "#/components/responses/Error"}}}},
    "/device/token": {"post": {"security": [], "tags": ["Authentication"], "summary": "Exchange an approved device code", "operationId": "exchangeDeviceCode", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["device_code"], "properties": {"device_code": {"type": "string"}}}}}}, "responses": {"200": {"description": "Bearer access token"}, "428": {"$ref": "#/components/responses/Error"}}}},
    "/account": {"get": {"tags": ["Account"], "summary": "Get account", "operationId": "getAccount", "responses": {"200": {"description": "Current account", "content": {"application/json": {"schema": {"type": "object", "properties": {"account": {"$ref": "#/components/schemas/Account"}}}}}}, "401": {"$ref": "#/components/responses/Error"}}}},
    "/usage": {"get": {"tags": ["Account"], "summary": "Get current usage and limits", "operationId": "getUsage", "responses": {"200": {"description": "Usage summary", "content": {"application/json": {"schema": {"type": "object"}}}}, "401": {"$ref": "#/components/responses/Error"}}}},
    "/services": {"get": {"tags": ["Account"], "summary": "List hosting and other services", "operationId": "listServices", "responses": {"200": {"description": "Services", "content": {"application/json": {"schema": {"type": "object", "properties": {"services": {"type": "array", "items": {"$ref": "#/components/schemas/Service"}}}}}}}, "401": {"$ref": "#/components/responses/Error"}}}},
    "/domains": {"get": {"tags": ["Domains"], "summary": "List domains", "operationId": "listDomains", "responses": {"200": {"description": "Domains", "content": {"application/json": {"schema": {"type": "object", "properties": {"domains": {"type": "array", "items": {"$ref": "#/components/schemas/Domain"}}}}}}}, "401": {"$ref": "#/components/responses/Error"}}}},
    "/domains/check": {"post": {"tags": ["Domains"], "summary": "Check domain availability and create a quote", "operationId": "checkDomain", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["domain"], "properties": {"domain": {"type": "string", "example": "example.de"}}}}}}, "responses": {"200": {"description": "Availability, customer price and checkout URL", "content": {"application/json": {"schema": {"type": "object", "properties": {"quote": {"$ref": "#/components/schemas/DomainQuote"}}}}}}, "422": {"$ref": "#/components/responses/Error"}}}},
    "/domains/orders": {"post": {"tags": ["Billing", "Domains"], "summary": "Create a domain order and payment approval", "operationId": "createDomainOrder", "parameters": [{"$ref": "#/components/parameters/IdempotencyKey"}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["quote_id"], "properties": {"quote_id": {"type": "string"}}}}}}, "responses": {"201": {"description": "Order and PayPal approval URL"}, "409": {"$ref": "#/components/responses/Error"}}}},
    "/domains/{domain_id}/dns": {
      "get": {"tags": ["Domains"], "summary": "List DNS records", "operationId": "listDnsRecords", "parameters": [{"$ref": "#/components/parameters/DomainId"}], "responses": {"200": {"description": "DNS records"}}},
      "post": {"tags": ["Domains"], "summary": "Create a DNS record", "operationId": "createDnsRecord", "parameters": [{"$ref": "#/components/parameters/DomainId"}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/DnsRecordInput"}}}}, "responses": {"202": {"description": "Record and asynchronous job"}}}
    },
    "/domains/{domain_id}/dns/{record_id}": {
      "patch": {"tags": ["Domains"], "summary": "Update a DNS record", "operationId": "updateDnsRecord", "parameters": [{"$ref": "#/components/parameters/DomainId"}, {"$ref": "#/components/parameters/RecordId"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DnsRecordInput"}}}}, "responses": {"202": {"description": "Update queued"}}},
      "delete": {"tags": ["Domains"], "summary": "Delete a DNS record", "operationId": "deleteDnsRecord", "parameters": [{"$ref": "#/components/parameters/DomainId"}, {"$ref": "#/components/parameters/RecordId"}], "responses": {"202": {"description": "Deletion queued"}}}
    },
    "/hosting/sites": {
      "get": {"tags": ["Hosting"], "summary": "List hosting sites", "operationId": "listHostingSites", "responses": {"200": {"description": "Hosting sites"}}},
      "post": {"tags": ["Hosting"], "summary": "Provision a hosting site", "operationId": "createHostingSite", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["domain"], "properties": {"domain": {"type": "string"}}}}}}, "responses": {"202": {"description": "Provisioning queued"}}}
    },
    "/hosting/jobs/{job_id}": {"get": {"tags": ["Hosting"], "summary": "Get asynchronous job state", "operationId": "getHostingJob", "parameters": [{"$ref": "#/components/parameters/JobId"}], "responses": {"200": {"description": "Job state"}}}},
    "/domains/{domain_id}/mailboxes": {
      "get": {"tags": ["Mail"], "summary": "List mailboxes", "operationId": "listMailboxes", "parameters": [{"$ref": "#/components/parameters/DomainId"}], "responses": {"200": {"description": "Mailboxes"}}},
      "post": {"tags": ["Mail"], "summary": "Create a mailbox", "operationId": "createMailbox", "parameters": [{"$ref": "#/components/parameters/DomainId"}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/MailboxInput"}}}}, "responses": {"202": {"description": "Mailbox creation queued; generated password is returned once"}}}
    },
    "/domains/{domain_id}/mailboxes/{mailbox_id}": {
      "patch": {"tags": ["Mail"], "summary": "Change mailbox quota or password", "operationId": "updateMailbox", "parameters": [{"$ref": "#/components/parameters/DomainId"}, {"$ref": "#/components/parameters/MailboxId"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/MailboxInput"}}}}, "responses": {"202": {"description": "Update queued"}}},
      "delete": {"tags": ["Mail"], "summary": "Delete a mailbox", "operationId": "deleteMailbox", "parameters": [{"$ref": "#/components/parameters/DomainId"}, {"$ref": "#/components/parameters/MailboxId"}], "responses": {"202": {"description": "Deletion queued"}}}
    },
    "/orders": {"get": {"tags": ["Billing"], "summary": "List orders", "operationId": "listOrders", "responses": {"200": {"description": "Orders"}}}},
    "/orders/{order_id}": {"get": {"tags": ["Billing"], "summary": "Get an order", "operationId": "getOrder", "parameters": [{"$ref": "#/components/parameters/OrderId"}], "responses": {"200": {"description": "Order"}}}},
    "/webhooks": {
      "get": {"tags": ["Webhooks"], "summary": "List webhook endpoints", "operationId": "listWebhooks", "responses": {"200": {"description": "Webhooks"}}},
      "post": {"tags": ["Webhooks"], "summary": "Create a signed webhook endpoint", "operationId": "createWebhook", "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/WebhookInput"}}}}, "responses": {"201": {"description": "Webhook; signing secret is returned once"}}}
    },
    "/webhooks/{webhook_id}": {"delete": {"tags": ["Webhooks"], "summary": "Disable a webhook", "operationId": "deleteWebhook", "parameters": [{"$ref": "#/components/parameters/WebhookId"}], "responses": {"200": {"description": "Webhook disabled"}}}},
    "/webhooks/{webhook_id}/test": {"post": {"tags": ["Webhooks"], "summary": "Queue a test delivery", "operationId": "testWebhook", "parameters": [{"$ref": "#/components/parameters/WebhookId"}], "responses": {"202": {"description": "Test event queued"}}}},
    "/chat/completions": {"post": {"tags": ["AI"], "summary": "Create a chat completion", "operationId": "createChatCompletion", "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ChatRequest"}}}}, "responses": {"200": {"description": "Chat completion", "content": {"application/json": {"schema": {"type": "object"}}}}, "402": {"$ref": "#/components/responses/Error"}, "422": {"$ref": "#/components/responses/Error"}}}},
    "/translations": {"post": {"tags": ["AI"], "summary": "Translate text", "operationId": "translateText", "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/TranslationRequest"}}}}, "responses": {"200": {"description": "Translation", "content": {"application/json": {"schema": {"type": "object", "properties": {"translation": {"type": "string"}, "source_language": {"type": "string"}, "target_language": {"type": "string"}}}}}}, "422": {"$ref": "#/components/responses/Error"}}}},
    "/maker/projects": {
      "get": {"tags": ["Maker"], "summary": "List Maker projects", "operationId": "listMakerProjects", "parameters": [{"name": "limit", "in": "query", "schema": {"type": "integer", "minimum": 1, "maximum": 100, "default": 40}}], "responses": {"200": {"description": "Project page", "content": {"application/json": {"schema": {"type": "object"}}}}}},
      "post": {"tags": ["Maker"], "summary": "Create and start a Maker project", "operationId": "createMakerProject", "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/MakerProjectCreate"}}}}, "responses": {"201": {"description": "Created project", "content": {"application/json": {"schema": {"type": "object"}}}}, "422": {"$ref": "#/components/responses/Error"}}}
    },
    "/maker/projects/{project_id}": {"get": {"tags": ["Maker"], "summary": "Get Maker project state", "operationId": "getMakerProject", "parameters": [{"$ref": "#/components/parameters/ProjectId"}], "responses": {"200": {"description": "Project state", "content": {"application/json": {"schema": {"type": "object"}}}}, "404": {"$ref": "#/components/responses/Error"}}}},
    "/maker/projects/{project_id}/messages": {"post": {"tags": ["Maker"], "summary": "Send feedback or a request to a Maker project", "operationId": "messageMakerProject", "parameters": [{"$ref": "#/components/parameters/ProjectId"}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["content"], "properties": {"content": {"type": "string"}, "interaction_mode": {"type": "string", "default": "auto"}}}}}}, "responses": {"202": {"description": "Message accepted"}}}},
    "/maker/projects/{project_id}/retry": {"post": {"tags": ["Maker"], "summary": "Retry a failed Maker build", "operationId": "retryMakerProject", "parameters": [{"$ref": "#/components/parameters/ProjectId"}], "responses": {"202": {"description": "Retry accepted"}}}},
    "/maker/projects/{project_id}/approve": {"post": {"tags": ["Maker"], "summary": "Approve a pending Maker plan or action", "operationId": "approveMakerProject", "parameters": [{"$ref": "#/components/parameters/ProjectId"}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["kind"], "properties": {"kind": {"type": "string"}}}}}}, "responses": {"202": {"description": "Approval accepted"}}}}
  },
  "components": {
    "securitySchemes": {"bearerAuth": {"type": "http", "scheme": "bearer", "bearerFormat": "LXI API token"}},
    "parameters": {
      "ProjectId": {"name": "project_id", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid"}},
      "DomainId": {"name": "domain_id", "in": "path", "required": true, "schema": {"type": "integer"}},
      "RecordId": {"name": "record_id", "in": "path", "required": true, "schema": {"type": "integer"}},
      "MailboxId": {"name": "mailbox_id", "in": "path", "required": true, "schema": {"type": "integer"}},
      "JobId": {"name": "job_id", "in": "path", "required": true, "schema": {"type": "integer"}},
      "OrderId": {"name": "order_id", "in": "path", "required": true, "schema": {"type": "integer"}},
      "WebhookId": {"name": "webhook_id", "in": "path", "required": true, "schema": {"type": "integer"}},
      "IdempotencyKey": {"name": "Idempotency-Key", "in": "header", "required": true, "schema": {"type": "string", "minLength": 8, "maxLength": 100}}
    },
    "responses": {"Error": {"description": "Structured API error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}},
    "schemas": {
      "Error": {"type": "object", "required": ["error"], "properties": {"error": {"type": "object", "required": ["code", "message", "request_id"], "properties": {"code": {"type": "string"}, "message": {"type": "string"}, "request_id": {"type": "string"}}}}},
      "Account": {"type": "object", "properties": {"id": {"type": "integer"}, "name": {"type": "string"}, "email": {"type": "string", "format": "email"}, "company": {"type": "string"}, "plan": {"type": "string"}, "email_verified": {"type": "boolean"}, "created_at": {"type": "string", "format": "date-time"}}},
      "Service": {"type": "object", "properties": {"id": {"type": "integer"}, "kind": {"type": "string"}, "label": {"type": "string"}, "identifier": {"type": "string"}, "status": {"type": "string"}, "plan_slug": {"type": "string"}, "control_url": {"type": ["string", "null"], "format": "uri"}}},
      "Domain": {"type": "object", "properties": {"id": {"type": "integer"}, "fqdn": {"type": "string"}, "type": {"type": "string"}, "status": {"type": "string"}, "expires_at": {"type": ["string", "null"], "format": "date-time"}, "auto_renew": {"type": "boolean"}, "nameservers": {"type": "array", "items": {"type": "string"}}}},
      "DomainQuote": {"type": "object", "properties": {"id": {"type": "string"}, "domain": {"type": "string"}, "available": {"type": "boolean"}, "premium": {"type": "boolean"}, "currency": {"const": "EUR"}, "price": {"type": "object", "properties": {"net_cents": {"type": "integer"}, "vat_cents": {"type": "integer"}, "gross_cents": {"type": "integer"}}}, "expires_at": {"type": "string", "format": "date-time"}, "checkout_url": {"type": "string", "format": "uri"}}},
      "ChatRequest": {"type": "object", "required": ["messages"], "properties": {"messages": {"type": "array", "minItems": 1, "maxItems": 100, "items": {"type": "object", "required": ["role", "content"], "properties": {"role": {"enum": ["system", "user", "assistant"]}, "content": {"type": "string"}}}}, "max_output_tokens": {"type": "integer", "minimum": 1, "maximum": 8192, "default": 2048}, "temperature": {"type": "number", "minimum": 0, "maximum": 2, "default": 0.3}, "stream": {"type": "boolean", "default": false}}},
      "TranslationRequest": {"type": "object", "required": ["text", "target_language"], "properties": {"text": {"type": "string", "maxLength": 64000}, "source_language": {"type": "string", "default": "auto"}, "target_language": {"type": "string"}}},
      "DnsRecordInput": {"type": "object", "required": ["type", "name", "value"], "properties": {"type": {"enum": ["A", "AAAA", "CNAME", "MX", "TXT", "CAA"]}, "name": {"type": "string", "default": "@"}, "value": {"type": "string"}, "ttl": {"type": "integer", "minimum": 60, "maximum": 86400, "default": 300}, "priority": {"type": ["integer", "null"], "minimum": 0, "maximum": 65535}}},
      "MailboxInput": {"type": "object", "properties": {"local_part": {"type": "string"}, "password": {"type": "string", "minLength": 12, "maxLength": 128}, "quota_mb": {"type": "integer", "minimum": 100, "maximum": 10240}}},
      "WebhookInput": {"type": "object", "required": ["url", "events"], "properties": {"url": {"type": "string", "format": "uri", "pattern": "^https://"}, "description": {"type": "string", "maxLength": 160}, "events": {"type": "array", "minItems": 1, "items": {"type": "string"}}}},
      "MakerProjectCreate": {"type": "object", "required": ["name", "goal"], "properties": {"name": {"type": "string", "maxLength": 100}, "goal": {"type": "string", "maxLength": 100000}, "workflow": {"enum": ["auto", "app_prototype", "software_project", "deep_research", "rag_qa", "data_analysis", "general_workflow"], "default": "auto"}}}
    }
  }
}
