{"openapi":"3.1.0","info":{"title":"Siteman API","version":"0.0.1","description":"API for managing business domains and email accounts"},"components":{"schemas":{},"parameters":{}},"paths":{"/version":{"get":{"tags":["Public"],"summary":"Version + deploy metadata for the API process","responses":{"200":{"description":"Version metadata","content":{"application/json":{"schema":{"type":"object","properties":{"semver":{"type":"string"},"commitShortSha":{"type":"string","nullable":true},"commitSha":{"type":"string","nullable":true},"deployedAt":{"type":"string"},"environment":{"type":"string"}},"required":["semver","commitShortSha","commitSha","deployedAt","environment"]}}}}}}},"/auth/domain-entry":{"post":{"tags":["Auth"],"summary":"Intrare login ancorată pe domeniu (zero-disclosure)","description":"Pasul unic „Care e domeniul firmei tale?\". Răspuns generic 200 indiferent dacă domeniul există sau ce metode de autentificare are configurate — fără enumerare. UI-ul afișează apoi Google / Passkey / Phone-PIN fără să indice care sunt active.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","minLength":3,"maxLength":253,"pattern":"^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\\.[a-zA-Z]{2,})+$"}},"required":["domain"]}}}},"responses":{"200":{"description":"Cerere procesată (răspuns generic, neutru față de existența domeniului)","content":{"application/json":{"schema":{"type":"object","properties":{"accepted":{"type":"boolean","enum":[true]}},"required":["accepted"]}}}}}}},"/auth/pin/send":{"post":{"operationId":"send_login_pin","tags":["Auth"],"summary":"Trimite cod PIN pe email","x-mcp-title":"Send login PIN","x-mcp-description":"Send a PIN authentication code via email to the specified address.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"}},"required":["email"]}}}},"responses":{"200":{"description":"PIN trimis cu succes","content":{"application/json":{"schema":{"type":"object","properties":{"sent":{"type":"boolean"}},"required":["sent"]}}}},"400":{"description":"Eroare la trimiterea PIN-ului","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/pin/verify":{"post":{"operationId":"verify_login_pin","tags":["Auth"],"summary":"Verifică codul PIN și autentifică","x-mcp-title":"Verify login PIN","x-mcp-description":"Verify the PIN code received via email. Returns a JWT token on successful authentication.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"pin":{"type":"string","pattern":"^[0-9]{6}$/u"}},"required":["email","pin"]}}}},"responses":{"200":{"description":"Autentificare reușită","content":{"application/json":{"schema":{"type":"object","properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"type":"number"}},"required":["accessToken","refreshToken","expiresIn"]}}}},"400":{"description":"PIN invalid sau expirat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/phone/domain-last4":{"post":{"tags":["Auth"],"summary":"Challenge cu ultimele 4 cifre ale telefonului pentru un domeniu (zero-disclosure)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","minLength":3,"maxLength":253},"last4":{"type":"string","pattern":"^[0-9]{4}$/u"}},"required":["domain","last4"]}}}},"responses":{"200":{"description":"Cerere procesată (răspuns generic indiferent dacă potrivirea a reușit)","content":{"application/json":{"schema":{"type":"object","properties":{"accepted":{"type":"boolean","enum":[true]}},"required":["accepted"]}}}}}}},"/auth/recovery/start":{"post":{"tags":["Auth"],"summary":"Pornește flow-ul de recuperare cont (zero-disclosure)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","minLength":3,"maxLength":253},"last4":{"type":"string","pattern":"^[0-9]{4}$/u"}},"required":["domain","last4"]}}}},"responses":{"200":{"description":"Cerere procesată (răspuns generic indiferent de potrivire)","content":{"application/json":{"schema":{"type":"object","properties":{"accepted":{"type":"boolean","enum":[true]}},"required":["accepted"]}}}}}}},"/auth/recovery/verify":{"post":{"tags":["Auth"],"summary":"Verifică PIN-ul de recuperare și emite un token de recuperare (5 min)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"pin":{"type":"string","pattern":"^[0-9]{6}$/u"}},"required":["email","pin"]}}}},"responses":{"200":{"description":"Token de recuperare emis","content":{"application/json":{"schema":{"type":"object","properties":{"recoveryToken":{"type":"string"},"expiresIn":{"type":"number"}},"required":["recoveryToken","expiresIn"]}}}},"400":{"description":"PIN invalid sau expirat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/google":{"get":{"tags":["Auth"],"summary":"Inițiere OAuth Google","description":"Redirect 302 către pagina de consimțământ Google. Generează un code_verifier (PKCE) și îl semnează ca state token JWT — verificat la /google/callback. Cu ?domain=… fluxul devine workspace-scoped: callback-ul cere ca identitatea Google să fie adminul domeniului.","parameters":[{"schema":{"type":"string","minLength":3,"maxLength":253,"pattern":"^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\\.[a-zA-Z]{2,})+$"},"required":false,"name":"domain","in":"query"}],"responses":{"302":{"description":"Redirect către Google"},"503":{"description":"Google OAuth nu este configurat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/google/callback":{"post":{"tags":["Auth"],"summary":"Callback OAuth Google","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","minLength":1},"state":{"type":"string","minLength":1}},"required":["code","state"]}}}},"responses":{"200":{"description":"Autentificare reușită","content":{"application/json":{"schema":{"type":"object","properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"type":"number"}},"required":["accessToken","refreshToken","expiresIn"]}}}},"400":{"description":"Token invalid","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/magic-link/send":{"post":{"tags":["Auth"],"summary":"Trimite link magic pe email","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"}},"required":["email"]}}}},"responses":{"200":{"description":"Link magic trimis","content":{"application/json":{"schema":{"type":"object","properties":{"sent":{"type":"boolean"}},"required":["sent"]}}}},"400":{"description":"Eroare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/magic-link/verify":{"post":{"tags":["Auth"],"summary":"Verifică link magic și autentifică","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","minLength":1}},"required":["token"]}}}},"responses":{"200":{"description":"Autentificare reușită","content":{"application/json":{"schema":{"type":"object","properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"type":"number"}},"required":["accessToken","refreshToken","expiresIn"]}}}},"400":{"description":"Link invalid sau expirat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/refresh":{"post":{"tags":["Auth"],"summary":"Reîmprospătează tokenul de acces","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"refreshToken":{"type":"string","minLength":1}}}}}},"responses":{"200":{"description":"Token reîmprospătat","content":{"application/json":{"schema":{"type":"object","properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"type":"number"}},"required":["accessToken","refreshToken","expiresIn"]}}}},"401":{"description":"Token de refresh invalid","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/api-key/exchange":{"post":{"operationId":"exchange_api_key","tags":["Auth - API Keys"],"summary":"Schimbă o cheie API pe un access token (JWT) de scurtă durată","x-mcp-title":"Exchange API key for access token","x-mcp-description":"Trade a plaintext API key for a short-lived JWT (15 min). Use the returned access token as `Authorization: Bearer <token>` against every protected endpoint, including /mcp.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string","minLength":1,"description":"Plaintext API key (sk_…) issued by /auth/api-keys"}},"required":["apiKey"]}}}},"responses":{"200":{"description":"Token emis","content":{"application/json":{"schema":{"type":"object","properties":{"accessToken":{"type":"string"},"expiresIn":{"type":"number","description":"Access token lifetime in seconds"}},"required":["accessToken","expiresIn"]}}}},"401":{"description":"Cheie API invalidă sau revocată","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/passkey/login-options":{"post":{"tags":["Auth"],"summary":"Generează opțiuni pentru autentificarea cu Passkey","responses":{"200":{"description":"Opțiuni de autentificare generate","content":{"application/json":{"schema":{"type":"object","properties":{"options":{"type":"object","additionalProperties":{"nullable":true}}},"required":["options"]}}}},"400":{"description":"Eroare la generarea opțiunilor","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/passkey/login":{"post":{"tags":["Auth"],"summary":"Autentificare cu Passkey","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","additionalProperties":{"nullable":true}}},"required":["response"]}}}},"responses":{"200":{"description":"Autentificare reușită","content":{"application/json":{"schema":{"type":"object","properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"type":"number"}},"required":["accessToken","refreshToken","expiresIn"]}}}},"400":{"description":"Autentificare eșuată","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/logout":{"post":{"tags":["Auth"],"summary":"Deconectare","responses":{"200":{"description":"Deconectare reușită","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/passkey/register-options":{"post":{"tags":["Auth"],"summary":"Generează opțiuni pentru înregistrarea Passkey","responses":{"200":{"description":"Opțiuni de înregistrare generate","content":{"application/json":{"schema":{"type":"object","properties":{"options":{"type":"object","additionalProperties":{"nullable":true}}},"required":["options"]}}}},"400":{"description":"Eroare la generarea opțiunilor","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/passkey/register":{"post":{"tags":["Auth"],"summary":"Verifică și salvează un Passkey nou","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","additionalProperties":{"nullable":true}},"userAgent":{"type":"string","maxLength":500}},"required":["response"]}}}},"responses":{"200":{"description":"Passkey înregistrat cu succes","content":{"application/json":{"schema":{"type":"object","properties":{"verified":{"type":"boolean"}},"required":["verified"]}}}},"400":{"description":"Eroare la înregistrarea Passkey","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/passkey/list":{"get":{"tags":["Auth"],"summary":"Listează Passkey-urile utilizatorului curent","responses":{"200":{"description":"Lista de Passkey-uri","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"credentialId":{"type":"string"},"deviceLabel":{"type":"string","nullable":true},"deviceType":{"type":"string","nullable":true,"enum":["singleDevice","multiDevice",null]},"backedUp":{"type":"boolean","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"required":["id","credentialId","deviceLabel","deviceType","backedUp","createdAt"]}}}}},"401":{"description":"Neautorizat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/passkey/:id":{"delete":{"tags":["Auth"],"summary":"Șterge un Passkey al utilizatorului curent","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Passkey șters","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Passkey negăsit","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/sessions":{"get":{"tags":["Auth"],"summary":"Listează sesiunile active ale utilizatorului curent","responses":{"200":{"description":"Lista de sesiuni","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"lastSeenAt":{"type":"string","nullable":true,"format":"date-time"},"deviceLabel":{"type":"string","nullable":true},"isCurrent":{"type":"boolean"}},"required":["id","createdAt","lastSeenAt","deviceLabel","isCurrent"]}}}}},"401":{"description":"Neautorizat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/sessions/:id":{"delete":{"tags":["Auth"],"summary":"Revocă o sesiune a utilizatorului curent","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Sesiune revocată","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Sesiune negăsită","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/api-keys":{"post":{"operationId":"create_api_key","tags":["Auth - API Keys"],"summary":"Generează o cheie API pentru utilizatorul curent","x-mcp-title":"Create API key","x-mcp-description":"Mint a new API key for the authenticated user. The plaintext token is returned exactly once — clients must persist it on receipt.","x-mcp-requires-auth":true,"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":80,"description":"Human-readable label so the user can identify the key later"}},"required":["label"]}}}},"responses":{"201":{"description":"Cheie creată","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"last4":{"type":"string"},"token":{"type":"string","description":"Plaintext token. Returned only once — store it now."},"createdAt":{"type":"string"}},"required":["id","label","last4","token","createdAt"]}}}},"401":{"description":"Neautorizat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}},"get":{"operationId":"list_api_keys","tags":["Auth - API Keys"],"summary":"Listează cheile API ale utilizatorului curent","x-mcp-title":"List API keys","x-mcp-description":"Return the authenticated user's API keys (id, label, last4, timestamps). Plaintext tokens are never returned by this endpoint.","x-mcp-requires-auth":true,"responses":{"200":{"description":"Lista cheilor","content":{"application/json":{"schema":{"type":"object","properties":{"keys":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"last4":{"type":"string"},"createdAt":{"type":"string"},"lastUsedAt":{"type":"string","nullable":true},"revokedAt":{"type":"string","nullable":true}},"required":["id","label","last4","createdAt","lastUsedAt","revokedAt"]}}},"required":["keys"]}}}},"401":{"description":"Neautorizat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/api-keys/:id":{"delete":{"operationId":"revoke_api_key","tags":["Auth - API Keys"],"summary":"Revocă o cheie API","x-mcp-title":"Revoke API key","x-mcp-description":"Permanently revoke an API key by id. The key stops authenticating on the next exchange attempt; existing JWTs minted from it remain valid until they expire (15 min).","x-mcp-requires-auth":true,"parameters":[{"schema":{"type":"string","description":"API key id"},"required":true,"description":"API key id","name":"id","in":"path"}],"responses":{"200":{"description":"Cheie revocată","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}}}},"401":{"description":"Neautorizat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Cheie negăsită","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/recovery/passkey/reset":{"post":{"tags":["Auth"],"summary":"Șterge toate passkey-urile contului (necesită token de recuperare)","responses":{"200":{"description":"Passkey-urile au fost șterse","content":{"application/json":{"schema":{"type":"object","properties":{"removed":{"type":"integer","minimum":0}},"required":["removed"]}}}},"401":{"description":"Token de recuperare lipsă sau invalid","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/auth/recovery/admin-email":{"post":{"tags":["Auth"],"summary":"Schimbă adresa de email admin (necesită token de recuperare)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"newEmail":{"type":"string","format":"email"}},"required":["newEmail"]}}}},"responses":{"200":{"description":"Email-ul admin a fost actualizat","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"]}}}},"400":{"description":"Cerere invalidă sau utilizator inexistent","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"401":{"description":"Token de recuperare lipsă sau invalid","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/domains/search":{"post":{"operationId":"search_domain","tags":["Domains"],"summary":"Verifică disponibilitatea unui domeniu","x-mcp-title":"Search domain","x-mcp-description":"Check domain availability. Returns available domains with prices.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","minLength":2,"maxLength":253}},"required":["query"]}}}},"responses":{"200":{"description":"Rezultate disponibilitate","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"available":{"type":"boolean"}},"required":["domain","available"]}}},"required":["results"]}}}},"400":{"description":"Eroare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/domains/register":{"post":{"operationId":"register_domain","tags":["Domains"],"summary":"Înregistrează un domeniu .ro","x-mcp-title":"Register domain","x-mcp-description":"Register an internet domain (e.g. company.ro). Domain must be available.","x-mcp-requires-auth":true,"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":3,"maxLength":253,"pattern":"^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\\.[a-zA-Z]{2,})+$"},"contact":{"type":"object","properties":{"firstName":{"type":"string","minLength":1},"lastName":{"type":"string","minLength":1},"email":{"type":"string","format":"email"},"phone":{"type":"string","minLength":10},"company":{"type":"string"},"fiscalCode":{"type":"string","minLength":1},"address":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"county":{"type":"string","minLength":1},"postalCode":{"type":"string","minLength":1}},"required":["firstName","lastName","email","phone","fiscalCode","address","city","county","postalCode"]}},"required":["name","contact"]}}}},"responses":{"201":{"description":"Domeniu înregistrat","content":{"application/json":{"schema":{"type":"object","properties":{"orderId":{"type":"string"},"domain":{"type":"string"},"status":{"type":"string","enum":["pending","completed","failed"]}},"required":["orderId","domain","status"]}}}},"400":{"description":"Eroare de validare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/domains/list":{"get":{"tags":["Domains"],"summary":"Listează domeniile utilizatorului","responses":{"200":{"description":"Lista de domenii","content":{"application/json":{"schema":{"type":"object","properties":{"domains":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["pending","registered","dns_configured","active","suspended","expired"]},"registeredAt":{"type":"string","nullable":true},"cloudflareDnsZoneId":{"type":"string","nullable":true},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","status","registeredAt","cloudflareDnsZoneId","createdAt","updatedAt"]}}},"required":["domains"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/domains/:id":{"get":{"tags":["Domains"],"summary":"Detalii domeniu","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Detalii domeniu","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["pending","registered","dns_configured","active","suspended","expired"]},"registeredAt":{"type":"string","nullable":true},"cloudflareDnsZoneId":{"type":"string","nullable":true},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","status","registeredAt","cloudflareDnsZoneId","createdAt","updatedAt"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Domeniu negăsit","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/files/shared/{token}/download":{"get":{"tags":["Files"],"summary":"Descarcă fișier partajat (public, fără autentificare)","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"token","in":"path"}],"responses":{"302":{"description":"Redirect to presigned download URL"},"404":{"description":"Token invalid or expired","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"410":{"description":"Share token exhausted","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/files":{"get":{"operationId":"list_files","tags":["Files"],"summary":"Listează fișierele utilizatorului","x-mcp-title":"List files","x-mcp-description":"List files uploaded by the current user.","x-mcp-requires-auth":true,"responses":{"200":{"description":"File list","content":{"application/json":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"mimeType":{"type":"string"},"sizeBytes":{"type":"number"},"status":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","name","mimeType","sizeBytes","status","createdAt"]}}},"required":["files"]}}}}}}},"/files/upload-url":{"post":{"operationId":"get_upload_url","tags":["Files"],"summary":"Obține URL presemnat pentru upload","x-mcp-title":"Get upload URL","x-mcp-description":"Generate a presigned URL for file upload.","x-mcp-requires-auth":true,"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"mimeType":{"type":"string","minLength":1},"sizeBytes":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":5368709120}},"required":["name","mimeType","sizeBytes"]}}}},"responses":{"200":{"description":"Presigned upload URL","content":{"application/json":{"schema":{"type":"object","properties":{"fileId":{"type":"string"},"uploadUrl":{"type":"string","format":"uri"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["fileId","uploadUrl","headers"]}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"413":{"description":"Storage quota exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/files/{fileId}/confirm":{"post":{"tags":["Files"],"summary":"Confirmă upload finalizat","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"fileId","in":"path"}],"responses":{"200":{"description":"Upload confirmed","content":{"application/json":{"schema":{"type":"object","properties":{"fileId":{"type":"string"},"name":{"type":"string"},"mimeType":{"type":"string"},"sizeBytes":{"type":"number"},"status":{"type":"string"}},"required":["fileId","name","mimeType","sizeBytes","status"]}}}},"400":{"description":"File content does not match declared type","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"File not found","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/files/{fileId}/download":{"get":{"operationId":"download_file","tags":["Files"],"summary":"Descarcă fișier (redirect la URL presemnat)","x-mcp-title":"Download file","x-mcp-description":"Get a presigned URL for file download.","x-mcp-requires-auth":true,"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"fileId","in":"path"}],"responses":{"302":{"description":"Redirect to presigned download URL"},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"File not found","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/files/{fileId}":{"delete":{"tags":["Files"],"summary":"Șterge fișier","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"fileId","in":"path"}],"responses":{"200":{"description":"File deleted","content":{"application/json":{"schema":{"type":"object","properties":{"fileId":{"type":"string"},"status":{"type":"string"}},"required":["fileId","status"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"File not found","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/files/multipart/init":{"post":{"tags":["Files"],"summary":"Inițiază upload multipart","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"mimeType":{"type":"string","minLength":1},"sizeBytes":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":5368709120},"partCount":{"type":"integer","minimum":1,"maximum":10000}},"required":["name","mimeType","sizeBytes","partCount"]}}}},"responses":{"200":{"description":"Multipart upload initiated","content":{"application/json":{"schema":{"type":"object","properties":{"fileId":{"type":"string"},"uploadId":{"type":"string"},"partUrls":{"type":"array","items":{"type":"string","format":"uri"}}},"required":["fileId","uploadId","partUrls"]}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"413":{"description":"Storage quota exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/files/multipart/complete":{"post":{"tags":["Files"],"summary":"Finalizează upload multipart","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"fileId":{"type":"string","minLength":1},"uploadId":{"type":"string","minLength":1},"parts":{"type":"array","items":{"type":"object","properties":{"partNumber":{"type":"integer","minimum":1},"etag":{"type":"string","minLength":1}},"required":["partNumber","etag"]},"minItems":1}},"required":["fileId","uploadId","parts"]}}}},"responses":{"200":{"description":"Multipart upload completed","content":{"application/json":{"schema":{"type":"object","properties":{"fileId":{"type":"string"},"status":{"type":"string"}},"required":["fileId","status"]}}}},"400":{"description":"Conținutul fișierului nu corespunde tipului declarat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"File not found","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/files/multipart/abort":{"post":{"tags":["Files"],"summary":"Anulează upload multipart","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"fileId":{"type":"string","minLength":1},"uploadId":{"type":"string","minLength":1}},"required":["fileId","uploadId"]}}}},"responses":{"200":{"description":"Multipart upload aborted","content":{"application/json":{"schema":{"type":"object","properties":{"fileId":{"type":"string"},"status":{"type":"string"}},"required":["fileId","status"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"File not found","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/files/{fileId}/share":{"post":{"tags":["Files"],"summary":"Creează link de partajare pentru fișier","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"fileId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"expiresIn":{"type":"string","enum":["1h","1d","7d","30d"],"default":"7d"},"maxDownloads":{"type":"integer","minimum":1}}}}}},"responses":{"200":{"description":"Share token created","content":{"application/json":{"schema":{"type":"object","properties":{"shareToken":{"type":"string"},"shareUrl":{"type":"string","format":"uri"}},"required":["shareToken","shareUrl"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"File not found","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/workspace/me":{"get":{"tags":["Workspace"],"summary":"Workspace-uri ale utilizatorului curent","responses":{"200":{"description":"Lista domeniilor cu status workspace","content":{"application/json":{"schema":{"type":"object","properties":{"domains":{"type":"array","items":{"type":"object","properties":{"domainId":{"type":"string"},"domainName":{"type":"string"},"domainStatus":{"type":"string"},"hasWorkspace":{"type":"boolean"},"subscriptionStatus":{"type":"string","nullable":true},"seats":{"type":"integer","nullable":true}},"required":["domainId","domainName","domainStatus","hasWorkspace","subscriptionStatus","seats"]}}},"required":["domains"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/workspace/provision":{"post":{"operationId":"provision_workspace","tags":["Workspace"],"summary":"Provizionare Google Workspace","x-mcp-title":"Provision Google Workspace","x-mcp-description":"Provision a Google Workspace subscription for a registered domain.","x-mcp-requires-auth":true,"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"domainId":{"type":"string","minLength":1},"seats":{"type":"integer","minimum":1,"maximum":300}},"required":["domainId","seats"]}}}},"responses":{"201":{"description":"Workspace provizionat cu succes","content":{"application/json":{"schema":{"type":"object","properties":{"subscriptionId":{"type":"string"},"domain":{"type":"string"},"seats":{"type":"integer"},"status":{"type":"string"}},"required":["subscriptionId","domain","seats","status"]}}}},"400":{"description":"Eroare de validare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Domeniul nu a fost găsit","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/workspace/{domainId}/status":{"get":{"tags":["Workspace"],"summary":"Status provizionare Google Workspace","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"domainId","in":"path"}],"responses":{"200":{"description":"Status workspace","content":{"application/json":{"schema":{"type":"object","properties":{"domainId":{"type":"string"},"domainName":{"type":"string"},"domainStatus":{"type":"string"},"hasWorkspace":{"type":"boolean"},"subscriptionId":{"type":"string","nullable":true},"subscriptionStatus":{"type":"string","nullable":true},"seats":{"type":"integer","nullable":true}},"required":["domainId","domainName","domainStatus","hasWorkspace","subscriptionId","subscriptionStatus","seats"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Domeniul nu a fost găsit","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/provisioning/{domainId}/status":{"get":{"tags":["Provisioning"],"summary":"Status provizionare (domeniu → DNS → Workspace)","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"domainId","in":"path"}],"responses":{"200":{"description":"Status provizionare","content":{"application/json":{"schema":{"type":"object","properties":{"domainId":{"type":"string"},"domainName":{"type":"string"},"stage":{"type":"string","enum":["pending","domain_registered","dns_configured","provisioning_workspace","completed","failed"]},"completedSteps":{"type":"integer","minimum":0},"totalSteps":{"type":"integer","minimum":1},"etaSeconds":{"type":"integer","nullable":true},"errors":{"type":"array","items":{"type":"string"}}},"required":["domainId","domainName","stage","completedSteps","totalSteps","etaSeconds","errors"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Domeniul nu a fost găsit","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/billing/checkout/bank-transfer":{"post":{"tags":["Billing"],"summary":"Creează un abonament cu plată prin transfer bancar (anual)","parameters":[{"schema":{"type":"string"},"required":false,"name":"x-idempotency-key","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"session":{"type":"string","minLength":1},"paymentMethod":{"type":"string","enum":["bank_transfer"]},"businessDetails":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["srl"]},"companyName":{"type":"string","minLength":1},"cif":{"type":"string","minLength":2},"regComNumber":{"type":"string","minLength":1},"fullName":{"type":"string"},"cnp":{"type":"string"},"county":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"postalCode":{"type":"string","minLength":1},"street":{"type":"string","minLength":1},"legalRepresentative":{"type":"string"},"primaryAdminEmail":{"type":"string","format":"email"},"eFacturaOptIn":{"type":"boolean","default":false}},"required":["kind","companyName","cif","regComNumber","county","city","postalCode","street"]},{"type":"object","properties":{"kind":{"type":"string","enum":["pfa"]},"companyName":{"type":"string","minLength":1},"cif":{"type":"string","minLength":2},"regComNumber":{"type":"string"},"fullName":{"type":"string"},"cnp":{"type":"string"},"county":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"postalCode":{"type":"string","minLength":1},"street":{"type":"string","minLength":1},"legalRepresentative":{"type":"string"},"primaryAdminEmail":{"type":"string","format":"email"},"eFacturaOptIn":{"type":"boolean","default":false}},"required":["kind","companyName","cif","county","city","postalCode","street"]},{"type":"object","properties":{"kind":{"type":"string","enum":["pf"]},"fullName":{"type":"string","minLength":1},"cnp":{"type":"string","minLength":13,"maxLength":13,"pattern":"^[1-9][0-9]{12}$/u"},"companyName":{"type":"string"},"cif":{"type":"string"},"regComNumber":{"type":"string"},"county":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"postalCode":{"type":"string","minLength":1},"street":{"type":"string","minLength":1},"legalRepresentative":{"type":"string"},"primaryAdminEmail":{"type":"string","format":"email"},"eFacturaOptIn":{"type":"boolean","default":false}},"required":["kind","fullName","cnp","county","city","postalCode","street"]}]}},"required":["session","paymentMethod"]}}}},"responses":{"200":{"description":"Abonament creat — așteaptă plata","content":{"application/json":{"schema":{"type":"object","properties":{"subscriptionId":{"type":"string"},"redirectTo":{"type":"string"}},"required":["subscriptionId","redirectTo"]}}}},"400":{"description":"Eroare validare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"401":{"description":"Sesiune invalidă","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Funcționalitate dezactivată","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"502":{"description":"Eroare la providerii externi","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/billing/checkout/session/verify":{"post":{"tags":["Billing"],"summary":"Verifică token-ul de sesiune checkout și întoarce starea utilizatorului","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"session":{"type":"string","minLength":1}},"required":["session"]}}}},"responses":{"200":{"description":"Token valid","content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string"},"planId":{"type":"string","enum":["lunar","anual"]},"channelId":{"type":"string"},"email":{"type":"string","format":"email"},"hasBusinessDetails":{"type":"boolean"},"bankTransferEnabled":{"type":"boolean"}},"required":["userId","planId","channelId","email","hasBusinessDetails","bankTransferEnabled"]}}}},"401":{"description":"Token invalid sau expirat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/billing/checkout":{"post":{"tags":["Billing"],"summary":"Creează o sesiune de checkout Stripe","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"planId":{"type":"string","enum":["lunar","anual"]},"seats":{"type":"integer","minimum":1,"maximum":100,"default":1},"aliasDomains":{"type":"integer","minimum":0,"maximum":50,"default":0}},"required":["planId"]}}}},"responses":{"200":{"description":"Sesiune de checkout creată","content":{"application/json":{"schema":{"type":"object","properties":{"sessionUrl":{"type":"string"}},"required":["sessionUrl"]}}}},"400":{"description":"Eroare de validare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/billing/subscription":{"get":{"tags":["Billing"],"summary":"Returnează abonamentul curent","responses":{"200":{"description":"Abonament găsit","content":{"application/json":{"schema":{"type":"object","properties":{"plan":{"type":"string","enum":["lunar","anual","personalizat"]},"status":{"type":"string","enum":["active","past_due","canceled","trialing","incomplete"]},"currentPeriodStart":{"type":"string","nullable":true},"currentPeriodEnd":{"type":"string","nullable":true},"cancelAt":{"type":"string","nullable":true}},"required":["plan","status","currentPeriodStart","currentPeriodEnd","cancelAt"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Abonament negăsit","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/billing/cancel":{"post":{"tags":["Billing"],"summary":"Anulează abonamentul curent","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"immediate":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Abonament anulat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","enum":["OK"]}},"required":["code"]}}}},"400":{"description":"Eroare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/billing/upgrade":{"post":{"tags":["Billing"],"summary":"Schimbă planul de abonament","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"planId":{"type":"string","enum":["lunar","anual"]}},"required":["planId"]}}}},"responses":{"200":{"description":"Sesiune de upgrade creată","content":{"application/json":{"schema":{"type":"object","properties":{"sessionUrl":{"type":"string"}},"required":["sessionUrl"]}}}},"400":{"description":"Eroare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/billing/portal":{"post":{"tags":["Billing"],"summary":"Creează o sesiune pentru portalul de facturare Stripe","responses":{"200":{"description":"Sesiune portal creată","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"]}}}},"400":{"description":"Eroare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Abonament negăsit","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/billing/invoices":{"get":{"tags":["Billing"],"summary":"Returnează ultimele 10 facturi ale utilizatorului","responses":{"200":{"description":"Lista de facturi","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"amountDue":{"type":"number"},"amountPaid":{"type":"number"},"currency":{"type":"string"},"status":{"type":"string","nullable":true,"enum":["draft","open","paid","uncollectible","void",null]},"periodStart":{"type":"string","nullable":true},"periodEnd":{"type":"string","nullable":true},"hostedInvoiceUrl":{"type":"string","nullable":true},"pdfUrl":{"type":"string","nullable":true},"createdAt":{"type":"string"}},"required":["id","amountDue","amountPaid","currency","status","periodStart","periodEnd","hostedInvoiceUrl","pdfUrl","createdAt"]}}}}},"400":{"description":"Eroare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/billing/checkout/status/{subscriptionId}":{"get":{"tags":["Billing"],"summary":"Returnează starea curentă a unei comenzi cu plată prin transfer bancar","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"subscriptionId","in":"path"}],"responses":{"200":{"description":"Stare comandă","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["awaiting_payment","paid","provisioning","active","cancelled"]},"proformaNumber":{"type":"string","nullable":true},"pdfUrl":{"type":"string","nullable":true},"hostedInvoiceUrl":{"type":"string","nullable":true},"iban":{"type":"string"},"beneficiary":{"type":"string"},"amountRon":{"type":"number"},"dueDate":{"type":"string","nullable":true}},"required":["status","proformaNumber","pdfUrl","hostedInvoiceUrl","iban","beneficiary","amountRon","dueDate"]}}}},"403":{"description":"Abonamentul nu aparține utilizatorului curent","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Abonament negăsit","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"503":{"description":"Provider neconfigurat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/billing/seats/add":{"post":{"tags":["Billing"],"summary":"Adaugă locuri suplimentare în abonament","x-mcp-title":"Add extra seats to the current subscription","x-mcp-description":"Increments the seat line on the active Stripe subscription by `count`. On the lunar plan the change accumulates into the next monthly invoice via billing_thresholds; on anual it invoices immediately via always_invoice proration.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer","minimum":1,"maximum":100}},"required":["count"]}}}},"responses":{"200":{"description":"Locuri adăugate","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","enum":["OK"]}},"required":["code"]}}}},"400":{"description":"Eroare de validare sau provider","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Abonament inexistent","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/billing/seats/remove":{"post":{"tags":["Billing"],"summary":"Elimină locuri din abonament","x-mcp-title":"Remove seats from the current subscription","x-mcp-description":"Decrements the seat line. On lunar the change prorates onto the next monthly invoice; on anual the removal is deferred to the period end (no Stripe credit issued, since the underlying Sherweb seat is already paid for the year).","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer","minimum":1,"maximum":100}},"required":["count"]}}}},"responses":{"200":{"description":"Locuri eliminate (sau programate pentru reînnoire pe planul anual)","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","enum":["OK"]}},"required":["code"]}}}},"400":{"description":"Eroare de validare sau provider","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Abonament inexistent","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/billing/aliases/add":{"post":{"tags":["Billing"],"summary":"Adaugă domenii alias (doar pe plan anual)","x-mcp-title":"Add alias domain seats (annual plan only)","x-mcp-description":"Increments the alias-domain line by `count`. Requires the anual plan; returns PLAN_UPGRADE_REQUIRED on lunar so the UI can route the user through plan-switch first. Charges immediately via always_invoice proration.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer","minimum":1,"maximum":50}},"required":["count"]}}}},"responses":{"200":{"description":"Aliasuri adăugate","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","enum":["OK"]}},"required":["code"]}}}},"400":{"description":"Eroare de validare, provider, sau plan upgrade necesar","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Abonament inexistent","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/billing/aliases/remove":{"post":{"tags":["Billing"],"summary":"Elimină domenii alias","x-mcp-title":"Remove alias domains from the subscription","x-mcp-description":"Decrements the alias-domain line. The removal is deferred to the next renewal (no mid-year credit memo) — Sherweb COGS for alias-domain registration is already paid upfront.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer","minimum":1,"maximum":50}},"required":["count"]}}}},"responses":{"200":{"description":"Aliasuri eliminate la următoarea reînnoire","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","enum":["OK"]}},"required":["code"]}}}},"400":{"description":"Eroare de validare sau provider","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Abonament inexistent","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/billing/plan/switch":{"post":{"tags":["Billing"],"summary":"Schimbă planul curent (doar lunar → anual)","x-mcp-title":"Switch billing plan from lunar to anual","x-mcp-description":"Swaps the subscription's plan price from lunar to anual and clears the lunar billing_thresholds. Charges the prorated upgrade amount immediately via always_invoice. Anual → lunar is intentionally blocked pending the refund-policy decision in SIT-401.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"toPlanId":{"type":"string","enum":["anual"]}},"required":["toPlanId"]}}}},"responses":{"200":{"description":"Plan schimbat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","enum":["OK"]}},"required":["code"]}}}},"400":{"description":"Eroare de validare sau provider","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Abonament inexistent","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/account/overview":{"get":{"tags":["Account"],"summary":"Sumar dashboard: domenii active, plan curent","responses":{"200":{"description":"Sumar contul tău","content":{"application/json":{"schema":{"type":"object","properties":{"domainCount":{"type":"integer","minimum":0},"activeDomainCount":{"type":"integer","minimum":0},"plan":{"type":"string","nullable":true,"enum":["lunar","anual","personalizat",null]},"planStatus":{"type":"string","nullable":true,"enum":["active","past_due","canceled","trialing","incomplete",null]},"currentPeriodEnd":{"type":"string","nullable":true},"lifecycleStage":{"type":"string","nullable":true,"enum":["visitor","lead","registered","activated","active","at_risk","churned",null]},"businessDetailsComplete":{"type":"boolean"},"seatCount":{"type":"integer","nullable":true,"minimum":0}},"required":["domainCount","activeDomainCount","plan","planStatus","currentPeriodEnd","lifecycleStage","businessDetailsComplete","seatCount"]}}}},"400":{"description":"Eroare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/account/activity":{"get":{"tags":["Account"],"summary":"Activitatea recentă a contului tău (audit_events proprii)","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":50},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Activitate recentă","content":{"application/json":{"schema":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"eventType":{"type":"string"},"description":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","eventType","description","createdAt"]}}},"required":["events"]}}}},"400":{"description":"Eroare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/account/profile":{"get":{"tags":["Account"],"summary":"Profilul contului tău","responses":{"200":{"description":"Profilul tău","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"phone":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"role":{"type":"string","nullable":true},"lifecycleStage":{"type":"string","nullable":true,"enum":["visitor","lead","registered","activated","active","at_risk","churned",null]}},"required":["id","email","phone","name","role","lifecycleStage"]}}}},"400":{"description":"Eroare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}},"patch":{"tags":["Account"],"summary":"Actualizează profilul tău","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200}}}}}},"responses":{"200":{"description":"Profil actualizat","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200}}}}}},"400":{"description":"Eroare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/account/export":{"post":{"tags":["Account"],"summary":"Exportă datele tale (GDPR — dreptul de acces)","responses":{"200":{"description":"Datele tale (răspuns inline, fallback dev)","content":{"application/json":{"schema":{"nullable":true}}}},"202":{"description":"Cerere acceptată; un email cu link semnat va sosi în câteva minute","content":{"application/json":{"schema":{"type":"object","properties":{"queued":{"type":"boolean","enum":[true]},"message":{"type":"string"}},"required":["queued","message"]}}}},"400":{"description":"Eroare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/account/delete":{"post":{"tags":["Account"],"summary":"Șterge contul tău (GDPR — dreptul de ștergere)","responses":{"200":{"description":"Cont anonimizat. Datele financiare sunt păstrate pentru retenția legală.","content":{"application/json":{"schema":{"type":"object","properties":{"anonymisedAt":{"type":"string"}},"required":["anonymisedAt"]}}}},"400":{"description":"Eroare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/account/entitlements":{"get":{"tags":["Account"],"summary":"Cota de entitlement-uri (extra_domain, extra_seat) + folosință curentă","responses":{"200":{"description":"Cota curentă","content":{"application/json":{"schema":{"type":"object","properties":{"extra_domain":{"type":"object","properties":{"limit":{"type":"integer","minimum":0},"used":{"type":"integer","nullable":true,"minimum":0}},"required":["limit","used"]},"extra_seat":{"type":"object","properties":{"limit":{"type":"integer","minimum":0},"used":{"type":"integer","nullable":true,"minimum":0}},"required":["limit","used"]}},"required":["extra_domain","extra_seat"]}}}},"400":{"description":"Eroare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/account/business-details":{"get":{"tags":["Account"],"summary":"Detaliile fiscale ale firmei (pentru facturare)","responses":{"200":{"description":"Detaliile fiscale stocate, sau null dacă nu există încă","content":{"application/json":{"schema":{"type":"object","properties":{"businessDetails":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["srl"]},"companyName":{"type":"string","minLength":1,"maxLength":256},"cif":{"type":"string","minLength":2,"maxLength":12},"regComNumber":{"type":"string","minLength":5,"maxLength":32},"legalRepresentative":{"type":"string","minLength":1,"maxLength":256},"county":{"type":"string","minLength":1,"maxLength":64},"city":{"type":"string","minLength":1,"maxLength":128},"postalCode":{"type":"string","pattern":"^\\d{6}$/u"},"street":{"type":"string","minLength":1,"maxLength":256},"primaryAdminEmail":{"type":"string","nullable":true,"maxLength":320,"format":"email"},"eFacturaOptIn":{"type":"boolean","default":false}},"required":["kind","companyName","cif","regComNumber","legalRepresentative","county","city","postalCode","street"]},{"type":"object","properties":{"kind":{"type":"string","enum":["pfa"]},"fullName":{"type":"string","minLength":1,"maxLength":256},"county":{"type":"string","minLength":1,"maxLength":64},"city":{"type":"string","minLength":1,"maxLength":128},"postalCode":{"type":"string","pattern":"^\\d{6}$/u"},"street":{"type":"string","minLength":1,"maxLength":256},"primaryAdminEmail":{"type":"string","nullable":true,"maxLength":320,"format":"email"},"eFacturaOptIn":{"type":"boolean","default":false}},"required":["kind","fullName","county","city","postalCode","street"]},{"type":"object","properties":{"kind":{"type":"string","enum":["pf"]},"fullName":{"type":"string","minLength":1,"maxLength":256},"cnp":{"type":"string","minLength":13,"maxLength":13,"pattern":"^[1-9][0-9]{12}$/u"},"county":{"type":"string","minLength":1,"maxLength":64},"city":{"type":"string","minLength":1,"maxLength":128},"postalCode":{"type":"string","pattern":"^\\d{6}$/u"},"street":{"type":"string","minLength":1,"maxLength":256},"primaryAdminEmail":{"type":"string","nullable":true,"maxLength":320,"format":"email"},"eFacturaOptIn":{"type":"boolean","default":false}},"required":["kind","fullName","cnp","county","city","postalCode","street"]},{"nullable":true}]}},"required":["businessDetails"]}}}},"400":{"description":"Eroare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}},"put":{"tags":["Account"],"summary":"Salvează detaliile fiscale ale firmei","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["srl"]},"companyName":{"type":"string","minLength":1,"maxLength":256},"cif":{"type":"string","minLength":2,"maxLength":12},"regComNumber":{"type":"string","minLength":5,"maxLength":32},"legalRepresentative":{"type":"string","minLength":1,"maxLength":256},"county":{"type":"string","minLength":1,"maxLength":64},"city":{"type":"string","minLength":1,"maxLength":128},"postalCode":{"type":"string","pattern":"^\\d{6}$/u"},"street":{"type":"string","minLength":1,"maxLength":256},"primaryAdminEmail":{"type":"string","nullable":true,"maxLength":320,"format":"email"},"eFacturaOptIn":{"type":"boolean","default":false}},"required":["kind","companyName","cif","regComNumber","legalRepresentative","county","city","postalCode","street"]},{"type":"object","properties":{"kind":{"type":"string","enum":["pfa"]},"fullName":{"type":"string","minLength":1,"maxLength":256},"county":{"type":"string","minLength":1,"maxLength":64},"city":{"type":"string","minLength":1,"maxLength":128},"postalCode":{"type":"string","pattern":"^\\d{6}$/u"},"street":{"type":"string","minLength":1,"maxLength":256},"primaryAdminEmail":{"type":"string","nullable":true,"maxLength":320,"format":"email"},"eFacturaOptIn":{"type":"boolean","default":false}},"required":["kind","fullName","county","city","postalCode","street"]},{"type":"object","properties":{"kind":{"type":"string","enum":["pf"]},"fullName":{"type":"string","minLength":1,"maxLength":256},"cnp":{"type":"string","minLength":13,"maxLength":13,"pattern":"^[1-9][0-9]{12}$/u"},"county":{"type":"string","minLength":1,"maxLength":64},"city":{"type":"string","minLength":1,"maxLength":128},"postalCode":{"type":"string","pattern":"^\\d{6}$/u"},"street":{"type":"string","minLength":1,"maxLength":256},"primaryAdminEmail":{"type":"string","nullable":true,"maxLength":320,"format":"email"},"eFacturaOptIn":{"type":"boolean","default":false}},"required":["kind","fullName","cnp","county","city","postalCode","street"]}]}}}},"responses":{"200":{"description":"Validare reușită, detaliile au fost salvate","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"valid":{"type":"boolean","enum":[true]}},"required":["valid"]},{"type":"object","properties":{"valid":{"type":"boolean","enum":[false]},"errors":{"type":"object","additionalProperties":{"type":"string"}}},"required":["valid","errors"]}]}}}},"400":{"description":"Validare eșuată sau eroare","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"valid":{"type":"boolean","enum":[true]}},"required":["valid"]},{"type":"object","properties":{"valid":{"type":"boolean","enum":[false]},"errors":{"type":"object","additionalProperties":{"type":"string"}}},"required":["valid","errors"]}]}}}},"401":{"description":"Neautorizat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/account/phone":{"post":{"tags":["Account"],"summary":"Salvează numărul de telefon (criptat în repaus + hash pe ultimele 4 cifre)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"phone":{"type":"string","pattern":"^(\\+40|0)[0-9]{9}$/u"}},"required":["phone"]}}}},"responses":{"200":{"description":"Telefon salvat","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"]}}}},"400":{"description":"Cerere invalidă","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Acces interzis","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/consents":{"post":{"tags":["Consents"],"summary":"Înregistrează consimțământul utilizatorului pentru o categorie","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"visitorId":{"type":"string","minLength":1,"maxLength":128},"category":{"type":"string","enum":["necessary","preferences","analytics","marketing","tos","privacy_policy","marketing_emails"]},"granted":{"type":"boolean"},"policyVersion":{"type":"string","minLength":1,"maxLength":64},"lawfulBasis":{"type":"string","enum":["contract","consent","legitimate_interest","legal_obligation"]}},"required":["category","granted"]}}}},"responses":{"201":{"description":"Consimțământ înregistrat","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}}}},"400":{"description":"Cerere invalidă","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/consents/me":{"get":{"tags":["Consents"],"summary":"Returnează starea curentă a consimțămintelor","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":128},"required":false,"name":"visitorId","in":"query"}],"responses":{"200":{"description":"Starea consimțămintelor","content":{"application/json":{"schema":{"type":"object","properties":{"consents":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string","enum":["necessary","preferences","analytics","marketing","tos","privacy_policy","marketing_emails"]},"granted":{"type":"boolean"},"policyVersion":{"type":"string","nullable":true},"createdAt":{"type":"string"}},"required":["category","granted","policyVersion","createdAt"]}}},"required":["consents"]}}}}}}},"/purchase/discount/validate":{"post":{"tags":["Purchase"],"summary":"Validează un cod de reducere","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":64},"plan":{"type":"string","enum":["lunar","anual","personalizat"]},"subtotal":{"type":"integer","minimum":0},"currency":{"type":"string","minLength":1,"maxLength":8,"default":"Lei"}},"required":["code","plan","subtotal"]}}}},"responses":{"200":{"description":"Rezultatul validării","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"valid":{"type":"boolean","enum":[true]},"discount":{"type":"integer","minimum":0},"kind":{"type":"string","enum":["percent","amount"]},"value":{"type":"integer"},"currency":{"type":"string"}},"required":["valid","discount","kind","value","currency"]},{"type":"object","properties":{"valid":{"type":"boolean","enum":[false]},"reason":{"type":"string","enum":["NOT_FOUND","INACTIVE","EXPIRED","USAGE_EXHAUSTED","PLAN_MISMATCH","CURRENCY_MISMATCH"]}},"required":["valid","reason"]}]}}}}}}},"/purchase/business-details/validate":{"post":{"tags":["Purchase"],"summary":"Validează detaliile fiscale ale firmei","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["srl"]},"companyName":{"type":"string","minLength":1,"maxLength":256},"cif":{"type":"string","minLength":2,"maxLength":12},"regComNumber":{"type":"string","minLength":5,"maxLength":32},"legalRepresentative":{"type":"string","minLength":1,"maxLength":256},"county":{"type":"string","minLength":1,"maxLength":64},"city":{"type":"string","minLength":1,"maxLength":128},"postalCode":{"type":"string","pattern":"^\\d{6}$/u"},"street":{"type":"string","minLength":1,"maxLength":256},"primaryAdminEmail":{"type":"string","nullable":true,"maxLength":320,"format":"email"},"eFacturaOptIn":{"type":"boolean","default":false}},"required":["kind","companyName","cif","regComNumber","legalRepresentative","county","city","postalCode","street"]},{"type":"object","properties":{"kind":{"type":"string","enum":["pfa"]},"fullName":{"type":"string","minLength":1,"maxLength":256},"county":{"type":"string","minLength":1,"maxLength":64},"city":{"type":"string","minLength":1,"maxLength":128},"postalCode":{"type":"string","pattern":"^\\d{6}$/u"},"street":{"type":"string","minLength":1,"maxLength":256},"primaryAdminEmail":{"type":"string","nullable":true,"maxLength":320,"format":"email"},"eFacturaOptIn":{"type":"boolean","default":false}},"required":["kind","fullName","county","city","postalCode","street"]},{"type":"object","properties":{"kind":{"type":"string","enum":["pf"]},"fullName":{"type":"string","minLength":1,"maxLength":256},"cnp":{"type":"string","minLength":13,"maxLength":13,"pattern":"^[1-9][0-9]{12}$/u"},"county":{"type":"string","minLength":1,"maxLength":64},"city":{"type":"string","minLength":1,"maxLength":128},"postalCode":{"type":"string","pattern":"^\\d{6}$/u"},"street":{"type":"string","minLength":1,"maxLength":256},"primaryAdminEmail":{"type":"string","nullable":true,"maxLength":320,"format":"email"},"eFacturaOptIn":{"type":"boolean","default":false}},"required":["kind","fullName","cnp","county","city","postalCode","street"]}]}}}},"responses":{"200":{"description":"Rezultatul validării","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"valid":{"type":"boolean","enum":[true]}},"required":["valid"]},{"type":"object","properties":{"valid":{"type":"boolean","enum":[false]},"errors":{"type":"object","additionalProperties":{"type":"string"}}},"required":["valid","errors"]}]}}}}}}},"/purchase/pricing/quote":{"post":{"tags":["Purchase"],"summary":"Calculează ofertă: subtotal, reducere, TVA, total","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"plan":{"type":"string","enum":["lunar","anual","personalizat"]},"seats":{"type":"integer","minimum":1,"maximum":100,"default":1},"aliasDomains":{"type":"integer","minimum":0,"maximum":50,"default":0},"discountCode":{"type":"string","minLength":1,"maxLength":64}},"required":["plan"]}}}},"responses":{"200":{"description":"Ofertă","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["fixed"]},"currency":{"type":"string"},"subtotal":{"type":"integer","minimum":0},"discount":{"type":"integer","minimum":0},"vat":{"type":"integer","minimum":0},"total":{"type":"integer","minimum":0},"breakdown":{"type":"object","properties":{"basePrice":{"type":"integer","minimum":0},"extraSeats":{"type":"integer","minimum":0},"extraSeatPrice":{"type":"integer","minimum":0},"extraSeatsTotal":{"type":"integer","minimum":0},"aliasDomains":{"type":"integer","minimum":0},"aliasDomainPrice":{"type":"integer","minimum":0},"aliasDomainsTotal":{"type":"integer","minimum":0}},"required":["basePrice","extraSeats","extraSeatPrice","extraSeatsTotal","aliasDomains","aliasDomainPrice","aliasDomainsTotal"]},"discountReason":{"type":"string","enum":["NOT_FOUND","INACTIVE","EXPIRED","USAGE_EXHAUSTED","PLAN_MISMATCH","CURRENCY_MISMATCH"]}},"required":["kind","currency","subtotal","discount","vat","total","breakdown"]},{"type":"object","properties":{"kind":{"type":"string","enum":["custom_quote"]},"message":{"type":"string"}},"required":["kind","message"]},{"type":"object","properties":{"kind":{"type":"string","enum":["plan_upgrade_required"]},"message":{"type":"string"},"requiredPlan":{"type":"string","enum":["lunar","anual","personalizat"]}},"required":["kind","message","requiredPlan"]}]}}}}}}},"/purchase/admin-email/validate":{"post":{"tags":["Purchase"],"summary":"Validează adresa de email pentru contul de admin Workspace","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","minLength":1,"maxLength":253},"localPart":{"type":"string","minLength":1,"maxLength":64}},"required":["domain","localPart"]}}}},"responses":{"200":{"description":"Rezultatul validării","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"valid":{"type":"boolean","enum":[true]},"email":{"type":"string"}},"required":["valid","email"]},{"type":"object","properties":{"valid":{"type":"boolean","enum":[false]},"reason":{"type":"string","enum":["INVALID_LOCAL_PART","RESERVED","TOO_SHORT","TOO_LONG"]}},"required":["valid","reason"]}]}}}}}}},"/marketing/stats":{"get":{"tags":["Marketing"],"summary":"Statistici publice pentru social proof","responses":{"200":{"description":"Statistici returnate cu succes","content":{"application/json":{"schema":{"type":"object","properties":{"domainsRegistered":{"type":"number"},"emailsActive":{"type":"number"},"satisfiedClients":{"type":"number"}},"required":["domainsRegistered","emailsActive","satisfiedClients"]}}}}}}},"/marketing/touchpoint":{"post":{"tags":["Marketing"],"summary":"Înregistrează un touchpoint anonim","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"visitorId":{"type":"string","minLength":8,"maxLength":128},"sessionId":{"type":"string","maxLength":128},"path":{"type":"string","minLength":1,"maxLength":2048},"referrerDomain":{"type":"string","maxLength":253},"country":{"type":"string","minLength":2,"maxLength":2},"deviceKind":{"type":"string","enum":["mobile","tablet","desktop","bot","unknown"]},"utmSource":{"type":"string","maxLength":255},"utmMedium":{"type":"string","maxLength":255},"utmCampaign":{"type":"string","maxLength":255},"utmContent":{"type":"string","maxLength":255},"utmTerm":{"type":"string","maxLength":255},"gclid":{"type":"string","maxLength":255},"fbclid":{"type":"string","maxLength":255}},"required":["visitorId","path"]}}}},"responses":{"202":{"description":"Acceptat (scriere asincronă, fire-and-forget)","content":{"application/json":{"schema":{"type":"object","properties":{"accepted":{"type":"boolean","enum":[true]}},"required":["accepted"]}}}}}}},"/marketing/status":{"get":{"tags":["Public"],"summary":"Status public servicii","responses":{"200":{"description":"Status agregat per serviciu","content":{"application/json":{"schema":{"type":"object","properties":{"overall":{"type":"string","enum":["operational","degraded","down","unknown"]},"checkedAt":{"type":"string"},"services":{"type":"array","items":{"type":"object","properties":{"service":{"type":"string"},"status":{"type":"string","enum":["healthy","down","not_configured","unknown"]},"uptimePercent24h":{"type":"number","nullable":true},"lastCheckedAt":{"type":"string","nullable":true}},"required":["service","status","uptimePercent24h","lastCheckedAt"]}}},"required":["overall","checkedAt","services"]}}}}}}},"/public/contact":{"post":{"tags":["Public"],"summary":"Trimite un mesaj prin formularul de contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":128},"email":{"type":"string","maxLength":320,"format":"email"},"phone":{"type":"string","minLength":1,"maxLength":32},"message":{"type":"string","minLength":1,"maxLength":4096},"website":{"type":"string"}},"required":["name","email","message"]}}}},"responses":{"200":{"description":"Mesaj acceptat","content":{"application/json":{"schema":{"type":"object","properties":{"accepted":{"type":"boolean","enum":[true]}},"required":["accepted"]}}}},"403":{"description":"Canalul curent nu acceptă submisii pe API-ul public (api_kind != shared)","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"429":{"description":"Limita orară de submisii pentru acest canal a fost atinsă","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/brand/by-host":{"get":{"tags":["Public"],"summary":"Rezolvă brand-ul pentru un host public","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":253,"example":"emailfirma.ro"},"required":true,"name":"host","in":"query"}],"responses":{"200":{"description":"Brand-ul corespunzător","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"domain":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"},"default":[]},"branding":{"type":"object","properties":{"siteName":{"type":"string","minLength":1,"maxLength":64},"baseUrl":{"type":"string","format":"uri"},"apiDocUrl":{"type":"string","format":"uri"},"plausibleDomain":{"type":"string","minLength":1,"maxLength":253},"mailFrom":{"type":"string","maxLength":320,"format":"email"},"contactEmail":{"type":"string","maxLength":320,"format":"email"},"contactPhone":{"type":"string","minLength":1,"maxLength":32},"logoDir":{"type":"string","minLength":1,"maxLength":64},"ogImagePath":{"type":"string","minLength":1,"maxLength":256},"primaryColor":{"type":"string","pattern":"^#[0-9a-f]{6}$/iu"},"metaPixelId":{"type":"string","maxLength":32},"googleTagId":{"type":"string","maxLength":32},"linkedinPartnerId":{"type":"string","maxLength":32}},"required":["siteName","baseUrl","apiDocUrl","plausibleDomain","mailFrom","contactEmail","contactPhone","logoDir","ogImagePath","primaryColor"]},"status":{"type":"string","enum":["active","suspended","setup"]},"deploymentMode":{"type":"string","enum":["shared","dedicated"]},"siteKind":{"type":"string","enum":["inline","external-bundle"],"default":"inline"},"siteFolder":{"type":"string"},"apiKind":{"type":"string","enum":["none","shared","custom"],"default":"shared"},"customApiUrl":{"type":"string","nullable":true,"default":null},"spaFallback":{"type":"boolean","default":false}},"required":["id","slug","name","domain","branding","status","deploymentMode","siteFolder"]}}}},"404":{"description":"Niciun brand nu revendică host-ul","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}}}},"/Autodiscover/Autodiscover.xml":{"post":{"tags":["Autodiscovery"],"summary":"Microsoft Autodiscover endpoint","description":"Returns Microsoft Autodiscover v1 XML for Outlook / older Apple Mail. Reads the email address from the request body, validates the domain is managed by siteman, and returns Gmail IMAP/SMTP settings.","requestBody":{"content":{"text/xml":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"Autodiscover XML","content":{"application/xml":{"schema":{"type":"string"}}}},"404":{"description":"Domain not managed","content":{"application/xml":{"schema":{"type":"string"}}}}}}},"/autodiscover/autodiscover.xml":{"post":{"tags":["Autodiscovery"],"summary":"Microsoft Autodiscover endpoint","description":"Returns Microsoft Autodiscover v1 XML for Outlook / older Apple Mail. Reads the email address from the request body, validates the domain is managed by siteman, and returns Gmail IMAP/SMTP settings.","requestBody":{"content":{"text/xml":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"Autodiscover XML","content":{"application/xml":{"schema":{"type":"string"}}}},"404":{"description":"Domain not managed","content":{"application/xml":{"schema":{"type":"string"}}}}}}},"/mail/config-v1.1.xml":{"get":{"tags":["Autodiscovery"],"summary":"Mozilla autoconfig endpoint","description":"Returns Mozilla autoconfig XML for Thunderbird/K-9. Picks the customer domain from the `emailaddress` query parameter (canonical) or the `autoconfig.{domain}` Host header.","parameters":[{"schema":{"type":"string"},"required":false,"name":"emailaddress","in":"query"}],"responses":{"200":{"description":"Autoconfig XML","content":{"application/xml":{"schema":{"type":"string"}}}},"404":{"description":"Domain not managed","content":{"application/xml":{"schema":{"type":"string"}}}}}}},"/.well-known/autoconfig/mail/config-v1.1.xml":{"get":{"tags":["Autodiscovery"],"summary":"Mozilla autoconfig endpoint","description":"Returns Mozilla autoconfig XML for Thunderbird/K-9. Picks the customer domain from the `emailaddress` query parameter (canonical) or the `autoconfig.{domain}` Host header.","parameters":[{"schema":{"type":"string"},"required":false,"name":"emailaddress","in":"query"}],"responses":{"200":{"description":"Autoconfig XML","content":{"application/xml":{"schema":{"type":"string"}}}},"404":{"description":"Domain not managed","content":{"application/xml":{"schema":{"type":"string"}}}}}}},"/email-setup/mobileconfig":{"get":{"tags":["Autodiscovery"],"summary":"Generează profil de configurare email pentru iOS/macOS","description":"Returnează un fișier .mobileconfig nesemnat cu setările IMAP/SMTP pentru emailul cerut. Utilizatorul trebuie să fie autentificat și să dețină domeniul. Profilul instalează contul pe iPhone/iPad/Mac cu autentificare prin parolă (App Password).","x-mcp-title":"Generate iOS/macOS email profile","x-mcp-description":"Generate a .mobileconfig profile that installs an IMAP/SMTP email account on Apple devices.","parameters":[{"schema":{"type":"string","format":"email"},"required":true,"name":"email","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":100},"required":false,"name":"displayName","in":"query"}],"responses":{"200":{"description":"Profil de configurare","content":{"application/x-apple-aspen-config":{"schema":{"type":"string"}}}},"403":{"description":"Utilizatorul nu deține domeniul","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Domeniul nu este gestionat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/email-setup/autodetect-coverage":{"get":{"tags":["Autodiscovery"],"summary":"Verifică dacă Outlook va detecta automat domeniul ca Google Workspace","description":"Interoghează serviciul AutoDetect al Microsoft cu emailul cerut și returnează ce furnizor a fost recunoscut. Dacă răspunde 'google', Outlook se va configura automat fără pași manuali.","x-mcp-title":"Probe Microsoft AutoDetect coverage","x-mcp-description":"Check whether Outlook will auto-configure a custom-domain email as Gmail.","parameters":[{"schema":{"type":"string","format":"email"},"required":true,"name":"email","in":"query"}],"responses":{"200":{"description":"Rezultatul probei","content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"},"covered":{"type":"boolean"},"services":{"type":"array","items":{"type":"string"}},"primaryService":{"type":"string","nullable":true}},"required":["email","covered","services","primaryService"]}}}},"403":{"description":"Utilizatorul nu deține domeniul","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Domeniul nu este gestionat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/sites/scaffold":{"post":{"tags":["Sites"],"summary":"Scaffold un site nou (admin sau agent MCP)","description":"Validează slug-ul + coliziunile, generează site.config.ts și inserează canalul cu status=setup. Caller-ul este responsabil să persiste sursa în git (CI / GitHub Apps worker).","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string","minLength":2,"maxLength":63},"domain":{"type":"string","minLength":3,"maxLength":253},"templateRef":{"type":"string","nullable":true,"minLength":1,"maxLength":128},"branding":{"type":"object","properties":{"siteName":{"type":"string","minLength":1,"maxLength":64},"baseUrl":{"type":"string","format":"uri"},"apiDocUrl":{"type":"string","format":"uri"},"plausibleDomain":{"type":"string","minLength":1,"maxLength":253},"mailFrom":{"type":"string","maxLength":320,"format":"email"},"contactEmail":{"type":"string","maxLength":320,"format":"email"},"contactPhone":{"type":"string","minLength":1,"maxLength":32},"logoDir":{"type":"string","minLength":1,"maxLength":64},"ogImagePath":{"type":"string","minLength":1,"maxLength":256},"primaryColor":{"type":"string","pattern":"^#[0-9a-f]{6}$/iu"},"metaPixelId":{"type":"string","maxLength":32},"googleTagId":{"type":"string","maxLength":32},"linkedinPartnerId":{"type":"string","maxLength":32}},"required":["siteName","baseUrl","apiDocUrl","plausibleDomain","mailFrom","contactEmail","contactPhone","logoDir","ogImagePath","primaryColor"]},"meta":{"type":"object","properties":{"siteName":{"type":"string","minLength":1,"maxLength":64},"tagline":{"type":"string","minLength":1,"maxLength":256},"contactEmail":{"type":"string","maxLength":320,"format":"email"},"contactPhone":{"type":"string","minLength":1,"maxLength":32},"socialOgImage":{"type":"string","minLength":1,"maxLength":512}},"required":["siteName"]},"theme":{"type":"object","properties":{"primaryColor":{"type":"string","pattern":"^#[0-9a-f]{6}$/iu"},"font":{"type":"string","minLength":1,"maxLength":64},"accentColor":{"type":"string","pattern":"^#[0-9a-f]{6}$/iu"}}},"aliases":{"type":"array","items":{"type":"string","minLength":3,"maxLength":253},"maxItems":8},"siteKind":{"type":"string","enum":["inline","external-bundle"]},"apiKind":{"type":"string","enum":["none","shared","custom"]},"customApiUrl":{"type":"string","nullable":true,"format":"uri"},"spaFallback":{"type":"boolean"},"source":{"type":"string","minLength":1,"maxLength":64}},"required":["slug","domain","branding","meta"]}}}},"responses":{"201":{"description":"Site creat (status=setup)","content":{"application/json":{"schema":{"type":"object","properties":{"channelId":{"type":"string"},"siteFolder":{"type":"string"},"filePath":{"type":"string"},"generatedSource":{"type":"string"}},"required":["channelId","siteFolder","filePath","generatedSource"]}}}},"400":{"description":"Slug invalid sau coliziune slug/domain","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"401":{"description":"Token lipsă sau invalid","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Nu ai dreptul să creezi un site","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"500":{"description":"Eroare internă","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/sites":{"get":{"tags":["Sites"],"summary":"Listă toate site-urile (admin)","description":"Returnează toate canalele din hub-ul siteman. Folosit de dashboard admin și de agenții AI prin MCP pentru a inspecta site-urile existente înainte de a crea altele noi.","responses":{"200":{"description":"Lista site-urilor","content":{"application/json":{"schema":{"type":"object","properties":{"sites":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"domain":{"type":"string","nullable":true},"status":{"type":"string","enum":["active","suspended","setup"]},"siteKind":{"type":"string","enum":["inline","external-bundle"]},"siteFolder":{"type":"string"},"apiKind":{"type":"string","enum":["none","shared","custom"]},"createdAt":{"type":"string"}},"required":["id","slug","name","domain","status","siteKind","siteFolder","apiKind","createdAt"]}}},"required":["sites"]}}}},"401":{"description":"Token lipsă sau invalid","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Nu ai dreptul să vezi site-urile","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/sites/{slug}":{"get":{"tags":["Sites"],"summary":"Detalii site (admin)","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":64},"required":true,"name":"slug","in":"path"}],"responses":{"200":{"description":"Canalul + proiecția brand-ului","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"domain":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"},"default":[]},"branding":{"type":"object","properties":{"siteName":{"type":"string","minLength":1,"maxLength":64},"baseUrl":{"type":"string","format":"uri"},"apiDocUrl":{"type":"string","format":"uri"},"plausibleDomain":{"type":"string","minLength":1,"maxLength":253},"mailFrom":{"type":"string","maxLength":320,"format":"email"},"contactEmail":{"type":"string","maxLength":320,"format":"email"},"contactPhone":{"type":"string","minLength":1,"maxLength":32},"logoDir":{"type":"string","minLength":1,"maxLength":64},"ogImagePath":{"type":"string","minLength":1,"maxLength":256},"primaryColor":{"type":"string","pattern":"^#[0-9a-f]{6}$/iu"},"metaPixelId":{"type":"string","maxLength":32},"googleTagId":{"type":"string","maxLength":32},"linkedinPartnerId":{"type":"string","maxLength":32}},"required":["siteName","baseUrl","apiDocUrl","plausibleDomain","mailFrom","contactEmail","contactPhone","logoDir","ogImagePath","primaryColor"]},"status":{"type":"string","enum":["active","suspended","setup"]},"deploymentMode":{"type":"string","enum":["shared","dedicated"]},"siteKind":{"type":"string","enum":["inline","external-bundle"],"default":"inline"},"siteFolder":{"type":"string"},"apiKind":{"type":"string","enum":["none","shared","custom"],"default":"shared"},"customApiUrl":{"type":"string","nullable":true,"default":null},"spaFallback":{"type":"boolean","default":false},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","slug","name","domain","branding","status","deploymentMode","siteFolder","createdAt","updatedAt"]}}}},"401":{"description":"Token lipsă sau invalid","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Nu ai dreptul să vezi acest site","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Slug-ul nu există","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/sites/drafts":{"post":{"tags":["Sites"],"summary":"Salvează progresul wizardului pentru un domeniu","description":"Upsert pe (userId, domainId). Validează content-ul împotriva contentSchema-ului template-ului ales — wizardul prinde erorile devreme.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"domainId":{"type":"string","minLength":1},"templateRef":{"type":"string","minLength":1,"maxLength":128},"content":{"type":"object","additionalProperties":{"nullable":true}}},"required":["domainId","templateRef","content"]}}}},"responses":{"200":{"description":"Draftul a fost salvat","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"domainId":{"type":"string"},"templateRef":{"type":"string"},"content":{"nullable":true},"status":{"type":"string","enum":["draft","queued","completed","failed"]},"channelId":{"type":"string","nullable":true},"failureReason":{"type":"string","nullable":true},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","domainId","templateRef","status","channelId","failureReason","createdAt","updatedAt"]}}}},"400":{"description":"Template necunoscut sau content invalid","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"401":{"description":"Token lipsă sau invalid","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Domeniul nu îți aparține","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"500":{"description":"Eroare internă","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/sites/drafts/by-domain/{domainId}":{"get":{"tags":["Sites"],"summary":"Citește draftul pentru un domeniu","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"domainId","in":"path"}],"responses":{"200":{"description":"Draftul curent","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"domainId":{"type":"string"},"templateRef":{"type":"string"},"content":{"nullable":true},"status":{"type":"string","enum":["draft","queued","completed","failed"]},"channelId":{"type":"string","nullable":true},"failureReason":{"type":"string","nullable":true},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","domainId","templateRef","status","channelId","failureReason","createdAt","updatedAt"]}}}},"401":{"description":"Token lipsă sau invalid","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Niciun draft pentru acel domeniu","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/sites/drafts/{draftId}":{"get":{"tags":["Sites"],"summary":"Citește un draft după id","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"draftId","in":"path"}],"responses":{"200":{"description":"Draftul","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"domainId":{"type":"string"},"templateRef":{"type":"string"},"content":{"nullable":true},"status":{"type":"string","enum":["draft","queued","completed","failed"]},"channelId":{"type":"string","nullable":true},"failureReason":{"type":"string","nullable":true},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","domainId","templateRef","status","channelId","failureReason","createdAt","updatedAt"]}}}},"401":{"description":"Token lipsă sau invalid","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"403":{"description":"Draftul nu îți aparține","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Draft inexistent","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/assistant/chat":{"post":{"tags":["Assistant"],"summary":"Trimite un mesaj asistentului AI și primește răspunsul","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"messages":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["user","assistant"]},"content":{"type":"string","minLength":1,"maxLength":4000}},"required":["role","content"]},"minItems":1,"maxItems":20}},"required":["messages"]}}}},"responses":{"200":{"description":"Răspunsul asistentului. `configured: false` când cheia Anthropic lipsește.","content":{"application/json":{"schema":{"type":"object","properties":{"reply":{"type":"string"},"configured":{"type":"boolean"}},"required":["reply","configured"]}}}}}}},"/admin/stats":{"get":{"tags":["Admin"],"summary":"Statistici agregate: utilizatori, domenii, abonamente, MRR","responses":{"200":{"description":"Statistici admin","content":{"application/json":{"schema":{"type":"object","properties":{"totalUsers":{"type":"number"},"totalActiveDomains":{"type":"number"},"totalActiveSubscriptions":{"type":"number"},"mrrEstimate":{"type":"number"},"mrr":{"type":"number"},"mrrSource":{"type":"string","enum":["stripe","estimate"]}},"required":["totalUsers","totalActiveDomains","totalActiveSubscriptions","mrrEstimate","mrr","mrrSource"]}}}}}}},"/admin/activity":{"get":{"tags":["Admin"],"summary":"Activitate recentă (audit_events filtrate la tipuri admin-relevante)","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"since","in":"query"}],"responses":{"200":{"description":"Activitate recentă","content":{"application/json":{"schema":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"eventType":{"type":"string"},"description":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","eventType","description","createdAt"]}}},"required":["events"]}}}}}}},"/admin/bank-transfers":{"get":{"tags":["Admin - Bank Transfer"],"summary":"Listează facturile cu plată prin transfer bancar","parameters":[{"schema":{"type":"string","enum":["open","paid","cancelled"],"default":"open"},"required":false,"name":"tab","in":"query"}],"responses":{"200":{"description":"Lista de facturi cu plată prin transfer bancar","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"invoiceId":{"type":"string"},"subscriptionId":{"type":"string"},"customerName":{"type":"string"},"cifOrCnp":{"type":"string"},"amountRon":{"type":"number"},"proformaNumber":{"type":"string","nullable":true},"daysOpen":{"type":"number"},"hostedInvoiceUrl":{"type":"string","nullable":true}},"required":["invoiceId","subscriptionId","customerName","cifOrCnp","amountRon","proformaNumber","daysOpen","hostedInvoiceUrl"]}}},"required":["rows"]}}}},"403":{"description":"Funcționalitate dezactivată","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"502":{"description":"Eroare la Stripe","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"503":{"description":"Stripe neconfigurat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/bank-transfers/{invoiceId}/mark-paid":{"post":{"tags":["Admin - Bank Transfer"],"summary":"Marchează o factură ca plătită prin transfer bancar","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"invoiceId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"paymentDate":{"type":"string","minLength":1},"paymentReference":{"type":"string","minLength":1},"note":{"type":"string"}},"required":["paymentDate","paymentReference"]}}}},"responses":{"200":{"description":"Marcat ca plătit, job fiscal enqueued","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"]}}}},"403":{"description":"Funcționalitate dezactivată","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"409":{"description":"Factura este deja plătită","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"502":{"description":"Eroare la Stripe","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"503":{"description":"Stripe neconfigurat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/bank-transfers/{invoiceId}/cancel":{"post":{"operationId":"admin_bank_transfer_cancel","tags":["Admin - Bank Transfer"],"summary":"Anulează o factură cu plată prin transfer bancar","x-mcp-title":"Cancel bank-transfer invoice","x-mcp-description":"Cancel a bank-transfer invoice and the underlying subscription (admin). Voids the Stripe invoice, cancels the Stripe subscription, cancels the SmartBill proforma if any, and enqueues the cancellation email.","x-mcp-requires-auth":true,"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"invoiceId","in":"path"}],"responses":{"200":{"description":"Factura anulată","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"]}}}},"403":{"description":"Funcționalitate dezactivată","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"502":{"description":"Eroare la Stripe","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"503":{"description":"Stripe neconfigurat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/bank-transfers/{invoiceId}/send-reminder-now":{"post":{"operationId":"admin_bank_transfer_send_reminder","tags":["Admin - Bank Transfer"],"summary":"Trimite imediat un email de reminder pentru o factură","x-mcp-title":"Send bank-transfer reminder now","x-mcp-description":"Send a reminder email for a bank-transfer invoice immediately (admin). Enqueues the send-bank-transfer-reminder job with tier=manual.","x-mcp-requires-auth":true,"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"invoiceId","in":"path"}],"responses":{"200":{"description":"Reminder enqueued","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"]}}}},"403":{"description":"Funcționalitate dezactivată","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"502":{"description":"Eroare la Stripe","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"503":{"description":"Stripe neconfigurat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/health":{"get":{"tags":["Admin"],"summary":"Probes provider conectivitate (DB, cyberFolks, Stripe, Postmark, etc.)","responses":{"200":{"description":"Status servicii","content":{"application/json":{"schema":{"type":"object","properties":{"services":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"status":{"type":"string","enum":["healthy","down","not_configured"]},"latencyMs":{"type":"integer","nullable":true},"error":{"type":"string","nullable":true}},"required":["name","status","latencyMs","error"]}}},"required":["services"]}}}}}}},"/admin/channels":{"get":{"tags":["Admin - Canale"],"summary":"Listează toate canalele","responses":{"200":{"description":"Lista de canale","content":{"application/json":{"schema":{"type":"object","properties":{"channels":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"},"deploymentMode":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","slug","name","status","deploymentMode","createdAt","updatedAt"]}}},"required":["channels"]}}}}}},"post":{"tags":["Admin - Canale"],"summary":"Creează un canal nou","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"slug":{"type":"string","minLength":1,"pattern":"^[a-z0-9-]+$"},"databaseUrl":{"type":"string","minLength":1},"deploymentMode":{"type":"string","enum":["shared","dedicated"]}},"required":["name","slug","databaseUrl","deploymentMode"]}}}},"responses":{"201":{"description":"Canal creat cu succes","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"},"deploymentMode":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","slug","name","status","deploymentMode","createdAt"]}}}},"409":{"description":"Slug-ul canalului există deja","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"500":{"description":"Eroare internă la crearea canalului","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/clients":{"get":{"tags":["Admin - Clienți"],"summary":"Listează utilizatorii cu numărul de domenii și statusul abonamentului","parameters":[{"schema":{"type":"string"},"required":false,"name":"search","in":"query"},{"schema":{"type":"integer","minimum":1,"default":1},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Lista de clienți","content":{"application/json":{"schema":{"type":"object","properties":{"clients":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true},"createdAt":{"type":"string"},"domainCount":{"type":"number"},"subscriptionStatus":{"type":"string","nullable":true},"subscriptionPlan":{"type":"string","nullable":true}},"required":["id","email","name","phone","createdAt","domainCount","subscriptionStatus","subscriptionPlan"]}},"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"}},"required":["clients","total","page","limit"]}}}}}}},"/admin/clients/:id":{"get":{"tags":["Admin - Clienți"],"summary":"Detalii client cu domeniile și abonamentele asociate","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Detalii client","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true},"googleId":{"type":"string","nullable":true},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"domains":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","name","status","createdAt"]}},"subscriptions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"plan":{"type":"string"},"stripeCustomerId":{"type":"string"},"currentPeriodStart":{"type":"string","nullable":true},"currentPeriodEnd":{"type":"string","nullable":true},"createdAt":{"type":"string"}},"required":["id","status","plan","stripeCustomerId","currentPeriodStart","currentPeriodEnd","createdAt"]}}},"required":["id","email","name","phone","googleId","createdAt","updatedAt","domains","subscriptions"]}}}},"404":{"description":"Client negăsit","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/cloudflare/zones":{"get":{"tags":["Admin - Cloudflare"],"summary":"Listează toate zonele DNS din Cloudflare pentru canalul curent","responses":{"200":{"description":"Lista zonelor Cloudflare","content":{"application/json":{"schema":{"type":"object","properties":{"zones":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"},"nameServers":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","nullable":true},"modifiedAt":{"type":"string","nullable":true}},"required":["id","name","status","nameServers","createdAt","modifiedAt"]}}},"required":["zones"]}}}},"502":{"description":"Eroare la apelul către Cloudflare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"503":{"description":"Integrarea Cloudflare nu este activă pentru acest canal","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/cloudflare/zones/:id":{"get":{"tags":["Admin - Cloudflare"],"summary":"Detaliile unei zone Cloudflare + înregistrările DNS","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Detalii zonă","content":{"application/json":{"schema":{"type":"object","properties":{"zone":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"},"nameServers":{"type":"array","items":{"type":"string"}},"originalNameServers":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","nullable":true},"modifiedAt":{"type":"string","nullable":true}},"required":["id","name","status","nameServers","originalNameServers","createdAt","modifiedAt"]},"dnsRecords":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string"},"name":{"type":"string"},"content":{"type":"string"},"ttl":{"type":"number"},"priority":{"type":"number","nullable":true},"proxied":{"type":"boolean","nullable":true}},"required":["id","type","name","content","ttl","priority","proxied"]}}},"required":["zone","dnsRecords"]}}}},"502":{"description":"Eroare la apelul către Cloudflare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"503":{"description":"Integrarea Cloudflare nu este activă pentru acest canal","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/cloudflare/zones/import":{"post":{"tags":["Admin - Cloudflare"],"summary":"Importă un domeniu existent în Cloudflare cu toate înregistrările DNS","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","minLength":1}},"required":["domain"]}}}},"responses":{"200":{"description":"Zona a fost creată și înregistrările DNS au fost copiate","content":{"application/json":{"schema":{"type":"object","properties":{"zoneId":{"type":"string"},"zoneName":{"type":"string"},"cfNameServers":{"type":"array","items":{"type":"string"}},"originalNameServers":{"type":"array","items":{"type":"string"}},"importedRecords":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string"},"name":{"type":"string"},"content":{"type":"string"},"ttl":{"type":"number"},"priority":{"type":"number","nullable":true},"proxied":{"type":"boolean","nullable":true}},"required":["id","type","name","content","ttl","priority","proxied"]}},"rollbackBatchId":{"type":"string"},"warnings":{"type":"array","items":{"type":"string"}}},"required":["zoneId","zoneName","cfNameServers","originalNameServers","importedRecords","rollbackBatchId","warnings"]}}}},"400":{"description":"Domeniu invalid","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"401":{"description":"Neautentificat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"409":{"description":"Zona există deja în contul Cloudflare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"502":{"description":"Eroare la apelul provider Cloudflare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"503":{"description":"Integrarea Cloudflare nu este activă pentru acest canal","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/cloudflare/integration":{"put":{"operationId":"enable_cloudflare_integration","tags":["Admin - Cloudflare"],"summary":"Activează integrarea Cloudflare (apiToken, accountId, live=true)","x-mcp-title":"Enable Cloudflare integration","x-mcp-description":"Persist Cloudflare API token + account ID and flip providers.cloudflare.live=true so the live HTTP client takes over from the mock.","x-mcp-requires-auth":true,"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"apiToken":{"type":"string","minLength":1,"description":"Cloudflare API token (Zone:Edit + Account:Read)"},"accountId":{"type":"string","minLength":1,"description":"Cloudflare account ID"}},"required":["apiToken","accountId"]}}}},"responses":{"200":{"description":"Integrare activată","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}},"required":["ok"]}}}}}}},"/admin/impersonate/:userId":{"post":{"tags":["Admin"],"summary":"Generează un token temporar pentru utilizatorul specificat (suport)","parameters":[{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"responses":{"200":{"description":"Token de impersonare generat","content":{"application/json":{"schema":{"type":"object","properties":{"accessToken":{"type":"string"},"expiresIn":{"type":"number"},"targetUser":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"}},"required":["id","email"]}},"required":["accessToken","expiresIn","targetUser"]}}}},"404":{"description":"Utilizator negăsit","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/config-registry":{"get":{"operationId":"get_config_registry","tags":["Admin - Configurare"],"summary":"Returnează schema (metadata) tuturor cheilor de configurare","x-mcp-title":"Get config registry","x-mcp-description":"Returns the typed registry of all known config keys (label, type, encryption, grouping). Used by the admin UI to render the right input control per field.","x-mcp-requires-auth":true,"responses":{"200":{"description":"Schema cheilor de configurare","content":{"application/json":{"schema":{"type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"section":{"type":"string"},"subsection":{"type":"string"},"encrypted":{"type":"boolean"},"label":{"type":"string"},"hint":{"type":"string"},"envVar":{"type":"string"},"fieldType":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["string"]}},"required":["kind"]},{"type":"object","properties":{"kind":{"type":"string","enum":["boolean"]}},"required":["kind"]},{"type":"object","properties":{"kind":{"type":"string","enum":["number"]}},"required":["kind"]},{"type":"object","properties":{"kind":{"type":"string","enum":["string-enum"]},"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"label":{"type":"string"}},"required":["value","label"]}}},"required":["kind","options"]},{"type":"object","properties":{"kind":{"type":"string","enum":["number-enum"]},"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"number"},"label":{"type":"string"}},"required":["value","label"]}}},"required":["kind","options"]}]}},"required":["key","section","encrypted","label","fieldType"]}},"sections":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"slug":{"type":"string"},"label":{"type":"string"},"icon":{"type":"string"}},"required":["key","slug","label","icon"]}},"subsectionLabels":{"type":"object","additionalProperties":{"type":"string"}}},"required":["entries","sections","subsectionLabels"]}}}}}}},"/admin/configs":{"get":{"operationId":"list_configs","tags":["Admin - Configurare"],"summary":"Listează configurările globale","x-mcp-title":"List global configs","x-mcp-description":"List all global platform configurations. Encrypted values are masked with ***. Requires admin role.","x-mcp-requires-auth":true,"responses":{"200":{"description":"Lista configurărilor globale","content":{"application/json":{"schema":{"type":"object","properties":{"configs":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"value":{"nullable":true},"encrypted":{"type":"boolean","nullable":true},"updatedAt":{"type":"string","nullable":true}},"required":["key","encrypted","updatedAt"]}}},"required":["configs"]}}}}}},"put":{"operationId":"set_config","tags":["Admin - Configurare"],"summary":"Setează o configurare","x-mcp-title":"Set config value","x-mcp-description":"Set or update a configuration key. Sensitive values are encrypted automatically. Scope: global or channel. Requires admin role.","x-mcp-requires-auth":true,"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string","description":"Dotted config key, e.g. providers.cloudflare.apiToken"},"value":{"type":"string","description":"The value to set"},"scope":{"type":"string","enum":["global","channel"],"description":"global or channel scope"},"channelId":{"type":"string","description":"Channel ID when scope is channel"}},"required":["key","value","scope"]}}}},"responses":{"200":{"description":"Configurare salvată","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}},"required":["ok"]}}}},"404":{"description":"Canalul nu a fost găsit","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"500":{"description":"Eroare internă","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}},"delete":{"operationId":"delete_config","tags":["Admin - Configurare"],"summary":"Șterge o configurare","x-mcp-title":"Delete config","x-mcp-description":"Delete a configuration key by key + scope + channelId. Requires admin role.","x-mcp-requires-auth":true,"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string","description":"Dotted config key to delete"},"scope":{"type":"string","enum":["global","channel"],"description":"global or channel scope"},"channelId":{"type":"string","description":"Channel ID when scope is channel"}},"required":["key","scope"]}}}},"responses":{"200":{"description":"Configurare ștearsă","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}},"required":["ok"]}}}}}}},"/admin/configs/channel/{channelId}":{"get":{"operationId":"list_channel_configs","tags":["Admin - Configurare"],"summary":"Listează configurările unui canal","x-mcp-title":"List channel configs","x-mcp-description":"List channel-specific configuration overrides. channelId is in path. Requires admin role.","x-mcp-requires-auth":true,"parameters":[{"schema":{"type":"string"},"required":true,"name":"channelId","in":"path"}],"responses":{"200":{"description":"Lista configurărilor canalului","content":{"application/json":{"schema":{"type":"object","properties":{"configs":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"value":{"nullable":true},"encrypted":{"type":"boolean","nullable":true},"updatedAt":{"type":"string","nullable":true}},"required":["key","encrypted","updatedAt"]}}},"required":["configs"]}}}}}}},"/admin/discount-codes":{"get":{"tags":["Admin"],"summary":"Listează codurile de reducere","responses":{"200":{"description":"Lista codurilor","content":{"application/json":{"schema":{"type":"object","properties":{"codes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"},"kind":{"type":"string","enum":["percent","amount"]},"value":{"type":"integer"},"currency":{"type":"string","nullable":true},"appliesTo":{"type":"string","enum":["monthly","annual","both"]},"maxUses":{"type":"integer","nullable":true},"usedCount":{"type":"integer"},"perUserLimit":{"type":"integer","nullable":true},"expiresAt":{"type":"string","nullable":true},"active":{"type":"boolean"},"createdAt":{"type":"string"}},"required":["id","code","kind","value","currency","appliesTo","maxUses","usedCount","perUserLimit","expiresAt","active","createdAt"]}}},"required":["codes"]}}}}}},"post":{"tags":["Admin"],"summary":"Creează un cod de reducere","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","minLength":2,"maxLength":64},"kind":{"type":"string","enum":["percent","amount"]},"value":{"type":"integer","minimum":1},"currency":{"type":"string","minLength":1,"maxLength":8},"appliesTo":{"type":"string","enum":["monthly","annual","both"],"default":"both"},"maxUses":{"type":"integer","minimum":1},"perUserLimit":{"type":"integer","minimum":1},"expiresAt":{"type":"string","format":"date-time"}},"required":["code","kind","value"]}}}},"responses":{"201":{"description":"Cod creat","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"}},"required":["id","code"]}}}},"409":{"description":"Cod deja existent","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/discount-codes/{id}":{"patch":{"tags":["Admin"],"summary":"Editează un cod de reducere (fără code / kind)","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"integer","minimum":1},"maxUses":{"type":"integer","nullable":true,"minimum":1},"perUserLimit":{"type":"integer","nullable":true,"minimum":1},"expiresAt":{"type":"string","nullable":true,"format":"date-time"},"appliesTo":{"type":"string","enum":["monthly","annual","both"]}}}}}},"responses":{"200":{"description":"Cod actualizat","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"]}}}},"404":{"description":"Cod inexistent","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/discount-codes/{id}/archive":{"post":{"tags":["Admin"],"summary":"Arhivează (dezactivează) un cod de reducere","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Cod arhivat","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"]}}}},"404":{"description":"Cod inexistent","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/postmark/signatures":{"get":{"tags":["Admin - Postmark"],"summary":"Listează semnăturile de expeditor Postmark","responses":{"200":{"description":"Lista de semnături","content":{"application/json":{"schema":{"type":"object","properties":{"signatures":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"email":{"type":"string"},"name":{"type":"string"},"replyToEmail":{"type":"string"},"domain":{"type":"string"},"confirmed":{"type":"boolean"}},"required":["id","email","name","replyToEmail","domain","confirmed"]}}},"required":["signatures"]}}}},"502":{"description":"Eroare la apelul către Postmark","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}},"post":{"tags":["Admin - Postmark"],"summary":"Adaugă o semnătură de expeditor Postmark","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"fromEmail":{"type":"string","format":"email"},"name":{"type":"string","minLength":1},"replyToEmail":{"type":"string","format":"email"},"returnPathDomain":{"type":"string","minLength":1},"confirmationPersonalNote":{"type":"string","maxLength":400}},"required":["fromEmail","name"]}}}},"responses":{"201":{"description":"Semnătură creată — Postmark va trimite un email de confirmare","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"number"},"email":{"type":"string"},"name":{"type":"string"},"replyToEmail":{"type":"string"},"domain":{"type":"string"},"confirmed":{"type":"boolean"},"spfVerified":{"type":"boolean"},"dkimVerified":{"type":"boolean"},"weakDkim":{"type":"boolean"},"dkimUpdateStatus":{"type":"string"},"returnPathDomain":{"type":"string"},"returnPathDomainVerified":{"type":"boolean"}},"required":["id","email","name","replyToEmail","domain","confirmed","spfVerified","dkimVerified","weakDkim","dkimUpdateStatus","returnPathDomain","returnPathDomainVerified"]}}}},"502":{"description":"Eroare la apelul către Postmark","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/postmark/domains":{"get":{"tags":["Admin - Postmark"],"summary":"Listează domeniile Postmark verificate la nivel DKIM","responses":{"200":{"description":"Lista de domenii","content":{"application/json":{"schema":{"type":"object","properties":{"domains":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"},"spfVerified":{"type":"boolean"},"dkimVerified":{"type":"boolean"},"weakDkim":{"type":"boolean"},"returnPathDomainVerified":{"type":"boolean"}},"required":["id","name","spfVerified","dkimVerified","weakDkim","returnPathDomainVerified"]}}},"required":["domains"]}}}},"502":{"description":"Eroare la apelul către Postmark","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}},"post":{"tags":["Admin - Postmark"],"summary":"Adaugă un domeniu Postmark — răspunsul include înregistrările DKIM de publicat","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":3,"pattern":"^[a-z0-9.-]+$/i"},"returnPathDomain":{"type":"string","minLength":3}},"required":["name"]}}}},"responses":{"201":{"description":"Domeniu creat — publică DKIM TXT în DNS și apoi declanșează verificarea","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"},"spfVerified":{"type":"boolean"},"dkimVerified":{"type":"boolean"},"weakDkim":{"type":"boolean"},"returnPathDomainVerified":{"type":"boolean"},"dkimHost":{"type":"string"},"dkimTextValue":{"type":"string"},"dkimPendingHost":{"type":"string"},"dkimPendingTextValue":{"type":"string"},"dkimUpdateStatus":{"type":"string"},"returnPathDomain":{"type":"string"},"returnPathDomainCnameValue":{"type":"string"}},"required":["id","name","spfVerified","dkimVerified","weakDkim","returnPathDomainVerified","dkimHost","dkimTextValue","dkimPendingHost","dkimPendingTextValue","dkimUpdateStatus","returnPathDomain","returnPathDomainCnameValue"]}}}},"502":{"description":"Eroare la apelul către Postmark","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/postmark/domains/{id}":{"get":{"tags":["Admin - Postmark"],"summary":"Detalii domeniu Postmark — include înregistrările DKIM și Return-Path pentru DNS","parameters":[{"schema":{"type":"string","pattern":"^\\d+$"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Detalii domeniu","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"},"spfVerified":{"type":"boolean"},"dkimVerified":{"type":"boolean"},"weakDkim":{"type":"boolean"},"returnPathDomainVerified":{"type":"boolean"},"dkimHost":{"type":"string"},"dkimTextValue":{"type":"string"},"dkimPendingHost":{"type":"string"},"dkimPendingTextValue":{"type":"string"},"dkimUpdateStatus":{"type":"string"},"returnPathDomain":{"type":"string"},"returnPathDomainCnameValue":{"type":"string"}},"required":["id","name","spfVerified","dkimVerified","weakDkim","returnPathDomainVerified","dkimHost","dkimTextValue","dkimPendingHost","dkimPendingTextValue","dkimUpdateStatus","returnPathDomain","returnPathDomainCnameValue"]}}}},"502":{"description":"Eroare la apelul către Postmark","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/postmark/domains/{id}/verify":{"post":{"tags":["Admin - Postmark"],"summary":"Declanșează verificarea DNS pentru DKIM sau Return-Path","parameters":[{"schema":{"type":"string","pattern":"^\\d+$"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"target":{"type":"string","enum":["dkim","return-path"]}},"required":["target"]}}}},"responses":{"200":{"description":"Verificare declanșată — răspunsul include starea actuală","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"},"spfVerified":{"type":"boolean"},"dkimVerified":{"type":"boolean"},"weakDkim":{"type":"boolean"},"returnPathDomainVerified":{"type":"boolean"},"dkimHost":{"type":"string"},"dkimTextValue":{"type":"string"},"dkimPendingHost":{"type":"string"},"dkimPendingTextValue":{"type":"string"},"dkimUpdateStatus":{"type":"string"},"returnPathDomain":{"type":"string"},"returnPathDomainCnameValue":{"type":"string"}},"required":["id","name","spfVerified","dkimVerified","weakDkim","returnPathDomainVerified","dkimHost","dkimTextValue","dkimPendingHost","dkimPendingTextValue","dkimUpdateStatus","returnPathDomain","returnPathDomainCnameValue"]}}}},"502":{"description":"Eroare la apelul către Postmark","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/postmark/domains/{id}/publish-cloudflare":{"post":{"tags":["Admin - Postmark"],"summary":"Publică DKIM TXT + Return-Path CNAME în zona Cloudflare corespunzătoare","parameters":[{"schema":{"type":"string","pattern":"^\\d+$"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Înregistrările au fost publicate (sau erau deja prezente)","content":{"application/json":{"schema":{"type":"object","properties":{"zone":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"]},"dkim":{"type":"object","properties":{"status":{"type":"string","enum":["published","exists","skipped","failed"]},"host":{"type":"string"},"message":{"type":"string"}},"required":["status","host"]},"returnPath":{"type":"object","properties":{"status":{"type":"string","enum":["published","exists","skipped","failed"]},"host":{"type":"string"},"message":{"type":"string"}},"required":["status","host"]}},"required":["zone","dkim","returnPath"]}}}},"404":{"description":"Nicio zonă Cloudflare nu se potrivește cu domeniul","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"502":{"description":"Eroare la apelul către Postmark sau Cloudflare","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/registrar-domains":{"get":{"tags":["Admin - Registrar"],"summary":"Listează toate domeniile pe care le deținem la registrar (cyberFolks)","responses":{"200":{"description":"Inventarul de domenii la registrar","content":{"application/json":{"schema":{"type":"object","properties":{"domains":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"registrar":{"type":"string","enum":["cyberfolks"]},"status":{"type":"string","enum":["active","expired","cancelled","pending_transfer"]},"source":{"type":"string","enum":["imported","siteman"]},"registeredAt":{"type":"string","nullable":true},"expiresAt":{"type":"string","nullable":true},"autoRenew":{"type":"boolean"},"registrarOrderId":{"type":"string","nullable":true},"domainId":{"type":"string","nullable":true},"notes":{"type":"string","nullable":true},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","registrar","status","source","registeredAt","expiresAt","autoRenew","registrarOrderId","domainId","notes","createdAt","updatedAt"]}},"cyberfolksMockMode":{"type":"boolean"}},"required":["domains","cyberfolksMockMode"]}}}}}}},"/admin/registrar-domains/{domain}":{"get":{"tags":["Admin - Registrar"],"summary":"Detalii cyberFolks pentru un domeniu (NS, contact, lock, DNS, email forwarding)","parameters":[{"schema":{"type":"string","minLength":3,"example":"auzit.ro"},"required":true,"name":"domain","in":"path"}],"responses":{"200":{"description":"Detaliile domeniului de la cyberFolks","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"sld":{"type":"string"},"tld":{"type":"string"},"mockMode":{"type":"boolean"},"nameservers":{"type":"object","properties":{"ok":{"type":"boolean"},"values":{"type":"array","items":{"type":"string"}},"error":{"type":"string"}},"required":["ok","values"]},"contact":{"type":"object","properties":{"ok":{"type":"boolean"},"registrant":{"type":"object","nullable":true,"properties":{"name":{"type":"string","nullable":true},"company":{"type":"string","nullable":true},"address":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"zipCode":{"type":"string","nullable":true},"email":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true}},"required":["name","company","address","city","country","zipCode","email","phone"]},"error":{"type":"string"}},"required":["ok","registrant"]},"locking":{"type":"object","properties":{"ok":{"type":"boolean"},"locked":{"type":"boolean","nullable":true},"raw":{"type":"string","nullable":true},"error":{"type":"string"}},"required":["ok","locked","raw"]},"dns":{"type":"object","properties":{"ok":{"type":"boolean"},"records":{"type":"array","items":{"type":"object","properties":{"hostname":{"type":"string"},"type":{"type":"string"},"address":{"type":"string"},"priority":{"type":"string","nullable":true}},"required":["hostname","type","address","priority"]}},"error":{"type":"string"}},"required":["ok","records"]},"emailForwarding":{"type":"object","properties":{"ok":{"type":"boolean"},"records":{"type":"array","items":{"type":"object","properties":{"prefix":{"type":"string"},"forwardto":{"type":"string"}},"required":["prefix","forwardto"]}},"error":{"type":"string"}},"required":["ok","records"]}},"required":["name","sld","tld","mockMode","nameservers","contact","locking","dns","emailForwarding"]}}}},"404":{"description":"Domeniul nu există în inventar","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/registrar-domains/check-availability":{"post":{"tags":["Admin - Registrar"],"summary":"Verifică live (fără cache) disponibilitatea unui domeniu la cyberFolks","x-mcp-title":"Check domain availability (admin, fresh)","x-mcp-description":"Live cyberFolks availability check for a .ro domain. Bypasses the domain_availability cache.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","minLength":1}},"required":["query"]}}}},"responses":{"200":{"description":"Rezultat live","content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"available":{"type":"boolean"},"checkedAt":{"type":"string"},"durationMs":{"type":"number"},"mock":{"type":"boolean"}},"required":["domain","available","checkedAt","durationMs","mock"]}}}},"400":{"description":"Input invalid sau cyberFolks indisponibil","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/registrar-domains/register-defaults":{"get":{"tags":["Admin - Registrar"],"summary":"Prefill pentru formularul de înregistrare domeniu (din legalEntity)","x-mcp-title":"Get registrant defaults (admin)","x-mcp-description":"Returns prefilled registrant contact for the admin domain-registration form. Company fields from the brand's legal entity; personal fields blank.","responses":{"200":{"description":"Defaults pentru formular","content":{"application/json":{"schema":{"type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string"},"phone":{"type":"string"},"company":{"type":"string"},"fiscalCode":{"type":"string"},"address":{"type":"string"},"city":{"type":"string"},"county":{"type":"string"},"postalCode":{"type":"string"}},"required":["firstName","lastName","email","phone","company","fiscalCode","address","city","county","postalCode"]}}}}}}},"/admin/registrar-domains/register":{"post":{"tags":["Admin - Registrar"],"summary":"Înregistrează un .ro pentru inventarul siteman (ops, fără client)","x-mcp-title":"Register .ro for inventory (admin)","x-mcp-description":"Buys a .ro domain at cyberFolks and stores it in the registrar_domains inventory. No end-user, no Domain row, no Cloudflare zone. Source=siteman.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"sld":{"type":"string","minLength":1},"contact":{"type":"object","properties":{"firstName":{"type":"string","minLength":1},"lastName":{"type":"string","minLength":1},"email":{"type":"string","format":"email"},"phone":{"type":"string","minLength":10},"company":{"type":"string"},"fiscalCode":{"type":"string","minLength":1},"address":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"county":{"type":"string","minLength":1},"postalCode":{"type":"string","minLength":1}},"required":["firstName","lastName","email","phone","fiscalCode","address","city","county","postalCode"]}},"required":["sld","contact"]}}}},"responses":{"201":{"description":"Domeniu înregistrat și adăugat în inventar","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"registeredAt":{"type":"string"},"expiresAt":{"type":"string"}},"required":["id","name","registeredAt","expiresAt"]}}}},"400":{"description":"Input invalid sau cyberFolks a refuzat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"409":{"description":"Domeniul este deja în inventarul nostru","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/registrar-domains/update-nameservers":{"post":{"tags":["Admin - Registrar"],"summary":"Actualizează nameserverele unui domeniu .ro la cyberFolks","x-mcp-title":"Update nameservers for inventory .ro (admin)","x-mcp-description":"Replaces the registrar-side NS records for a .ro in the siteman inventory. Reads current NS first and records a rollback row capturing before/after so the change can be reverted later. Validates that nameservers look like FQDNs but does NOT resolve them — cyberFolks does its own server-side validation.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","minLength":3,"example":"auzit.ro"},"nameservers":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":5,"example":["ns1.cloudflare.com","ns2.cloudflare.com"]},"reason":{"type":"string","maxLength":500,"example":"Migrare la Cloudflare DNS pentru clientul X"}},"required":["domain","nameservers"]}}}},"responses":{"200":{"description":"Nameservere actualizate; rollback înregistrat","content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"priorNameservers":{"type":"array","items":{"type":"string"}},"nextNameservers":{"type":"array","items":{"type":"string"}},"rollbackId":{"type":"string"},"mock":{"type":"boolean"}},"required":["domain","priorNameservers","nextNameservers","rollbackId","mock"]}}}},"400":{"description":"Input invalid sau cyberFolks a refuzat actualizarea","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Domeniul nu este în inventarul nostru","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/tld-pricing":{"get":{"tags":["Admin - Registrar"],"summary":"Prețuri TLD sincronizate din cyberFolks (cache local, populat de cron sync-tld-pricing)","responses":{"200":{"description":"Lista prețurilor per TLD","content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"tld":{"type":"string"},"registrationPrice":{"type":"string"},"renewalPrice":{"type":"string"},"transferPrice":{"type":"string"},"graceDays":{"type":"integer"},"graceFee":{"type":"string"},"redemptionDays":{"type":"integer"},"redemptionFee":{"type":"string"},"currencyCode":{"type":"string"},"years":{"type":"array","nullable":true,"items":{"type":"object","properties":{"year":{"type":"number"},"price":{"type":"number"}},"required":["year","price"]}},"syncedAt":{"type":"string"}},"required":["tld","registrationPrice","renewalPrice","transferPrice","graceDays","graceFee","redemptionDays","redemptionFee","currencyCode","years","syncedAt"]}},"empty":{"type":"boolean"}},"required":["rows","empty"]}}}}}}},"/admin/sherweb/customers":{"get":{"tags":["Admin - Sherweb"],"summary":"Listează organizațiile (clienții) din contul Sherweb","responses":{"200":{"description":"Lista organizațiilor Sherweb","content":{"application/json":{"schema":{"type":"object","properties":{"customers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"displayName":{"type":"string"},"path":{"type":"array","items":{"type":"string"}},"suspendedOn":{"type":"string","nullable":true},"customerCompanyInformation":{"type":"object","nullable":true,"properties":{"primaryContactFirstName":{"type":"string","nullable":true},"primaryContactLastName":{"type":"string","nullable":true},"primaryContactCulture":{"type":"string","nullable":true},"address":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"region":{"type":"string","nullable":true},"postalCode":{"type":"string","nullable":true}}}},"required":["id","displayName","path"]}}},"required":["customers"]}}}},"502":{"description":"Eroare la apelul către Sherweb","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"503":{"description":"Integrarea Sherweb nu este configurată","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/sherweb/customers/{customerId}/subscriptions":{"get":{"tags":["Admin - Sherweb"],"summary":"Listează abonamentele unui client Sherweb","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"customerId","in":"path"}],"responses":{"200":{"description":"Lista abonamentelor","content":{"application/json":{"schema":{"type":"object","properties":{"subscriptions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"productName":{"type":"string"},"description":{"type":"string","nullable":true},"sku":{"type":"string"},"quantity":{"type":"integer","minimum":0},"renewalSettingsConfigurable":{"type":"boolean"},"purchaseDate":{"type":"string","nullable":true},"estStatus":{"type":"string","nullable":true}},"required":["id","productName","sku","quantity"]}}},"required":["subscriptions"]}}}},"502":{"description":"Eroare la apelul către Sherweb","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"503":{"description":"Integrarea Sherweb nu este configurată","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/sherweb/customers/{customerId}/subscriptions/{subscriptionId}/amend":{"post":{"tags":["Admin - Sherweb"],"summary":"Modifică numărul de seat-uri pentru un abonament Sherweb","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"customerId","in":"path"},{"schema":{"type":"string","minLength":1},"required":true,"name":"subscriptionId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"newQuantity":{"type":"integer","minimum":1,"maximum":1000}},"required":["newQuantity"]}}}},"responses":{"200":{"description":"Modificare acceptată de Sherweb","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"]}}}},"502":{"description":"Eroare la apelul către Sherweb","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"503":{"description":"Integrarea Sherweb nu este configurată","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/railway/web-domains":{"get":{"tags":["Admin - Railway"],"summary":"Listează domeniile configurate în Railway pentru serviciul web","responses":{"200":{"description":"Lista domeniilor","content":{"application/json":{"schema":{"type":"object","properties":{"serviceName":{"type":"string"},"domains":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"domain":{"type":"string"},"kind":{"type":"string","enum":["custom","service"]},"createdAt":{"type":"string","nullable":true},"status":{"type":"string","nullable":true},"certStatus":{"type":"string","enum":["validating","issuing","valid","failed","unknown"]},"certError":{"type":"string","nullable":true},"certRetryable":{"type":"boolean"},"cdnProvider":{"type":"string","enum":["none","cloudflare","unknown"]}},"required":["id","domain","kind","createdAt","status","certStatus","certError","certRetryable","cdnProvider"]}}},"required":["serviceName","domains"]}}}},"502":{"description":"Eroare la apelul către Railway","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"503":{"description":"Integrarea Railway nu este configurată","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/railway/domains/reattach":{"post":{"tags":["Admin - Railway"],"summary":"Re-attach a Railway custom domain + re-sync Cloudflare DNS","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","minLength":1}},"required":["domain"]}}}},"responses":{"200":{"description":"Domain re-attached + DNS resynced","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"newDomainId":{"type":"string"},"batchId":{"type":"string","nullable":true},"appliedCount":{"type":"integer","minimum":0}},"required":["ok","newDomainId","batchId","appliedCount"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"404":{"description":"Domain not found on web service","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"502":{"description":"Railway or Cloudflare API error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"503":{"description":"Railway integration not configured","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/cloudflare/zones/{zoneId}/serve-via-railway/preview":{"post":{"tags":["Admin - Cloudflare"],"summary":"Calculează diff-ul DNS pentru a servi zona prin Railway (fără scriere)","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"zoneId","in":"path"}],"responses":{"200":{"description":"Plan de modificări DNS","content":{"application/json":{"schema":{"type":"object","properties":{"zoneId":{"type":"string"},"zoneName":{"type":"string"},"railwayDomainId":{"type":"string"},"planned":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"recordType":{"type":"string"},"requiredValue":{"type":"string"},"desiredProxied":{"type":"boolean"},"action":{"type":"string","enum":["create","update","noop"]},"currentValue":{"type":"string","nullable":true},"currentRecordId":{"type":"string","nullable":true},"currentProxied":{"type":"boolean","nullable":true},"conflicts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"content":{"type":"string"}},"required":["id","name","type","content"]}}},"required":["name","recordType","requiredValue","desiredProxied","action","currentValue","currentRecordId","currentProxied","conflicts"]}},"plannedZoneSettings":{"type":"array","items":{"type":"object","properties":{"settingId":{"type":"string","enum":["ssl","always_use_https"]},"currentValue":{"type":"string","nullable":true},"requiredValue":{"type":"string"},"action":{"type":"string","enum":["update","noop"]}},"required":["settingId","currentValue","requiredValue","action"]}},"hasOverwrites":{"type":"boolean"}},"required":["zoneId","zoneName","railwayDomainId","planned","plannedZoneSettings","hasOverwrites"]}}}},"502":{"description":"Eroare la apelul provider","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/cloudflare/zones/{zoneId}/serve-via-railway/apply":{"post":{"tags":["Admin - Cloudflare"],"summary":"Aplică modificările DNS pentru a servi zona prin Railway","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"zoneId","in":"path"}],"responses":{"200":{"description":"Modificări aplicate; rollback persistat","content":{"application/json":{"schema":{"type":"object","properties":{"batchId":{"type":"string"},"applied":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"recordType":{"type":"string"},"action":{"type":"string","enum":["create","update"]}},"required":["name","recordType","action"]}}},"required":["batchId","applied"]}}}},"401":{"description":"Neautentificat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"502":{"description":"Eroare la apelul provider","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/cloudflare/dns-rollbacks":{"get":{"tags":["Admin - Cloudflare"],"summary":"Listează tranșele recente de modificări DNS","responses":{"200":{"description":"Tranșe recente, cel mai nou primul","content":{"application/json":{"schema":{"type":"object","properties":{"batches":{"type":"array","items":{"type":"object","properties":{"batchId":{"type":"string"},"zoneName":{"type":"string"},"reason":{"type":"string"},"createdAt":{"type":"string"},"rolledBackAt":{"type":"string","nullable":true},"entryCount":{"type":"integer","minimum":0}},"required":["batchId","zoneName","reason","createdAt","rolledBackAt","entryCount"]}}},"required":["batches"]}}}},"502":{"description":"Eroare la apelul provider","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/cloudflare/dns-rollbacks/{batchId}/apply":{"post":{"tags":["Admin - Cloudflare"],"summary":"Revertă o tranșă de modificări DNS","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"batchId","in":"path"}],"responses":{"200":{"description":"Rollback aplicat","content":{"application/json":{"schema":{"type":"object","properties":{"batchId":{"type":"string"},"reverted":{"type":"integer","minimum":0}},"required":["batchId","reverted"]}}}},"502":{"description":"Eroare la apelul provider","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/marketing/overview":{"get":{"tags":["Admin"],"summary":"Sumar marketing: livrări CAPI, funnel UTM, erori","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":365,"default":30},"required":false,"name":"sinceDays","in":"query"}],"responses":{"200":{"description":"Sumar marketing pentru ultimele N zile","content":{"application/json":{"schema":{"type":"object","properties":{"configured":{"type":"object","properties":{"meta":{"type":"boolean"},"googleAds":{"type":"boolean"},"linkedin":{"type":"boolean"}},"required":["meta","googleAds","linkedin"]},"stats":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["meta","google_ads","linkedin"]},"status":{"type":"string","enum":["pending","sent","failed","skipped"]},"count":{"type":"number"}},"required":["platform","status","count"]}},"timeline":{"type":"array","items":{"type":"object","properties":{"day":{"type":"string"},"platform":{"type":"string","enum":["meta","google_ads","linkedin"]},"sent":{"type":"number"},"failed":{"type":"number"}},"required":["day","platform","sent","failed"]}},"recentDeliveries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"attributionId":{"type":"string"},"platform":{"type":"string","enum":["meta","google_ads","linkedin"]},"eventName":{"type":"string"},"eventId":{"type":"string"},"status":{"type":"string","enum":["pending","sent","failed","skipped"]},"attempts":{"type":"string"},"errorMessage":{"type":"string","nullable":true},"sentAt":{"type":"string","nullable":true},"createdAt":{"type":"string"}},"required":["id","attributionId","platform","eventName","eventId","status","attempts","errorMessage","sentAt","createdAt"]}},"recentFailures":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"platform":{"type":"string","enum":["meta","google_ads","linkedin"]},"eventName":{"type":"string"},"errorMessage":{"type":"string","nullable":true},"createdAt":{"type":"string"}},"required":["id","platform","eventName","errorMessage","createdAt"]}},"funnel":{"type":"array","items":{"type":"object","properties":{"utmSource":{"type":"string","nullable":true},"utmMedium":{"type":"string","nullable":true},"utmCampaign":{"type":"string","nullable":true},"visitors":{"type":"number"},"registrations":{"type":"number"},"purchases":{"type":"number"},"revenue":{"type":"number"}},"required":["utmSource","utmMedium","utmCampaign","visitors","registrations","purchases","revenue"]}}},"required":["configured","stats","timeline","recentDeliveries","recentFailures","funnel"]}}}}}}},"/admin/marketing/deliveries/{id}/replay":{"post":{"tags":["Admin"],"summary":"Re-trimite o conversie eșuată către platformele de marketing","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"id","in":"path"}],"responses":{"202":{"description":"Re-trimitere acceptată — re-rulează forward-conversion","content":{"application/json":{"schema":{"type":"object","properties":{"enqueued":{"type":"boolean"}},"required":["enqueued"]}}}},"404":{"description":"Livrare inexistentă","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"503":{"description":"Coada Redis nu e configurată","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/jobs":{"get":{"tags":["Admin - Jobs"],"summary":"Listează job-urile disponibile","responses":{"200":{"description":"Job list","content":{"application/json":{"schema":{"type":"object","properties":{"jobs":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"}},"required":["name","description"]}}},"required":["jobs"]}}}}}}},"/admin/jobs/:name/run":{"post":{"tags":["Admin - Jobs"],"summary":"Rulează un job manual","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"name","in":"path"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"payload":{"nullable":true}}}}}},"responses":{"200":{"description":"Job started","content":{"application/json":{"schema":{"type":"object","properties":{"executionId":{"type":"string"}},"required":["executionId"]}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/admin/jobs/:name/executions":{"get":{"tags":["Admin - Jobs"],"summary":"Listează execuțiile unui job","parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"name","in":"path"}],"responses":{"200":{"description":"Execution history","content":{"application/json":{"schema":{"type":"object","properties":{"executions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"createdAt":{"type":"string"},"error":{"type":"string","nullable":true}},"required":["id","status","createdAt","error"]}}},"required":["executions"]}}}}}}},"/events/me":{"get":{"tags":["Events"],"summary":"SSE stream — worker progress events for the signed-in user","parameters":[{"schema":{"type":"string"},"required":false,"name":"token","in":"query"}],"responses":{"200":{"description":"Event stream","content":{"text/event-stream":{"schema":{"type":"string"}}}},"401":{"description":"Missing or invalid access token","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/events/hub":{"get":{"operationId":"events_hub","tags":["Events"],"summary":"SSE stream — hub events (channel changes) for the web SSR relay","x-mcp-exclude":true,"responses":{"200":{"description":"SSE stream of hub events","content":{"text/event-stream":{"schema":{"type":"string"}}}},"401":{"description":"Missing or invalid SSE_RELAY_TOKEN / wrong UA","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/internal/config/{consumer}":{"get":{"tags":["Internal"],"summary":"Configurație pentru consumatorii interni","x-mcp-exclude":true,"parameters":[{"schema":{"type":"string","enum":["web-ssr","web-build","web-client"]},"required":true,"name":"consumer","in":"path"}],"responses":{"200":{"description":"Config for consumer","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"nullable":true}}}}},"401":{"description":"Missing/invalid INTERNAL_API_TOKEN","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code"]}}}},"503":{"description":"INTERNAL_API_TOKEN not set on this deployment","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code"]}}}}}}},"/internal/diagnostics/egress-ip":{"get":{"tags":["Internal"],"summary":"Returns the API service's outbound IP as seen by a public probe","x-mcp-exclude":true,"responses":{"200":{"description":"Egress IP discovered via public probe","content":{"application/json":{"schema":{"type":"object","properties":{"ip":{"type":"string","nullable":true},"source":{"type":"string"},"probedAt":{"type":"string"}},"required":["ip","source","probedAt"]}}}},"401":{"description":"Missing/invalid INTERNAL_API_TOKEN","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code"]}}}},"503":{"description":"INTERNAL_API_TOKEN not set on this deployment","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code"]}}}}}}},"/internal/diagnostics/cyberfolks-call":{"post":{"tags":["Internal"],"summary":"Test a cyberFolks API call (tlds/pricing) with ad-hoc or live credentials","x-mcp-exclude":true,"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"endpoint":{"type":"string","description":"Override endpoint URL. Omit to use the active hub config."},"username":{"type":"string","description":"Override username. Omit to use the active hub config."},"apiKey":{"type":"string","description":"Override API key. Omit to use the active hub config."},"mode":{"type":"string","enum":["bun-default","bun-mimic-php","curl"],"default":"bun-default","description":"bun-default = our regular cyberfolks client. bun-mimic-php = Bun fetch with PHP/Guzzle header set (Content-Type for GET, no Accept-Encoding override). curl = shell out to system curl (matches PHP+Guzzle's TLS fingerprint)."}}}}}},"responses":{"200":{"description":"Probe result (success or structured failure)","content":{"application/json":{"schema":{"type":"object","properties":{"mode":{"type":"string"},"usedCredsFromBody":{"type":"boolean"},"endpoint":{"type":"string"},"username":{"type":"string"},"httpStatus":{"type":"number"},"bodyPreview":{"type":"string"},"cloudflareChallenge":{"type":"boolean"},"apiResponseOk":{"type":"boolean"},"tldEntryCount":{"type":"number"}},"required":["mode","usedCredsFromBody","endpoint","username","httpStatus","bodyPreview","cloudflareChallenge","apiResponseOk"]}}}},"401":{"description":"Missing/invalid INTERNAL_API_TOKEN","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code"]}}}},"503":{"description":"INTERNAL_API_TOKEN not set on this deployment","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code"]}}}}}}},"/internal/cron/run/{jobName}":{"post":{"tags":["Internal"],"summary":"Trigger a registered job from a Railway cron service via API proxy","x-mcp-exclude":true,"parameters":[{"schema":{"type":"string"},"required":true,"name":"jobName","in":"path"}],"responses":{"200":{"description":"Job triggered; result reflects success or structured failure","content":{"application/json":{"schema":{"type":"object","properties":{"jobName":{"type":"string"},"ok":{"type":"boolean"},"executionId":{"type":"string"},"errorCode":{"type":"string"},"errorMessage":{"type":"string"}},"required":["jobName","ok"]}}}},"401":{"description":"Missing/invalid INTERNAL_API_TOKEN","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code"]}}}},"503":{"description":"INTERNAL_API_TOKEN not set on this deployment","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code"]}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"tags":["OAuth - Discovery"],"summary":"Metadate Protected Resource (RFC 9728)","description":"Returnează URL-ul Authorization Server-ului asociat cu acest endpoint MCP. Clienții MCP (Claude Code, Cursor, etc.) fac un GET pe acest URL după ce primesc 401 de la /mcp.","x-mcp-exclude":true,"responses":{"200":{"description":"PRM doc pointing MCP clients at the authorization server","content":{"application/json":{"schema":{"type":"object","properties":{"resource":{"type":"string","format":"uri"},"authorization_servers":{"type":"array","items":{"type":"string","format":"uri"}},"scopes_supported":{"type":"array","items":{"type":"string"}},"bearer_methods_supported":{"type":"array","items":{"type":"string","enum":["header"]}},"resource_documentation":{"type":"string","format":"uri"}},"required":["resource","authorization_servers","scopes_supported","bearer_methods_supported"]}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"tags":["OAuth - Discovery"],"summary":"Metadate Authorization Server (RFC 8414)","description":"Returnează endpoint-urile OAuth 2.1 ale acestui server (authorize, token, register, revoke). Clienții fac discovery aici după ce găsesc URL-ul AS-ului în PRM.","x-mcp-exclude":true,"responses":{"200":{"description":"AS metadata used by MCP clients to discover endpoints","content":{"application/json":{"schema":{"type":"object","properties":{"issuer":{"type":"string","format":"uri"},"authorization_endpoint":{"type":"string","format":"uri"},"token_endpoint":{"type":"string","format":"uri"},"registration_endpoint":{"type":"string","format":"uri"},"revocation_endpoint":{"type":"string","format":"uri"},"response_types_supported":{"type":"array","items":{"type":"string"}},"grant_types_supported":{"type":"array","items":{"type":"string"}},"code_challenge_methods_supported":{"type":"array","items":{"type":"string"}},"token_endpoint_auth_methods_supported":{"type":"array","items":{"type":"string"}},"scopes_supported":{"type":"array","items":{"type":"string"}},"service_documentation":{"type":"string","format":"uri"}},"required":["issuer","authorization_endpoint","token_endpoint","registration_endpoint","response_types_supported","grant_types_supported","code_challenge_methods_supported","token_endpoint_auth_methods_supported","scopes_supported"]}}}}}}},"/oauth/register":{"post":{"tags":["OAuth"],"summary":"Dynamic Client Registration (RFC 7591)","description":"Înregistrează un client MCP nou fără intervenție manuală. Clienții publici (token_endpoint_auth_method=none) NU primesc client_secret și trebuie să folosească PKCE. Default scope: toate cele disponibile (filtrul după rol se aplică la consimțământ).","x-mcp-exclude":true,"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"client_name":{"type":"string","minLength":1,"maxLength":200},"redirect_uris":{"type":"array","items":{"type":"string","format":"uri"},"minItems":1,"maxItems":10},"grant_types":{"type":"array","items":{"type":"string","enum":["authorization_code","refresh_token"]},"default":["authorization_code","refresh_token"]},"response_types":{"type":"array","items":{"type":"string","enum":["code"]},"default":["code"]},"token_endpoint_auth_method":{"type":"string","enum":["none","client_secret_basic","client_secret_post"],"default":"none"},"scope":{"type":"string"},"logo_uri":{"type":"string","format":"uri"},"client_uri":{"type":"string","format":"uri"},"policy_uri":{"type":"string","format":"uri"},"tos_uri":{"type":"string","format":"uri"},"software_id":{"type":"string","maxLength":200},"software_version":{"type":"string","maxLength":50}},"required":["client_name","redirect_uris"]}}}},"responses":{"201":{"description":"Client înregistrat","content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"type":"string"},"client_secret":{"type":"string"},"client_id_issued_at":{"type":"number"},"client_secret_expires_at":{"type":"number"},"client_name":{"type":"string"},"redirect_uris":{"type":"array","items":{"type":"string","format":"uri"}},"grant_types":{"type":"array","items":{"type":"string"}},"response_types":{"type":"array","items":{"type":"string"}},"token_endpoint_auth_method":{"type":"string"},"scope":{"type":"string"}},"required":["client_id","client_id_issued_at","client_name","redirect_uris","grant_types","response_types","token_endpoint_auth_method","scope"]}}}},"400":{"description":"Cerere de înregistrare invalidă","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","enum":["invalid_request","invalid_client","invalid_grant","unauthorized_client","unsupported_grant_type","invalid_scope","server_error","temporarily_unavailable","access_denied"]},"error_description":{"type":"string"},"error_uri":{"type":"string","format":"uri"}},"required":["error"]}}}}}}},"/oauth/authorize":{"get":{"tags":["OAuth"],"summary":"Authorization endpoint (RFC 6749 §3.1, OAuth 2.1)","description":"Începutul fluxului OAuth 2.1. Validează clientul + redirect_uri + scope, verifică dacă utilizatorul este autentificat (cookie de sesiune), și fie redirectează la pagina de login a brandului, fie la pagina de consimțământ.","x-mcp-exclude":true,"parameters":[{"schema":{"type":"string","enum":["code"]},"required":true,"name":"response_type","in":"query"},{"schema":{"type":"string","minLength":1},"required":true,"name":"client_id","in":"query"},{"schema":{"type":"string","format":"uri"},"required":true,"name":"redirect_uri","in":"query"},{"schema":{"type":"string"},"required":false,"name":"scope","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":500},"required":true,"name":"state","in":"query"},{"schema":{"type":"string","minLength":43,"maxLength":128},"required":true,"name":"code_challenge","in":"query"},{"schema":{"type":"string","enum":["S256"]},"required":true,"name":"code_challenge_method","in":"query"}],"responses":{"302":{"description":"Redirect to login or consent"},"400":{"description":"Invalid request (no redirect possible)"}}}},"/oauth/authorization-request/{token}":{"get":{"tags":["OAuth"],"summary":"Detaliile unei cereri de autorizare în așteptare (pentru pagina de consimțământ)","description":"Pagina de consimțământ pe web cheamă acest endpoint cu JWT-ul pending-request din URL. Returnează numele clientului, scope-urile cerute, listele de scope-uri disponibile filtrate după rolul utilizatorului, și URL-urile cosmetice (logo, terms, privacy).","x-mcp-exclude":true,"parameters":[{"schema":{"type":"string","minLength":1},"required":true,"name":"token","in":"path"}],"responses":{"200":{"description":"Detaliile cererii","content":{"application/json":{"schema":{"type":"object","properties":{"client_name":{"type":"string"},"client_uri":{"type":"string","nullable":true,"format":"uri"},"logo_uri":{"type":"string","nullable":true,"format":"uri"},"requested_scope":{"type":"string"},"available_areas":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"labelRo":{"type":"string"},"descriptionRo":{"type":"string"},"adminOnly":{"type":"boolean"}},"required":["id","labelRo","descriptionRo","adminOnly"]}},"user_role":{"type":"string","enum":["admin","user"]}},"required":["client_name","client_uri","logo_uri","requested_scope","available_areas","user_role"]}}}},"400":{"description":"JWT invalid sau expirat","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}}}}},"/oauth/authorize/decide":{"post":{"tags":["OAuth"],"summary":"Approve or deny a pending authorization request","description":"Apelată de pagina de consimțământ după ce utilizatorul a apăsat „Permite acces” sau „Refuză”. Mintuiește codul de autorizare la aprobare, întoarce un URL de redirect spre clientul MCP. La refuz întoarce URL-ul de redirect cu error=access_denied.","x-mcp-exclude":true,"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"request":{"type":"string","minLength":1,"description":"Pending-request JWT minted by /oauth/authorize"},"approve":{"type":"boolean"},"granted_scope":{"type":"string","description":"Optional scope subset the user actually approved (may be narrower than what was requested). Omit when approve=false."}},"required":["request","approve"]}}}},"responses":{"200":{"description":"Decizia înregistrată; clientul trebuie redirectat la `redirect_to`.","content":{"application/json":{"schema":{"type":"object","properties":{"redirect_to":{"type":"string","format":"uri"}},"required":["redirect_to"]}}}},"400":{"description":"Cerere invalidă (JWT expirat sau scope refuzat de server)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","enum":["invalid_request","invalid_client","invalid_grant","unauthorized_client","unsupported_grant_type","invalid_scope","server_error","temporarily_unavailable","access_denied"]},"error_description":{"type":"string"},"error_uri":{"type":"string","format":"uri"}},"required":["error"]}}}}}}},"/oauth/token":{"post":{"tags":["OAuth"],"summary":"Token endpoint (RFC 6749 §3.2, OAuth 2.1)","description":"Schimbă un cod de autorizare sau un refresh token pentru o pereche access_token + refresh_token. PKCE este obligatoriu pe authorization_code (S256). Refresh tokens rotesc la fiecare apel — reutilizarea detectează replay și revocă toate tokenurile pentru perechea (user, client). Acceptă atât application/x-www-form-urlencoded (standard OAuth) cât și application/json.","x-mcp-exclude":true,"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"oneOf":[{"type":"object","properties":{"grant_type":{"type":"string","enum":["authorization_code"]},"code":{"type":"string","minLength":1},"redirect_uri":{"type":"string","format":"uri"},"client_id":{"type":"string","minLength":1},"client_secret":{"type":"string"},"code_verifier":{"type":"string","minLength":43,"maxLength":128}},"required":["grant_type","code","redirect_uri","client_id","code_verifier"]},{"type":"object","properties":{"grant_type":{"type":"string","enum":["refresh_token"]},"refresh_token":{"type":"string","minLength":1},"client_id":{"type":"string","minLength":1},"client_secret":{"type":"string"},"scope":{"type":"string"}},"required":["grant_type","refresh_token","client_id"]}]}},"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"grant_type":{"type":"string","enum":["authorization_code"]},"code":{"type":"string","minLength":1},"redirect_uri":{"type":"string","format":"uri"},"client_id":{"type":"string","minLength":1},"client_secret":{"type":"string"},"code_verifier":{"type":"string","minLength":43,"maxLength":128}},"required":["grant_type","code","redirect_uri","client_id","code_verifier"]},{"type":"object","properties":{"grant_type":{"type":"string","enum":["refresh_token"]},"refresh_token":{"type":"string","minLength":1},"client_id":{"type":"string","minLength":1},"client_secret":{"type":"string"},"scope":{"type":"string"}},"required":["grant_type","refresh_token","client_id"]}]}}}},"responses":{"200":{"description":"Tokens emise","content":{"application/json":{"schema":{"type":"object","properties":{"access_token":{"type":"string"},"token_type":{"type":"string","enum":["Bearer"]},"expires_in":{"type":"number"},"refresh_token":{"type":"string"},"scope":{"type":"string"}},"required":["access_token","token_type","expires_in","scope"]}}}},"400":{"description":"OAuth error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","enum":["invalid_request","invalid_client","invalid_grant","unauthorized_client","unsupported_grant_type","invalid_scope","server_error","temporarily_unavailable","access_denied"]},"error_description":{"type":"string"},"error_uri":{"type":"string","format":"uri"}},"required":["error"]}}}}}}},"/oauth/revoke":{"post":{"tags":["OAuth"],"summary":"Token revocation (RFC 7009)","description":"Revocă un refresh token. Per RFC 7009 §2.2, întoarce 200 indiferent dacă tokenul a existat sau nu — nu dezvăluim existența. Access tokens (JWT scurte) sunt ignorate aici; expiră oricum în maxim 1h. Acceptă application/x-www-form-urlencoded (standard) și application/json.","x-mcp-exclude":true,"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"token":{"type":"string","minLength":1},"token_type_hint":{"type":"string","enum":["access_token","refresh_token"]}},"required":["token"]}},"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","minLength":1},"token_type_hint":{"type":"string","enum":["access_token","refresh_token"]}},"required":["token"]}}}},"responses":{"200":{"description":"Revoked (always 200 per spec)"}}}}}}