{"openapi":"3.1.0","info":{"title":"LaserData Cloud Core API","description":"Control plane: tenants, divisions, environments, deployments, billing, members.\n\nPublic REST API for the LaserData Cloud control plane.\n\n## Authentication\n\nEvery tenant endpoint accepts either of two auth methods. Pick whichever the Try-It panel shows; both work.\n- **API key** (machine / CI / SDK): send in the `ld-api-key` header. Keys are tenant-scoped and bound to a single role. Per-environment scoping is enforced by the role's permissions. Cannot be used on `/account/*` (user-scope) endpoints, tenant creation, leave / delete tenant, or invitation accept / reject.\n- **Session cookie** (browser / console): obtained from `POST /account/sign_in`. Mutating endpoints additionally require the `x-csrf-token` header echoed from the sign-in response.\n\nUser-scope endpoints (anything under `/account/*`, tenant creation, leave / delete tenant, invitation accept / reject) are session-only and reject API keys with `403 api_key_not_allowed`.\n\n## Idempotency\n\n`POST`, `PUT`, and `PATCH` requests authenticated by an API key may include an `idempotency-key: <opaque>` header (max 255 characters, UUIDv4 recommended). The server caches the first response for 10 minutes per `(api_key, key)` pair and replays it on retries. A reuse with a *different* request body returns `409 idempotency_error`. A reuse while the original request is still in flight returns `409 idempotent_request_in_progress`. Replays carry an `idempotent-replayed: true` header. DELETE is omitted because it is natively idempotent.\n\n## Pagination\n\nList endpoints return a `Paged<T>` body (`page`, `total_pages`, `total_results`, `items`) and a `link` header (RFC 8288) with `rel=\"first\"`, `\"prev\"`, `\"next\"`, `\"last\"` when applicable.\n\n## Errors\n\nError responses follow RFC 7807 `application/problem+json` with `type`, `title`, `code`, `reason`, `instance`, `status`, `retryable`, and optional `field` / `field_issues`. `retryable` is `true` for 408, 425, 429, 500, 502, 503, 504. On 429 or 503 a `retry-after` header may be set in seconds. Otherwise fall back to exponential backoff.\n\n## Response headers\n\n- `ld-request`: request ID. Include it when reporting issues.\n- `ld-tenant`, `ld-division`, `ld-environment`, `ld-deployment`, `ld-role`: created-resource ID headers returned on the corresponding `POST` endpoints.\n- `link`: pagination relations.\n- `retry-after`: wait hint on 429 / 503.\n- `idempotent-replayed`: set to `true` when the body is a cached idempotent replay.","termsOfService":"https://laserdata.com/terms","contact":{"name":"LaserData Support","url":"https://docs.laserdata.com","email":"support@laserdata.com"},"license":{"name":"Proprietary"},"version":"0.0.84","x-logo":{"altText":"LaserData","href":"https://laserdata.com","url":"https://assets.laserdata.com/laserdata_dark.png"}},"servers":[{"url":"https://api.laserdata.cloud","description":"Production"}],"paths":{"/account":{"get":{"tags":["Account"],"summary":"Get account","description":"Returns the current user's full account: profile, settings, linked identity providers, and tenant memberships with per-tenant role and permission summary.","operationId":"get_account","responses":{"200":{"description":"Current user account details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDetails"}}}},"401":{"description":"No active session"}},"security":[{"session_cookie":[]}]}},"/account/auth/callback":{"get":{"tags":["Account"],"summary":"OAuth callback","description":"Identity-provider callback (Google, GitHub, Microsoft). The IdP redirects the user agent here with ID+token query params. Server resolves the intent and redirects back to the frontend with `intent` (sign_in / sign_up / link_account) appended. Not called directly by API clients.","operationId":"auth_callback","parameters":[{"name":"id","in":"query","description":"Intent ID from the IdP redirect","required":false,"schema":{"type":"string"}},{"name":"token","in":"query","description":"Intent token from the IdP redirect","required":false,"schema":{"type":"string"}},{"name":"user","in":"query","description":"When present, treated as sign-in flow. Otherwise resolved to sign_up or link_account based on whether the email already belongs to a registered user","required":false,"schema":{"type":"string"}}],"responses":{"307":{"description":"Redirect to the configured frontend with auth intent parameters"},"500":{"description":"Missing id/token, invalid intent, or IdP failure"}},"security":[]}},"/account/auth/intents":{"post":{"tags":["Account"],"summary":"Create auth intent","description":"Step 1 of the OAuth sign-in / sign-up flow. Creates a one-time intent and returns the IdP authorization URL the user agent should be redirected to. Source defaults to `google`.","operationId":"create_intent","requestBody":{"description":"Identity source selector","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIntent"}}},"required":true},"responses":{"200":{"description":"Intent created. The redirect URL points at the IdP authorize endpoint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntentRedirect"}}}},"400":{"description":"Identity source disabled"},"429":{"description":"Rate limit exceeded"}},"security":[]}},"/account/export":{"get":{"tags":["Account"],"summary":"Export account data (GDPR)","description":"Returns a single JSON document with all personal data held about the current user: profile, identities, sessions, memberships, invitations, settings. Use this to satisfy GDPR data-portability requests.","operationId":"export_user_data","responses":{"200":{"description":"GDPR data export for the current user","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDataExport"}}}},"401":{"description":"No active session"}},"security":[{"session_cookie":[]}]}},"/account/invitations":{"get":{"tags":["Invitations"],"summary":"List my invitations","description":"Returns pending invitations addressed to the current user. Use to populate the console's invitation inbox. Session-only: API keys are tenant-scoped and cannot list user invitations.","operationId":"get_invitations","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":1},{"name":"results","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":10}],"responses":{"200":{"description":"Paged invitations for current user","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paged_InvitationInfo"}}}},"401":{"description":"No active session"}},"security":[{"session_cookie":[]}]}},"/account/invitations/{invitation_id}/accept":{"put":{"tags":["Invitations"],"summary":"Accept invitation","description":"Accepts an invitation and creates the tenant membership. The user immediately has access according to the invitation's role assignment. Session-only: API keys are tenant-scoped and cannot accept user invitations.","operationId":"accept_invitation","parameters":[{"name":"invitation_id","in":"path","description":"Invitation identifier","required":true,"schema":{"$ref":"#/components/schemas/InvitationId"}}],"responses":{"201":{"description":"Invitation accepted"},"404":{"description":"Invitation not found"},"410":{"description":"Invitation expired"}},"security":[{"session_cookie":[]}]}},"/account/invitations/{invitation_id}/reject":{"put":{"tags":["Invitations"],"summary":"Reject invitation","description":"Declines an invitation. No membership is created. The inviter is notified. Session-only: API keys are tenant-scoped and cannot reject user invitations.","operationId":"reject_invitation","parameters":[{"name":"invitation_id","in":"path","description":"Invitation identifier","required":true,"schema":{"$ref":"#/components/schemas/InvitationId"}}],"responses":{"201":{"description":"Invitation rejected"},"404":{"description":"Invitation not found"}},"security":[{"session_cookie":[]}]}},"/account/link":{"post":{"tags":["Account"],"summary":"Link external account","description":"Links another identity provider (Google / GitHub / Microsoft) to the current user. Requires a fresh IdP intent for the source being linked. After linking the user can sign in via either provider.","operationId":"link_account","requestBody":{"description":"Intent ID + token for the IdP being linked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkAccount"}}},"required":true},"responses":{"200":{"description":"Account linked. Includes a new session when the intent was verified.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewAccount"}}}},"401":{"description":"Invalid or expired intent"},"409":{"description":"External account already linked to another user"}},"security":[]}},"/account/sessions":{"get":{"tags":["Account"],"summary":"List sessions","description":"Lists all active sessions for the current user (one entry per browser/device).","operationId":"get_sessions","responses":{"200":{"description":"Active sessions","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserSessionInfo"}}}}},"401":{"description":"No active session"}},"security":[{"session_cookie":[]}]},"post":{"tags":["Account"],"summary":"Refresh session","description":"Extends the current session's expiry. Returns a new session cookie + csrf_token.","operationId":"refresh_session","responses":{"200":{"description":"Refreshed session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionInfo"}}}},"401":{"description":"No valid session cookie"},"429":{"description":"Rate limit exceeded"}},"security":[{"session_cookie":[]}]},"delete":{"tags":["Account"],"summary":"Delete all sessions","description":"Signs out the current user everywhere by invalidating every active session. Use this after a suspected credential leak.","operationId":"delete_sessions","responses":{"204":{"description":"All sessions deleted"},"401":{"description":"No active session"}},"security":[{"session_cookie":[]}]}},"/account/settings":{"put":{"tags":["Account"],"summary":"Update settings","description":"Updates the current user's preferences: default tenant + division (for console nav), theme, and IP binding. IP binding pins active sessions to the IP that created them. Useful for tighter security but breaks roaming.","operationId":"update_settings","requestBody":{"description":"Partial update. Null or missing fields are unchanged","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSettings"}}},"required":true},"responses":{"204":{"description":"Settings updated"},"400":{"description":"Invalid theme or tenant/division reference"},"401":{"description":"No active session"}},"security":[{"session_cookie":[]}]}},"/account/sign_in":{"post":{"tags":["Account"],"summary":"Sign in","description":"Step 3 of the OAuth flow. Trades the intent ID+token (received from the IdP callback) for an authenticated session. Sets the `session` cookie and returns a `csrf_token` that must be sent on all subsequent state-changing requests via `x-csrf-token` header.","operationId":"sign_in","requestBody":{"description":"Intent ID + token consumed from the IdP callback","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignIn"}}},"required":true},"responses":{"200":{"description":"Authenticated session. The csrf_token must be echoed back as X-CSRF-Token on writes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionInfo"}}}},"401":{"description":"Invalid credentials or expired intent"},"403":{"description":"User account locked or disabled"},"429":{"description":"Rate limit exceeded"}},"security":[]}},"/account/sign_out":{"delete":{"tags":["Account"],"summary":"Sign out","description":"Terminates the current session, deletes the session cookie, and invalidates the CSRF token. Subsequent requests must obtain a new session via /account/auth/intents → IdP → /account/sign_in.","operationId":"sign_out","responses":{"204":{"description":"Session terminated"},"401":{"description":"No active session"}},"security":[{"session_cookie":[]}]}},"/account/sign_up":{"post":{"tags":["Account"],"summary":"Sign up","description":"Create a new user account from a verified IdP intent. Optionally provisions a tenant + division (e.g. for SaaS onboarding) or accepts an invitation token. If the IdP-provided email matches an existing tenant's claimed email domain and join_policy allows, the new user joins automatically and a session is returned. Otherwise the account is created in `awaiting_verification` state.","operationId":"sign_up","requestBody":{"description":"Intent + profile fields (name, title) + optional tenant name / invitation token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignUp"}}},"required":true},"responses":{"201":{"description":"Account created. If `verified` and tenant resolved, includes session + ld-tenant / ld-division response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewAccount"}}}},"400":{"description":"Invalid input or already-existing user"},"401":{"description":"Invalid or expired intent"}},"security":[]}},"/pricing":{"get":{"tags":["Billing"],"summary":"Get public pricing","description":"Returns public plan and pricing information without requiring authentication.","operationId":"get_pricing","responses":{"200":{"description":"Public pricing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingInfo"}}}}},"security":[]}},"/pricing/estimate":{"post":{"tags":["Billing"],"summary":"Estimate public pricing","description":"Returns a full-calendar-month estimate in USD for a fixed 3-node paid cluster or a 720-hour BYOC illustration. Throughput is decimal megabytes per second and customer data volume is decimal GB.","operationId":"estimate_pricing","requestBody":{"description":"Managed or BYOC estimate input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimatePricing"}}},"required":true},"responses":{"200":{"description":"Pricing estimate","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingEstimate"}}}},"400":{"description":"Invalid estimate input"},"429":{"description":"Estimate rate limit exceeded"}},"security":[]}},"/tenants":{"get":{"tags":["Tenants"],"summary":"List tenants","description":"Returns all tenants the calling user is a member of. Used by the console to populate the tenant switcher. With API key auth this is scoped to the key's tenant.","operationId":"get_tenants","responses":{"200":{"description":"Tenants accessible to the caller","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TenantInfo"}}}}},"401":{"description":"No active session or API key"}}},"post":{"tags":["Tenants"],"summary":"Create tenant","description":"Creates a new tenant with the caller as owner. Optionally provisions a default division in the same request. The new ids are returned in `ld-tenant` and `ld-division` response headers. Subject to per-user `owned_tenants` limit. Session-only: API keys are tenant-scoped and cannot create new tenants.","operationId":"create_tenant","requestBody":{"description":"Name, description, email, protected, optional initial division","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTenant"}}},"required":true},"responses":{"201":{"description":"Tenant created. The new tenant ID is returned in the ld-tenant header"},"400":{"description":"Invalid name / email / division settings or owned-tenants limit reached"},"409":{"description":"Email domain already claimed"}},"security":[{"session_cookie":[]}]}},"/tenants/{tenant_id}":{"get":{"tags":["Tenants"],"summary":"Get tenant","description":"Returns tenant details: status, subscription plan + features, billing email, custom email domain. The caller must be a member of the tenant.","operationId":"get_tenant","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"responses":{"200":{"description":"Tenant details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantDetailsInfo"}}}},"403":{"description":"Not a member of the tenant"},"404":{"description":"Tenant not found"}}},"put":{"tags":["Tenants"],"summary":"Update tenant","description":"Partial update of tenant attributes (name, description, email, protected). Owner-only.","operationId":"update_tenant","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"requestBody":{"description":"Partial update. Null or missing fields are unchanged","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTenant"}}},"required":true},"responses":{"204":{"description":"Tenant updated"},"400":{"description":"Invalid field value"},"403":{"description":"Not the tenant owner"},"404":{"description":"Tenant not found"}}},"delete":{"tags":["Tenants"],"summary":"Delete tenant","description":"Permanently deletes the tenant and all child resources (divisions, environments, deployments will be torn down). Requires a resource confirmation code (obtain via PUT /tenants/{tenant_id}/request_code with action `delete_tenant`). Owner-only. Outstanding deployments and billing must be settled first. Session-only: API keys are tenant-scoped and cannot delete tenants.","operationId":"delete_tenant","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"code","in":"query","required":false,"schema":{"type":["string","null"]}}],"responses":{"204":{"description":"Tenant deleted"},"400":{"description":"Active deployments or unpaid invoices exist, or missing/invalid code"},"403":{"description":"Not the tenant owner"},"404":{"description":"Tenant not found"}},"security":[{"session_cookie":[]}]}},"/tenants/{tenant_id}/api_keys":{"get":{"tags":["API Keys"],"summary":"List API keys","description":"Returns the tenant's API keys. Metadata only - the `token` secret is never included in list responses.","operationId":"get_api_keys","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"page","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":1},{"name":"results","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":50},{"name":"name","in":"query","required":false,"schema":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ApiKeyName"}]}}],"responses":{"200":{"description":"Paged API key listing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paged_ApiKeyInfo"}}}},"403":{"description":"Insufficient permissions on the tenant"}}},"post":{"tags":["API Keys"],"summary":"Create API key","description":"Creates a tenant-scoped API key. Provide `role_id` to reuse an existing role, or `permissions` to mint a dedicated single-purpose role automatically. The returned `token` is shown ONCE - store it immediately, it cannot be retrieved again.","operationId":"create_api_key","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"requestBody":{"description":"Name, expiry (max 365 days), role_id OR inline permissions, optional IP allowlist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKey"}}},"required":true},"responses":{"201":{"description":"API key created. `token` returned once and never again","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyToken"}}}},"400":{"description":"Invalid name, expiry beyond 365 days, or both role_id and permissions provided"},"403":{"description":"Insufficient permissions on the tenant"},"409":{"description":"Name already used in this tenant or limit reached"}}}},"/tenants/{tenant_id}/api_keys/context":{"get":{"tags":["API Keys"],"summary":"Get caller's key context","description":"Returns metadata about the API key making this call: role, permissions, expiry, IP allowlist. Lets an autonomous agent introspect its own authority before attempting actions.","operationId":"get_api_key_context","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"responses":{"200":{"description":"Calling API key context and permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyDetails"}}}},"401":{"description":"Caller is not authenticated via API key"}}}},"/tenants/{tenant_id}/api_keys/{api_key_id}":{"get":{"tags":["API Keys"],"summary":"Get API key","description":"Returns full metadata for an API key: role, permission tree, IP allowlist. Token secret is never returned.","operationId":"get_api_key","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"api_key_id","in":"path","description":"API key identifier","required":true,"schema":{"$ref":"#/components/schemas/ApiKeyId"}}],"responses":{"200":{"description":"API key details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyDetails"}}}},"403":{"description":"Insufficient permissions"},"404":{"description":"API key not found"}}},"delete":{"tags":["API Keys"],"summary":"Delete API key","description":"Immediately revokes the API key. Subsequent requests using its token will return 401. In-flight requests complete normally. Cannot be undone - create a new key if you need to restore access.","operationId":"delete_api_key","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"api_key_id","in":"path","description":"API key identifier","required":true,"schema":{"$ref":"#/components/schemas/ApiKeyId"}}],"responses":{"204":{"description":"API key deleted"},"403":{"description":"Insufficient permissions"},"404":{"description":"API key not found"}}}},"/tenants/{tenant_id}/api_keys/{api_key_id}/security":{"put":{"tags":["API Keys"],"summary":"Update API key security","description":"Updates only the security policy (IP validation + allowed_ips list). Role and permissions cannot be changed - delete and recreate the key instead, which keeps audit trails clean.","operationId":"update_api_key_security","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"api_key_id","in":"path","description":"API key identifier","required":true,"schema":{"$ref":"#/components/schemas/ApiKeyId"}}],"requestBody":{"description":"Toggle validate_ip and/or replace allowed_ips list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApiKeySecurity"}}},"required":true},"responses":{"204":{"description":"API key security updated"},"400":{"description":"Invalid CIDR, or validate_ip=true with empty allowed_ips"},"403":{"description":"Insufficient permissions"},"404":{"description":"API key not found"}}}},"/tenants/{tenant_id}/billing/credits":{"get":{"tags":["Billing"],"summary":"Get tenant credits","description":"Lists credits redeemed by the tenant with the remaining balance each. Invoices consume credits oldest first.","operationId":"get_tenant_credits","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"responses":{"200":{"description":"Tenant credits","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TenantCreditInfo"}}}}}}}},"/tenants/{tenant_id}/billing/info":{"get":{"tags":["Billing"],"summary":"Get billing info","description":"Returns the tenant billing recipient profile used for invoicing.","operationId":"get_billing_info","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"responses":{"200":{"description":"Tenant billing info","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingInfo"}}}},"403":{"description":"Insufficient permissions"}}},"put":{"tags":["Billing"],"summary":"Update billing info","description":"Updates the tenant billing recipient profile used for invoicing.","operationId":"update_billing_info","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"requestBody":{"description":"Billing recipient fields such as company, address, tax ID, email, and phone","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBillingInfo"}}},"required":true},"responses":{"204":{"description":"Billing info updated"}}}},"/tenants/{tenant_id}/billing/invoices":{"get":{"tags":["Billing"],"summary":"List invoices","description":"Returns paged customer invoices for the tenant.","operationId":"get_invoices","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"responses":{"200":{"description":"Paged invoices","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paged_CustomerInvoiceInfo"}}}}}}},"/tenants/{tenant_id}/billing/invoices/{invoice_id}":{"get":{"tags":["Billing"],"summary":"Get invoice","description":"Returns full invoice details for one tenant invoice.","operationId":"get_invoice","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"invoice_id","in":"path","description":"Invoice identifier","required":true,"schema":{"$ref":"#/components/schemas/InvoiceId"}}],"responses":{"200":{"description":"Invoice details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerInvoiceDetails"}}}}}}},"/tenants/{tenant_id}/billing/invoices/{invoice_id}/pdf":{"get":{"tags":["Billing"],"summary":"Download invoice PDF","description":"Downloads the rendered PDF file for one invoice.","operationId":"download_invoice_pdf","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"invoice_id","in":"path","description":"Invoice identifier","required":true,"schema":{"$ref":"#/components/schemas/InvoiceId"}}],"responses":{"200":{"description":"Invoice PDF (application/pdf)","content":{"application/pdf":{}}}}}},"/tenants/{tenant_id}/billing/payments/intents":{"post":{"tags":["Payments"],"summary":"Create Stripe setup intent","description":"Creates a Stripe setup intent so the client can collect and attach a payment method for the tenant.","operationId":"create_setup_intent","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"responses":{"200":{"description":"Stripe setup intent","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupIntentResponse"}}}},"403":{"description":"Insufficient permissions"}}}},"/tenants/{tenant_id}/billing/payments/method":{"get":{"tags":["Payments"],"summary":"Get payment method","description":"Returns the tenant's current payment provider and stored payment method metadata.","operationId":"get_payment_info","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"responses":{"200":{"description":"Payment method info","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentInfo"}}}},"403":{"description":"Insufficient permissions"}}},"delete":{"tags":["Payments"],"summary":"Remove payment method","description":"Detaches the current payment method for the tenant.","operationId":"remove_payment_method","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"responses":{"204":{"description":"Payment method removed"}}}},"/tenants/{tenant_id}/billing/promo_codes":{"post":{"tags":["Billing"],"summary":"Redeem a promo code","description":"Redeems a promo code once per tenant and returns the granted credit. Credits reduce upcoming invoices until the balance or the code expiry is reached.","operationId":"redeem_promo_code","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"requestBody":{"description":"Promo code to redeem","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemPromoCode"}}},"required":true},"responses":{"201":{"description":"Credit granted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreditInfo"}}}},"400":{"description":"Promo code is invalid or not applicable"},"409":{"description":"Promo code already redeemed by this tenant"},"429":{"description":"Promo-code attempt rate limit exceeded"}}}},"/tenants/{tenant_id}/billing/reports":{"get":{"tags":["Billing"],"summary":"List billing reports","description":"Returns paged deployment billing reports for a tenant.","operationId":"get_billing_reports","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"responses":{"200":{"description":"Paged billing reports","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paged_BillingReportInfo"}}}}}}},"/tenants/{tenant_id}/billing/reports/{report_id}":{"get":{"tags":["Billing"],"summary":"Get billing report","description":"Returns one deployment billing report with detailed usage and pricing breakdown.","operationId":"get_billing_report","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"report_id","in":"path","description":"Deployment report identifier","required":true,"schema":{"$ref":"#/components/schemas/DeploymentReportId"}}],"responses":{"200":{"description":"Billing report details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingReportDetails"}}}}}}},"/tenants/{tenant_id}/cloud_accounts":{"get":{"tags":["Cloud Accounts"],"summary":"List cloud accounts","description":"Returns the tenant's registered cloud accounts.","operationId":"get_cloud_accounts","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"page","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":1},{"name":"results","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":10},{"name":"name","in":"query","required":false,"schema":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CloudAccountName"}]}},{"name":"cloud","in":"query","required":false,"schema":{"type":["string","null"]}},{"name":"region","in":"query","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Paged cloud accounts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paged_CloudAccountInfo"}}}},"403":{"description":"Insufficient permissions"}}},"post":{"tags":["Cloud Accounts"],"summary":"Register cloud account","description":"Registers an external cloud provider account (AWS or GCP) for BYOC deployments, VPC peering, and PrivateLink. Stores credentials and network metadata under the tenant.","operationId":"create_cloud_account","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"requestBody":{"description":"Provider, account ID, region, provider-specific settings","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCloudAccount"}}},"required":true},"responses":{"201":{"description":"Cloud account created"},"400":{"description":"Invalid provider or settings"},"403":{"description":"Insufficient permissions"},"409":{"description":"Name already used in this tenant"}}}},"/tenants/{tenant_id}/cloud_accounts/{cloud_account_id}":{"get":{"tags":["Cloud Accounts"],"summary":"Get cloud account","description":"Returns full details of a registered cloud account, including provider-specific settings.","operationId":"get_cloud_account","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"cloud_account_id","in":"path","description":"Cloud account identifier","required":true,"schema":{"$ref":"#/components/schemas/CloudAccountId"}}],"responses":{"200":{"description":"Cloud account details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloudAccountDetails"}}}},"403":{"description":"Insufficient permissions"},"404":{"description":"Cloud account not found"}}},"put":{"tags":["Cloud Accounts"],"summary":"Update cloud account","description":"Updates name, region, settings, or remarks. Omitted fields stay unchanged. Account provider type is immutable.","operationId":"update_cloud_account","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"cloud_account_id","in":"path","description":"Cloud account identifier","required":true,"schema":{"$ref":"#/components/schemas/CloudAccountId"}}],"requestBody":{"description":"Partial update. Null or missing fields are unchanged","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCloudAccount"}}},"required":true},"responses":{"204":{"description":"Cloud account updated"},"400":{"description":"Invalid settings"},"403":{"description":"Insufficient permissions"},"404":{"description":"Cloud account not found"}}},"delete":{"tags":["Cloud Accounts"],"summary":"Delete cloud account","description":"Removes a registered cloud account. Fails if any deployments, VPC peerings, or PrivateLink endpoints still reference it.","operationId":"delete_cloud_account","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"cloud_account_id","in":"path","description":"Cloud account identifier","required":true,"schema":{"$ref":"#/components/schemas/CloudAccountId"}}],"responses":{"204":{"description":"Cloud account deleted"},"400":{"description":"Account still referenced by deployments or network resources"},"403":{"description":"Insufficient permissions"},"404":{"description":"Cloud account not found"}}}},"/tenants/{tenant_id}/clouds":{"get":{"tags":["Clouds"],"summary":"List available clouds","description":"Returns the cloud providers (AWS, GCP) available for deployments in this tenant.","operationId":"get_clouds","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"responses":{"200":{"description":"Available clouds","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CloudInfo"}}}}},"403":{"description":"Insufficient permissions"}}}},"/tenants/{tenant_id}/clouds/{cloud}/regions":{"get":{"tags":["Clouds"],"summary":"List regions","description":"Returns the regions available for deployment in the selected cloud provider.","operationId":"get_regions","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"cloud","in":"path","description":"Cloud provider (aws, gcp)","required":true,"schema":{"type":"string"}},{"name":"tier","in":"query","description":"Optional deployment tier used to filter regions","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Regions for the cloud","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RegionInfo"}}}}},"403":{"description":"Insufficient permissions"},"404":{"description":"Unknown cloud provider"}}}},"/tenants/{tenant_id}/clouds/{cloud}/regions/{region}/clusters":{"get":{"tags":["Clouds"],"summary":"List cluster kinds","description":"Returns the cluster sizes/kinds (instance types + node counts) available for deployment in the selected cloud + region.","operationId":"get_clusters","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"cloud","in":"path","description":"Cloud provider (aws, gcp)","required":true,"schema":{"type":"string"}},{"name":"region","in":"path","description":"Region code (e.g. us-east-1)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Cluster kinds available in the region","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClusterInfo"}}}}},"403":{"description":"Insufficient permissions"},"404":{"description":"Unknown cloud or region"}}}},"/tenants/{tenant_id}/clouds/{cloud}/regions/{region}/storages":{"get":{"tags":["Clouds"],"summary":"List storage options","description":"Returns the storage classes (local, EBS, persistent disk) available for deployment in the selected cloud + region.","operationId":"get_storages","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"cloud","in":"path","description":"Cloud provider (aws, gcp)","required":true,"schema":{"type":"string"}},{"name":"region","in":"path","description":"Region code (e.g. us-east-1)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Storage options available in the region","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StorageInfo"}}}}},"403":{"description":"Insufficient permissions"},"404":{"description":"Unknown cloud or region"}}}},"/tenants/{tenant_id}/clouds/{cloud}/regions/{region}/tiers":{"get":{"tags":["Clouds"],"summary":"List deployment tiers","description":"Returns the deployment tiers (e.g. starter, standard, enterprise) available for the selected cloud + region.","operationId":"get_tiers","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"cloud","in":"path","description":"Cloud provider (aws, gcp)","required":true,"schema":{"type":"string"}},{"name":"region","in":"path","description":"Region code (e.g. us-east-1)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Tier options available in the region","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TierInfo"}}}}},"403":{"description":"Insufficient permissions"},"404":{"description":"Unknown cloud or region"}}}},"/tenants/{tenant_id}/config":{"get":{"tags":["Tenants"],"summary":"Get tenant config","description":"Returns the tenant's organizational policy: join policy, invitation rules, and email-domain claim status.","operationId":"get_tenant_config","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"responses":{"200":{"description":"Tenant config","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantConfigInfo"}}}},"403":{"description":"Not a member of the tenant"}}},"put":{"tags":["Tenants"],"summary":"Update tenant config","description":"Updates organizational policy: join_policy (open / invite_only / domain_match), whether external invitations are allowed, and whether invitations must come from the claimed email domain.","operationId":"update_tenant_config","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"requestBody":{"description":"Join policy + invitation policies","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTenantConfig"}}},"required":true},"responses":{"204":{"description":"Tenant config updated"},"403":{"description":"Not the tenant owner"},"404":{"description":"Tenant not found"}}}},"/tenants/{tenant_id}/divisions":{"get":{"tags":["Divisions"],"summary":"List divisions","description":"Returns the tenant's divisions visible to the caller. Permission-filtered: only divisions where the calling role has at least read access are included.","operationId":"get_divisions","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"page","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":1},{"name":"results","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":10}],"responses":{"200":{"description":"Paged divisions listing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paged_DivisionInfo"}}}},"403":{"description":"Insufficient permissions on the tenant"}}},"post":{"tags":["Divisions"],"summary":"Create division","description":"Creates a division inside the tenant. `protected` divisions require a resource confirmation code on delete. The new division ID is returned in the `ld-division` response header.","operationId":"create_division","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"requestBody":{"description":"Name (required), description, billing email, protected flag","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDivision"}}},"required":true},"responses":{"201":{"description":"Division created. The new division ID is returned in the ld-division header"},"400":{"description":"Invalid name / description / email or tenant divisions limit reached"},"403":{"description":"Insufficient permissions on the tenant"},"409":{"description":"Name already used"}}}},"/tenants/{tenant_id}/divisions/{division_id}":{"get":{"tags":["Divisions"],"summary":"Get division","description":"Returns division details including description, billing email, and whether a payment method is attached. Divisions are tenant subunits used for billing isolation and environment grouping.","operationId":"get_division","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}}],"responses":{"200":{"description":"Division details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DivisionDetails"}}}},"403":{"description":"Insufficient permissions on the division"},"404":{"description":"Division not found"}}},"put":{"tags":["Divisions"],"summary":"Update division","description":"Updates division attributes. All fields are optional - omitted fields are unchanged. Toggling `protected` from false to true requires the division to be in a known-good state.","operationId":"update_division","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}}],"requestBody":{"description":"Partial update. Null or missing fields are unchanged","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDivision"}}},"required":true},"responses":{"204":{"description":"Division updated"},"400":{"description":"Invalid field value"},"403":{"description":"Insufficient permissions"},"404":{"description":"Division not found"}}},"delete":{"tags":["Divisions"],"summary":"Delete division","description":"Deletes the division. Protected divisions require a resource code (obtain via PUT /tenants/{tenant_id}/request_code with action `delete_division`). The division must be empty of environments/deployments first.","operationId":"delete_division","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}},{"name":"code","in":"query","required":false,"schema":{"type":["string","null"]}}],"responses":{"204":{"description":"Division deleted"},"400":{"description":"Division still contains environments / deployments, or missing code on protected division"},"403":{"description":"Insufficient permissions"},"404":{"description":"Division not found"}}}},"/tenants/{tenant_id}/divisions/{division_id}/deployments/starter":{"post":{"tags":["Deployments"],"summary":"Deploy starter environment","description":"Creates or reuses an environment and schedules a starter deployment for the tenant/division.","operationId":"deploy_starter","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}}],"requestBody":{"description":"Starter deployment request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeployStarter"}}},"required":true},"responses":{"202":{"description":"Starter deployment scheduled. The ld-environment and ld-deployment headers are set"}}}},"/tenants/{tenant_id}/divisions/{division_id}/environments":{"get":{"tags":["Environments"],"summary":"List environments","description":"Returns the division's environments visible to the caller. Permission-filtered.","operationId":"get_environments","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}},{"name":"page","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":1},{"name":"results","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":10}],"responses":{"200":{"description":"Paged environments listing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paged_EnvironmentInfo"}}}},"403":{"description":"Insufficient permissions"}}},"post":{"tags":["Environments"],"summary":"Create environment","description":"Creates an environment in the division. Environments are the natural API key scope unit: scope a key to a single environment to bound an agent's blast radius. New id returned in the `ld-environment` response header.","operationId":"create_environment","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}}],"requestBody":{"description":"Name, optional description, protected flag","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEnvironment"}}},"required":true},"responses":{"201":{"description":"Environment created. The new environment ID is returned in the ld-environment header"},"400":{"description":"Invalid name / description or environments limit reached"},"403":{"description":"Insufficient permissions"},"409":{"description":"Name already used in this division"}}}},"/tenants/{tenant_id}/divisions/{division_id}/environments/{environment_id}":{"get":{"tags":["Environments"],"summary":"Get environment","description":"Returns environment details including description and deployment count. Environments group deployments within a division and are the smallest unit for fine-grained API key scoping.","operationId":"get_environment","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}},{"name":"environment_id","in":"path","description":"Environment identifier","required":true,"schema":{"$ref":"#/components/schemas/EnvironmentId"}}],"responses":{"200":{"description":"Environment details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentDetails"}}}},"403":{"description":"Insufficient permissions on the environment"},"404":{"description":"Environment not found"}}},"put":{"tags":["Environments"],"summary":"Update environment","description":"Partial update of environment attributes. Omitted fields are unchanged.","operationId":"update_environment","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}},{"name":"environment_id","in":"path","description":"Environment identifier","required":true,"schema":{"$ref":"#/components/schemas/EnvironmentId"}}],"requestBody":{"description":"Partial update. Null or missing fields are unchanged","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEnvironment"}}},"required":true},"responses":{"204":{"description":"Environment updated"},"400":{"description":"Invalid field value"},"403":{"description":"Insufficient permissions"},"404":{"description":"Environment not found"}}},"delete":{"tags":["Environments"],"summary":"Delete environment","description":"Deletes the environment. Must be empty of deployments first. Protected environments require a resource code (obtain via PUT /tenants/{tenant_id}/request_code with action `delete_environment`).","operationId":"delete_environment","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}},{"name":"environment_id","in":"path","description":"Environment identifier","required":true,"schema":{"$ref":"#/components/schemas/EnvironmentId"}},{"name":"code","in":"query","required":false,"schema":{"type":["string","null"]}}],"responses":{"204":{"description":"Environment deleted"},"400":{"description":"Environment contains deployments or missing code on protected env"},"403":{"description":"Insufficient permissions"},"404":{"description":"Environment not found"}}}},"/tenants/{tenant_id}/divisions/{division_id}/environments/{environment_id}/deployments":{"get":{"tags":["Deployments"],"summary":"List deployments","description":"Returns the environment's deployments visible to the caller. Permission-filtered.","operationId":"get_deployments","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}},{"name":"environment_id","in":"path","description":"Environment identifier","required":true,"schema":{"$ref":"#/components/schemas/EnvironmentId"}}],"responses":{"200":{"description":"Paged deployments","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paged_DeploymentInfo"}}}},"403":{"description":"Insufficient permissions"}}}},"/tenants/{tenant_id}/divisions/{division_id}/environments/{environment_id}/deployments/byoc":{"post":{"tags":["Deployments"],"summary":"Deploy to your own cloud","description":"Schedules a BYOC deployment into the caller's AWS or GCP account. Cloud-specific identity and network settings are included in the request body.","operationId":"deploy_to_your_own_cloud","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}},{"name":"environment_id","in":"path","description":"Environment identifier","required":true,"schema":{"$ref":"#/components/schemas/EnvironmentId"}}],"requestBody":{"description":"BYOC deployment spec","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeployToYourOwnCloud"}}},"required":true},"responses":{"202":{"description":"BYOC deployment scheduled. The ld-environment and ld-deployment headers are set"}}}},"/tenants/{tenant_id}/divisions/{division_id}/environments/{environment_id}/deployments/byoc/setup":{"post":{"tags":["Deployments"],"summary":"Generate BYOC setup","description":"Returns cloud-specific onboarding instructions and values required before creating a BYOC deployment.","operationId":"generate_byoc_setup","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}},{"name":"environment_id","in":"path","description":"Environment identifier","required":true,"schema":{"$ref":"#/components/schemas/EnvironmentId"}}],"requestBody":{"description":"Target cloud and region","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateByocSetup"}}},"required":true},"responses":{"200":{"description":"BYOC setup","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ByocSetup"}}}},"400":{"description":"Invalid cloud or region"},"403":{"description":"Insufficient permissions"}}}},"/tenants/{tenant_id}/divisions/{division_id}/environments/{environment_id}/deployments/managed":{"post":{"tags":["Deployments"],"summary":"Deploy to managed cloud","description":"Creates a LaserData-managed deployment inside an existing environment. Returns accepted immediately. Provisioning continues asynchronously.","operationId":"deploy_to_managed_cloud","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}},{"name":"environment_id","in":"path","description":"Environment identifier","required":true,"schema":{"$ref":"#/components/schemas/EnvironmentId"}}],"requestBody":{"description":"Managed deployment spec","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeployToManagedCloud"}}},"required":true},"responses":{"202":{"description":"Deployment scheduled. The ld-environment and ld-deployment headers are set"}}}},"/tenants/{tenant_id}/divisions/{division_id}/environments/{environment_id}/deployments/preview":{"post":{"tags":["Deployments"],"summary":"Preview deployment cost","description":"Returns a rough monthly cost estimate for a hypothetical deployment based on cloud, region, tier, storage, throughput, and topology. The figure is an estimate only - it is computed from public list pricing without tenant-specific discounts or final billing rules, and may differ from what is actually invoiced. Free tier always returns zero. The endpoint never creates a deployment.","operationId":"preview_deployment","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}},{"name":"environment_id","in":"path","description":"Environment identifier","required":true,"schema":{"$ref":"#/components/schemas/EnvironmentId"}}],"requestBody":{"description":"Deployment shape to estimate","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewDeployment"}}},"required":true},"responses":{"200":{"description":"Predicted deployment cost","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentPreview"}}}},"400":{"description":"Invalid request body"},"403":{"description":"Insufficient permissions"}}}},"/tenants/{tenant_id}/divisions/{division_id}/environments/{environment_id}/deployments/{deployment_id}":{"get":{"tags":["Deployments"],"summary":"Get deployment","description":"Returns deployment details including cluster size, region, runtime status, and storage configuration. The `supervisor_url` field is the base URL of the supervisor API that owns this deployment's lifecycle (status, configuration, telemetry, restart, upgrade, node operations) - direct subsequent management calls there. Example: `https://supervisor-aws-us.laserdata.cloud`.","operationId":"get_deployment","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}},{"name":"environment_id","in":"path","description":"Environment identifier","required":true,"schema":{"$ref":"#/components/schemas/EnvironmentId"}},{"name":"deployment_id","in":"path","description":"Deployment identifier","required":true,"schema":{"$ref":"#/components/schemas/DeploymentId"}}],"responses":{"200":{"description":"Deployment details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentDetails"}}}},"403":{"description":"Insufficient permissions"},"404":{"description":"Deployment not found"}}},"put":{"tags":["Deployments"],"summary":"Update deployment","description":"Updates mutable deployment metadata such as protection flag and description.","operationId":"update_deployment","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}},{"name":"environment_id","in":"path","description":"Environment identifier","required":true,"schema":{"$ref":"#/components/schemas/EnvironmentId"}},{"name":"deployment_id","in":"path","description":"Deployment identifier","required":true,"schema":{"$ref":"#/components/schemas/DeploymentId"}}],"requestBody":{"description":"Deployment metadata update","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDeployment"}}},"required":true},"responses":{"200":{"description":"Deployment updated"}}},"delete":{"tags":["Deployments"],"summary":"Delete deployment","description":"Schedules deletion of the deployment. Protected deployments require a resource code (obtain via PUT /tenants/{tenant_id}/request_code with action `delete_deployment`).","operationId":"delete_deployment","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}},{"name":"environment_id","in":"path","description":"Environment identifier","required":true,"schema":{"$ref":"#/components/schemas/EnvironmentId"}},{"name":"deployment_id","in":"path","description":"Deployment identifier","required":true,"schema":{"$ref":"#/components/schemas/DeploymentId"}},{"name":"code","in":"query","description":"Resource confirmation code for protected deployments","required":false,"schema":{"type":"string"}}],"responses":{"202":{"description":"Deployment deletion scheduled"},"400":{"description":"Missing or invalid code on protected deployment"},"403":{"description":"Insufficient permissions"},"404":{"description":"Deployment not found"}}}},"/tenants/{tenant_id}/divisions/{division_id}/environments/{environment_id}/deployments/{deployment_id}/connectors":{"get":{"tags":["Connectors"],"summary":"List available connectors","description":"Returns the connector catalog with availability and activation status for the deployment. Filter by `type` query parameter (`source` or `sink`).","operationId":"get_connectors","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}},{"name":"environment_id","in":"path","description":"Environment identifier","required":true,"schema":{"$ref":"#/components/schemas/EnvironmentId"}},{"name":"deployment_id","in":"path","description":"Deployment identifier","required":true,"schema":{"$ref":"#/components/schemas/DeploymentId"}},{"name":"type","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"page","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":1},{"name":"results","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":10}],"responses":{"200":{"description":"Paged connectors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paged_ConnectorInfo"}}}},"403":{"description":"Insufficient permissions"},"404":{"description":"Deployment not found"}}}},"/tenants/{tenant_id}/divisions/{division_id}/environments/{environment_id}/deployments/{deployment_id}/connectors/activate":{"post":{"tags":["Connectors"],"summary":"Activate connector","description":"Activates a connector instance on the deployment. The instance starts in Pending status and transitions to Active once nodes process the task. Poll the connector list to confirm readiness.","operationId":"activate_connector","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}},{"name":"environment_id","in":"path","description":"Environment identifier","required":true,"schema":{"$ref":"#/components/schemas/EnvironmentId"}},{"name":"deployment_id","in":"path","description":"Deployment identifier","required":true,"schema":{"$ref":"#/components/schemas/DeploymentId"}}],"requestBody":{"description":"Connector type + provider-specific config","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivateConnector"}}},"required":true},"responses":{"202":{"description":"Connector activation scheduled"},"400":{"description":"Invalid or unsupported connector config"},"403":{"description":"Insufficient permissions"},"404":{"description":"Deployment not found"}}}},"/tenants/{tenant_id}/divisions/{division_id}/environments/{environment_id}/deployments/{deployment_id}/extend":{"post":{"tags":["Deployments"],"summary":"Extend deployment","description":"Schedules horizontal scaling for a deployment by adding nodes.","operationId":"extend_deployment","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}},{"name":"environment_id","in":"path","description":"Environment identifier","required":true,"schema":{"$ref":"#/components/schemas/EnvironmentId"}},{"name":"deployment_id","in":"path","description":"Deployment identifier","required":true,"schema":{"$ref":"#/components/schemas/DeploymentId"}}],"requestBody":{"description":"Nodes to add by runtime group","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtendDeployment"}}},"required":true},"responses":{"202":{"description":"Deployment extension scheduled"}}}},"/tenants/{tenant_id}/divisions/{division_id}/environments/{environment_id}/deployments/{deployment_id}/retention":{"put":{"tags":["Deployments"],"summary":"Update deployment retention","description":"Updates telemetry retention policy for the deployment.","operationId":"update_retention","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}},{"name":"environment_id","in":"path","description":"Environment identifier","required":true,"schema":{"$ref":"#/components/schemas/EnvironmentId"}},{"name":"deployment_id","in":"path","description":"Deployment identifier","required":true,"schema":{"$ref":"#/components/schemas/DeploymentId"}}],"requestBody":{"description":"Retention settings","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRetention"}}},"required":true},"responses":{"200":{"description":"Retention updated"}}}},"/tenants/{tenant_id}/divisions/{division_id}/environments/{environment_id}/deployments/{deployment_id}/spend_limit":{"put":{"tags":["Deployments"],"summary":"Update deployment spend limit","description":"Sets or clears the monthly spend cap for the deployment.","operationId":"update_spend_limit","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}},{"name":"environment_id","in":"path","description":"Environment identifier","required":true,"schema":{"$ref":"#/components/schemas/EnvironmentId"}},{"name":"deployment_id","in":"path","description":"Deployment identifier","required":true,"schema":{"$ref":"#/components/schemas/DeploymentId"}}],"requestBody":{"description":"Optional monthly spend limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSpendLimit"}}},"required":true},"responses":{"200":{"description":"Spend limit updated"}}}},"/tenants/{tenant_id}/divisions/{division_id}/environments/{environment_id}/deployments/{deployment_id}/upgrade":{"post":{"tags":["Deployments"],"summary":"Upgrade deployment","description":"Schedules a deployment upgrade such as tier or storage changes.","operationId":"upgrade_deployment","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}},{"name":"environment_id","in":"path","description":"Environment identifier","required":true,"schema":{"$ref":"#/components/schemas/EnvironmentId"}},{"name":"deployment_id","in":"path","description":"Deployment identifier","required":true,"schema":{"$ref":"#/components/schemas/DeploymentId"}}],"requestBody":{"description":"Requested deployment upgrade","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeDeployment"}}},"required":true},"responses":{"202":{"description":"Deployment upgrade scheduled"}}}},"/tenants/{tenant_id}/divisions/{division_id}/summary":{"get":{"tags":["Divisions"],"summary":"Division summary","description":"Aggregate counters for the division: environments + deployments totals. Cheap projection for dashboards and agent context priming.","operationId":"get_division_summary","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"division_id","in":"path","description":"Division identifier","required":true,"schema":{"$ref":"#/components/schemas/DivisionId"}}],"responses":{"200":{"description":"Division summary counters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DivisionSummaryInfo"}}}},"403":{"description":"Insufficient permissions"},"404":{"description":"Division not found"}}}},"/tenants/{tenant_id}/invitations":{"get":{"tags":["Invitations"],"summary":"List tenant invitations","description":"Returns outstanding invitations sent from this tenant (pending / accepted / rejected). Filter via the underlying query params.","operationId":"get_tenant_invitations","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"page","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":1},{"name":"results","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":10}],"responses":{"200":{"description":"Paged invitations for tenant","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paged_TenantInvitationInfo"}}}},"403":{"description":"Insufficient permissions"}}},"post":{"tags":["Invitations"],"summary":"Invite member","description":"Sends an invitation email. If the email already belongs to a registered user, the invitation appears in their /account/invitations list. Otherwise the invitee receives a sign-up link. Subject to tenant invitation policy (open / domain_only / block_external).","operationId":"invite_member","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"requestBody":{"description":"Email (required) + optional division scope + optional role ids","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteMember"}}},"required":true},"responses":{"201":{"description":"Invitation created"},"400":{"description":"Invalid email, violates tenant invitation policy, already invited, or already a member"},"403":{"description":"Insufficient permissions"}}}},"/tenants/{tenant_id}/invitations/{invitation_id}":{"delete":{"tags":["Invitations"],"summary":"Delete invitation","description":"Revokes an outstanding invitation. The invitee can no longer accept it. Use this to revoke before expiry if circumstances change.","operationId":"delete_invitation","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"invitation_id","in":"path","description":"Invitation identifier","required":true,"schema":{"$ref":"#/components/schemas/InvitationId"}}],"responses":{"204":{"description":"Invitation deleted"},"403":{"description":"Insufficient permissions"},"404":{"description":"Invitation not found"}}}},"/tenants/{tenant_id}/members":{"get":{"tags":["Members"],"summary":"List members","description":"Returns paginated tenant members with role + permission summary per member. Filter by active status via the `active` query parameter.","operationId":"get_members","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"active","in":"query","required":false,"schema":{"type":["boolean","null"]}},{"name":"page","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":1},{"name":"results","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":10}],"responses":{"200":{"description":"Paged members","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paged_MemberDetails"}}}},"403":{"description":"Insufficient permissions"}}}},"/tenants/{tenant_id}/members/all":{"get":{"tags":["Members"],"summary":"List all members","description":"Returns every tenant member at once with minimal fields (id, email, name). Use for member picker UIs. For tenants with many members, prefer the paginated GET /tenants/{id}/members.","operationId":"get_all_members","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"responses":{"200":{"description":"All members","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MemberInfo"}}}}},"403":{"description":"Insufficient permissions"}}}},"/tenants/{tenant_id}/members/permissions":{"get":{"tags":["Members"],"summary":"Get permissions catalog","description":"Returns the full catalog of permissions available in this tenant, grouped by scope (tenant / division / environment). Use to populate role-permission selectors.","operationId":"get_permissions","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"responses":{"200":{"description":"Available tenant permissions catalog","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantPermissions"}}}},"403":{"description":"Insufficient permissions"}}}},"/tenants/{tenant_id}/members/{member_id}":{"put":{"tags":["Members"],"summary":"Update member","description":"Toggle active status or replace the member's role assignment. Setting `active = false` keeps the membership record but blocks sign-in to the tenant. Setting `roles` replaces the full set atomically.","operationId":"update_member","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"member_id","in":"path","description":"Member user identifier","required":true,"schema":{"$ref":"#/components/schemas/UserId"}}],"requestBody":{"description":"Partial update. Null or missing fields are unchanged","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMember"}}},"required":true},"responses":{"204":{"description":"Member updated"},"400":{"description":"Cannot update self or tenant owner"},"403":{"description":"Insufficient permissions"},"404":{"description":"Member not found"}}},"delete":{"tags":["Members"],"summary":"Remove member","description":"Removes the member's tenant membership. Cannot remove the tenant owner or yourself - use DELETE /tenants/{tenant_id}/membership for self-removal.","operationId":"delete_member","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"member_id","in":"path","description":"Member user identifier","required":true,"schema":{"$ref":"#/components/schemas/UserId"}}],"responses":{"204":{"description":"Member removed"},"400":{"description":"Cannot delete yourself or the tenant owner"},"403":{"description":"Insufficient permissions"},"404":{"description":"Member not found"}}}},"/tenants/{tenant_id}/membership":{"delete":{"tags":["Tenants"],"summary":"Leave tenant","description":"Removes the current user's membership from this tenant. The tenant owner cannot leave - they must transfer ownership or delete the tenant first. Session-only: API keys are tenant-scoped and cannot leave tenants.","operationId":"leave_tenant","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"responses":{"204":{"description":"Membership removed for current user"},"400":{"description":"Caller is the tenant owner and cannot leave"},"404":{"description":"Not a member of this tenant"}},"security":[{"session_cookie":[]}]}},"/tenants/{tenant_id}/request_code":{"put":{"tags":["Tenants"],"summary":"Request resource action code","description":"Mints a one-time confirmation code emailed to the caller. Required for irreversible operations on `protected` resources (delete_tenant, delete_division, delete_environment, delete_deployment). The code is included on the subsequent DELETE call as a query parameter.","operationId":"request_resource_code","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"requestBody":{"description":"Which destructive action the code authorizes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestResourceCode"}}},"required":true},"responses":{"204":{"description":"Code requested. Sent by email to the caller"},"403":{"description":"Insufficient permissions for the requested action"},"429":{"description":"Code already requested recently"}}}},"/tenants/{tenant_id}/roles":{"get":{"tags":["Roles"],"summary":"List roles","description":"Returns the tenant's roles. System roles (Owner, Admin, Member, Viewer) plus any custom roles. Filter by `kind` to separate system from custom.","operationId":"get_roles","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"page","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":1},{"name":"results","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":10},{"name":"kind","in":"query","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Paged roles","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paged_RoleBasicInfo"}}}},"403":{"description":"Insufficient permissions"}}},"post":{"tags":["Roles"],"summary":"Create role","description":"Creates a custom role with a permission tree spanning tenant + division + environment scopes. New id returned in `ld-role` header. System roles cannot be created via this API.","operationId":"add_role","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"requestBody":{"description":"Name + permissions tree. System role kind is rejected - all created roles are Custom.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddRole"}}},"required":true},"responses":{"201":{"description":"Role created. The new role ID is returned in the ld-role header"},"400":{"description":"Invalid name, invalid permissions tree, or roles limit reached"},"403":{"description":"Insufficient permissions"},"409":{"description":"Name already used"}}}},"/tenants/{tenant_id}/roles/{role_id}":{"get":{"tags":["Roles"],"summary":"Get role","description":"Returns role details including full permission tree (tenant + division + environment scopes).","operationId":"get_role","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"role_id","in":"path","description":"Role identifier","required":true,"schema":{"$ref":"#/components/schemas/RoleId"}}],"responses":{"200":{"description":"Role with permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleDetails"}}}},"403":{"description":"Insufficient permissions"},"404":{"description":"Role not found"}}},"put":{"tags":["Roles"],"summary":"Update role","description":"Updates a custom role's name or permissions tree. System roles cannot be modified.","operationId":"update_role","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"role_id","in":"path","description":"Role identifier","required":true,"schema":{"$ref":"#/components/schemas/RoleId"}}],"requestBody":{"description":"Partial update. Null or missing fields are unchanged","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRole"}}},"required":true},"responses":{"204":{"description":"Role updated"},"400":{"description":"Invalid name or permissions"},"403":{"description":"Cannot modify system role or insufficient permissions"},"404":{"description":"Role not found"}}},"delete":{"tags":["Roles"],"summary":"Delete role","description":"Deletes a custom role. Members assigned to it lose its permissions. System roles cannot be deleted.","operationId":"delete_role","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"role_id","in":"path","description":"Role identifier","required":true,"schema":{"$ref":"#/components/schemas/RoleId"}}],"responses":{"204":{"description":"Role deleted"},"403":{"description":"Cannot delete system role or insufficient permissions"},"404":{"description":"Role not found"}}}},"/tenants/{tenant_id}/roles/{role_id}/members":{"get":{"tags":["Roles"],"summary":"List role members","description":"Returns the users currently assigned to this role.","operationId":"get_role_members","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"role_id","in":"path","description":"Role identifier","required":true,"schema":{"$ref":"#/components/schemas/RoleId"}},{"name":"page","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":1},{"name":"results","in":"query","required":false,"schema":{"type":["integer","null"],"format":"int64","minimum":1},"example":10}],"responses":{"200":{"description":"Paged role members","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paged_RoleMemberInfo"}}}},"403":{"description":"Insufficient permissions"},"404":{"description":"Role not found"}}}},"/tenants/{tenant_id}/roles/{role_id}/members/assign":{"put":{"tags":["Roles"],"summary":"Assign members to role","description":"Adds existing members to the role. Members keep any other roles they already have.","operationId":"assign_role_members","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"role_id","in":"path","description":"Role identifier","required":true,"schema":{"$ref":"#/components/schemas/RoleId"}}],"requestBody":{"description":"List of member user ids to add to the role","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignRoleMembers"}}},"required":true},"responses":{"204":{"description":"Members assigned to role"},"400":{"description":"Empty members list, members not in tenant, or cannot assign self"},"403":{"description":"Insufficient permissions"}}}},"/tenants/{tenant_id}/roles/{role_id}/members/revoke":{"put":{"tags":["Roles"],"summary":"Revoke members from role","description":"Removes members from the role. They keep their other role assignments and tenant membership.","operationId":"revoke_role_members","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}},{"name":"role_id","in":"path","description":"Role identifier","required":true,"schema":{"$ref":"#/components/schemas/RoleId"}}],"requestBody":{"description":"List of member user ids to remove from the role","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeRoleMembers"}}},"required":true},"responses":{"204":{"description":"Members revoked from role"},"400":{"description":"Empty members list or cannot revoke from self"},"403":{"description":"Insufficient permissions"}}}},"/tenants/{tenant_id}/structure":{"get":{"tags":["Tenants"],"summary":"Get tenant resource tree","description":"Returns the entire tenant resource hierarchy as a nested tree: divisions -> environments -> deployments. Single call to prime an agent's context about everything in the tenant. Permission-filtered, hidden divisions and environments are omitted. Each deployment's `supervisor_url` points to the supervisor API that owns its lifecycle (status, configuration, telemetry, restart, upgrade, node operations).","operationId":"get_tenant_structure","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"responses":{"200":{"description":"Tenant resource tree","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantStructure"}}}},"403":{"description":"Not a member of the tenant"}}}},"/tenants/{tenant_id}/summary":{"get":{"tags":["Tenants"],"summary":"Tenant summary","description":"Aggregate counters for the tenant: total divisions, environments, deployments. Cheap projection for dashboards.","operationId":"get_tenant_summary","parameters":[{"name":"tenant_id","in":"path","description":"Tenant identifier","required":true,"schema":{"$ref":"#/components/schemas/TenantId"}}],"responses":{"200":{"description":"Tenant summary counters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantSummaryInfo"}}}},"403":{"description":"Not a member of the tenant"}}}}},"components":{"schemas":{"ActivateConnector":{"type":"object","required":["connector_key","connector_type"],"properties":{"connector_key":{"type":"string"},"connector_type":{"type":"string"},"instance_key":{"type":["string","null"]},"instance_name":{"type":["string","null"]}}},"AddRole":{"type":"object","required":["name","permissions"],"properties":{"name":{"$ref":"#/components/schemas/RoleName"},"permissions":{"$ref":"#/components/schemas/RolePermissions"}}},"ApiKeyDetails":{"allOf":[{"$ref":"#/components/schemas/ApiKeyInfo"},{"type":"object","required":["permissions"],"properties":{"permissions":{"$ref":"#/components/schemas/RolePermissionsInfo"}}}]},"ApiKeyId":{"type":"integer","format":"int64","example":7261845127892140000,"minimum":0},"ApiKeyInfo":{"type":"object","required":["id","user_id","role_id","role_name","name","validate_ip","allowed_ips","expiry_at","created_at"],"properties":{"allowed_ips":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string","format":"date-time","description":"Resource creation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"division_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DivisionId"}]},"division_name":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DivisionName"}]},"expiry_at":{"type":"string","format":"date-time","description":"Expiration timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"id":{"$ref":"#/components/schemas/ApiKeyId"},"name":{"$ref":"#/components/schemas/ApiKeyName"},"role_id":{"$ref":"#/components/schemas/RoleId"},"role_name":{"$ref":"#/components/schemas/RoleName"},"user_id":{"$ref":"#/components/schemas/UserId"},"validate_ip":{"type":"boolean"}},"example":{"allowed_ips":["203.0.113.10","203.0.113.11"],"created_at":"2026-05-20T10:00:00Z","division_id":7261844974723780000,"division_name":"Engineering","expiry_at":"2027-01-15T12:00:00Z","id":7261845198004700001,"name":"ci-pipeline","role_id":611298765432109010,"role_name":"ci-deployer","user_id":611298765432109069,"validate_ip":true}},"ApiKeyName":{"type":"string","example":"ci-deployer"},"ApiKeyToken":{"type":"object","required":["id","token"],"properties":{"id":{"$ref":"#/components/schemas/ApiKeyId"},"token":{"type":"string","example":"ld_pk_AbCdEf0123456789AbCdEf0123456789"}}},"Area":{"type":"string","enum":["us","eu","ap","ca","sa"]},"AssignRoleMembers":{"type":"object","required":["members"],"properties":{"members":{"type":"array","items":{"$ref":"#/components/schemas/UserId"}}}},"AvailabilityMode":{"type":"string","enum":["single_az","multi_az"]},"AvailabilityRate":{"type":"object","required":["single_az","multi_az"],"properties":{"multi_az":{"type":"string"},"single_az":{"type":"string"}}},"AwsAccountId":{"type":"string","description":"AWS Account ID - exactly 12 digits.","example":"123456789012"},"AwsByocDeployment":{"type":"object","required":["account_id","identity_arn","external_id","vpc_id","vpc_cidr"],"properties":{"account_id":{"$ref":"#/components/schemas/AwsAccountId"},"external_id":{"type":"string"},"identity_arn":{"type":"string"},"vpc_cidr":{"$ref":"#/components/schemas/CidrBlock"},"vpc_id":{"$ref":"#/components/schemas/AwsVpcId"}}},"AwsCloudAccountSettings":{"type":"object","properties":{"external_id":{"type":["string","null"]},"identity_arn":{"type":["string","null"]},"vpc_cidr":{"type":["string","null"]},"vpc_id":{"type":["string","null"]}}},"AwsVpcId":{"type":"string","description":"AWS VPC ID, e.g. `vpc-1234567890abcdef0`.\nMust start with `vpc-` followed by 1-17 hex characters.","example":"vpc-0abc1234def567890"},"BillingInfo":{"type":"object","properties":{"address":{"type":["string","null"]},"city":{"type":["string","null"]},"company":{"type":["string","null"]},"country":{"type":["string","null"]},"email":{"type":["string","null"]},"name":{"type":["string","null"]},"phone":{"type":["string","null"]},"postal_code":{"type":["string","null"]},"state":{"type":["string","null"]},"tax_id":{"type":["string","null"]}}},"BillingReportDetails":{"allOf":[{"$ref":"#/components/schemas/BillingReportInfo"},{"type":"object","required":["compute_cost","storage_cost","network_cost"],"properties":{"compute_cost":{"type":"string"},"monthly_base_charge":{"type":["string","null"]},"network_cost":{"type":"string"},"network_usage_cost":{"type":["string","null"]},"storage_cost":{"type":"string"}}}]},"BillingReportInfo":{"type":"object","required":["id","deployment_id","name","cloud","variant","from","to","total_cost","currency"],"properties":{"cloud":{"$ref":"#/components/schemas/Cloud"},"currency":{"$ref":"#/components/schemas/Currency"},"deployment_id":{"$ref":"#/components/schemas/DeploymentId"},"from":{"type":"string","format":"date-time"},"id":{"$ref":"#/components/schemas/DeploymentReportId"},"name":{"type":"string"},"region":{"type":["string","null"]},"tier":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DeploymentTier"}]},"to":{"type":"string","format":"date-time"},"total_cost":{"type":"string"},"variant":{"$ref":"#/components/schemas/DeploymentVariant"}},"example":{"cloud":"aws","currency":"USD","deployment_id":7261845127892140000,"from":"2026-04-01T00:00:00Z","id":7261845701661510000,"name":"iggy-prod-01","region":"us-east-1","tier":"small","to":"2026-05-01T00:00:00Z","total_cost":"182.45","variant":"managed"}},"ByocRates":{"type":"object","required":["monthly_base"],"properties":{"monthly_base":{"type":"string"}}},"ByocSetup":{"allOf":[{},{},{"type":"object","required":["supervisor","steps"],"properties":{"steps":{"type":"array","items":{"type":"string"}},"supervisor":{"type":"string"}}}]},"CidrBlock":{"type":"string","example":"10.0.0.0/16"},"Cloud":{"type":"string","description":"Supported managed cloud provider. Only `aws` and `gcp` are accepted on the public API.","enum":["aws","gcp"],"examples":["aws"]},"CloudAccountDetails":{"allOf":[{"$ref":"#/components/schemas/CloudAccountInfo"},{"type":"object","properties":{"remarks":{"type":["string","null"]},"settings":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CloudAccountSettings"}]}}}]},"CloudAccountId":{"type":"integer","format":"int64","example":611298765432109069,"minimum":0},"CloudAccountInfo":{"type":"object","required":["id","cloud","name","account_id","status","created_at","updated_at"],"properties":{"account_id":{"type":"string"},"cloud":{"$ref":"#/components/schemas/Cloud"},"created_at":{"type":"string","format":"date-time","description":"Resource creation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"id":{"$ref":"#/components/schemas/CloudAccountId"},"name":{"$ref":"#/components/schemas/CloudAccountName"},"region":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Region"}]},"status":{"$ref":"#/components/schemas/Status"},"updated_at":{"type":"string","format":"date-time","description":"Resource last-update timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"validated_at":{"type":["string","null"],"format":"date-time","description":"Validation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"}},"example":{"account_id":"123456789012","cloud":"aws","created_at":"2026-05-20T10:00:00Z","id":7261845211446120000,"name":"acme-prod-aws","region":"us-east-1","status":"active","updated_at":"2026-05-20T10:00:00Z","validated_at":"2026-05-20T10:00:00Z"}},"CloudAccountName":{"type":"string","example":"aws-prod"},"CloudAccountSettings":{"type":"object","properties":{"aws":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AwsCloudAccountSettings"}]},"gcp":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/GcpCloudAccountSettings"}]}}},"CloudInfo":{"type":"object","required":["key","name"],"properties":{"key":{"type":"string"},"name":{"type":"string"}}},"CloudRates":{"type":"object","required":["tiers","compute","network_drive","local_nvme","network","throughput"],"properties":{"compute":{"type":"array","items":{"$ref":"#/components/schemas/ComputeRate"}},"local_nvme":{"type":"array","items":{"$ref":"#/components/schemas/LocalNvmeRate"}},"network":{"$ref":"#/components/schemas/NetworkRates"},"network_drive":{"$ref":"#/components/schemas/NetworkDriveRate"},"throughput":{"$ref":"#/components/schemas/ThroughputLimits"},"tiers":{"type":"array","items":{"$ref":"#/components/schemas/ManagedTierRate"}}}},"CloudStorageSettings":{"type":"object","description":"Simplified storage configuration for API requests.\nContains only storage type and optional size. IOPS and throughput are\nautomatically calculated based on tier and storage type when converted to CloudStorage.","required":["type"],"properties":{"size":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/StorageSize","description":"Size in GB. Required for network storage types."}]},"type":{"$ref":"#/components/schemas/StorageType"}}},"ClusterInfo":{"type":"object","required":["key","name","description","available","tiers"],"properties":{"available":{"type":"boolean"},"description":{"type":"string"},"key":{"type":"string"},"name":{"type":"string"},"tiers":{"type":"array","items":{"type":"string"}}}},"ClusterKind":{"type":"string","enum":["standalone","cluster"]},"ComputeRate":{"type":"object","required":["tier","vcpus_per_node","storage_profiles","monthly_per_node","telemetry_days","sizing_throughput_mb_per_second"],"properties":{"monthly_per_node":{"type":"string"},"sizing_throughput_mb_per_second":{"type":"string"},"storage_profiles":{"type":"array","items":{"$ref":"#/components/schemas/StorageProfileId"}},"telemetry_days":{"type":"integer","format":"int32","minimum":0},"tier":{"$ref":"#/components/schemas/DeploymentTier"},"vcpus_per_node":{"type":"integer","format":"int32","minimum":0}}},"ConnectorInfo":{"type":"object","required":["key","type","name","description","available","permitted"],"properties":{"available":{"type":"boolean"},"description":{"type":"string"},"key":{"type":"string"},"name":{"type":"string"},"permitted":{"type":"boolean"},"type":{"$ref":"#/components/schemas/ConnectorType"}},"example":{"available":true,"description":"Stream messages from an Iggy topic to a PostgreSQL table.","key":"iggy.postgres.sink","name":"PostgreSQL Sink","permitted":true,"type":"sink"}},"ConnectorType":{"type":"string","enum":["sink","source"]},"CreateApiKey":{"type":"object","required":["name","expiry_at","validate_ip"],"properties":{"allowed_ips":{"type":["array","null"],"items":{"type":"string"}},"division_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DivisionId"}]},"expiry_at":{"type":"string","format":"date-time","description":"Expiration timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"name":{"$ref":"#/components/schemas/ApiKeyName"},"permissions":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/RolePermissions"}]},"role_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/RoleId"}]},"validate_ip":{"type":"boolean"}}},"CreateCloudAccount":{"type":"object","required":["cloud","name","account_id"],"properties":{"account_id":{"type":"string"},"cloud":{"type":"string"},"name":{"$ref":"#/components/schemas/CloudAccountName"},"region":{"type":["string","null"]},"remarks":{"type":["string","null"]},"settings":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CloudAccountSettings"}]}}},"CreateDivision":{"type":"object","required":["name"],"properties":{"description":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Description"}]},"email":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Email"}]},"name":{"$ref":"#/components/schemas/DivisionName"},"protected":{"type":["boolean","null"],"description":"Optional. When `true`, deletion is hardened: deleting this division will require a\none-time confirmation code emailed to the tenant address (request via\n`PUT /tenants/{tenant_id}/request_code` with `action = \"delete_division\"`).\nDefaults to `false` when omitted.","example":true}}},"CreateEnvironment":{"type":"object","required":["name"],"properties":{"description":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Description"}]},"name":{"$ref":"#/components/schemas/EnvironmentName"},"protected":{"type":["boolean","null"],"description":"Optional. When `true`, deletion is hardened: deleting this environment will require\na one-time confirmation code emailed to the tenant address (request via\n`PUT /tenants/{tenant_id}/request_code` with `action = \"delete_environment\"`).\nDefaults to `false` when omitted.","example":true}}},"CreateIntent":{"type":"object","properties":{"source":{"$ref":"#/components/schemas/IdentityProvider"}}},"CreateTenant":{"type":"object","required":["name"],"properties":{"description":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Description"}]},"division":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/TenantDivision"}]},"email":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Email"}]},"name":{"$ref":"#/components/schemas/TenantName"},"protected":{"type":["boolean","null"],"description":"Optional. When `true`, deletion is hardened: deleting this tenant will require a\none-time confirmation code emailed to the tenant address (request via\n`PUT /tenants/{tenant_id}/request_code` with `action = \"delete_tenant\"`).\nDefaults to `false` when omitted.","example":true}}},"Currency":{"type":"string","enum":["USD"]},"CustomerInvoiceDetails":{"allOf":[{"$ref":"#/components/schemas/CustomerInvoiceInfo"},{"type":"object","required":["subtotal","credits_applied","line_items"],"properties":{"billing_info":{},"credits_applied":{"type":"string"},"line_items":{"type":"array","items":{}},"notes":{"type":["string","null"]},"paid_at":{"type":["string","null"],"format":"date-time"},"subtotal":{"type":"string"},"tax":{"type":["string","null"]}}}]},"CustomerInvoiceInfo":{"type":"object","required":["id","tenant_id","number","period_start","period_end","status","currency","total","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"currency":{"$ref":"#/components/schemas/Currency"},"division_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DivisionId"}]},"id":{"$ref":"#/components/schemas/InvoiceId"},"number":{"type":"string"},"period_end":{"type":"string","format":"date-time"},"period_start":{"type":"string","format":"date-time"},"status":{"$ref":"#/components/schemas/InvoiceStatus"},"tenant_id":{"$ref":"#/components/schemas/TenantId"},"total":{"type":"string"}},"example":{"created_at":"2026-05-02T10:00:00Z","currency":"USD","division_id":7261844974723780000,"id":7261845776048540000,"number":"INV-2026-000182","period_end":"2026-05-01T00:00:00Z","period_start":"2026-04-01T00:00:00Z","status":"approved","tenant_id":7261845022003200001,"total":"182.45"}},"DeleteDeploymentPayload":{"type":"object","required":["tenant_id","division_id","environment_id","deployment_id"],"properties":{"deployment_id":{"$ref":"#/components/schemas/DeploymentId"},"division_id":{"$ref":"#/components/schemas/DivisionId"},"environment_id":{"$ref":"#/components/schemas/EnvironmentId"},"tenant_id":{"$ref":"#/components/schemas/TenantId"}}},"DeleteDivisionPayload":{"type":"object","required":["tenant_id","division_id"],"properties":{"division_id":{"$ref":"#/components/schemas/DivisionId"},"tenant_id":{"$ref":"#/components/schemas/TenantId"}}},"DeleteEnvironmentPayload":{"type":"object","required":["tenant_id","division_id","environment_id"],"properties":{"division_id":{"$ref":"#/components/schemas/DivisionId"},"environment_id":{"$ref":"#/components/schemas/EnvironmentId"},"tenant_id":{"$ref":"#/components/schemas/TenantId"}}},"DeleteTenantPayload":{"type":"object","required":["tenant_id"],"properties":{"tenant_id":{"$ref":"#/components/schemas/TenantId"}}},"DeployStarter":{"type":"object","required":["cloud","region"],"properties":{"cloud":{"$ref":"#/components/schemas/Cloud"},"deployment_name":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DeploymentName"}]},"environment_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/EnvironmentId"}]},"environment_name":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/EnvironmentName"}]},"region":{"$ref":"#/components/schemas/Region"}}},"DeployToManagedCloud":{"type":"object","required":["name","cloud","tier","cluster","region"],"properties":{"availability_mode":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AvailabilityMode"}]},"cloud":{"$ref":"#/components/schemas/Cloud"},"cluster":{"$ref":"#/components/schemas/ClusterKind"},"dedicated":{"type":["boolean","null"]},"encrypted":{"type":["boolean","null"]},"managed_tier":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ManagedTier"}]},"name":{"$ref":"#/components/schemas/DeploymentName"},"network_scope":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NetworkScope"}]},"protected":{"type":["boolean","null"],"example":true},"public_ip_enabled":{"type":["boolean","null"]},"region":{"$ref":"#/components/schemas/Region"},"retention":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/RetentionSettings"}]},"shared":{"type":["boolean","null"]},"spend_limit":{"type":["string","null"]},"storage":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CloudStorageSettings"}]},"subdomain_enabled":{"type":["boolean","null"]},"target_network_tput":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NetworkTput"}]},"tier":{"$ref":"#/components/schemas/DeploymentTier"}}},"DeployToYourOwnCloud":{"type":"object","required":["name","cloud","tier","cluster","region"],"properties":{"availability_mode":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AvailabilityMode"}]},"aws":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AwsByocDeployment"}]},"cloud":{"$ref":"#/components/schemas/Cloud"},"cluster":{"$ref":"#/components/schemas/ClusterKind"},"encrypted":{"type":["boolean","null"]},"gcp":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/GcpByocDeployment"}]},"name":{"$ref":"#/components/schemas/DeploymentName"},"protected":{"type":["boolean","null"],"description":"Optional. When `true`, deletion is hardened: deleting this BYOC deployment will\nrequire a one-time confirmation code emailed to the tenant address (request via\n`PUT /tenants/{tenant_id}/request_code` with `action = \"delete_deployment\"`).\nDefaults to `false` when omitted.","example":true},"public_ip_enabled":{"type":["boolean","null"]},"region":{"$ref":"#/components/schemas/Region"},"retention":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/RetentionSettings"}]},"spend_limit":{"type":["string","null"]},"storage":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CloudStorageSettings"}]},"subdomain_enabled":{"type":["boolean","null"]},"target_network_tput":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NetworkTput"}]},"tier":{"$ref":"#/components/schemas/DeploymentTier"}}},"DeploymentDetails":{"allOf":[{"$ref":"#/components/schemas/DeploymentInfo"},{"type":"object","required":["upgrades"],"properties":{"description":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Description"}]},"managed_tier":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ManagedTier"}]},"monthly_base":{"type":["string","null"]},"upgrades":{"type":"array","items":{"$ref":"#/components/schemas/DeploymentUpgrade"}}}}]},"DeploymentId":{"type":"integer","format":"int64","example":7261845127892140000,"minimum":0},"DeploymentInfo":{"type":"object","required":["id","name","code","variant","domain","cloud","area","cluster","runtimes","nodes_count","protected","encrypted","dedicated","shared","storage_type","storage_size","availability_mode","retention","can_upgrade","created_at","updated_at"],"properties":{"area":{"$ref":"#/components/schemas/Area"},"availability_mode":{"$ref":"#/components/schemas/AvailabilityMode"},"can_upgrade":{"type":"boolean"},"cloud":{"$ref":"#/components/schemas/Cloud"},"cluster":{"$ref":"#/components/schemas/ClusterKind"},"code":{"type":"string"},"created_at":{"type":"string","format":"date-time","example":"2026-05-20T10:00:00Z"},"dedicated":{"type":"boolean"},"domain":{"type":"string"},"encrypted":{"type":"boolean"},"id":{"$ref":"#/components/schemas/DeploymentId"},"name":{"$ref":"#/components/schemas/DeploymentName"},"nodes_count":{"type":"integer","format":"int32","minimum":0},"protected":{"type":"boolean","example":true},"rate_limit":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DeploymentNetworkRateLimit"}]},"region":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Region"}]},"retention":{"$ref":"#/components/schemas/DeploymentRetention"},"runtimes":{"type":"array","items":{"$ref":"#/components/schemas/RuntimeType"}},"shared":{"type":"boolean"},"storage_size":{"$ref":"#/components/schemas/StorageSize"},"storage_type":{"$ref":"#/components/schemas/StorageType"},"supervisor_url":{"type":["string","null"],"example":"https://supervisor-aws-us.laserdata.cloud"},"target_network_tput":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NetworkTput"}]},"tier":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DeploymentTier"}]},"updated_at":{"type":"string","format":"date-time","example":"2026-05-20T10:00:00Z"},"upgraded_at":{"type":["string","null"],"format":"date-time","example":"2026-05-20T10:00:00Z"},"variant":{"$ref":"#/components/schemas/DeploymentVariant"}},"example":{"area":"us","availability_mode":"multi_az","can_upgrade":true,"cloud":"aws","cluster":"standalone","code":"AXJ-7Q2","created_at":"2026-05-20T10:00:00Z","dedicated":false,"domain":"iggy-prod-01.acme.laserdata.cloud","encrypted":true,"id":7261845127892140000,"name":"iggy-prod-01","nodes_count":3,"protected":true,"region":"us-east-1","retention":{"telemetry":{"heartbeats_days":7,"logs_days":7,"metrics_days":7}},"runtimes":["iggy","warden"],"shared":false,"storage_size":500,"storage_type":"network_balanced","supervisor_url":"https://supervisor-aws-us.laserdata.cloud","tier":"small","updated_at":"2026-05-20T10:00:00Z","upgraded_at":null,"variant":"managed"}},"DeploymentName":{"type":"string","example":"iggy-prod-01"},"DeploymentNetworkRateLimit":{"type":"string","description":"Rate limit formatted as `<value> <unit>` (e.g. `1 MB/s`, `500 KB/s`, `2 GB/s`).","examples":["1 MB/s"]},"DeploymentPreview":{"type":"object","required":["cloud","region","tier","nodes","compute_profile_id","included_telemetry_days","capacity","pricing_version","monthly_base_usd","monthly_total_usd","breakdown"],"properties":{"breakdown":{"$ref":"#/components/schemas/DeploymentPreviewBreakdown"},"capacity":{"$ref":"#/components/schemas/DeploymentPreviewCapacity"},"cloud":{"$ref":"#/components/schemas/Cloud"},"compute_profile_id":{"type":"string"},"included_telemetry_days":{"type":"integer","format":"int32","minimum":0},"monthly_base_usd":{"type":"string"},"monthly_total_usd":{"type":"string"},"nodes":{"type":"integer","format":"int32","minimum":0},"pricing_version":{"type":"integer","format":"int32","minimum":0},"region":{"$ref":"#/components/schemas/Region"},"tier":{"$ref":"#/components/schemas/DeploymentTier"}}},"DeploymentPreviewBreakdown":{"type":"object","required":["compute_usd","storage_usd","network_usd"],"properties":{"compute_usd":{"type":"string"},"network_usd":{"type":"string"},"storage_usd":{"type":"string"}}},"DeploymentPreviewCapacity":{"type":"object","required":["shards_per_node","default_segment_bytes","min_segment_bytes","partitions_per_node_at_default_segment","partitions_per_node_at_min_segment"],"properties":{"default_segment_bytes":{"type":"integer","format":"int64","minimum":0},"min_segment_bytes":{"type":"integer","format":"int64","minimum":0},"partitions_per_node_at_default_segment":{"type":"integer","format":"int64","minimum":0},"partitions_per_node_at_min_segment":{"type":"integer","format":"int64","minimum":0},"shards_per_node":{"type":"integer","format":"int32","minimum":0}}},"DeploymentReportId":{"type":"integer","format":"int64","example":611298765432109067,"minimum":0},"DeploymentRetention":{"type":"object","required":["telemetry"],"properties":{"data_storage_gb":{"type":["integer","null"],"format":"int64","description":"Optional S3 data retention storage in GB.","minimum":0},"telemetry":{"$ref":"#/components/schemas/TelemetryRetention"}}},"DeploymentStructure":{"type":"object","required":["id","name","cloud","variant"],"properties":{"cloud":{"$ref":"#/components/schemas/Cloud"},"id":{"$ref":"#/components/schemas/DeploymentId"},"name":{"$ref":"#/components/schemas/DeploymentName"},"region":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Region"}]},"supervisor_url":{"type":["string","null"],"description":"Base URL of the supervisor API that owns this deployment's lifecycle. All status,\nconfiguration, telemetry, restart, upgrade, and node operations target this host:\nsee the Supervisor API reference. Absent for `on_premise` deployments that are not\nfronted by a managed supervisor.","example":"https://supervisor-aws-us.laserdata.cloud"},"tier":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DeploymentTier"}]},"variant":{"$ref":"#/components/schemas/DeploymentVariant"}}},"DeploymentTier":{"type":"string","enum":["free","small","medium","large","xlarge","2xlarge","4xlarge","8xlarge","16xlarge"]},"DeploymentTierLimit":{"type":"object","required":["tier","limit"],"properties":{"limit":{"type":"integer","format":"int32","minimum":0},"tier":{"$ref":"#/components/schemas/DeploymentTier"}}},"DeploymentUpgrade":{"type":"object","required":["upgraded_at"],"properties":{"instance_type":{"type":["string","null"]},"nodes_after":{"type":["integer","null"],"format":"int32","minimum":0},"nodes_before":{"type":["integer","null"],"format":"int32","minimum":0},"rate_limit":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DeploymentNetworkRateLimit"}]},"storage_size":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/StorageSize"}]},"storage_type":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/StorageType"}]},"target_network_tput":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NetworkTput"}]},"tier":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DeploymentTier"}]},"upgraded_at":{"type":"string","format":"date-time","description":"Last upgrade timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"}}},"DeploymentVariant":{"type":"string","enum":["managed","byoc","on_premise"]},"Description":{"type":"string","example":"Production deployment for high-throughput streaming."},"DivisionDetails":{"allOf":[{"$ref":"#/components/schemas/DivisionInfo"},{"type":"object","required":["description","email","has_payment_method"],"properties":{"description":{"$ref":"#/components/schemas/Description"},"email":{"$ref":"#/components/schemas/Email"},"has_payment_method":{"type":"boolean"}}}]},"DivisionId":{"type":"integer","format":"int64","example":7261844974723780000,"minimum":0},"DivisionInfo":{"type":"object","required":["id","name","protected","created_at","updated_at"],"properties":{"created_at":{"type":"string","format":"date-time","description":"Resource creation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"id":{"$ref":"#/components/schemas/DivisionId"},"name":{"$ref":"#/components/schemas/DivisionName"},"protected":{"type":"boolean","description":"When `true`, deletion is hardened: the DELETE request must include a one-time\nconfirmation code emailed to the tenant address. Obtain the code via\n`PUT /tenants/{tenant_id}/request_code` with `action = \"delete_division\"` and pass\nit as the `code` query parameter on the DELETE call.","example":true},"updated_at":{"type":"string","format":"date-time","description":"Resource last-update timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"}},"example":{"created_at":"2026-05-20T10:00:00Z","id":7261844974723780000,"name":"Engineering","protected":true,"updated_at":"2026-05-20T10:00:00Z"}},"DivisionName":{"type":"string","example":"production"},"DivisionPermissions":{"type":"object","properties":{"environment":{"type":["array","null"],"items":{"type":"string"}},"environments":{"type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"string"}},"propertyNames":{"type":"string"}},"permissions":{"type":["array","null"],"items":{"type":"string"}}}},"DivisionPermissionsInfo":{"type":"object","required":["name","permissions","environment","environments"],"properties":{"environment":{"type":"array","items":{"type":"string"}},"environments":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/EnvironmentPermissionsInfo"},"propertyNames":{"type":"string"}},"name":{"$ref":"#/components/schemas/DivisionName"},"permissions":{"type":"array","items":{"type":"string"}}}},"DivisionStructure":{"type":"object","required":["id","name","environments"],"properties":{"environments":{"type":"array","items":{"$ref":"#/components/schemas/EnvironmentStructure"}},"id":{"$ref":"#/components/schemas/DivisionId"},"name":{"$ref":"#/components/schemas/DivisionName"}}},"DivisionSummaryInfo":{"type":"object","required":["total_environments","total_deployments"],"properties":{"total_deployments":{"type":"integer","format":"int32","minimum":0},"total_environments":{"type":"integer","format":"int32","minimum":0}}},"Email":{"type":"string","example":"alice@laserdata.com"},"EnvironmentDetails":{"allOf":[{"$ref":"#/components/schemas/EnvironmentInfo"},{"type":"object","required":["description"],"properties":{"description":{"$ref":"#/components/schemas/Description"}}}]},"EnvironmentId":{"type":"integer","format":"int64","example":7261845066528310000,"minimum":0},"EnvironmentInfo":{"type":"object","required":["id","name","deployments_count","protected","created_at","updated_at"],"properties":{"created_at":{"type":"string","format":"date-time","description":"Resource creation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"deployments_count":{"type":"integer","format":"int32","minimum":0},"id":{"$ref":"#/components/schemas/EnvironmentId"},"name":{"$ref":"#/components/schemas/EnvironmentName"},"protected":{"type":"boolean","description":"When `true`, deletion is hardened: the DELETE request must include a one-time\nconfirmation code emailed to the tenant address. Obtain the code via\n`PUT /tenants/{tenant_id}/request_code` with `action = \"delete_environment\"` and\npass it as the `code` query parameter on the DELETE call.","example":true},"updated_at":{"type":"string","format":"date-time","description":"Resource last-update timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"}},"example":{"created_at":"2026-05-20T10:00:00Z","deployments_count":3,"id":7261845066528310000,"name":"production","protected":true,"updated_at":"2026-05-20T10:00:00Z"}},"EnvironmentName":{"type":"string","example":"staging"},"EnvironmentPermissionsInfo":{"type":"object","required":["name","permissions"],"properties":{"name":{"$ref":"#/components/schemas/EnvironmentName"},"permissions":{"type":"array","items":{"type":"string"}}}},"EnvironmentStructure":{"type":"object","required":["id","name","deployments"],"properties":{"deployments":{"type":"array","items":{"$ref":"#/components/schemas/DeploymentStructure"}},"id":{"$ref":"#/components/schemas/EnvironmentId"},"name":{"$ref":"#/components/schemas/EnvironmentName"}}},"ErrorResponse":{"type":"object","required":["title","code","reason"],"properties":{"code":{"type":"string","description":"Stable machine-readable error code (snake_case)."},"field":{"type":["string","null"]},"field_issues":{"type":"array","items":{"$ref":"#/components/schemas/FieldIssue"}},"instance":{"type":["string","null"],"description":"RFC 7807 instance URI identifying the specific occurrence; mirrors the `ld-request` header value."},"reason":{"type":"string","description":"RFC 7807 detail string. Long-form human explanation of this occurrence."},"resolution":{"type":["string","null"],"description":"Concrete guidance an automated client or operator can use to recover."},"retryable":{"type":["boolean","null"],"description":"`true` for retryable conditions (408, 425, 429, 500, 502, 503, 504), `false` otherwise."},"status":{"type":["integer","null"],"format":"int32","description":"Mirror of HTTP status code. Agents can branch on the body without re-reading the response status.","minimum":0},"title":{"type":"string","description":"RFC 7807 short, human-readable title for the error class."},"type":{"type":"string","description":"RFC 7807 type URI identifying the error class. `about:blank` when no type is registered."}}},"EstimatePricing":{"allOf":[{"$ref":"#/components/schemas/EstimateVariant"}]},"EstimateVariant":{"oneOf":[{"type":"object","required":["managed_tier","cloud","compute_profile_id","storage_profile_id","storage_gb_per_node","throughput_mb_per_second","network_scope","availability_mode","variant"],"properties":{"availability_mode":{"$ref":"#/components/schemas/AvailabilityMode"},"cloud":{"$ref":"#/components/schemas/Cloud"},"compute_profile_id":{"$ref":"#/components/schemas/DeploymentTier"},"managed_tier":{"$ref":"#/components/schemas/ManagedTier"},"network_scope":{"$ref":"#/components/schemas/NetworkScope"},"region":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Region"}]},"storage_gb_per_node":{"type":"integer","format":"int32","minimum":0},"storage_profile_id":{"$ref":"#/components/schemas/StorageProfileId"},"throughput_mb_per_second":{"type":"string"},"variant":{"type":"string","enum":["managed"]}}},{"type":"object","required":["vcpus_per_node","variant"],"properties":{"variant":{"type":"string","enum":["byoc"]},"vcpus_per_node":{"type":"integer","format":"int32","minimum":0}}}]},"ExportedIdentity":{"type":"object","required":["source","external_id","created_at"],"properties":{"created_at":{"type":"string","format":"date-time","description":"Resource creation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"external_id":{"type":"string"},"source":{"$ref":"#/components/schemas/IdentityProvider"}}},"ExportedInvitation":{"type":"object","required":["tenant_id","status","created_at"],"properties":{"created_at":{"type":"string","format":"date-time","description":"Resource creation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"status":{"$ref":"#/components/schemas/InvitationStatus"},"tenant_id":{"$ref":"#/components/schemas/TenantId"}}},"ExportedMembership":{"type":"object","required":["tenant_id","tenant_name","roles","permissions","joined_at"],"properties":{"joined_at":{"type":"string","format":"date-time"},"permissions":{"type":"array","items":{"type":"string"}},"roles":{"type":"array","items":{"$ref":"#/components/schemas/RoleName"}},"tenant_id":{"$ref":"#/components/schemas/TenantId"},"tenant_name":{"$ref":"#/components/schemas/TenantName"}}},"ExportedSession":{"type":"object","required":["id","created_at","expiry_at"],"properties":{"created_at":{"type":"string","format":"date-time","description":"Resource creation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"expiry_at":{"type":"string","format":"date-time","description":"Expiration timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"id":{"$ref":"#/components/schemas/SessionId"}}},"ExportedSettings":{"type":"object","required":["theme","ip_binding"],"properties":{"default_division_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DivisionId"}]},"default_tenant_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/TenantId"}]},"ip_binding":{"type":"boolean"},"theme":{"$ref":"#/components/schemas/Theme"}}},"ExportedUser":{"type":"object","required":["id","email","name","created_at"],"properties":{"created_at":{"type":"string","format":"date-time","description":"Resource creation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"email":{"$ref":"#/components/schemas/Email"},"id":{"$ref":"#/components/schemas/UserId"},"name":{"$ref":"#/components/schemas/FullName"}}},"ExtendDeployment":{"type":"object","required":["nodes"],"properties":{"nodes":{"type":"array","items":{"$ref":"#/components/schemas/NodeToExtend"}}}},"FieldIssue":{"type":"object","required":["code","reason"],"properties":{"code":{"type":"string"},"path":{"type":["string","null"]},"reason":{"type":"string"}}},"FullName":{"type":"string","example":"Alice Doe"},"GcpByocDeployment":{"type":"object","required":["project_id","service_account_email","vpc_name"],"properties":{"project_id":{"$ref":"#/components/schemas/GcpProjectId"},"service_account_email":{"$ref":"#/components/schemas/GcpServiceAccountEmail"},"vpc_name":{"$ref":"#/components/schemas/HyphenName"}}},"GcpCloudAccountSettings":{"type":"object","properties":{"vpc_cidr":{"type":["string","null"]},"vpc_network":{"type":["string","null"]}}},"GcpProjectId":{"type":"string","description":"A validated GCP project ID.\n\nGCP project IDs must follow these rules:\n- 6–30 characters\n- Lowercase letters, digits, and hyphens only\n- Starts with a lowercase letter\n- Does not end with a hyphen","example":"acme-prod-123456"},"GcpServiceAccountEmail":{"type":"string","description":"A validated GCP service account email address.\n\nGCP service account emails follow the format:\n  `{name}@{project}.iam.gserviceaccount.com`\n\nValidation rules:\n- Must contain exactly one `@`\n- Must end with `.iam.gserviceaccount.com`\n- Must not contain path-traversal or control characters (`/`, `\\`, `:`)\n- The local part (before `@`) must be non-empty\n\nThis newtype prevents URL injection when the email is interpolated into\nthe IAM Credentials API impersonation endpoint.","example":"laserdata-byoc@acme-prod-123456.iam.gserviceaccount.com"},"GenerateByocSetup":{"type":"object","required":["cloud","region"],"properties":{"cloud":{"$ref":"#/components/schemas/Cloud"},"region":{"$ref":"#/components/schemas/Region"}}},"HyphenName":{"type":"string","example":"iggy-prod-vpc"},"IdentityProvider":{"type":"string","enum":["google","github","microsoft"]},"IntentRedirect":{"type":"object","required":["url"],"properties":{"url":{"type":"string"}}},"InvitationId":{"type":"integer","format":"int64","example":611298765432109070,"minimum":0},"InvitationInfo":{"type":"object","required":["id","status","tenant","roles"],"properties":{"id":{"$ref":"#/components/schemas/InvitationId"},"roles":{"type":"array","items":{"type":"string"},"description":"Role names the invitee will receive on acceptance. System roles are `admin`,\n`developer`, `viewer`, `billing`; tenants may also define custom roles via\n`POST /tenants/{tenant_id}/roles`. Empty when the invitation grants no role."},"status":{"$ref":"#/components/schemas/InvitationStatus"},"tenant":{"$ref":"#/components/schemas/TenantName"}},"example":{"id":7261845127892140000,"roles":["developer","billing"],"status":"pending","tenant":"Acme"}},"InvitationStatus":{"type":"string","enum":["pending","accepted","rejected"]},"InviteMember":{"type":"object","required":["email"],"properties":{"division_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DivisionId"}]},"email":{"$ref":"#/components/schemas/Email"},"roles":{"type":["array","null"],"items":{"$ref":"#/components/schemas/RoleId"}}}},"InvoiceId":{"type":"integer","format":"int64","example":611298765432109068,"minimum":0},"InvoiceStatus":{"type":"string","enum":["draft","pending","approved","paid","failed","cancelled","refunded","partially_refunded"]},"JoinPolicy":{"type":"string","enum":["invite_only","open","request_to_join"]},"LinkAccount":{"type":"object","required":["id","token"],"properties":{"id":{"type":"string"},"source":{"$ref":"#/components/schemas/IdentityProvider"},"token":{"type":"string"}}},"LocalNvmeRate":{"type":"object","required":["tier","gb_per_node","monthly_per_node","min_throughput_mb_per_second"],"properties":{"gb_per_node":{"type":"integer","format":"int32","minimum":0},"min_throughput_mb_per_second":{"type":"string"},"monthly_per_node":{"type":"string"},"tier":{"$ref":"#/components/schemas/DeploymentTier"}}},"ManagedRates":{"type":"object","required":["aws","gcp"],"properties":{"aws":{"$ref":"#/components/schemas/CloudRates"},"gcp":{"$ref":"#/components/schemas/CloudRates"}}},"ManagedTier":{"type":"string","enum":["standard","performance","enterprise"]},"ManagedTierRate":{"type":"object","required":["managed_tier","monthly_base","compute_profile_id","storage_profile_id","storage_gb_per_node","throughput_mb_per_second","availability_mode","included_telemetry_days","vpc_peering","private_link"],"properties":{"availability_mode":{"$ref":"#/components/schemas/AvailabilityMode"},"compute_profile_id":{"$ref":"#/components/schemas/DeploymentTier"},"included_telemetry_days":{"type":"integer","format":"int32","minimum":0},"managed_tier":{"$ref":"#/components/schemas/ManagedTier"},"monthly_base":{"type":"string"},"private_link":{"type":"boolean"},"storage_gb_per_node":{"type":"integer","format":"int32","minimum":0},"storage_profile_id":{"$ref":"#/components/schemas/StorageProfileId"},"throughput_mb_per_second":{"type":"string"},"vpc_peering":{"type":"boolean"}}},"MemberDetails":{"type":"object","required":["id","email","name","active","roles","created_at"],"properties":{"active":{"type":"boolean"},"created_at":{"type":"string","format":"date-time","description":"Resource creation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"email":{"$ref":"#/components/schemas/Email"},"id":{"$ref":"#/components/schemas/UserId"},"name":{"$ref":"#/components/schemas/FullName"},"roles":{"type":"array","items":{"type":"string"},"description":"Role names assigned to this member. System roles are `admin`, `developer`, `viewer`,\n`billing`; tenants may also define custom roles via `POST /tenants/{tenant_id}/roles`."}},"example":{"active":true,"created_at":"2026-05-20T10:00:00Z","email":"alice@acme.com","id":611298765432109069,"name":"Alice Doe","roles":["developer","billing"]}},"MemberInfo":{"type":"object","required":["id","email","name"],"properties":{"email":{"$ref":"#/components/schemas/Email"},"id":{"$ref":"#/components/schemas/UserId"},"name":{"$ref":"#/components/schemas/FullName"}}},"NetworkDriveRate":{"type":"object","required":["min_gb_per_node","max_gb_per_node","per_gb_month"],"properties":{"max_gb_per_node":{"type":"integer","format":"int32","minimum":0},"min_gb_per_node":{"type":"integer","format":"int32","minimum":0},"per_gb_month":{"type":"string"}}},"NetworkRates":{"type":"object","required":["minimum_monthly","same_region","cross_region_same_cloud","cross_cloud","multi_az_per_gb"],"properties":{"cross_cloud":{"type":"array","items":{"$ref":"#/components/schemas/UsageRate"}},"cross_region_same_cloud":{"type":"array","items":{"$ref":"#/components/schemas/UsageRate"}},"minimum_monthly":{"$ref":"#/components/schemas/AvailabilityRate"},"multi_az_per_gb":{"type":"string"},"same_region":{"type":"array","items":{"$ref":"#/components/schemas/UsageRate"}}}},"NetworkScope":{"type":"string","enum":["same_region","cross_region_same_cloud","cross_cloud"]},"NetworkTput":{"type":"integer","format":"int32","description":"Network throughput in decimal KB/s (1000 KB = 1 MB)","example":1024,"minimum":0},"NewAccount":{"type":"object","required":["verified"],"properties":{"division_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DivisionId"}]},"division_name":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DivisionName"}]},"linked_accounts":{"type":["array","null"],"items":{"$ref":"#/components/schemas/IdentityProvider"}},"session":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SessionInfo"}]},"tenant_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/TenantId"}]},"tenant_name":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/TenantName"}]},"verified":{"type":"boolean"},"workspace":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/WorkspaceState"}]}}},"NodeToExtend":{"type":"object","required":["count"],"properties":{"count":{"type":"integer","format":"int32","example":3,"minimum":0}}},"Paged_ApiKeyInfo":{"type":"object","required":["total_pages","total_results","page","items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","user_id","role_id","role_name","name","validate_ip","allowed_ips","expiry_at","created_at"],"properties":{"allowed_ips":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string","format":"date-time","description":"Resource creation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"division_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DivisionId"}]},"division_name":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DivisionName"}]},"expiry_at":{"type":"string","format":"date-time","description":"Expiration timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"id":{"$ref":"#/components/schemas/ApiKeyId"},"name":{"$ref":"#/components/schemas/ApiKeyName"},"role_id":{"$ref":"#/components/schemas/RoleId"},"role_name":{"$ref":"#/components/schemas/RoleName"},"user_id":{"$ref":"#/components/schemas/UserId"},"validate_ip":{"type":"boolean"}},"example":{"allowed_ips":["203.0.113.10","203.0.113.11"],"created_at":"2026-05-20T10:00:00Z","division_id":7261844974723780000,"division_name":"Engineering","expiry_at":"2027-01-15T12:00:00Z","id":7261845198004700001,"name":"ci-pipeline","role_id":611298765432109010,"role_name":"ci-deployer","user_id":611298765432109069,"validate_ip":true}}},"page":{"type":"integer","format":"int64","example":1,"minimum":1},"total_pages":{"type":"integer","format":"int64","example":4,"minimum":0},"total_results":{"type":"integer","format":"int64","example":137,"minimum":0}}},"Paged_BillingReportInfo":{"type":"object","required":["total_pages","total_results","page","items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","deployment_id","name","cloud","variant","from","to","total_cost","currency"],"properties":{"cloud":{"$ref":"#/components/schemas/Cloud"},"currency":{"$ref":"#/components/schemas/Currency"},"deployment_id":{"$ref":"#/components/schemas/DeploymentId"},"from":{"type":"string","format":"date-time"},"id":{"$ref":"#/components/schemas/DeploymentReportId"},"name":{"type":"string"},"region":{"type":["string","null"]},"tier":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DeploymentTier"}]},"to":{"type":"string","format":"date-time"},"total_cost":{"type":"string"},"variant":{"$ref":"#/components/schemas/DeploymentVariant"}},"example":{"cloud":"aws","currency":"USD","deployment_id":7261845127892140000,"from":"2026-04-01T00:00:00Z","id":7261845701661510000,"name":"iggy-prod-01","region":"us-east-1","tier":"small","to":"2026-05-01T00:00:00Z","total_cost":"182.45","variant":"managed"}}},"page":{"type":"integer","format":"int64","example":1,"minimum":1},"total_pages":{"type":"integer","format":"int64","example":4,"minimum":0},"total_results":{"type":"integer","format":"int64","example":137,"minimum":0}}},"Paged_CloudAccountInfo":{"type":"object","required":["total_pages","total_results","page","items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","cloud","name","account_id","status","created_at","updated_at"],"properties":{"account_id":{"type":"string"},"cloud":{"$ref":"#/components/schemas/Cloud"},"created_at":{"type":"string","format":"date-time","description":"Resource creation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"id":{"$ref":"#/components/schemas/CloudAccountId"},"name":{"$ref":"#/components/schemas/CloudAccountName"},"region":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Region"}]},"status":{"$ref":"#/components/schemas/Status"},"updated_at":{"type":"string","format":"date-time","description":"Resource last-update timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"validated_at":{"type":["string","null"],"format":"date-time","description":"Validation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"}},"example":{"account_id":"123456789012","cloud":"aws","created_at":"2026-05-20T10:00:00Z","id":7261845211446120000,"name":"acme-prod-aws","region":"us-east-1","status":"active","updated_at":"2026-05-20T10:00:00Z","validated_at":"2026-05-20T10:00:00Z"}}},"page":{"type":"integer","format":"int64","example":1,"minimum":1},"total_pages":{"type":"integer","format":"int64","example":4,"minimum":0},"total_results":{"type":"integer","format":"int64","example":137,"minimum":0}}},"Paged_ConnectorInfo":{"type":"object","required":["total_pages","total_results","page","items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["key","type","name","description","available","permitted"],"properties":{"available":{"type":"boolean"},"description":{"type":"string"},"key":{"type":"string"},"name":{"type":"string"},"permitted":{"type":"boolean"},"type":{"$ref":"#/components/schemas/ConnectorType"}},"example":{"available":true,"description":"Stream messages from an Iggy topic to a PostgreSQL table.","key":"iggy.postgres.sink","name":"PostgreSQL Sink","permitted":true,"type":"sink"}}},"page":{"type":"integer","format":"int64","example":1,"minimum":1},"total_pages":{"type":"integer","format":"int64","example":4,"minimum":0},"total_results":{"type":"integer","format":"int64","example":137,"minimum":0}}},"Paged_CustomerInvoiceInfo":{"type":"object","required":["total_pages","total_results","page","items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","tenant_id","number","period_start","period_end","status","currency","total","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"currency":{"$ref":"#/components/schemas/Currency"},"division_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DivisionId"}]},"id":{"$ref":"#/components/schemas/InvoiceId"},"number":{"type":"string"},"period_end":{"type":"string","format":"date-time"},"period_start":{"type":"string","format":"date-time"},"status":{"$ref":"#/components/schemas/InvoiceStatus"},"tenant_id":{"$ref":"#/components/schemas/TenantId"},"total":{"type":"string"}},"example":{"created_at":"2026-05-02T10:00:00Z","currency":"USD","division_id":7261844974723780000,"id":7261845776048540000,"number":"INV-2026-000182","period_end":"2026-05-01T00:00:00Z","period_start":"2026-04-01T00:00:00Z","status":"approved","tenant_id":7261845022003200001,"total":"182.45"}}},"page":{"type":"integer","format":"int64","example":1,"minimum":1},"total_pages":{"type":"integer","format":"int64","example":4,"minimum":0},"total_results":{"type":"integer","format":"int64","example":137,"minimum":0}}},"Paged_DeploymentInfo":{"type":"object","required":["total_pages","total_results","page","items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","name","code","variant","domain","cloud","area","cluster","runtimes","nodes_count","protected","encrypted","dedicated","shared","storage_type","storage_size","availability_mode","retention","can_upgrade","created_at","updated_at"],"properties":{"area":{"$ref":"#/components/schemas/Area"},"availability_mode":{"$ref":"#/components/schemas/AvailabilityMode"},"can_upgrade":{"type":"boolean"},"cloud":{"$ref":"#/components/schemas/Cloud"},"cluster":{"$ref":"#/components/schemas/ClusterKind"},"code":{"type":"string"},"created_at":{"type":"string","format":"date-time","example":"2026-05-20T10:00:00Z"},"dedicated":{"type":"boolean"},"domain":{"type":"string"},"encrypted":{"type":"boolean"},"id":{"$ref":"#/components/schemas/DeploymentId"},"name":{"$ref":"#/components/schemas/DeploymentName"},"nodes_count":{"type":"integer","format":"int32","minimum":0},"protected":{"type":"boolean","example":true},"rate_limit":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DeploymentNetworkRateLimit"}]},"region":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Region"}]},"retention":{"$ref":"#/components/schemas/DeploymentRetention"},"runtimes":{"type":"array","items":{"$ref":"#/components/schemas/RuntimeType"}},"shared":{"type":"boolean"},"storage_size":{"$ref":"#/components/schemas/StorageSize"},"storage_type":{"$ref":"#/components/schemas/StorageType"},"supervisor_url":{"type":["string","null"],"example":"https://supervisor-aws-us.laserdata.cloud"},"target_network_tput":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NetworkTput"}]},"tier":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DeploymentTier"}]},"updated_at":{"type":"string","format":"date-time","example":"2026-05-20T10:00:00Z"},"upgraded_at":{"type":["string","null"],"format":"date-time","example":"2026-05-20T10:00:00Z"},"variant":{"$ref":"#/components/schemas/DeploymentVariant"}},"example":{"area":"us","availability_mode":"multi_az","can_upgrade":true,"cloud":"aws","cluster":"standalone","code":"AXJ-7Q2","created_at":"2026-05-20T10:00:00Z","dedicated":false,"domain":"iggy-prod-01.acme.laserdata.cloud","encrypted":true,"id":7261845127892140000,"name":"iggy-prod-01","nodes_count":3,"protected":true,"region":"us-east-1","retention":{"telemetry":{"heartbeats_days":7,"logs_days":7,"metrics_days":7}},"runtimes":["iggy","warden"],"shared":false,"storage_size":500,"storage_type":"network_balanced","supervisor_url":"https://supervisor-aws-us.laserdata.cloud","tier":"small","updated_at":"2026-05-20T10:00:00Z","upgraded_at":null,"variant":"managed"}}},"page":{"type":"integer","format":"int64","example":1,"minimum":1},"total_pages":{"type":"integer","format":"int64","example":4,"minimum":0},"total_results":{"type":"integer","format":"int64","example":137,"minimum":0}}},"Paged_DivisionInfo":{"type":"object","required":["total_pages","total_results","page","items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","name","protected","created_at","updated_at"],"properties":{"created_at":{"type":"string","format":"date-time","description":"Resource creation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"id":{"$ref":"#/components/schemas/DivisionId"},"name":{"$ref":"#/components/schemas/DivisionName"},"protected":{"type":"boolean","description":"When `true`, deletion is hardened: the DELETE request must include a one-time\nconfirmation code emailed to the tenant address. Obtain the code via\n`PUT /tenants/{tenant_id}/request_code` with `action = \"delete_division\"` and pass\nit as the `code` query parameter on the DELETE call.","example":true},"updated_at":{"type":"string","format":"date-time","description":"Resource last-update timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"}},"example":{"created_at":"2026-05-20T10:00:00Z","id":7261844974723780000,"name":"Engineering","protected":true,"updated_at":"2026-05-20T10:00:00Z"}}},"page":{"type":"integer","format":"int64","example":1,"minimum":1},"total_pages":{"type":"integer","format":"int64","example":4,"minimum":0},"total_results":{"type":"integer","format":"int64","example":137,"minimum":0}}},"Paged_EnvironmentInfo":{"type":"object","required":["total_pages","total_results","page","items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","name","deployments_count","protected","created_at","updated_at"],"properties":{"created_at":{"type":"string","format":"date-time","description":"Resource creation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"deployments_count":{"type":"integer","format":"int32","minimum":0},"id":{"$ref":"#/components/schemas/EnvironmentId"},"name":{"$ref":"#/components/schemas/EnvironmentName"},"protected":{"type":"boolean","description":"When `true`, deletion is hardened: the DELETE request must include a one-time\nconfirmation code emailed to the tenant address. Obtain the code via\n`PUT /tenants/{tenant_id}/request_code` with `action = \"delete_environment\"` and\npass it as the `code` query parameter on the DELETE call.","example":true},"updated_at":{"type":"string","format":"date-time","description":"Resource last-update timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"}},"example":{"created_at":"2026-05-20T10:00:00Z","deployments_count":3,"id":7261845066528310000,"name":"production","protected":true,"updated_at":"2026-05-20T10:00:00Z"}}},"page":{"type":"integer","format":"int64","example":1,"minimum":1},"total_pages":{"type":"integer","format":"int64","example":4,"minimum":0},"total_results":{"type":"integer","format":"int64","example":137,"minimum":0}}},"Paged_InvitationInfo":{"type":"object","required":["total_pages","total_results","page","items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","status","tenant","roles"],"properties":{"id":{"$ref":"#/components/schemas/InvitationId"},"roles":{"type":"array","items":{"type":"string"},"description":"Role names the invitee will receive on acceptance. System roles are `admin`,\n`developer`, `viewer`, `billing`; tenants may also define custom roles via\n`POST /tenants/{tenant_id}/roles`. Empty when the invitation grants no role."},"status":{"$ref":"#/components/schemas/InvitationStatus"},"tenant":{"$ref":"#/components/schemas/TenantName"}},"example":{"id":7261845127892140000,"roles":["developer","billing"],"status":"pending","tenant":"Acme"}}},"page":{"type":"integer","format":"int64","example":1,"minimum":1},"total_pages":{"type":"integer","format":"int64","example":4,"minimum":0},"total_results":{"type":"integer","format":"int64","example":137,"minimum":0}}},"Paged_MemberDetails":{"type":"object","required":["total_pages","total_results","page","items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","email","name","active","roles","created_at"],"properties":{"active":{"type":"boolean"},"created_at":{"type":"string","format":"date-time","description":"Resource creation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"email":{"$ref":"#/components/schemas/Email"},"id":{"$ref":"#/components/schemas/UserId"},"name":{"$ref":"#/components/schemas/FullName"},"roles":{"type":"array","items":{"type":"string"},"description":"Role names assigned to this member. System roles are `admin`, `developer`, `viewer`,\n`billing`; tenants may also define custom roles via `POST /tenants/{tenant_id}/roles`."}},"example":{"active":true,"created_at":"2026-05-20T10:00:00Z","email":"alice@acme.com","id":611298765432109069,"name":"Alice Doe","roles":["developer","billing"]}}},"page":{"type":"integer","format":"int64","example":1,"minimum":1},"total_pages":{"type":"integer","format":"int64","example":4,"minimum":0},"total_results":{"type":"integer","format":"int64","example":137,"minimum":0}}},"Paged_RoleBasicInfo":{"type":"object","required":["total_pages","total_results","page","items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","name","kind"],"properties":{"id":{"$ref":"#/components/schemas/RoleId"},"kind":{"$ref":"#/components/schemas/TenantRoleKind"},"name":{"$ref":"#/components/schemas/RoleName"}},"example":{"id":611298765432109010,"kind":"system","name":"developer"}}},"page":{"type":"integer","format":"int64","example":1,"minimum":1},"total_pages":{"type":"integer","format":"int64","example":4,"minimum":0},"total_results":{"type":"integer","format":"int64","example":137,"minimum":0}}},"Paged_RoleMemberInfo":{"type":"object","required":["total_pages","total_results","page","items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","email","name","active"],"properties":{"active":{"type":"boolean"},"email":{"$ref":"#/components/schemas/Email"},"id":{"$ref":"#/components/schemas/UserId"},"name":{"$ref":"#/components/schemas/FullName"}},"example":{"active":true,"email":"alice@acme.com","id":611298765432109069,"name":"Alice Doe"}}},"page":{"type":"integer","format":"int64","example":1,"minimum":1},"total_pages":{"type":"integer","format":"int64","example":4,"minimum":0},"total_results":{"type":"integer","format":"int64","example":137,"minimum":0}}},"Paged_TenantInvitationInfo":{"type":"object","required":["total_pages","total_results","page","items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","status","email","roles"],"properties":{"email":{"$ref":"#/components/schemas/Email"},"id":{"$ref":"#/components/schemas/InvitationId"},"roles":{"type":"array","items":{"type":"string"},"description":"Role names the invitee will receive on acceptance. System roles are `admin`,\n`developer`, `viewer`, `billing`; tenants may also define custom roles via\n`POST /tenants/{tenant_id}/roles`. Empty when the invitation grants no role."},"status":{"$ref":"#/components/schemas/InvitationStatus"}},"example":{"email":"invitee@acme.com","id":7261845127892140000,"roles":["developer"],"status":"pending"}}},"page":{"type":"integer","format":"int64","example":1,"minimum":1},"total_pages":{"type":"integer","format":"int64","example":4,"minimum":0},"total_results":{"type":"integer","format":"int64","example":137,"minimum":0}}},"PartitionCapacity":{"type":"object","description":"What bounds partitions on a profile: one Iggy shard per vCPU and the segment each partition keeps on disk.","required":["shards_per_node","default_segment_bytes","min_segment_bytes"],"properties":{"default_segment_bytes":{"type":"integer","format":"int64","minimum":0},"min_segment_bytes":{"type":"integer","format":"int64","minimum":0},"shards_per_node":{"type":"integer","format":"int32","minimum":0}}},"PaymentInfo":{"type":"object","required":["provider","auto_charge"],"properties":{"auto_charge":{"type":"boolean"},"card_brand":{"type":["string","null"]},"card_exp_month":{"type":["integer","null"],"format":"int32","minimum":0},"card_exp_year":{"type":["integer","null"],"format":"int32","minimum":0},"card_last4":{"type":["string","null"]},"coupon_id":{"type":["string","null"]},"currency":{"type":["string","null"]},"customer_id":{"type":["string","null"]},"discount_percent":{"type":["string","null"]},"invoice_prefix":{"type":["string","null"]},"metadata":{"type":["string","null"]},"payment_method_id":{"type":["string","null"]},"payment_terms_days":{"type":["integer","null"],"format":"int32","minimum":0},"provider":{"$ref":"#/components/schemas/PaymentProvider"},"subscription_id":{"type":["string","null"]},"tax_exempt":{"type":["string","null"]}}},"PaymentProvider":{"type":"string","enum":["manual","stripe","pay_pal","bank_transfer","aws_marketplace","gcp_marketplace","unknown"]},"PermissionInfo":{"type":"object","required":["key","name","resource","description"],"properties":{"description":{"type":"string"},"key":{"type":"string"},"name":{"type":"string"},"resource":{"type":"string"}}},"PlanFeatures":{"type":"object","required":["invitations_limit","members_limit","roles_limit","divisions_limit","environments_limit","deployment_tiers","deployment_access_rules_limit","deployment_configs_limit","deployment_backups_limit","private_connections_limit","private_endpoints_limit","byoc_enabled","cluster_enabled","on_premise_enabled","private_networking_enabled","multi_az_enabled","dedicated_enabled","backup_enabled","cross_region_dr_enabled","audit_retention_days","api_keys_limit","cloud_accounts_limit","notification_channels_limit","notification_subscriptions_limit","deployment_snapshots_limit","custom_domains_limit","backup_regions_limit","nodes_per_deployment_limit","backup_retention_days","snapshot_retention_days","pending_invitations_limit","api_key_allowed_ips_limit","divisions_per_role_limit","environments_per_division_limit","concurrent_deployments_limit","verified_domains_limit","audit_export_enabled","advanced_connectors_enabled","custom_idp_enabled","customer_managed_keys_enabled","advanced_notification_channels_enabled","scim_enabled"],"properties":{"advanced_connectors_enabled":{"type":"boolean"},"advanced_notification_channels_enabled":{"type":"boolean"},"api_key_allowed_ips_limit":{"type":"integer","format":"int32","minimum":0},"api_keys_limit":{"type":"integer","format":"int32","minimum":0},"audit_export_enabled":{"type":"boolean"},"audit_retention_days":{"type":"integer","format":"int32","minimum":0},"backup_enabled":{"type":"boolean"},"backup_regions_limit":{"type":"integer","format":"int32","minimum":0},"backup_retention_days":{"type":"integer","format":"int32","minimum":0},"byoc_enabled":{"type":"boolean"},"cloud_accounts_limit":{"type":"integer","format":"int32","minimum":0},"cluster_enabled":{"type":"boolean"},"concurrent_deployments_limit":{"type":"integer","format":"int32","minimum":0},"cross_region_dr_enabled":{"type":"boolean"},"custom_domains_limit":{"type":"integer","format":"int32","minimum":0},"custom_idp_enabled":{"type":"boolean"},"customer_managed_keys_enabled":{"type":"boolean"},"dedicated_enabled":{"type":"boolean"},"deployment_access_rules_limit":{"type":"integer","format":"int32","minimum":0},"deployment_backups_limit":{"type":"integer","format":"int32","minimum":0},"deployment_configs_limit":{"type":"integer","format":"int32","minimum":0},"deployment_snapshots_limit":{"type":"integer","format":"int32","minimum":0},"deployment_tiers":{"type":"array","items":{"$ref":"#/components/schemas/DeploymentTierLimit"}},"divisions_limit":{"type":"integer","format":"int32","minimum":0},"divisions_per_role_limit":{"type":"integer","format":"int32","minimum":0},"environments_limit":{"type":"integer","format":"int32","minimum":0},"environments_per_division_limit":{"type":"integer","format":"int32","minimum":0},"invitations_limit":{"type":"integer","format":"int32","minimum":0},"members_limit":{"type":"integer","format":"int32","minimum":0},"multi_az_enabled":{"type":"boolean"},"nodes_per_deployment_limit":{"type":"integer","format":"int32","minimum":0},"notification_channels_limit":{"type":"integer","format":"int32","minimum":0},"notification_subscriptions_limit":{"type":"integer","format":"int32","minimum":0},"on_premise_enabled":{"type":"boolean"},"pending_invitations_limit":{"type":"integer","format":"int32","minimum":0},"private_connections_limit":{"type":"integer","format":"int32","minimum":0},"private_endpoints_limit":{"type":"integer","format":"int32","minimum":0},"private_networking_enabled":{"type":"boolean"},"roles_limit":{"type":"integer","format":"int32","minimum":0},"scim_enabled":{"type":"boolean"},"snapshot_retention_days":{"type":"integer","format":"int32","minimum":0},"verified_domains_limit":{"type":"integer","format":"int32","minimum":0}}},"PreviewDeployment":{"type":"object","required":["cloud","region","tier"],"properties":{"availability_mode":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AvailabilityMode"}]},"cloud":{"$ref":"#/components/schemas/Cloud"},"managed_tier":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ManagedTier"}]},"network_scope":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NetworkScope"}]},"region":{"$ref":"#/components/schemas/Region"},"storage":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CloudStorageSettings"}]},"target_network_tput":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NetworkTput"}]},"tier":{"$ref":"#/components/schemas/DeploymentTier"}}},"PricingEstimate":{"type":"object","required":["currency","monthly_base","monthly_total","breakdown","usage","deployment","capacity","pricing_version"],"properties":{"breakdown":{"$ref":"#/components/schemas/PricingEstimateBreakdown"},"capacity":{"$ref":"#/components/schemas/PartitionCapacity"},"currency":{"$ref":"#/components/schemas/Currency"},"deployment":{"$ref":"#/components/schemas/PricingEstimateDeployment"},"monthly_base":{"type":"string","description":"Reserved resources and tier features, excluding estimated transfer."},"monthly_total":{"type":"string"},"pricing_version":{"type":"integer","format":"int32","minimum":0},"usage":{"$ref":"#/components/schemas/PricingEstimateUsage"}}},"PricingEstimateBreakdown":{"type":"object","required":["compute","storage","network"],"properties":{"compute":{"type":"string"},"network":{"type":"string"},"storage":{"type":"string"}}},"PricingEstimateDeployment":{"type":"object","required":["nodes","compute_profile_label","storage_profile_label","availability_mode","included_telemetry_days"],"properties":{"availability_mode":{"$ref":"#/components/schemas/AvailabilityMode"},"compute_profile_label":{"type":"string"},"included_telemetry_days":{"type":"integer","format":"int32","minimum":0},"nodes":{"type":"integer","format":"int32","minimum":0},"storage_profile_label":{"type":"string"}}},"PricingEstimateUsage":{"type":"object","required":["estimated_customer_gb_per_month","provisioned_storage_gb_total","partitions_per_node_at_default_segment","partitions_per_node_at_min_segment"],"properties":{"estimated_customer_gb_per_month":{"type":"string"},"partitions_per_node_at_default_segment":{"type":"integer","format":"int64","minimum":0},"partitions_per_node_at_min_segment":{"type":"integer","format":"int64","minimum":0},"provisioned_storage_gb_total":{"type":"integer","format":"int32","minimum":0}}},"PricingInfo":{"type":"object","description":"Public rate card. Sell rates only, every amount is per UTC calendar month.","required":["currency","nodes","managed","byoc"],"properties":{"byoc":{"$ref":"#/components/schemas/ByocRates"},"currency":{"$ref":"#/components/schemas/Currency"},"managed":{"$ref":"#/components/schemas/ManagedRates"},"nodes":{"type":"integer","format":"int32","minimum":0}}},"PromoCodeId":{"type":"integer","format":"int64","minimum":0},"RedeemPromoCode":{"type":"object","required":["code"],"properties":{"code":{"type":"string"}}},"Region":{"type":"string","example":"us-east-1"},"RegionInfo":{"type":"object","required":["key","name"],"properties":{"key":{"type":"string"},"name":{"type":"string"}}},"RequestResourceCode":{"type":"object","required":["action"],"properties":{"action":{"$ref":"#/components/schemas/ResourceCodeAction"}}},"ResourceCodeAction":{"oneOf":[{"type":"object","required":["payload","action_type"],"properties":{"action_type":{"type":"string","enum":["delete_tenant"]},"payload":{"$ref":"#/components/schemas/DeleteTenantPayload"}}},{"type":"object","required":["payload","action_type"],"properties":{"action_type":{"type":"string","enum":["delete_division"]},"payload":{"$ref":"#/components/schemas/DeleteDivisionPayload"}}},{"type":"object","required":["payload","action_type"],"properties":{"action_type":{"type":"string","enum":["delete_environment"]},"payload":{"$ref":"#/components/schemas/DeleteEnvironmentPayload"}}},{"type":"object","required":["payload","action_type"],"properties":{"action_type":{"type":"string","enum":["delete_deployment"]},"payload":{"$ref":"#/components/schemas/DeleteDeploymentPayload"}}}]},"RetentionSettings":{"type":"object","required":["telemetry_days"],"properties":{"telemetry_days":{"type":"integer","format":"int32","example":14,"minimum":0}}},"RevokeRoleMembers":{"type":"object","required":["members"],"properties":{"members":{"type":"array","items":{"$ref":"#/components/schemas/UserId"}}}},"RoleBasicInfo":{"type":"object","required":["id","name","kind"],"properties":{"id":{"$ref":"#/components/schemas/RoleId"},"kind":{"$ref":"#/components/schemas/TenantRoleKind"},"name":{"$ref":"#/components/schemas/RoleName"}},"example":{"id":611298765432109010,"kind":"system","name":"developer"}},"RoleDetails":{"allOf":[{"$ref":"#/components/schemas/RoleBasicInfo"},{"type":"object","required":["permissions"],"properties":{"permissions":{"$ref":"#/components/schemas/RolePermissionsInfo"}}}]},"RoleId":{"type":"integer","format":"int64","example":7261845001236500000,"minimum":0},"RoleMemberInfo":{"type":"object","required":["id","email","name","active"],"properties":{"active":{"type":"boolean"},"email":{"$ref":"#/components/schemas/Email"},"id":{"$ref":"#/components/schemas/UserId"},"name":{"$ref":"#/components/schemas/FullName"}},"example":{"active":true,"email":"alice@acme.com","id":611298765432109069,"name":"Alice Doe"}},"RoleName":{"type":"string","example":"tenant-admin"},"RolePermissions":{"type":"object","properties":{"division":{"type":["array","null"],"items":{"type":"string"}},"divisions":{"type":["object","null"],"additionalProperties":{"$ref":"#/components/schemas/DivisionPermissions"},"propertyNames":{"type":"string"}},"environment":{"type":["array","null"],"items":{"type":"string"}},"tenant":{"type":["array","null"],"items":{"type":"string"}}}},"RolePermissionsInfo":{"type":"object","required":["tenant","division","environment","divisions"],"properties":{"division":{"type":"array","items":{"type":"string"}},"divisions":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/DivisionPermissionsInfo"},"propertyNames":{"type":"string"}},"environment":{"type":"array","items":{"type":"string"}},"tenant":{"type":"array","items":{"type":"string"}}}},"RuntimeType":{"type":"string","description":"Runtime identifier: `warden`, `iggy`, `connectors`, `connector:{id}`, `plane`, or `mcp`.","examples":["iggy"]},"SessionId":{"type":"integer","format":"int64","example":611298765432109071,"minimum":0},"SessionInfo":{"type":"object","required":["email","expiry","csrf_token"],"properties":{"csrf_token":{"type":"string"},"email":{"$ref":"#/components/schemas/Email"},"expiry":{"type":"string","format":"date-time"}}},"SessionMetadata":{"type":"object","required":["ip_address","created_at","expiry_at"],"properties":{"created_at":{"type":"string","format":"date-time","description":"Resource creation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"expiry_at":{"type":"string","format":"date-time","description":"Expiration timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"ip_address":{"type":"string"},"user_agent":{"type":["string","null"]}}},"SetupIntentResponse":{"type":"object","required":["client_secret"],"properties":{"client_secret":{"type":"string"}}},"SignIn":{"type":"object","required":["id","token"],"properties":{"id":{"type":"string"},"source":{"$ref":"#/components/schemas/IdentityProvider"},"token":{"type":"string"}}},"SignUp":{"type":"object","required":["source","id","token","name","title"],"properties":{"feedback":{"type":["string","null"]},"id":{"type":"string"},"invitation":{"type":["string","null"]},"name":{"$ref":"#/components/schemas/FullName"},"source":{"$ref":"#/components/schemas/IdentityProvider"},"tenant":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/TenantName"}]},"title":{"$ref":"#/components/schemas/Title"},"token":{"type":"string"}}},"Status":{"type":"string","enum":["inactive","active","locked","deleted"]},"StorageInfo":{"type":"object","required":["key","name","description","available","clusters"],"properties":{"available":{"type":"boolean"},"clusters":{"type":"array","items":{"type":"string"}},"description":{"type":"string"},"key":{"type":"string"},"name":{"type":"string"}}},"StorageProfileId":{"type":"string","enum":["network_drive","local_nvme"]},"StorageSize":{"type":"integer","format":"int32","description":"Storage size in GB","minimum":0},"StorageType":{"type":"string","description":"Storage type for deployments\n\nFrontend should use these exact values: \"ssd\" or \"network\" (lowercase)\nThese are the only two supported storage types currently.","enum":["local_ssd","network_balanced","network_optimized","network_extreme"]},"TelemetryRetention":{"type":"object","required":["logs_days","metrics_days","heartbeats_days"],"properties":{"heartbeats_days":{"type":"integer","format":"int32","minimum":0},"logs_days":{"type":"integer","format":"int32","minimum":0},"metrics_days":{"type":"integer","format":"int32","minimum":0}}},"TenantConfig":{"type":"object","required":["join_policy","block_external_invitations","enforce_domain_only_invitations"],"properties":{"block_external_invitations":{"type":"boolean"},"enforce_domain_only_invitations":{"type":"boolean"},"join_policy":{"$ref":"#/components/schemas/JoinPolicy"}}},"TenantConfigInfo":{"allOf":[{"$ref":"#/components/schemas/TenantConfig"},{"type":"object","properties":{"email_domain":{"type":["string","null"]},"email_domain_verified_at":{"type":["string","null"],"format":"date-time","example":"2026-05-20T10:00:00Z"}}}]},"TenantCreditId":{"type":"integer","format":"int64","minimum":0},"TenantCreditInfo":{"type":"object","description":"Credit balance a tenant redeemed. Invoices consume `remaining` oldest first.","required":["id","tenant_id","promo_code_id","amount","remaining","currency","created_at"],"properties":{"amount":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"currency":{"$ref":"#/components/schemas/Currency"},"expires_at":{"type":["string","null"],"format":"date-time"},"id":{"$ref":"#/components/schemas/TenantCreditId"},"promo_code_id":{"$ref":"#/components/schemas/PromoCodeId"},"remaining":{"type":"string"},"tenant_id":{"$ref":"#/components/schemas/TenantId"}}},"TenantDetailsInfo":{"allOf":[{"$ref":"#/components/schemas/TenantInfo"},{"type":"object","required":["description","features","email","starter_available","has_payment_method","has_custom_email_domain"],"properties":{"description":{"$ref":"#/components/schemas/Description"},"email":{"$ref":"#/components/schemas/Email"},"features":{"$ref":"#/components/schemas/PlanFeatures"},"has_custom_email_domain":{"type":"boolean"},"has_payment_method":{"type":"boolean"},"remarks":{"type":["string","null"]},"starter_available":{"type":"boolean"},"status":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Status"}]},"subscription":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/TenantSubscriptionInfo"}]}}}]},"TenantDivision":{"type":"object","required":["name"],"properties":{"description":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Description"}]},"email":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Email"}]},"name":{"$ref":"#/components/schemas/DivisionName"},"protected":{"type":["boolean","null"],"description":"Optional. When `true`, deletion is hardened: deleting this division will require a\none-time confirmation code emailed to the tenant address (request via\n`PUT /tenants/{tenant_id}/request_code` with `action = \"delete_division\"`).\nDefaults to `false` when omitted.","example":false}}},"TenantId":{"type":"integer","format":"int64","example":7261845022003200001,"minimum":0},"TenantInfo":{"type":"object","required":["id","name","protected","created_at","updated_at"],"properties":{"created_at":{"type":"string","format":"date-time","description":"Resource creation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"id":{"$ref":"#/components/schemas/TenantId"},"name":{"$ref":"#/components/schemas/TenantName"},"protected":{"type":"boolean","description":"When `true`, deletion is hardened: the DELETE request must include a one-time\nconfirmation code emailed to the tenant address. Obtain the code via\n`PUT /tenants/{tenant_id}/request_code` with `action = \"delete_tenant\"` and pass it\nas the `code` query parameter on the DELETE call.","example":true},"remarks":{"type":["string","null"]},"updated_at":{"type":"string","format":"date-time","description":"Resource last-update timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"}},"example":{"created_at":"2026-05-20T10:00:00Z","id":7261845022003200001,"name":"Acme","protected":true,"updated_at":"2026-05-20T10:00:00Z"}},"TenantInvitationInfo":{"type":"object","required":["id","status","email","roles"],"properties":{"email":{"$ref":"#/components/schemas/Email"},"id":{"$ref":"#/components/schemas/InvitationId"},"roles":{"type":"array","items":{"type":"string"},"description":"Role names the invitee will receive on acceptance. System roles are `admin`,\n`developer`, `viewer`, `billing`; tenants may also define custom roles via\n`POST /tenants/{tenant_id}/roles`. Empty when the invitation grants no role."},"status":{"$ref":"#/components/schemas/InvitationStatus"}},"example":{"email":"invitee@acme.com","id":7261845127892140000,"roles":["developer"],"status":"pending"}},"TenantName":{"type":"string","example":"acme-corp"},"TenantPermissions":{"type":"object","required":["tenant","division","environment"],"properties":{"division":{"type":"array","items":{"$ref":"#/components/schemas/PermissionInfo"}},"environment":{"type":"array","items":{"$ref":"#/components/schemas/PermissionInfo"}},"tenant":{"type":"array","items":{"$ref":"#/components/schemas/PermissionInfo"}}}},"TenantRoleKind":{"type":"string","enum":["system","custom","api_key"]},"TenantStructure":{"type":"object","required":["id","name","divisions"],"properties":{"divisions":{"type":"array","items":{"$ref":"#/components/schemas/DivisionStructure"}},"id":{"$ref":"#/components/schemas/TenantId"},"name":{"$ref":"#/components/schemas/TenantName"}}},"TenantSubscriptionInfo":{"type":"object","required":["id","plan","active","created_at","valid_from","valid_to"],"properties":{"active":{"type":"boolean"},"created_at":{"type":"string","format":"date-time","description":"Resource creation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"id":{"type":"integer","format":"int64","minimum":0},"plan":{"type":"string"},"valid_from":{"type":"string","format":"date-time","description":"Inclusive validity start (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"valid_to":{"type":"string","format":"date-time","description":"Exclusive validity end (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"}}},"TenantSummaryInfo":{"type":"object","required":["total_divisions","total_environments","total_deployments"],"properties":{"total_deployments":{"type":"integer","format":"int32","minimum":0},"total_divisions":{"type":"integer","format":"int32","minimum":0},"total_environments":{"type":"integer","format":"int32","minimum":0}}},"Theme":{"type":"string","enum":["system","light","dark"]},"ThroughputLimits":{"type":"object","required":["min_mb_per_second","max_mb_per_second"],"properties":{"max_mb_per_second":{"type":"string"},"min_mb_per_second":{"type":"string"}}},"TierInfo":{"type":"object","required":["key","name","description","instance","available","vcpus","memory_gib","clusters","storages"],"properties":{"available":{"type":"boolean"},"clusters":{"type":"array","items":{"type":"string"}},"description":{"type":"string"},"instance":{"type":"string"},"key":{"type":"string"},"limit":{"type":["integer","null"],"format":"int32","minimum":0},"memory_gib":{"type":"integer","format":"int32","minimum":0},"name":{"type":"string"},"rate_limit":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DeploymentNetworkRateLimit"}]},"storages":{"type":"array","items":{"type":"string"}},"vcpus":{"type":"integer","format":"int32","minimum":0}}},"Title":{"type":"string","example":"Backend Engineer"},"UpdateApiKeySecurity":{"type":"object","properties":{"allowed_ips":{"type":["array","null"],"items":{"type":"string"}},"validate_ip":{"type":["boolean","null"]}}},"UpdateBillingInfo":{"allOf":[{"$ref":"#/components/schemas/BillingInfo"}]},"UpdateCloudAccount":{"type":"object","properties":{"account_id":{"type":["string","null"]},"name":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CloudAccountName"}]},"region":{"type":["string","null"]},"remarks":{"type":["string","null"]},"settings":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CloudAccountSettings"}]},"status":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Status"}]}}},"UpdateDeployment":{"type":"object","properties":{"description":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Description"}]},"protected":{"type":["boolean","null"],"description":"Optional. Toggle deletion hardening for this deployment. When `true`, future DELETE\ncalls must include a one-time confirmation code emailed to the tenant address\n(request via `PUT /tenants/{tenant_id}/request_code` with\n`action = \"delete_deployment\"`). Leave unset to keep the current value.","example":true}}},"UpdateDivision":{"type":"object","properties":{"description":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Description"}]},"email":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Email"}]},"name":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DivisionName"}]},"protected":{"type":["boolean","null"],"description":"Optional. Toggle deletion hardening for this division. When `true`, future DELETE\ncalls must include a one-time confirmation code emailed to the tenant address\n(request via `PUT /tenants/{tenant_id}/request_code` with\n`action = \"delete_division\"`). Leave unset to keep the current value.","example":true}}},"UpdateEnvironment":{"type":"object","properties":{"description":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Description"}]},"name":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/EnvironmentName"}]},"protected":{"type":["boolean","null"],"description":"Optional. Toggle deletion hardening for this environment. When `true`, future DELETE\ncalls must include a one-time confirmation code emailed to the tenant address\n(request via `PUT /tenants/{tenant_id}/request_code` with\n`action = \"delete_environment\"`). Leave unset to keep the current value.","example":true}}},"UpdateMember":{"type":"object","properties":{"active":{"type":["boolean","null"]},"roles":{"type":["array","null"],"items":{"$ref":"#/components/schemas/RoleId"}}}},"UpdateRetention":{"type":"object","required":["retention"],"properties":{"retention":{"$ref":"#/components/schemas/RetentionSettings"}}},"UpdateRole":{"type":"object","properties":{"name":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/RoleName"}]},"permissions":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/RolePermissions"}]}}},"UpdateSettings":{"type":"object","properties":{"default_division_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DivisionId"}]},"default_tenant_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/TenantId"}]},"ip_binding":{"type":["boolean","null"]},"theme":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Theme"}]}}},"UpdateSpendLimit":{"type":"object","properties":{"spend_limit":{"type":["string","null"]}}},"UpdateTenant":{"type":"object","properties":{"description":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Description"}]},"email":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Email"}]},"name":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/TenantName"}]},"protected":{"type":["boolean","null"],"description":"Optional. Toggle deletion hardening for this tenant. When `true`, future DELETE calls\nmust include a one-time confirmation code emailed to the tenant address (request via\n`PUT /tenants/{tenant_id}/request_code` with `action = \"delete_tenant\"`). Leave unset\nto keep the current value.","example":true}}},"UpdateTenantConfig":{"type":"object","required":["join_policy","block_external_invitations","enforce_domain_only_invitations"],"properties":{"block_external_invitations":{"type":"boolean"},"enforce_domain_only_invitations":{"type":"boolean"},"join_policy":{"type":"string"}}},"UpgradeDeployment":{"type":"object","properties":{"managed_tier":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ManagedTier"}]},"storage":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CloudStorageSettings"}]},"tier":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DeploymentTier"}]}}},"UsageRate":{"type":"object","required":["per_gb"],"properties":{"max_gb":{"type":["integer","null"],"format":"int64","minimum":0},"per_gb":{"type":"string"}}},"UserBasicInfo":{"type":"object","required":["id","email","name","title","status","role","verified"],"properties":{"email":{"$ref":"#/components/schemas/Email"},"id":{"$ref":"#/components/schemas/UserId"},"name":{"$ref":"#/components/schemas/FullName"},"remarks":{"type":["string","null"]},"role":{"$ref":"#/components/schemas/UserRole"},"status":{"$ref":"#/components/schemas/Status"},"title":{"$ref":"#/components/schemas/Title"},"verified":{"type":"boolean"}}},"UserDataExport":{"type":"object","required":["user","identities","sessions","memberships","invitations","settings","exported_at"],"properties":{"exported_at":{"type":"string","format":"date-time"},"identities":{"type":"array","items":{"$ref":"#/components/schemas/ExportedIdentity"}},"invitations":{"type":"array","items":{"$ref":"#/components/schemas/ExportedInvitation"}},"memberships":{"type":"array","items":{"$ref":"#/components/schemas/ExportedMembership"}},"sessions":{"type":"array","items":{"$ref":"#/components/schemas/ExportedSession"}},"settings":{"$ref":"#/components/schemas/ExportedSettings"},"user":{"$ref":"#/components/schemas/ExportedUser"}}},"UserDetails":{"allOf":[{"$ref":"#/components/schemas/UserInfo"},{"type":"object","required":["settings"],"properties":{"settings":{"$ref":"#/components/schemas/UserSettingsInfo"}}}]},"UserDivisionBasicInfo":{"type":"object","required":["id","name"],"properties":{"id":{"$ref":"#/components/schemas/DivisionId"},"name":{"$ref":"#/components/schemas/DivisionName"}}},"UserDivisionPermissionsInfo":{"allOf":[{"$ref":"#/components/schemas/UserDivisionBasicInfo"},{"type":"object","required":["permissions","environment","environments"],"properties":{"environment":{"type":"array","items":{"type":"string"}},"environments":{"type":"array","items":{"$ref":"#/components/schemas/UserEnvironmentPermissionsInfo"}},"permissions":{"type":"array","items":{"type":"string"}}}}]},"UserEnvironmentBasicInfo":{"type":"object","required":["id","name"],"properties":{"id":{"$ref":"#/components/schemas/EnvironmentId"},"name":{"$ref":"#/components/schemas/EnvironmentName"}}},"UserEnvironmentPermissionsInfo":{"allOf":[{"$ref":"#/components/schemas/UserEnvironmentBasicInfo"},{"type":"object","required":["permissions"],"properties":{"permissions":{"type":"array","items":{"type":"string"}}}}]},"UserId":{"type":"integer","format":"int64","example":7261844898910240000,"minimum":0},"UserIdentity":{"type":"object","required":["source","external_id","enabled","created_at"],"properties":{"created_at":{"type":"string","format":"date-time","description":"Resource creation timestamp (RFC 3339 UTC).","example":"2026-05-20T10:00:00Z"},"enabled":{"type":"boolean"},"external_id":{"type":"string"},"source":{"$ref":"#/components/schemas/IdentityProvider"}}},"UserInfo":{"allOf":[{"$ref":"#/components/schemas/UserBasicInfo"},{"type":"object","required":["about","limits","identities","tenants"],"properties":{"about":{"$ref":"#/components/schemas/Description"},"identities":{"type":"array","items":{"$ref":"#/components/schemas/UserIdentity"}},"limits":{"$ref":"#/components/schemas/UserLimits"},"permissions":{"type":["array","null"],"items":{"type":"string"}},"tenants":{"type":"array","items":{"$ref":"#/components/schemas/UserTenantInfo"}}}}]},"UserLimits":{"type":"object","required":["sessions","tenants","memberships"],"properties":{"memberships":{"type":"integer","format":"int32","minimum":0},"sessions":{"type":"integer","format":"int32","minimum":0},"tenants":{"type":"integer","format":"int32","minimum":0}}},"UserPermissionsInfo":{"type":"object","required":["tenant","division","divisions"],"properties":{"division":{"type":"array","items":{"type":"string"}},"divisions":{"type":"array","items":{"$ref":"#/components/schemas/UserDivisionPermissionsInfo"}},"environment":{"type":"array","items":{"type":"string"},"description":"Default permissions for every environment in this organization."},"tenant":{"type":"array","items":{"type":"string"}}}},"UserRole":{"type":"string","enum":["user","admin","root"]},"UserSessionInfo":{"allOf":[{"$ref":"#/components/schemas/SessionMetadata"},{"type":"object","required":["id"],"properties":{"id":{"$ref":"#/components/schemas/SessionId"}}}]},"UserSettingsInfo":{"type":"object","required":["theme","ip_binding"],"properties":{"default_division":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/UserDivisionBasicInfo"}]},"default_tenant":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/UserTenantBasicInfo"}]},"ip_binding":{"type":"boolean"},"theme":{"$ref":"#/components/schemas/Theme"}}},"UserTenantBasicInfo":{"type":"object","required":["id","name"],"properties":{"id":{"$ref":"#/components/schemas/TenantId"},"name":{"$ref":"#/components/schemas/TenantName"}}},"UserTenantInfo":{"allOf":[{"$ref":"#/components/schemas/UserTenantBasicInfo"},{"type":"object","required":["active","roles","permissions"],"properties":{"active":{"type":"boolean"},"permissions":{"$ref":"#/components/schemas/UserPermissionsInfo"},"roles":{"type":"array","items":{"type":"string"}}}}]},"WorkspaceState":{"type":"string","enum":["joined","join_requested","awaiting_invitation"]}},"securitySchemes":{"ld_api_key":{"type":"apiKey","in":"header","name":"ld-api-key","description":"Tenant API key issued via POST /tenants/{tenant_id}/api_keys. Sent in the ld-api-key request header. Scoped to tenant-level operations only. Cannot be used on user-scope endpoints (`/account/*`) or for tenant creation."},"session_cookie":{"type":"apiKey","in":"cookie","name":"session","description":"Browser session cookie issued by POST /account/sign_in. Required for user-scope endpoints and tenant creation. Mutating endpoints additionally require the X-CSRF-Token header echoed from the sign-in response."}}},"security":[{"ld_api_key":[]},{"session_cookie":[]}],"tags":[{"name":"Account","description":"User account, sign-in, sessions, settings"},{"name":"Tenants","description":"Tenant CRUD, config, structure"},{"name":"Divisions","description":"Tenant divisions"},{"name":"Environments","description":"Environments within a division"},{"name":"Deployments","description":"Deployment lifecycle"},{"name":"Connectors","description":"Deployment connectors"},{"name":"Members","description":"Tenant members"},{"name":"Invitations","description":"Tenant invitations"},{"name":"Roles","description":"Tenant roles and permissions"},{"name":"API Keys","description":"Tenant API key management"},{"name":"Clouds","description":"Available clouds, regions, clusters, storages, tiers"},{"name":"Cloud Accounts","description":"BYOC cloud accounts"},{"name":"Billing","description":"Pricing, billing reports, invoices"},{"name":"Payments","description":"Payment methods (Stripe)"},{"name":"Marketplace","description":"AWS Marketplace registration"},{"name":"GCP Marketplace","description":"GCP Marketplace signup"}],"externalDocs":{"url":"https://docs.laserdata.com","description":"LaserData Cloud documentation"}}