{"openapi":"3.1.0","info":{"title":"Objectify API","version":"1.0.0","description":"Multi-tenant Objects Platform API on Cloudflare Workers. Provides database, authentication, file storage, AI, real-time subscriptions, webhooks, workflows, and analytics as a service.","contact":{"name":"Objectify","url":"https://objectify.cloud"},"license":{"name":"Proprietary"}},"servers":[{"url":"https://api.objectify.cloud","description":"Production"},{"url":"http://localhost:8787","description":"Local development"}],"tags":[{"name":"Public","description":"Health checks, docs, and landing pages. No authentication required."},{"name":"Billing","description":"Stripe billing integration and webhooks."},{"name":"Object Types","description":"Define your data schema. Object types are like database tables."},{"name":"Properties","description":"Typed fields on object types — 22 data types with indexing and validation."},{"name":"Objects","description":"CRUD on data records with versioning, batch operations, and soft-delete/restore."},{"name":"Search","description":"Property-based filtering, full-text search, and aggregation."},{"name":"Views","description":"Saved filter/sort/column presets for object types."},{"name":"Associations","description":"Typed relationships between objects across types."},{"name":"Files","description":"File storage on Cloudflare R2 with variants, signed URLs, versioning, and batch ops."},{"name":"Events","description":"Custom event tracking for analytics and automation."},{"name":"Errors","description":"Client-side error reporting."},{"name":"Versions","description":"Object version history."},{"name":"Import / Export","description":"Bulk data import (CSV/JSON) and async export."},{"name":"Comments","description":"Activity feed comments on objects."},{"name":"Workflows","description":"Object approval workflow operations — submit, approve, reject."},{"name":"Reports","description":"Pipeline, time series, leaderboard, and funnel reports."},{"name":"Email","description":"Transactional email sending through configured providers."},{"name":"AI","description":"Cloudflare Workers AI — chat, generation, embeddings, vector search, moderation, image description."},{"name":"Authentication","description":"End-user auth: email/password, magic links, OAuth, phone OTP, anonymous sessions."},{"name":"MFA","description":"TOTP-based multi-factor authentication enrollment, verification, and recovery."},{"name":"Sessions","description":"User session listing and revocation."},{"name":"Notifications","description":"In-app notification management."},{"name":"Passkeys","description":"WebAuthn/FIDO2 passkey registration and authentication."},{"name":"Public Forms","description":"Public-facing form access and submission (no auth)."},{"name":"SAML / SSO","description":"SAML 2.0 single sign-on integration."},{"name":"Realtime","description":"WebSocket subscriptions for live object and file change events."},{"name":"Short URLs","description":"URL shortener service via obfy.uk — create, manage, and track short links."},{"name":"Accounting","description":"Double-entry accounting via tenant API: chart of accounts, journal entries, invoices, payments, bank reconciliation, tax codes, financial reports."},{"name":"Portal Auth","description":"Public portal authentication endpoints — login, signup, password reset, magic links, OTP, and email verification. No Bearer token required."}],"components":{"schemas":{"ObjectType":{"type":"object","properties":{"id":{"type":"string","example":"ot_abc123"},"tenant_id":{"type":"string","example":"tn_xyz789"},"name":{"type":"string","example":"contacts"},"display_name":{"type":["string","null"],"example":"Contacts"},"created_at":{"type":"string","example":"2026-01-01T00:00:00Z"},"updated_at":{"type":"string","example":"2026-01-15T12:00:00Z"}},"required":["id","tenant_id","name","display_name","created_at","updated_at"]},"ErrorDetail":{"type":"object","properties":{"code":{"type":"string","example":"VALIDATION_ERROR"},"message":{"type":"string","example":"Invalid request body"}},"required":["code","message"]},"ErrorEnvelope":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"$ref":"#/components/schemas/ErrorDetail"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","error","request_id"]},"CreateObjectTypeBody":{"type":"object","properties":{"name":{"type":"string","pattern":"^[a-z0-9-]+$","description":"URL-safe lowercase name","example":"contacts"}},"required":["name"]},"Property":{"type":"object","properties":{"id":{"type":"string","example":"prop_abc123"},"object_type_id":{"type":"string","example":"ot_abc123"},"name":{"type":"string","example":"email"},"data_type":{"type":"string","example":"email"},"is_indexed":{"type":"boolean","example":false},"is_sortable":{"type":"boolean","example":false},"is_unique":{"type":"boolean","example":false},"is_required":{"type":"boolean","example":false},"default_value":{"example":null},"enum_values":{"type":["array","null"],"items":{"type":"string"},"example":null},"description":{"type":["string","null"],"example":"Contact email address"},"created_at":{"type":"string","example":"2026-01-01T00:00:00Z"}},"required":["id","object_type_id","name","data_type","is_indexed","is_sortable","is_unique","is_required","enum_values","description","created_at"]},"DataType":{"type":"string","enum":["string","text","email","url","phone","slug","color","richtext","number","integer","float","percent","currency","rating","boolean","date","datetime","time","json","array","object","enum"]},"CreatePropertyBody":{"type":"object","properties":{"name":{"type":"string","example":"email"},"data_type":{"$ref":"#/components/schemas/DataType"},"is_indexed":{"type":"boolean","default":false},"is_sortable":{"type":"boolean","default":false},"is_unique":{"type":"boolean","default":false},"is_required":{"type":"boolean","default":false},"default_value":{},"enum_values":{"type":"array","items":{"type":"string"}},"description":{"type":"string"}},"required":["name","data_type"]},"UpdateObjectTypeBody":{"type":"object","properties":{"name":{"type":"string","description":"New name for the object type","example":"customers"}},"required":["name"]},"UpdatePropertyBody":{"type":"object","properties":{"is_indexed":{"type":"boolean"},"is_sortable":{"type":"boolean"},"is_unique":{"type":"boolean"},"is_required":{"type":"boolean"},"default_value":{},"description":{"type":"string"}}},"CreateObjectBody":{"type":"object","properties":{"properties":{"type":"object","additionalProperties":{},"default":{},"example":{"name":"Acme Corp","email":"info@acme.com"}}}},"Object":{"type":"object","properties":{"id":{"type":"string","example":"obj_abc123"},"object_type_id":{"type":"string","example":"ot_abc123"},"tenant_id":{"type":"string","example":"tn_xyz789"},"properties":{"type":"object","additionalProperties":{},"example":{"name":"Acme Corp","email":"info@acme.com"}},"created_at":{"type":"string","example":"2026-01-01T00:00:00Z"},"updated_at":{"type":"string","example":"2026-01-15T12:00:00Z"},"created_by":{"type":["string","null"],"example":"usr_abc123"},"version":{"type":"integer","example":1},"is_deleted":{"type":"boolean","example":false}},"required":["id","object_type_id","tenant_id","properties","created_at","updated_at","created_by","version","is_deleted"]},"UpdateObjectBody":{"type":"object","properties":{"properties":{"type":"object","additionalProperties":{},"example":{"name":"Updated Name"}}},"required":["properties"]},"AuthSession":{"type":"object","properties":{"access_token":{"type":"string","example":"eyJhbGciOiJIUzI1NiIs..."},"refresh_token":{"type":"string","example":"rt_abc123..."},"token_type":{"type":"string","enum":["bearer"]},"expires_in":{"type":"integer","example":3600},"user":{"type":"object","properties":{"id":{"type":"string","example":"usr_abc123"},"email":{"type":"string","format":"email","example":"user@example.com"},"role":{"type":"string","example":"authenticated"}},"required":["id","email","role"]}},"required":["access_token","refresh_token","token_type","expires_in","user"]},"AuthUser":{"type":"object","properties":{"id":{"type":"string","example":"usr_abc123"},"email":{"type":"string","format":"email","example":"user@example.com"},"phone":{"type":["string","null"],"example":"+15551234567"},"role":{"type":"string","example":"authenticated"},"email_verified":{"type":"boolean","example":true},"phone_verified":{"type":"boolean","example":false},"user_metadata":{"type":"object","additionalProperties":{},"example":{"name":"Jane Doe"}},"created_at":{"type":"string","example":"2026-01-01T00:00:00Z"},"updated_at":{"type":"string","example":"2026-01-15T12:00:00Z"},"last_sign_in_at":{"type":["string","null"],"example":"2026-03-20T10:00:00Z"}},"required":["id","email","phone","role","email_verified","phone_verified","user_metadata","created_at","updated_at","last_sign_in_at"]},"Notification":{"type":"object","properties":{"id":{"type":"string","example":"ntf_abc123"},"user_id":{"type":"string","example":"usr_abc123"},"type":{"type":"string","example":"system"},"title":{"type":"string","example":"Welcome!"},"body":{"type":["string","null"],"example":"Your account is ready."},"is_read":{"type":"boolean","example":false},"metadata":{"type":["object","null"],"additionalProperties":{},"example":null},"created_at":{"type":"string","example":"2026-01-01T00:00:00Z"}},"required":["id","user_id","type","title","body","is_read","metadata","created_at"]},"Passkey":{"type":"object","properties":{"id":{"type":"string","example":"pk_abc123"},"user_id":{"type":"string","example":"usr_abc123"},"credential_id":{"type":"string","example":"cred_abc123..."},"friendly_name":{"type":["string","null"],"example":"MacBook Touch ID"},"created_at":{"type":"string","example":"2026-01-01T00:00:00Z"},"last_used_at":{"type":["string","null"],"example":"2026-03-20T10:00:00Z"}},"required":["id","user_id","credential_id","friendly_name","created_at","last_used_at"]},"Session":{"type":"object","properties":{"id":{"type":"string","example":"sess_abc123"},"user_id":{"type":"string","example":"usr_abc123"},"ip":{"type":"string","example":"203.0.113.1"},"user_agent":{"type":"string","example":"Mozilla/5.0..."},"created_at":{"type":"string","example":"2026-01-01T00:00:00Z"},"last_active_at":{"type":"string","example":"2026-03-20T10:00:00Z"}},"required":["id","user_id","ip","user_agent","created_at","last_active_at"]},"MfaFactor":{"type":"object","properties":{"id":{"type":"string","example":"mfa_abc123"},"type":{"type":"string","enum":["totp"]},"friendly_name":{"type":["string","null"],"example":"Work authenticator"},"created_at":{"type":"string","example":"2026-01-01T00:00:00Z"},"verified_at":{"type":["string","null"],"example":"2026-01-01T00:05:00Z"}},"required":["id","type","friendly_name","created_at","verified_at"]},"FinancialReport":{"type":"object","properties":{}},"Invoice":{"type":"object","properties":{}},"FiscalPeriod":{"type":"object","properties":{}},"Account":{"type":"object","properties":{}},"BankAccount":{"type":"object","properties":{}},"Currency":{"type":"object","properties":{}},"ExchangeRate":{"type":"object","properties":{}},"InvoiceLine":{"type":"object","properties":{}},"JournalEntry":{"type":"object","properties":{}},"JournalLine":{"type":"object","properties":{}},"Payment":{"type":"object","properties":{}},"RecurringTransaction":{"type":"object","properties":{}},"TaxCode":{"type":"object","properties":{}},"BankTransaction":{"type":"object","properties":{}},"AiProvider":{"type":"object","properties":{}},"ApiKeyMeta":{"type":"object","properties":{}},"ApiKeyScope":{"type":"object","properties":{}},"AuditLog":{"type":"object","properties":{}},"TenantAuthConfig":{"type":"object","properties":{}},"EmailTemplate":{"type":"object","properties":{}},"Automation":{"type":"object","properties":{}},"Backup":{"type":"object","properties":{}},"BackupStatus":{"type":"object","properties":{}},"DashboardWidget":{"type":"object","properties":{}},"Dashboard":{"type":"object","properties":{}},"DlqMessage":{"type":"object","properties":{}},"ErrorEntry":{"type":"object","properties":{}},"CustomEvent":{"type":"object","properties":{}},"FileRecord":{"type":"object","properties":{}},"StorageStats":{"type":"object","properties":{}},"FolderInfo":{"type":"object","properties":{}},"FileAccess":{"type":"object","properties":{}},"Form":{"type":"object","properties":{}},"FormSubmission":{"type":"object","properties":{}},"GovernanceConfig":{"type":"object","properties":{}},"Integration":{"type":"object","properties":{}},"IntegrationSyncLog":{"type":"object","properties":{}},"CustomFunction":{"type":"object","properties":{}},"Plugin":{"type":"object","properties":{}},"FunctionLog":{"type":"object","properties":{}},"AccessPolicy":{"type":"object","properties":{}},"Role":{"type":"object","properties":{}},"UserRole":{"type":"object","properties":{}},"SavedReport":{"type":"object","properties":{}},"ScheduledJob":{"type":"object","properties":{}},"ShardInfo":{"type":"object","properties":{}},"SupportTicket":{"type":"object","properties":{}},"TicketMessage":{"type":"object","properties":{}},"TenantRoute":{"type":"object","properties":{}},"PlanTier":{"type":"object","properties":{}},"PlanLimits":{"type":"object","properties":{}},"DependencyExistsResponse":{"type":"object","properties":{}},"MigrationJob":{"type":"object","properties":{}},"MigrationState":{"type":"object","properties":{}},"WebhookDelivery":{"type":"object","properties":{}},"WebhookConfig":{"type":"object","properties":{}},"WebhookStatus":{"type":"object","properties":{}},"Workflow":{"type":"object","properties":{}},"AiConversation":{"type":"object","properties":{}},"Association":{"type":"object","properties":{}},"Comment":{"type":"object","properties":{}},"FileStatus":{"type":"object","properties":{}},"SortDirection":{"type":"object","properties":{}},"ObjectRecord":{"type":"object","properties":{}},"TenantConfig":{"type":"object","properties":{}},"SearchFilter":{"type":"object","properties":{}},"SearchSort":{"type":"object","properties":{}},"ShortUrl":{"type":"object","properties":{}},"ShortUrlCreate":{"type":"object","properties":{}},"ShortUrlUpdate":{"type":"object","properties":{}},"ObjectVersion":{"type":"object","properties":{}},"View":{"type":"object","properties":{}}},"parameters":{},"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","description":"API key token or user JWT issued by the auth system. Pass as `Authorization: Bearer <token>`."},"AdminKey":{"type":"http","scheme":"bearer","description":"Platform admin key for /admin/* and /owner/* authenticated routes."}}},"paths":{"/v1/object-types":{"post":{"tags":["Object Types"],"summary":"Create object type","description":"Create a new object type (schema). Requires \"schema\" scope.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateObjectTypeBody"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ObjectType"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"get":{"tags":["Object Types"],"summary":"List object types","description":"List all object types for the authenticated tenant.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/ObjectType"}},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/object-types/{object_type_id}/properties":{"post":{"tags":["Properties"],"summary":"Create property","description":"Add a typed field to an object type. Requires \"schema\" scope.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"ot_abc123"},"required":true,"name":"object_type_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePropertyBody"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Property"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"get":{"tags":["Properties"],"summary":"List properties","description":"List all properties defined on an object type.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"ot_abc123"},"required":true,"name":"object_type_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Property"}},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/object-types/{object_type_id}":{"delete":{"tags":["Object Types"],"summary":"Delete object type","description":"Permanently deletes the object type, all its properties, objects, and associated data. This is destructive and cannot be undone.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"ot_abc123"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string","enum":["true","false"],"description":"Force cascade-delete all dependent records"},"required":false,"name":"force","in":"query"},{"schema":{"type":"string","description":"Confirmation token from a prior 409 response (required when force=true)"},"required":false,"name":"confirm_token","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deleted":{"type":"boolean","enum":[true]}},"required":["deleted"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"get":{"tags":["Object Types"],"summary":"Get object type","description":"Get a single object type by ID.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"ot_abc123"},"required":true,"name":"object_type_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ObjectType"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"patch":{"tags":["Object Types"],"summary":"Update object type","description":"Rename an object type. Requires \"schema\" scope.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"ot_abc123"},"required":true,"name":"object_type_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateObjectTypeBody"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ObjectType"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/object-types/{object_type_id}/properties/{property_id}":{"delete":{"tags":["Properties"],"summary":"Delete property","description":"Delete a property from an object type. Existing values become untyped.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"ot_abc123"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string","example":"prop_abc123"},"required":true,"name":"property_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deleted":{"type":"boolean","enum":[true]}},"required":["deleted"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"patch":{"tags":["Properties"],"summary":"Update property","description":"Update property settings. Name and data_type cannot be changed.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"ot_abc123"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string","example":"prop_abc123"},"required":true,"name":"property_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePropertyBody"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Property"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/objects/{object_type_id}/batch/create":{"post":{"tags":["Objects"],"summary":"Batch create objects","description":"Create up to 100 objects in a single request. Requires \"write\" scope.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"ot_abc123"},"required":true,"name":"object_type_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"objects":{"type":"array","items":{"$ref":"#/components/schemas/CreateObjectBody"},"maxItems":100}},"required":["objects"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"created":{"type":"integer"},"ids":{"type":"array","items":{"type":"string"}}},"required":["created","ids"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/objects/{object_type_id}":{"post":{"tags":["Objects"],"summary":"Create object","description":"Create a new object of the given type. Requires \"write\" scope.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"ot_abc123"},"required":true,"name":"object_type_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateObjectBody"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Object"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/objects/{object_type_id}/{object_id}":{"delete":{"tags":["Objects"],"summary":"Delete object","description":"Soft-delete an object (moves to trash). Use force=true for permanent deletion.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"ot_abc123"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string","example":"obj_abc123"},"required":true,"name":"object_id","in":"path"},{"schema":{"type":"string","enum":["true","false"],"description":"Force cascade-delete all dependent records"},"required":false,"name":"force","in":"query"},{"schema":{"type":"string","description":"Confirmation token from a prior 409 response (required when force=true)"},"required":false,"name":"confirm_token","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"get":{"tags":["Objects"],"summary":"Get object","description":"Retrieve a single object by type and ID.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"ot_abc123"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string","example":"obj_abc123"},"required":true,"name":"object_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Object"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"patch":{"tags":["Objects"],"summary":"Update object","description":"Update properties on an existing object. Requires \"write\" scope.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"ot_abc123"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string","example":"obj_abc123"},"required":true,"name":"object_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateObjectBody"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Object"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/objects/{object_type_id}/list":{"get":{"tags":["Objects"],"summary":"List objects","description":"List objects of a given type with pagination, filtering, and sorting.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"ot_abc123"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"Results per page"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","description":"Pagination cursor"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string","description":"Sort field","example":"created_at"},"required":false,"name":"sort","in":"query"},{"schema":{"type":"string","enum":["asc","desc"],"description":"Sort direction"},"required":false,"name":"order","in":"query"}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/Object"}},"next_cursor":{"type":["string","null"],"example":"eyJpZCI6..."},"total":{"type":"integer","example":42}},"required":["results","next_cursor"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/objects/{object_type_id}/search":{"post":{"tags":["Search"],"summary":"Search objects","description":"Filter and search objects with complex queries. Requires \"read\" scope.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"ot_abc123"},"required":true,"name":"object_type_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"filters":{"type":"array","items":{"type":"object","additionalProperties":{}}},"sort":{"type":"string"},"order":{"type":"string","enum":["asc","desc"]},"limit":{"type":"integer","maximum":100},"cursor":{"type":"string"},"query":{"type":"string","description":"Full-text search query"}}}}}},"responses":{"200":{"description":"Search results","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/Object"}},"next_cursor":{"type":["string","null"],"example":"eyJpZCI6..."},"total":{"type":"integer","example":42}},"required":["results","next_cursor"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/anonymous":{"post":{"tags":["Authentication"],"summary":"Create anonymous session","description":"Create an anonymous user with a session. Can be linked to a real account later.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Anonymous session created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AuthSession"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/passkeys/{credential_id}":{"delete":{"tags":["Passkeys"],"summary":"Delete passkey","description":"Remove a registered passkey.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"cred_abc123"},"required":true,"name":"credential_id","in":"path"}],"responses":{"200":{"description":"Passkey deleted","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deleted":{"type":"boolean","enum":[true]}},"required":["deleted"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/notifications/preferences/{channel}":{"delete":{"tags":["Notifications"],"summary":"Delete notification preference","description":"Remove a notification channel preference.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"email"},"required":true,"name":"channel","in":"path"}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deleted":{"type":"boolean","enum":[true]}},"required":["deleted"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/me/export":{"get":{"tags":["Authentication"],"summary":"Export user data","description":"Export all data associated with the authenticated user (GDPR-style). Rate-limited to once per hour.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"User data export","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"_meta":{"type":"object","properties":{"user_id":{"type":"string"},"tenant_id":{"type":"string"},"export_type":{"type":"string","enum":["user_data_export"]},"exported_at":{"type":"string"}},"required":["user_id","tenant_id","export_type","exported_at"]}},"required":["_meta"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/forgot-password":{"post":{"tags":["Authentication"],"summary":"Request password reset","description":"Send a password reset email. Always returns 200 for security (anti-enumeration).","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"redirect_to":{"type":"string"},"turnstile_token":{"type":"string"}},"required":["email"]}}}},"responses":{"200":{"description":"Reset email sent","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/notifications/preferences":{"get":{"tags":["Notifications"],"summary":"Get notification preferences","description":"Get notification channel preferences for the authenticated user.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Preferences","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","properties":{"channel":{"type":"string"},"enabled":{"type":"boolean"},"categories":{"type":"array","items":{"type":"string"}}},"required":["channel","enabled","categories"]}},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"put":{"tags":["Notifications"],"summary":"Update notification preferences","description":"Update notification channel preferences.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"channel":{"type":"string"},"enabled":{"type":"boolean"},"categories":{"type":"array","items":{"type":"string"}}},"required":["channel"]}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"updated":{"type":"boolean","enum":[true]}},"required":["updated"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/user":{"get":{"tags":["Authentication"],"summary":"Get current user","description":"Returns the currently authenticated user profile.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"User profile","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AuthUser"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"patch":{"tags":["Authentication"],"summary":"Update current user","description":"Update email, phone, password, or metadata for the authenticated user.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"phone":{"type":"string"},"password":{"type":"string","minLength":8},"user_metadata":{"type":"object","additionalProperties":{}}}}}}},"responses":{"200":{"description":"Updated user","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AuthUser"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/notifications":{"get":{"tags":["Notifications"],"summary":"List notifications","description":"List notifications for the authenticated user with pagination.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Notification list","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/Notification"}},"next_cursor":{"type":["string","null"],"example":"eyJpZCI6..."},"total":{"type":"integer","example":42}},"required":["results","next_cursor"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/passkeys":{"get":{"tags":["Passkeys"],"summary":"List passkeys","description":"List all passkeys registered for the authenticated user.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Passkey list","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Passkey"}},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/sessions":{"get":{"tags":["Sessions"],"summary":"List active sessions","description":"List all active sessions for the authenticated user.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Session list","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Session"}},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"delete":{"tags":["Sessions"],"summary":"Revoke all sessions","description":"Revoke all active sessions for the authenticated user.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"All sessions revoked","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"revoked":{"type":"integer"}},"required":["revoked"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/login":{"post":{"tags":["Authentication"],"summary":"Log in","description":"Authenticate with email and password. Returns session tokens or MFA challenge.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"password":{"type":"string"},"turnstile_token":{"type":"string"}},"required":["email","password"]}}}},"responses":{"200":{"description":"Authenticated","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AuthSession"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/logout":{"post":{"tags":["Authentication"],"summary":"Log out","description":"Revoke the current refresh token.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"refresh_token":{"type":"string"}}}}}},"responses":{"200":{"description":"Logged out","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/notifications/read-all":{"post":{"tags":["Notifications"],"summary":"Mark all as read","description":"Mark all notifications as read for the authenticated user.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"All marked read","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"updated":{"type":"integer"}},"required":["updated"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/notifications/{notification_id}/read":{"patch":{"tags":["Notifications"],"summary":"Mark notification read","description":"Mark a single notification as read.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"ntf_abc123"},"required":true,"name":"notification_id","in":"path"}],"responses":{"200":{"description":"Marked read","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"read":{"type":"boolean","enum":[true]}},"required":["read"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/mfa/challenge":{"post":{"tags":["MFA"],"summary":"Challenge MFA","description":"Verify an MFA code during login. Returns user_id and verified status.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"factor_id":{"type":"string"},"code":{"type":"string"},"user_id":{"type":"string"}},"required":["factor_id","code"]}}}},"responses":{"200":{"description":"MFA challenge result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"user_id":{"type":"string"},"verified":{"type":"boolean"}},"required":["user_id","verified"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/mfa/complete":{"post":{"tags":["MFA"],"summary":"Complete MFA login","description":"Complete MFA-gated login with a TOTP code and MFA ticket.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"mfa_ticket":{"type":"string"},"factor_id":{"type":"string"},"code":{"type":"string"}},"required":["mfa_ticket","factor_id","code"]}}}},"responses":{"200":{"description":"MFA login complete","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AuthSession"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/mfa/enroll":{"post":{"tags":["MFA"],"summary":"Enroll TOTP factor","description":"Begin TOTP MFA enrollment. Returns secret and QR code URI.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"friendly_name":{"type":"string"}}}}}},"responses":{"201":{"description":"Factor created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"factor_id":{"type":"string"},"type":{"type":"string","enum":["totp"]},"totp":{"type":"object","properties":{"secret":{"type":"string"},"uri":{"type":"string"},"qr_uri":{"type":"string"}},"required":["secret","uri","qr_uri"]}},"required":["factor_id","type","totp"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/mfa/factors":{"get":{"tags":["MFA"],"summary":"List MFA factors","description":"List all enrolled MFA factors for the current user.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Factor list","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/MfaFactor"}},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/mfa/recover":{"post":{"tags":["MFA"],"summary":"MFA recovery","description":"Bypass MFA using a recovery code. Consumes the recovery code.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"mfa_ticket":{"type":"string"},"recovery_code":{"type":"string"}},"required":["mfa_ticket","recovery_code"]}}}},"responses":{"200":{"description":"Recovery complete","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AuthSession"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/mfa/{factor_id}":{"delete":{"tags":["MFA"],"summary":"Unenroll MFA factor","description":"Remove an MFA factor from the current user.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"mfa_abc123"},"required":true,"name":"factor_id","in":"path"}],"responses":{"200":{"description":"Factor removed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"unenrolled":{"type":"boolean","enum":[true]}},"required":["unenrolled"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/mfa/verify":{"post":{"tags":["MFA"],"summary":"Verify TOTP code","description":"Verify a TOTP code to complete MFA factor enrollment.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"factor_id":{"type":"string"},"code":{"type":"string"}},"required":["factor_id","code"]}}}},"responses":{"200":{"description":"Factor verified","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"verified":{"type":"boolean","enum":[true]}},"required":["verified"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/oauth/{provider}/callback":{"get":{"tags":["Authentication"],"summary":"OAuth callback","description":"Handle OAuth provider callback. Creates or links user account.","parameters":[{"schema":{"type":"string","example":"google"},"required":true,"name":"provider","in":"path"}],"responses":{"200":{"description":"Session created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AuthSession"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"302":{"description":"Redirect to app"},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/oauth/{provider}":{"get":{"tags":["Authentication"],"summary":"OAuth redirect","description":"Redirect to OAuth provider (Google, GitHub, etc.) for authentication.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"google"},"required":true,"name":"provider","in":"path"},{"schema":{"type":"string"},"required":false,"name":"redirect_to","in":"query"}],"responses":{"302":{"description":"Redirect to OAuth provider"},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/passkeys/authenticate/begin":{"post":{"tags":["Passkeys"],"summary":"Begin passkey authentication","description":"Get WebAuthn credential request options for passkey authentication.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Authentication options","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"options":{"type":"object","additionalProperties":{}}},"required":["options"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/passkeys/authenticate/complete":{"post":{"tags":["Passkeys"],"summary":"Complete passkey authentication","description":"Complete passkey authentication and receive a session.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"credential":{"type":"object","additionalProperties":{}}},"required":["credential"]}}}},"responses":{"200":{"description":"Authenticated via passkey","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AuthSession"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/passkeys/register/begin":{"post":{"tags":["Passkeys"],"summary":"Begin passkey registration","description":"Get WebAuthn credential creation options for passkey registration.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Registration options","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"options":{"type":"object","additionalProperties":{}}},"required":["options"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/passkeys/register/complete":{"post":{"tags":["Passkeys"],"summary":"Complete passkey registration","description":"Complete passkey registration with the credential from the browser.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"credential":{"type":"object","additionalProperties":{}},"friendly_name":{"type":"string"}},"required":["credential"]}}}},"responses":{"200":{"description":"Passkey registered","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Passkey"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/portal-forgot-password":{"post":{"tags":["Portal Auth"],"summary":"Portal password reset request","description":"Request a password reset email via the public portal.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"redirect_to":{"type":"string"},"turnstile_token":{"type":"string"}},"required":["email"]}}}},"responses":{"200":{"description":"Reset email sent","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/portal-identify":{"post":{"tags":["Portal Auth"],"summary":"Identify tenant by email","description":"Look up which tenant(s) an email belongs to for portal login.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"}},"required":["email"]}}}},"responses":{"200":{"description":"Tenant identified","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"tenant_id":{"type":["string","null"]},"multiple_tenants":{"type":"boolean"},"tenants":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"]}}},"required":["tenant_id","multiple_tenants"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/portal-login":{"post":{"tags":["Portal Auth"],"summary":"Portal login","description":"Authenticate via the public portal with email, password, and tenant ID.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"password":{"type":"string"},"tenant_id":{"type":"string"},"turnstile_token":{"type":"string"}},"required":["email","password","tenant_id"]}}}},"responses":{"200":{"description":"Portal login successful","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AuthSession"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/portal-magic-link":{"post":{"tags":["Portal Auth"],"summary":"Portal send magic link","description":"Send a passwordless magic-link email via the portal.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"redirect_to":{"type":"string"}},"required":["email"]}}}},"responses":{"200":{"description":"Magic link sent","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/portal-magic-link-verify":{"post":{"tags":["Portal Auth"],"summary":"Portal verify magic link","description":"Exchange a portal magic-link token for an auth session.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"}},"required":["token"]}}}},"responses":{"200":{"description":"Magic link verified","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AuthSession"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/portal-otp-send":{"post":{"tags":["Portal Auth"],"summary":"Portal send OTP","description":"Send a one-time password via SMS for portal authentication.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"phone":{"type":"string"}},"required":["phone"]}}}},"responses":{"200":{"description":"OTP sent","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/portal-otp-verify":{"post":{"tags":["Portal Auth"],"summary":"Portal verify OTP","description":"Verify portal OTP and create a session.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"phone":{"type":"string"},"code":{"type":"string"}},"required":["phone","code"]}}}},"responses":{"200":{"description":"OTP verified","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AuthSession"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/portal-reset-password":{"post":{"tags":["Portal Auth"],"summary":"Portal password reset","description":"Reset password using a token received via email.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"},"password":{"type":"string","minLength":8}},"required":["token","password"]}}}},"responses":{"200":{"description":"Password reset","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/portal-signup":{"post":{"tags":["Portal Auth"],"summary":"Portal signup","description":"Create a new account via the public portal.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":8},"phone":{"type":"string"},"user_metadata":{"type":"object","additionalProperties":{}},"turnstile_token":{"type":"string"}},"required":["email","password"]}}}},"responses":{"201":{"description":"Account created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AuthSession"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/portal-verify-email":{"post":{"tags":["Portal Auth"],"summary":"Portal verify email","description":"Verify email address via portal authentication flow.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"}},"required":["token"]}}}},"responses":{"200":{"description":"Email verified","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/refresh":{"post":{"tags":["Authentication"],"summary":"Refresh tokens","description":"Exchange a refresh token for new access and refresh tokens.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"refresh_token":{"type":"string"}},"required":["refresh_token"]}}}},"responses":{"200":{"description":"Tokens refreshed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AuthSession"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/reset-password":{"post":{"tags":["Authentication"],"summary":"Reset password","description":"Reset password using token from email. Revokes all refresh tokens.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"},"password":{"type":"string","minLength":8}},"required":["token","password"]}}}},"responses":{"200":{"description":"Password reset","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"password_reset":{"type":"boolean","enum":[true]}},"required":["password_reset"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/sessions/{session_id}":{"delete":{"tags":["Sessions"],"summary":"Revoke session","description":"Revoke a specific session by ID.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"sess_abc123"},"required":true,"name":"session_id","in":"path"}],"responses":{"200":{"description":"Session revoked","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"revoked":{"type":"boolean","enum":[true]}},"required":["revoked"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/magic-link":{"post":{"tags":["Authentication"],"summary":"Send magic link","description":"Send a passwordless magic-link login email.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"redirect_to":{"type":"string"}},"required":["email"]}}}},"responses":{"200":{"description":"Magic link sent","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/otp/send":{"post":{"tags":["Authentication"],"summary":"Send SMS OTP","description":"Send a one-time password via SMS to an E.164 phone number.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"phone":{"type":"string"}},"required":["phone"]}}}},"responses":{"200":{"description":"OTP sent","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/signup":{"post":{"tags":["Authentication"],"summary":"Sign up","description":"Create a new user account with email and password. Sends verification email.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":8},"phone":{"type":"string"},"user_metadata":{"type":"object","additionalProperties":{}},"turnstile_token":{"type":"string"}},"required":["email","password"]}}}},"responses":{"201":{"description":"Account created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AuthSession"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/notifications/count":{"get":{"tags":["Notifications"],"summary":"Get unread count","description":"Get the number of unread notifications.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Unread count","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"count":{"type":"integer"}},"required":["count"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/verify":{"get":{"tags":["Authentication"],"summary":"Verify email (GET)","description":"Verify email via link from verification email.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"token","in":"query"},{"schema":{"type":"string"},"required":false,"name":"type","in":"query"}],"responses":{"200":{"description":"Verified","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"verified":{"type":"boolean","enum":[true]}},"required":["verified"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"post":{"tags":["Authentication"],"summary":"Verify email","description":"Verify email address with token from signup email.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"},"type":{"type":"string","default":"email_verify"}},"required":["token"]}}}},"responses":{"200":{"description":"Verified","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"verified":{"type":"boolean","enum":[true]}},"required":["verified"]},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/magic-link/verify":{"post":{"tags":["Authentication"],"summary":"Verify magic link","description":"Exchange magic-link token for an auth session.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"}},"required":["token"]}}}},"responses":{"200":{"description":"Authenticated via magic link","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AuthSession"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/otp/verify":{"post":{"tags":["Authentication"],"summary":"Verify OTP","description":"Verify the one-time password and create an auth session.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"phone":{"type":"string"},"code":{"type":"string"}},"required":["phone","code"]}}}},"responses":{"200":{"description":"OTP verified","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AuthSession"},"request_id":{"type":"string","example":"req_abc123"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/accounting/reports/aged-payables":{"get":{"tags":["Accounting"],"summary":"Aged payables report","description":"Aged payables report","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"name":"as_of","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/FinancialReport"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/reports/aged-receivables":{"get":{"tags":["Accounting"],"summary":"Aged receivables report","description":"Aged receivables report","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"name":"as_of","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/FinancialReport"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/invoices/{invoice_id}/approve":{"post":{"tags":["Accounting"],"summary":"Approve invoice","description":"Approve invoice","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"invoice_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Invoice"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/reports/balance-sheet":{"get":{"tags":["Accounting"],"summary":"Balance sheet report","description":"Balance sheet report","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"name":"as_of","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/FinancialReport"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/reports/cash-flow":{"get":{"tags":["Accounting"],"summary":"Cash flow statement","description":"Cash flow statement","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"name":"from","in":"query"},{"schema":{"type":"string"},"required":false,"name":"to","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/FinancialReport"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/periods/{period_id}/close":{"post":{"tags":["Accounting"],"summary":"Close period","description":"Close period","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"period_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/FiscalPeriod"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/accounts":{"post":{"tags":["Accounting"],"summary":"Create account","description":"Create account","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"sub_type":{"type":"string"},"parent_id":{"type":"string"},"description":{"type":"string"},"currency":{"type":"string"}},"required":["code","name","type","sub_type","parent_id","description","currency"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Account"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Accounting"],"summary":"List chart of accounts","description":"List chart of accounts","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"name":"type","in":"query"},{"schema":{"type":"string"},"required":false,"name":"active","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Account"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/bank-accounts":{"post":{"tags":["Accounting"],"summary":"Create bank account","description":"Create bank account","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"account_number":{"type":"string"},"bank_name":{"type":"string"},"currency":{"type":"string"},"gl_account_id":{"type":"string"}},"required":["name","account_number","bank_name","currency","gl_account_id"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/BankAccount"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Accounting"],"summary":"List bank accounts","description":"List bank accounts","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/BankAccount"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/currencies":{"post":{"tags":["Accounting"],"summary":"Create currency","description":"Create currency","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"},"decimal_places":{"type":"integer"}},"required":["code","name","symbol","decimal_places"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Currency"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Accounting"],"summary":"List currencies","description":"List currencies","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Currency"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/exchange-rates":{"post":{"tags":["Accounting"],"summary":"Create exchange rate","description":"Create exchange rate","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"from_currency":{"type":"string"},"to_currency":{"type":"string"},"rate":{"type":"number"},"effective_date":{"type":"string"}},"required":["from_currency","to_currency","rate","effective_date"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ExchangeRate"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Accounting"],"summary":"List exchange rates","description":"List exchange rates","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"name":"from_currency","in":"query"},{"schema":{"type":"string"},"required":false,"name":"to_currency","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/ExchangeRate"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/invoices":{"post":{"tags":["Accounting"],"summary":"Create invoice","description":"Create invoice","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["sales","purchase"]},"contact_name":{"type":"string"},"date":{"type":"string"},"due_date":{"type":"string"},"lines":{"type":"array","items":{"$ref":"#/components/schemas/InvoiceLine"}},"currency":{"type":"string"},"notes":{"type":"string"}},"required":["type","contact_name","date","due_date","lines","currency","notes"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Invoice"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Accounting"],"summary":"List invoices","description":"List invoices","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","enum":["sales","purchase"]},"required":false,"name":"type","in":"query"},{"schema":{"type":"string"},"required":false,"name":"status","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"invoices":{"type":"array","items":{"$ref":"#/components/schemas/Invoice"}},"total":{"type":"integer"}},"required":["invoices","total"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/journal-entries":{"post":{"tags":["Accounting"],"summary":"Create journal entry","description":"Create journal entry","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"date":{"type":"string"},"description":{"type":"string"},"reference":{"type":"string"},"lines":{"type":"array","items":{"$ref":"#/components/schemas/JournalLine"}},"currency":{"type":"string"},"post":{"type":"boolean"}},"required":["date","description","reference","lines","currency","post"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/JournalEntry"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Accounting"],"summary":"List journal entries","description":"List journal entries","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"name":"status","in":"query"},{"schema":{"type":"string"},"required":false,"name":"from","in":"query"},{"schema":{"type":"string"},"required":false,"name":"to","in":"query"},{"schema":{"type":"string"},"required":false,"name":"account_id","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"entries":{"type":"array","items":{"$ref":"#/components/schemas/JournalEntry"}},"total":{"type":"integer"}},"required":["entries","total"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/payments":{"post":{"tags":["Accounting"],"summary":"Create payment","description":"Create payment","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["receipt","disbursement"]},"contact_name":{"type":"string"},"date":{"type":"string"},"amount":{"type":"number"},"method":{"type":"string"},"bank_account_id":{"type":"string"},"reference":{"type":"string"},"allocations":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["type","contact_name","date","amount","method","bank_account_id","reference","allocations"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Payment"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Accounting"],"summary":"List payments","description":"List payments","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","enum":["receipt","disbursement"]},"required":false,"name":"type","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"payments":{"type":"array","items":{"$ref":"#/components/schemas/Payment"}},"total":{"type":"integer"}},"required":["payments","total"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/periods":{"post":{"tags":["Accounting"],"summary":"Create period","description":"Create period","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"start_date":{"type":"string"},"end_date":{"type":"string"}},"required":["name","start_date","end_date"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/FiscalPeriod"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Accounting"],"summary":"List accounting periods","description":"List accounting periods","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/FiscalPeriod"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/recurring":{"post":{"tags":["Accounting"],"summary":"Create recurring entry","description":"Create recurring entry","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string","enum":["journal_entry","invoice"]},"template":{"type":"object","additionalProperties":{}},"frequency":{"type":"string"},"next_run":{"type":"string"},"end_date":{"type":"string"}},"required":["name","type","template","frequency","next_run","end_date"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/RecurringTransaction"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Accounting"],"summary":"List recurring entries","description":"List recurring entries","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/RecurringTransaction"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/tax-codes":{"post":{"tags":["Accounting"],"summary":"Create tax code","description":"Create tax code","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"rate":{"type":"number"},"type":{"type":"string","enum":["inclusive","exclusive"]},"category":{"type":"string"}},"required":["code","name","rate","type","category"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/TaxCode"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Accounting"],"summary":"List tax codes","description":"List tax codes","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/TaxCode"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/accounts/{account_id}":{"delete":{"tags":["Accounting"],"summary":"Delete account","description":"Delete account","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"account_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Accounting"],"summary":"Get account","description":"Get account","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"account_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Account"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Accounting"],"summary":"Update account","description":"Update account","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"account_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"sub_type":{"type":"string"},"description":{"type":"string"},"is_active":{"type":"boolean"}},"required":["name","sub_type","description","is_active"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Account"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/bank-accounts/{bank_account_id}":{"delete":{"tags":["Accounting"],"summary":"Delete bank account","description":"Delete bank account","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"bank_account_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Accounting"],"summary":"Get bank account","description":"Get bank account","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"bank_account_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/BankAccount"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Accounting"],"summary":"Update bank account","description":"Update bank account","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"bank_account_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"account_number":{"type":"string"},"bank_name":{"type":"string"},"is_active":{"type":"boolean"}},"required":["name","account_number","bank_name","is_active"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/BankAccount"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/currencies/{currency_id}":{"delete":{"tags":["Accounting"],"summary":"Delete currency","description":"Delete currency","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"currency_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Accounting"],"summary":"Get currency","description":"Get currency","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"currency_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Currency"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Accounting"],"summary":"Update currency","description":"Update currency","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"currency_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"symbol":{"type":"string"},"decimal_places":{"type":"integer"}},"required":["name","symbol","decimal_places"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Currency"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/exchange-rates/{rate_id}":{"delete":{"tags":["Accounting"],"summary":"Delete exchange rate","description":"Delete exchange rate","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"rate_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Accounting"],"summary":"Get exchange rate","description":"Get exchange rate","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"rate_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ExchangeRate"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/invoices/{invoice_id}":{"delete":{"tags":["Accounting"],"summary":"Delete invoice","description":"Delete invoice","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"invoice_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Accounting"],"summary":"Get invoice","description":"Get invoice","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"invoice_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Invoice"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Accounting"],"summary":"Update invoice","description":"Update invoice","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"invoice_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"contact_name":{"type":"string"},"date":{"type":"string"},"due_date":{"type":"string"},"notes":{"type":"string"},"lines":{"type":"array","items":{"$ref":"#/components/schemas/InvoiceLine"}}},"required":["contact_name","date","due_date","notes","lines"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Invoice"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/journal-entries/{entry_id}":{"delete":{"tags":["Accounting"],"summary":"Delete journal entry","description":"Delete journal entry","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"entry_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Accounting"],"summary":"Get journal entry","description":"Get journal entry","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"entry_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/JournalEntry"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Accounting"],"summary":"Update journal entry","description":"Update journal entry","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"entry_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"date":{"type":"string"},"description":{"type":"string"},"reference":{"type":"string"},"lines":{"type":"array","items":{"$ref":"#/components/schemas/JournalLine"}}},"required":["date","description","reference","lines"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/JournalEntry"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/periods/{period_id}":{"delete":{"tags":["Accounting"],"summary":"Delete period","description":"Delete period","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"period_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Accounting"],"summary":"Get period","description":"Get period","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"period_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/FiscalPeriod"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Accounting"],"summary":"Update period","description":"Update period","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"period_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"start_date":{"type":"string"},"end_date":{"type":"string"}},"required":["name","start_date","end_date"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/FiscalPeriod"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/recurring/{recurring_id}":{"delete":{"tags":["Accounting"],"summary":"Delete recurring entry","description":"Delete recurring entry","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"recurring_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Accounting"],"summary":"Get recurring entry","description":"Get recurring entry","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"recurring_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/RecurringTransaction"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Accounting"],"summary":"Update recurring entry","description":"Update recurring entry","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"recurring_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"template":{"type":"object","additionalProperties":{}},"frequency":{"type":"string"},"next_run":{"type":"string"},"end_date":{"type":"string"}},"required":["name","template","frequency","next_run","end_date"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/RecurringTransaction"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/tax-codes/{tax_code_id}":{"delete":{"tags":["Accounting"],"summary":"Delete tax code","description":"Delete tax code","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"tax_code_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Accounting"],"summary":"Get tax code","description":"Get tax code","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"tax_code_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/TaxCode"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Accounting"],"summary":"Update tax code","description":"Update tax code","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"tax_code_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"rate":{"type":"number"},"type":{"type":"string"},"category":{"type":"string"}},"required":["name","rate","type","category"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/TaxCode"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/recurring/{recurring_id}/execute":{"post":{"tags":["Accounting"],"summary":"Execute recurring entry now","description":"Execute recurring entry now","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"recurring_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/reports/general-ledger":{"get":{"tags":["Accounting"],"summary":"General ledger report","description":"General ledger report","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"name":"from","in":"query"},{"schema":{"type":"string"},"required":false,"name":"to","in":"query"},{"schema":{"type":"string"},"required":false,"name":"account_id","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/FinancialReport"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/bank-transactions/{transaction_id}":{"get":{"tags":["Accounting"],"summary":"Get bank transaction","description":"Get bank transaction","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"transaction_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/BankTransaction"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/payments/{payment_id}":{"get":{"tags":["Accounting"],"summary":"Get payment","description":"Get payment","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"payment_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Payment"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/bank-accounts/{bank_account_id}/import":{"post":{"tags":["Accounting"],"summary":"Import bank transactions","description":"Import bank transactions","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"bank_account_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"transactions":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"description":{"type":"string"},"amount":{"type":"number"},"type":{"type":"string","enum":["debit","credit"]}},"required":["date","description","amount","type"]}}},"required":["transactions"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/bank-accounts/{bank_account_id}/transactions":{"get":{"tags":["Accounting"],"summary":"List bank transactions","description":"List bank transactions","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"bank_account_id","in":"path"},{"schema":{"type":"string"},"required":false,"name":"status","in":"query"},{"schema":{"type":"string"},"required":false,"name":"from","in":"query"},{"schema":{"type":"string"},"required":false,"name":"to","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/bank-transactions/{transaction_id}/match":{"post":{"tags":["Accounting"],"summary":"Match bank transaction","description":"Match bank transaction","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"transaction_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"entry_id":{"type":"string"}},"required":["entry_id"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/journal-entries/{entry_id}/post":{"post":{"tags":["Accounting"],"summary":"Post journal entry","description":"Post journal entry","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"entry_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/reports/profit-and-loss":{"get":{"tags":["Accounting"],"summary":"Profit and loss report","description":"Profit and loss report","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"name":"from","in":"query"},{"schema":{"type":"string"},"required":false,"name":"to","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/FinancialReport"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/bank-accounts/{bank_account_id}/reconcile":{"post":{"tags":["Accounting"],"summary":"Reconcile bank account","description":"Reconcile bank account","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"bank_account_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"transaction_ids":{"type":"array","items":{"type":"string"}}},"required":["transaction_ids"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/periods/{period_id}/reopen":{"post":{"tags":["Accounting"],"summary":"Reopen period","description":"Reopen period","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"period_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/FiscalPeriod"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/journal-entries/{entry_id}/reverse":{"post":{"tags":["Accounting"],"summary":"Reverse journal entry","description":"Reverse journal entry","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"entry_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"date":{"type":"string"},"description":{"type":"string"}},"required":["date","description"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/JournalEntry"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/reports/tax":{"get":{"tags":["Accounting"],"summary":"Tax report","description":"Tax report","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"name":"from","in":"query"},{"schema":{"type":"string"},"required":false,"name":"to","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/FinancialReport"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/reports/trial-balance":{"get":{"tags":["Accounting"],"summary":"Trial balance report","description":"Trial balance report","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"name":"as_of","in":"query"},{"schema":{"type":"string"},"required":false,"name":"period_id","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/FinancialReport"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/invoices/{invoice_id}/void":{"post":{"tags":["Accounting"],"summary":"Void invoice","description":"Void invoice","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"invoice_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Invoice"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/accounting/payments/{payment_id}/void":{"post":{"tags":["Accounting"],"summary":"Void payment","description":"Void payment","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"payment_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Payment"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/ai-providers":{"post":{"tags":["Admin: AI Providers"],"summary":"Create AI provider","description":"Create AI provider","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"provider_type":{"type":"string"},"api_key":{"type":"string"},"config_json":{"type":"object","additionalProperties":{}}},"required":["name","provider_type","api_key","config_json"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AiProvider"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: AI Providers"],"summary":"List AI providers","description":"List AI providers","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/AiProvider"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/ai-providers/{provider_id}":{"delete":{"tags":["Admin: AI Providers"],"summary":"Delete AI provider","description":"Delete AI provider","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"provider_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: AI Providers"],"summary":"Get AI provider","description":"Get AI provider","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"provider_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AiProvider"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Admin: AI Providers"],"summary":"Update AI provider","description":"Update AI provider","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"provider_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"api_key":{"type":"string"},"config_json":{"type":"object","additionalProperties":{}}},"required":["name","api_key","config_json"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AiProvider"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/ai-usage":{"get":{"tags":["Admin: AI Providers"],"summary":"Get AI usage stats","description":"Get AI usage stats","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/analytics":{"get":{"tags":["Admin: Analytics"],"summary":"Get tenant analytics","description":"Get tenant analytics","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","enum":["1h","24h","7d","30d"]},"required":false,"name":"period","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/analytics/engine":{"get":{"tags":["Admin: Analytics"],"summary":"Analytics engine query","description":"Analytics engine query","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"name":"period","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/keys":{"post":{"tags":["Admin: API Keys"],"summary":"Create API key","description":"Create API key","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string"},"scopes":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyScope"}},"ip_allowlist":{"type":"array","items":{"type":"string"}},"expires_at":{},"rate_limit":{}},"required":["label","scopes","ip_allowlist"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"key":{"$ref":"#/components/schemas/ApiKeyMeta"},"token":{"type":"string"}},"required":["key","token"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: API Keys"],"summary":"List API keys","description":"List API keys","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyMeta"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/keys/{key_id}":{"delete":{"tags":["Admin: API Keys"],"summary":"Revoke API key","description":"Revoke API key","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"key_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ApiKeyMeta"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Admin: API Keys"],"summary":"Update API key","description":"Update API key","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"key_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string"},"scopes":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyScope"}},"ip_allowlist":{"type":"array","items":{"type":"string"}},"rate_limit":{}},"required":["label","scopes","ip_allowlist"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ApiKeyMeta"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/keys/{key_id}/rotate":{"post":{"tags":["Admin: API Keys"],"summary":"Rotate API key","description":"Rotate API key","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"key_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string"},"scopes":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyScope"}}},"required":["label","scopes"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"old_key":{"$ref":"#/components/schemas/ApiKeyMeta"},"new_key":{"$ref":"#/components/schemas/ApiKeyMeta"},"token":{"type":"string"}},"required":["old_key","new_key","token"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/audit-logs":{"get":{"tags":["Admin: Audit"],"summary":"List audit logs","description":"List audit logs","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"offset","in":"query"},{"schema":{"type":"string"},"required":false,"name":"action","in":"query"},{"schema":{"type":"string"},"required":false,"name":"resource_type","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"logs":{"type":"array","items":{"$ref":"#/components/schemas/AuditLog"}},"total":{"type":"integer"}},"required":["logs","total"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/auth-config":{"get":{"tags":["Admin: Auth Config"],"summary":"Get auth config","description":"Get auth config","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/TenantAuthConfig"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"post":{"tags":["Admin: Auth Config"],"summary":"Update auth config","description":"Update auth config","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/TenantAuthConfig"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/automations":{"post":{"tags":["Admin: Automations"],"summary":"Create automation","description":"Create automation","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"trigger_event":{"type":"string"},"conditions":{"type":"array","items":{"type":"object","additionalProperties":{}}},"actions":{"type":"array","items":{"type":"object","additionalProperties":{}}},"enabled":{"type":"boolean"}},"required":["name","trigger_event","conditions","actions","enabled"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Automation"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Automations"],"summary":"List automations","description":"List automations","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Automation"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/automations/{automation_id}":{"delete":{"tags":["Admin: Automations"],"summary":"Delete automation","description":"Delete automation","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"automation_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Automations"],"summary":"Get automation","description":"Get automation","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"automation_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Automation"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Admin: Automations"],"summary":"Update automation","description":"Update automation","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"automation_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"trigger_event":{"type":"string"},"conditions":{"type":"array","items":{"type":"object","additionalProperties":{}}},"actions":{"type":"array","items":{"type":"object","additionalProperties":{}}},"enabled":{"type":"boolean"}},"required":["name","trigger_event","conditions","actions","enabled"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Automation"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/automations/{automation_id}/runs":{"get":{"tags":["Admin: Automations"],"summary":"List automation runs","description":"List automation runs","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"automation_id","in":"path"},{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"runs":{"type":"array","items":{"type":"object","additionalProperties":{}}},"total":{"type":"integer"}},"required":["runs","total"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/automations/{automation_id}/trigger":{"post":{"tags":["Admin: Automations"],"summary":"Trigger automation","description":"Trigger automation","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"automation_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","additionalProperties":{}}},"required":["data"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"run_id":{"type":"string"}},"required":["run_id"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/branding":{"get":{"tags":["Admin: Branding"],"summary":"Get branding settings","description":"Get branding settings","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Admin: Branding"],"summary":"Update branding","description":"Update branding","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"custom_domain":{"type":"string"},"logo_url":{"type":"string"},"favicon_url":{"type":"string"},"primary_color":{"type":"string"},"brand_name":{"type":"string"},"footer_text":{"type":"string"},"custom_css":{"type":"string"}},"required":["custom_domain","logo_url","favicon_url","primary_color","brand_name","footer_text","custom_css"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/dashboards/public/{share_token}":{"get":{"tags":["Admin: Dashboards"],"summary":"Get public dashboard","description":"Access a publicly shared dashboard. No authentication required.","parameters":[{"schema":{"type":"string"},"required":true,"name":"share_token","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/dashboards/{dashboard_id}/widgets":{"post":{"tags":["Admin: Dashboards"],"summary":"Add widget to dashboard","description":"Add widget to dashboard","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"dashboard_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"config_json":{"type":"object","additionalProperties":{}},"position_json":{"type":"object","additionalProperties":{}}},"required":["type","title","config_json","position_json"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/DashboardWidget"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/dashboards":{"post":{"tags":["Admin: Dashboards"],"summary":"Create dashboard","description":"Create dashboard","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"layout_json":{"type":"object","additionalProperties":{}},"is_public":{"type":"boolean"}},"required":["name","description","layout_json","is_public"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Dashboard"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Dashboards"],"summary":"List dashboards","description":"List dashboards","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Dashboard"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/dashboards/{dashboard_id}":{"delete":{"tags":["Admin: Dashboards"],"summary":"Delete dashboard","description":"Delete dashboard","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"dashboard_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Dashboards"],"summary":"Get dashboard","description":"Get dashboard","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"dashboard_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Dashboard"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Admin: Dashboards"],"summary":"Update dashboard","description":"Update dashboard","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"dashboard_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"layout_json":{"type":"object","additionalProperties":{}},"is_public":{"type":"boolean"}},"required":["name","description","layout_json","is_public"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Dashboard"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/dashboards/{dashboard_id}/widgets/{widget_id}":{"delete":{"tags":["Admin: Dashboards"],"summary":"Delete widget","description":"Delete widget","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"dashboard_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"widget_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Admin: Dashboards"],"summary":"Update widget","description":"Update widget","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"dashboard_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"widget_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"config_json":{"type":"object","additionalProperties":{}},"position_json":{"type":"object","additionalProperties":{}}},"required":["type","title","config_json","position_json"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/DashboardWidget"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/dlq/{msg_id}":{"delete":{"tags":["Admin: DLQ"],"summary":"Discard DLQ message","description":"Discard DLQ message","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"msg_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"discarded":{"type":"boolean"}},"required":["discarded"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/dlq":{"get":{"tags":["Admin: DLQ"],"summary":"List DLQ messages","description":"List DLQ messages","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/DlqMessage"}},"total":{"type":"integer"}},"required":["messages","total"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/dlq/{msg_id}/retry":{"post":{"tags":["Admin: DLQ"],"summary":"Retry DLQ message","description":"Retry DLQ message","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"msg_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"retried":{"type":"boolean"}},"required":["retried"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/forms":{"post":{"tags":["Admin: Forms"],"summary":"Create form","description":"Create form","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"object_type_id":{"type":"string"},"fields":{"type":"array","items":{"type":"object","additionalProperties":{}}},"settings":{"type":"object","additionalProperties":{}}},"required":["name","object_type_id","fields","settings"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Form"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Forms"],"summary":"List forms","description":"List forms","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Form"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/forms/{form_id}":{"delete":{"tags":["Admin: Forms"],"summary":"Delete form","description":"Delete form","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"form_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Admin: Forms"],"summary":"Update form","description":"Update form","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"form_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"fields":{"type":"array","items":{"type":"object","additionalProperties":{}}},"settings":{"type":"object","additionalProperties":{}},"status":{"type":"string","enum":["active","inactive"]}},"required":["name","fields","settings","status"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Form"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Public Forms"],"summary":"Get public form","description":"Retrieve a published form definition including fields, settings, and branding.","parameters":[{"schema":{"type":"string"},"required":true,"name":"form_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"tenant_id","in":"query"}],"responses":{"200":{"description":"Form definition","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"form_id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"object_type_id":{"type":"string"},"fields":{"type":"array","items":{"type":"object","additionalProperties":{}}},"settings":{"type":"object","additionalProperties":{}},"branding":{"type":"object","additionalProperties":{}},"require_captcha":{"type":"boolean"}},"required":["form_id","name","description","object_type_id","fields","settings","branding","require_captcha"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Form not active","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Form or tenant not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/forms/{form_id}/duplicate":{"post":{"tags":["Admin: Forms"],"summary":"Duplicate form","description":"Duplicate form","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"form_id","in":"path"}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Form"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/forms/{form_id}/submissions/export":{"get":{"tags":["Admin: Forms"],"summary":"Export form submissions","description":"Export form submissions","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"form_id","in":"path"},{"schema":{"type":"string","enum":["csv","json"]},"required":false,"name":"format","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/forms/{form_id}/analytics":{"get":{"tags":["Admin: Forms"],"summary":"Get form analytics","description":"Get form analytics","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"form_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/forms/{form_id}/submissions":{"get":{"tags":["Admin: Forms"],"summary":"List form submissions","description":"List form submissions","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"form_id","in":"path"},{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"submissions":{"type":"array","items":{"$ref":"#/components/schemas/FormSubmission"}},"total":{"type":"integer"}},"required":["submissions","total"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/governance":{"get":{"tags":["Admin: Governance"],"summary":"Get governance settings","description":"Get governance settings","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/GovernanceConfig"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Admin: Governance"],"summary":"Update governance settings","description":"Update governance settings","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"audit_retention_days":{"type":"integer"},"session_duration_secs":{"type":"integer"},"password_min_length":{"type":"integer"},"ip_allowlist":{"type":"array","items":{"type":"string"}}},"required":["audit_retention_days","session_duration_secs","password_min_length","ip_allowlist"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/GovernanceConfig"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/policies/simulate":{"post":{"tags":["Admin: Governance"],"summary":"Simulate RLS policy","description":"Simulate RLS policy","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"policy":{"type":"object","additionalProperties":{}},"auth_context":{"type":"object","additionalProperties":{}},"sample_data":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["policy","auth_context","sample_data"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/integrations":{"post":{"tags":["Admin: Integrations"],"summary":"Create integration","description":"Create integration","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string"},"name":{"type":"string"},"config_json":{"type":"object","additionalProperties":{}},"sync_direction":{"type":"string"}},"required":["provider","name","config_json","sync_direction"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Integration"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Integrations"],"summary":"List integrations","description":"List integrations","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Integration"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/integrations/{integration_id}":{"delete":{"tags":["Admin: Integrations"],"summary":"Delete integration","description":"Delete integration","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"integration_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Integrations"],"summary":"Get integration","description":"Get integration","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"integration_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Integration"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Admin: Integrations"],"summary":"Update integration","description":"Update integration","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"integration_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"config_json":{"type":"object","additionalProperties":{}},"status":{"type":"string"}},"required":["name","config_json","status"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Integration"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/integrations/{integration_id}/logs":{"get":{"tags":["Admin: Integrations"],"summary":"List sync logs","description":"List sync logs","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"integration_id","in":"path"},{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/IntegrationSyncLog"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/integrations/{integration_id}/sync":{"post":{"tags":["Admin: Integrations"],"summary":"Sync integration","description":"Sync integration","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"integration_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/functions":{"post":{"tags":["Admin: Plugins"],"summary":"Create custom function","description":"Create custom function","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"trigger_type":{"type":"string"},"code":{"type":"string"},"runtime":{"type":"string"}},"required":["name","description","trigger_type","code","runtime"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/CustomFunction"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Plugins"],"summary":"List custom functions","description":"List custom functions","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/CustomFunction"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/functions/{function_id}":{"delete":{"tags":["Admin: Plugins"],"summary":"Delete function","description":"Delete function","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"function_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Plugins"],"summary":"Get function","description":"Get function","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"function_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/CustomFunction"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Admin: Plugins"],"summary":"Update function","description":"Update function","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"function_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"code":{"type":"string"},"enabled":{"type":"boolean"}},"required":["name","code","enabled"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/CustomFunction"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/functions/{function_id}/execute":{"post":{"tags":["Admin: Plugins"],"summary":"Execute function","description":"Execute function","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"function_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"object","additionalProperties":{}}},"required":["input"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/plugins/{plugin_id}":{"get":{"tags":["Admin: Plugins"],"summary":"Get plugin","description":"Get plugin","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"plugin_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Plugin"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"delete":{"tags":["Admin: Plugins"],"summary":"Uninstall plugin","description":"Uninstall plugin","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"plugin_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Admin: Plugins"],"summary":"Update plugin","description":"Update plugin","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"plugin_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"config_json":{"type":"object","additionalProperties":{}},"enabled":{"type":"boolean"}},"required":["name","config_json","enabled"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Plugin"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/plugins":{"post":{"tags":["Admin: Plugins"],"summary":"Install plugin","description":"Install plugin","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"manifest_json":{"type":"object","additionalProperties":{}},"config_json":{"type":"object","additionalProperties":{}},"enabled":{"type":"boolean"}},"required":["name","version","manifest_json","config_json","enabled"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Plugin"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Plugins"],"summary":"List plugins","description":"List plugins","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Plugin"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/functions/{function_id}/logs":{"get":{"tags":["Admin: Plugins"],"summary":"List function logs","description":"List function logs","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"function_id","in":"path"},{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/FunctionLog"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/object-types/{object_type_id}/policies":{"post":{"tags":["Admin: Policies"],"summary":"Create access policy","description":"Create access policy","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"action":{"type":"string","enum":["select","insert","update","delete"]},"role":{},"condition_json":{"type":"object","additionalProperties":{}},"enabled":{"type":"boolean"}},"required":["name","action","condition_json","enabled"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AccessPolicy"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Policies"],"summary":"List access policies","description":"List access policies","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/AccessPolicy"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/object-types/{object_type_id}/policies/{policy_id}":{"delete":{"tags":["Admin: Policies"],"summary":"Delete access policy","description":"Delete access policy","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"policy_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Admin: Policies"],"summary":"Update access policy","description":"Update access policy","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"policy_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"action":{"type":"string"},"role":{},"condition_json":{"type":"object","additionalProperties":{}},"enabled":{"type":"boolean"}},"required":["name","action","condition_json","enabled"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AccessPolicy"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/realtime/stats":{"get":{"tags":["Admin: Realtime"],"summary":"Get realtime stats","description":"Get realtime stats","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"total_connections":{"type":"integer"},"channels":{"type":"object","additionalProperties":{}},"channel_count":{"type":"integer"}},"required":["total_connections","channels","channel_count"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/roles/{role_id}/permissions":{"put":{"tags":["Admin: Roles"],"summary":"Assign permissions to role","description":"Assign permissions to role","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"role_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"permissions":{"type":"array","items":{"type":"string"}}},"required":["permissions"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/roles/assign":{"post":{"tags":["Admin: Roles"],"summary":"Assign role to user","description":"Assign role to user","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"user_id":{"type":"string"},"role_id":{"type":"string"}},"required":["user_id","role_id"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/roles":{"post":{"tags":["Admin: Roles"],"summary":"Create role","description":"Create role","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"parent_role_id":{"type":"string"}},"required":["name","description","parent_role_id"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Role"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Roles"],"summary":"List roles","description":"List roles","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Role"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/roles/{role_id}":{"delete":{"tags":["Admin: Roles"],"summary":"Delete role","description":"Delete role","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"role_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Roles"],"summary":"Get role","description":"Get role","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"role_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Role"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Admin: Roles"],"summary":"Update role","description":"Update role","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"role_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"}},"required":["name","description"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Role"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/users/{user_id}/roles":{"get":{"tags":["Admin: Roles"],"summary":"List user roles","description":"List user roles","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"user_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/UserRole"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/roles/{role_id}/users/{user_id}":{"delete":{"tags":["Admin: Roles"],"summary":"Remove role from user","description":"Remove role from user","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"role_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"user_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/saved-reports":{"post":{"tags":["Admin: Saved Reports"],"summary":"Create saved report","description":"Create saved report","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string"},"config_json":{"type":"object","additionalProperties":{}},"schedule":{"type":"string"}},"required":["name","description","type","config_json","schedule"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/SavedReport"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Saved Reports"],"summary":"List saved reports","description":"List saved reports","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/SavedReport"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/saved-reports/{report_id}":{"delete":{"tags":["Admin: Saved Reports"],"summary":"Delete saved report","description":"Delete saved report","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"report_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Saved Reports"],"summary":"Get saved report","description":"Get saved report","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"report_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/SavedReport"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Admin: Saved Reports"],"summary":"Update saved report","description":"Update saved report","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"report_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"config_json":{"type":"object","additionalProperties":{}},"schedule":{"type":"string"}},"required":["name","description","config_json","schedule"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/SavedReport"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/saved-reports/{report_id}/export":{"get":{"tags":["Admin: Saved Reports"],"summary":"Export saved report","description":"Export saved report","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"report_id","in":"path"},{"schema":{"type":"string","enum":["csv","json"]},"required":false,"name":"format","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/saved-reports/{report_id}/run":{"post":{"tags":["Admin: Saved Reports"],"summary":"Run saved report","description":"Run saved report","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"report_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/scheduled-jobs":{"post":{"tags":["Admin: Scheduled Jobs"],"summary":"Create scheduled job","description":"Create scheduled job","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"cron_expression":{"type":"string"},"run_at":{"type":"string"},"action_type":{"type":"string"},"action_config":{"type":"object","additionalProperties":{}},"enabled":{"type":"boolean"}},"required":["name","description","cron_expression","run_at","action_type","action_config","enabled"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ScheduledJob"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Scheduled Jobs"],"summary":"List scheduled jobs","description":"List scheduled jobs","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/ScheduledJob"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/scheduled-jobs/{job_id}":{"delete":{"tags":["Admin: Scheduled Jobs"],"summary":"Delete scheduled job","description":"Delete scheduled job","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"job_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Scheduled Jobs"],"summary":"Get scheduled job","description":"Get scheduled job","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"job_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ScheduledJob"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Admin: Scheduled Jobs"],"summary":"Update scheduled job","description":"Update scheduled job","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"job_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"cron_expression":{"type":"string"},"action_type":{"type":"string"},"action_config":{"type":"object","additionalProperties":{}},"enabled":{"type":"boolean"}},"required":["name","description","cron_expression","action_type","action_config","enabled"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ScheduledJob"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/scheduled-jobs/{job_id}/execute":{"post":{"tags":["Admin: Scheduled Jobs"],"summary":"Execute scheduled job","description":"Execute scheduled job","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"job_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":{}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/sql":{"post":{"tags":["Admin: SQL"],"summary":"Execute SQL query","description":"Execute SQL query","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"sql":{"type":"string"},"params":{"type":"array","items":{}}},"required":["sql","params"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"string"}},"rows":{"type":"array","items":{"type":"object","additionalProperties":{}}},"row_count":{"type":"integer"},"duration_ms":{"type":"number"}},"required":["columns","rows","row_count","duration_ms"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/usage":{"get":{"tags":["Admin: Tenants"],"summary":"Get tenant usage","description":"Get tenant usage","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"tenant_id":{"type":"string"},"plan_tier":{"$ref":"#/components/schemas/PlanTier"},"used_storage_bytes":{"type":"integer"},"plan_limits":{"$ref":"#/components/schemas/PlanLimits"}},"required":["tenant_id","plan_tier","used_storage_bytes","plan_limits"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/users":{"post":{"tags":["Admin: Users"],"summary":"Create user","description":"Create user","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"},"password":{"type":"string"},"phone":{"type":"string"},"role":{"type":"string"},"email_verified":{"type":"boolean"},"user_metadata":{"type":"object","additionalProperties":{}}},"required":["email","password","phone","role","email_verified","user_metadata"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"allOf":[{"$ref":"#/components/schemas/AuthUser"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Users"],"summary":"List users","description":"List users","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"offset","in":"query"},{"schema":{"type":"string"},"required":false,"name":"search","in":"query"},{"schema":{"type":"string"},"required":false,"name":"role","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"users":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/AuthUser"},{"properties":{}}]}},"total":{"type":"integer"}},"required":["users","total"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/users/{user_id}":{"delete":{"tags":["Admin: Users"],"summary":"Delete user","description":"Delete user","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"user_id","in":"path"},{"schema":{"type":"boolean"},"required":false,"name":"force","in":"query"},{"schema":{"type":"string"},"required":false,"name":"confirm_token","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"user_id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["user_id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"409":{"description":"Dependency exists — dependent records must be removed first","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DependencyExistsResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Users"],"summary":"Get user","description":"Get user","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"user_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"allOf":[{"$ref":"#/components/schemas/AuthUser"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Admin: Users"],"summary":"Update user","description":"Update user","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"user_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"},"phone":{"type":"string"},"role":{"type":"string"},"banned":{"type":"boolean"},"ban_reason":{"type":"string"},"email_verified":{"type":"boolean"},"user_metadata":{"type":"object","additionalProperties":{}}},"required":["email","phone","role","banned","ban_reason","email_verified","user_metadata"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"allOf":[{"$ref":"#/components/schemas/AuthUser"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/users/{user_id}/mfa":{"get":{"tags":["Admin: Users"],"summary":"List user MFA factors","description":"List user MFA factors","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"user_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/MfaFactor"},{"properties":{}}]}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/webhook-deliveries":{"get":{"tags":["Admin: Webhook Deliveries"],"summary":"List webhook deliveries","description":"List webhook deliveries","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deliveries":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDelivery"}},"total":{"type":"integer"}},"required":["deliveries","total"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/webhook-deliveries/{delivery_id}/retry":{"post":{"tags":["Admin: Webhook Deliveries"],"summary":"Retry webhook delivery","description":"Retry webhook delivery","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"delivery_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"retried":{"type":"boolean"}},"required":["retried"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/webhooks":{"post":{"tags":["Admin: Webhooks"],"summary":"Create webhook","description":"Create webhook","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"object_types":{"type":"array","items":{"type":"string"}},"status":{"$ref":"#/components/schemas/WebhookStatus"}},"required":["url","events","object_types","status"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/WebhookConfig"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Admin: Webhooks"],"summary":"List webhooks","description":"List webhooks","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookConfig"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/webhooks/{webhook_id}":{"delete":{"tags":["Admin: Webhooks"],"summary":"Delete webhook","description":"Delete webhook","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"webhook_id","in":"path"},{"schema":{"type":"boolean"},"required":false,"name":"force","in":"query"},{"schema":{"type":"string"},"required":false,"name":"confirm_token","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"409":{"description":"Dependency exists — dependent records must be removed first","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DependencyExistsResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Admin: Webhooks"],"summary":"Update webhook","description":"Update webhook","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"webhook_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"status":{"$ref":"#/components/schemas/WebhookStatus"}},"required":["url","events","status"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/WebhookConfig"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/webhooks/{webhook_id}/replay":{"post":{"tags":["Admin: Webhooks"],"summary":"Replay webhook","description":"Replay webhook","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"webhook_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"event":{"type":"string"},"payload":{"type":"object","additionalProperties":{}}},"required":["event","payload"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"status_code":{"type":"integer"}},"required":["status_code"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/webhooks/{webhook_id}/rotate-secret":{"post":{"tags":["Admin: Webhooks"],"summary":"Rotate webhook secret","description":"Rotate webhook secret","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"webhook_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/WebhookConfig"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/webhooks/{webhook_id}/test":{"post":{"tags":["Admin: Webhooks"],"summary":"Test webhook","description":"Test webhook","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"webhook_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"status_code":{"type":"integer"}},"required":["status_code"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/ai/auto-tag":{"post":{"tags":["AI"],"summary":"Auto-tag content","description":"Automatically generate tags for an object based on its properties.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"object_type_id":{"type":"string"},"object_id":{"type":"string"}},"required":["object_type_id","object_id"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"string"}}},"required":["tags"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/ai/chat":{"post":{"tags":["AI"],"summary":"Chat completion","description":"Generate a chat response with optional conversation history. Max 20 history messages, 50KB combined.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"history":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["user","assistant"]},"content":{"type":"string"}},"required":["role","content"]}},"model":{"type":"string"}},"required":["message","history","model"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"response":{"type":"string"},"model":{"type":"string"}},"required":["response","model"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/ai/conversations/{conversation_id}/chat":{"post":{"tags":["AI"],"summary":"Chat with conversation history","description":"Chat with conversation history","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"conversation_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"model":{"type":"string"}},"required":["message","model"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"response":{"type":"string"},"model":{"type":"string"}},"required":["response","model"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/ai/describe":{"post":{"tags":["AI"],"summary":"Describe image","description":"Generate a text description of an image file stored in R2. Supports JPEG, PNG, WebP, GIF (max 10MB).","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"file_id":{"type":"string"},"model":{"type":"string"}},"required":["file_id","model"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"description":{"type":"string"},"filename":{"type":"string"},"model":{"type":"string"}},"required":["description","filename","model"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/ai/generate":{"post":{"tags":["AI"],"summary":"Text generation","description":"Generate text from a prompt.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string"},"model":{"type":"string"},"max_tokens":{"type":"integer"}},"required":["prompt","model","max_tokens"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"text":{"type":"string"},"model":{"type":"string"}},"required":["text","model"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/ai/index":{"post":{"tags":["AI"],"summary":"Index objects for vector search","description":"Generate embeddings for objects and insert them into the Vectorize index. Max 100 per request.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"object_type_id":{"type":"string"},"object_ids":{"type":"array","items":{"type":"string"}}},"required":["object_type_id","object_ids"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"indexed":{"type":"integer"},"model":{"type":"string"},"object_type_id":{"type":"string"}},"required":["indexed","model","object_type_id"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/ai/moderate":{"post":{"tags":["AI"],"summary":"Content moderation","description":"Classify text content for policy violations.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","additionalProperties":{}}},"model":{"type":"string"}},"required":["results","model"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/ai/summarise":{"post":{"tags":["AI"],"summary":"Summarise content","description":"Generate a summary of an object's text content.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"object_type_id":{"type":"string"},"object_id":{"type":"string"},"max_length":{"type":"integer"}},"required":["object_type_id","object_id","max_length"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"summary":{"type":"string"}},"required":["summary"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/ai/search":{"post":{"tags":["AI"],"summary":"Vector similarity search","description":"Search the Vectorize index for objects semantically similar to the query.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"limit":{"type":"integer"},"object_type_id":{"type":"string"}},"required":["query","limit","object_type_id"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","additionalProperties":{}}},"model":{"type":"string"},"dimensions":{"type":"integer"}},"required":["results","model","dimensions"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/ai/conversations":{"post":{"tags":["AI"],"summary":"Create AI conversation","description":"Create AI conversation","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"model":{"type":"string"}},"required":["title","model"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AiConversation"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["AI"],"summary":"List AI conversations","description":"List AI conversations","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/AiConversation"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/ai/conversations/{conversation_id}":{"delete":{"tags":["AI"],"summary":"Delete AI conversation","description":"Delete AI conversation","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"conversation_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"conversation_id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["conversation_id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["AI"],"summary":"Get AI conversation","description":"Get AI conversation","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"conversation_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AiConversation"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["AI"],"summary":"Update AI conversation","description":"Update AI conversation","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"conversation_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"}},"required":["title"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AiConversation"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/ai/embeddings":{"post":{"tags":["AI"],"summary":"Generate embeddings","description":"Generate vector embeddings for one or more text inputs. Max 100 texts.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"text":{},"model":{"type":"string"}},"required":["model"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"embeddings":{"type":"array","items":{"type":"array","items":{"type":"number"}}},"model":{"type":"string"},"dimensions":{"type":"integer"}},"required":["embeddings","model","dimensions"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/ai/models":{"get":{"tags":["AI"],"summary":"List available AI models","description":"List available Cloudflare Workers AI models grouped by capability.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"text_generation":{"type":"array","items":{"type":"string"}},"text_embedding":{"type":"array","items":{"type":"string"}},"image_to_text":{"type":"array","items":{"type":"string"}},"text_classification":{"type":"array","items":{"type":"string"}}},"required":["text_generation","text_embedding","image_to_text","text_classification"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/objects/{from_type}/{from_id}/associations/{association_type}/{to_type}/{to_id}":{"delete":{"tags":["Associations"],"summary":"Delete association","description":"Remove an association between two objects.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"from_type","in":"path"},{"schema":{"type":"string"},"required":true,"name":"from_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"association_type","in":"path"},{"schema":{"type":"string"},"required":true,"name":"to_type","in":"path"},{"schema":{"type":"string"},"required":true,"name":"to_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"put":{"tags":["Associations"],"summary":"Create or update association","description":"Create or replace an association between two objects. Optionally include a meta object (max 10KB).","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"from_type","in":"path"},{"schema":{"type":"string"},"required":true,"name":"from_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"association_type","in":"path"},{"schema":{"type":"string"},"required":true,"name":"to_type","in":"path"},{"schema":{"type":"string"},"required":true,"name":"to_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"meta":{"type":"object","additionalProperties":{}}},"required":["meta"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Association"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/objects/{type}/{id}/associations":{"get":{"tags":["Associations"],"summary":"List associations","description":"List associations for an object, optionally filtering by type and direction.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"type","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","enum":["forward","reverse"]},"required":false,"name":"direction","in":"query"},{"schema":{"type":"string"},"required":false,"name":"association_type","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"cursor","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/Association"}},"next_cursor":{},"total":{"type":"integer"}},"required":["results","total"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/objects/{object_type_id}/{object_id}/comments":{"post":{"tags":["Comments"],"summary":"Create comment","description":"Add a comment to an object (activity feed). Requires authenticated user.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"object_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"type":"string"}},"required":["body"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Comment"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Comments"],"summary":"List comments","description":"List comments on an object, newest first.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"object_id","in":"path"},{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"cursor","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/Comment"}},"next_cursor":{},"total":{"type":"integer"}},"required":["results","total"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/objects/{object_type_id}/{object_id}/comments/{comment_id}":{"delete":{"tags":["Comments"],"summary":"Delete comment","description":"Delete a comment. Only the author can delete their own comments.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"object_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"comment_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Comments"],"summary":"Update comment","description":"Edit a comment. Only the author can edit their own comments.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"object_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"comment_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"type":"string"}},"required":["body"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Comment"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/email/send":{"post":{"tags":["Email"],"summary":"Send email","description":"Send a transactional email using the tenant's configured email provider.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"to":{"type":"string"},"subject":{"type":"string"},"html":{"type":"string"},"text":{"type":"string"},"from":{"type":"string"},"reply_to":{"type":"string"}},"required":["to","subject","html","text","from","reply_to"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"sent":{"type":"boolean"},"message_id":{"type":"string"}},"required":["sent","message_id"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/errors/report":{"post":{"tags":["Errors"],"summary":"Report client error","description":"Report a client-side error for tracking and alerting.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"stack":{"type":"string"},"source":{"type":"string"},"level":{"type":"string","enum":["error","fatal"]},"path":{"type":"string"},"metadata":{"type":"object","additionalProperties":{}}},"required":["message","stack","source","level","path","metadata"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"error_id":{"type":"string"}},"required":["error_id"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/events/stream":{"get":{"tags":["Events"],"summary":"Server-sent events stream","description":"Real-time SSE stream of object and file events.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"SSE stream"},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/events/types":{"get":{"tags":["Events"],"summary":"List available event types","description":"List available event types","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"string"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/events":{"post":{"tags":["Events"],"summary":"Track custom event","description":"Track a custom event for analytics and automation triggers.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"event_type":{"type":"string"},"data":{"type":"object","additionalProperties":{}}},"required":["event_type","data"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"tracked":{"type":"boolean"}},"required":["tracked"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/events/list":{"get":{"tags":["Events"],"summary":"List custom events","description":"List custom events","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/CustomEvent"}},"total":{"type":"integer"}},"required":["events","total"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/files/batch/delete":{"post":{"tags":["Files"],"summary":"Batch delete files","description":"Delete multiple files in a single request. Max 100.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"file_ids":{"type":"array","items":{"type":"string"}}},"required":["file_ids"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deleted":{"type":"array","items":{"type":"string"}},"count":{"type":"integer"}},"required":["deleted","count"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/files/batch/read":{"post":{"tags":["Files"],"summary":"Batch read file metadata","description":"Retrieve metadata for multiple files by ID. Max 100.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"file_ids":{"type":"array","items":{"type":"string"}}},"required":["file_ids"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/FileRecord"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/files/batch/update":{"post":{"tags":["Files"],"summary":"Batch update file metadata","description":"Update access or folder for multiple files. Max 100.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"file_ids":{"type":"array","items":{"type":"string"}},"access":{"$ref":"#/components/schemas/FileAccess"},"folder":{"type":"string"}},"required":["file_ids","access","folder"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"updated":{"type":"integer"}},"required":["updated"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/files/{file_id}/upload-complete":{"post":{"tags":["Files"],"summary":"Confirm presigned upload","description":"Marks a presigned upload as complete. Status changes from \"pending\" to \"ready\".","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"file_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/FileRecord"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/files/{file_id}/signed-url":{"post":{"tags":["Files"],"summary":"Generate signed URL","description":"Creates a time-limited, HMAC-signed URL for accessing private files without authentication.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"file_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"expires_in":{"type":"integer"}},"required":["expires_in"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"url":{"type":"string"},"expires_at":{"type":"string"},"ttl":{"type":"integer"}},"required":["url","expires_at","ttl"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/files/{file_id}":{"delete":{"tags":["Files"],"summary":"Delete file","description":"Soft-delete a file. R2 object is cleaned up asynchronously. Triggers file.deleted webhook.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"file_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"file_id":{"type":"string"},"deleted":{"type":"boolean"}},"required":["file_id","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Files"],"summary":"Get file metadata","description":"Get metadata for a single file.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"file_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/FileRecord"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Files"],"summary":"Update file metadata","description":"Update filename, access level, folder, meta, or linked object. Triggers file.updated webhook.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"file_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"filename":{"type":"string"},"access":{"$ref":"#/components/schemas/FileAccess"},"folder":{"type":"string"},"meta":{"type":"object","additionalProperties":{}},"object_type_id":{},"object_id":{}},"required":["filename","access","folder","meta"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/FileRecord"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/files/{file_id}/content":{"get":{"tags":["Files"],"summary":"Download file content","description":"Returns raw binary content. Also accessible via signed URLs without Bearer auth when token/expires/t query params are present.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"file_id","in":"path"},{"schema":{"type":"string"},"required":false,"name":"token","in":"query"},{"schema":{"type":"number"},"required":false,"name":"expires","in":"query"},{"schema":{"type":"string"},"required":false,"name":"t","in":"query"}],"responses":{"200":{"description":"File content"},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/files/{file_id}/variants/{variant}":{"get":{"tags":["Files"],"summary":"Get image variant","description":"On-the-fly image transformation. Only for image files. Results are cached.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"file_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"variant","in":"path"},{"schema":{"type":"integer"},"required":false,"name":"w","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"h","in":"query"},{"schema":{"type":"string","enum":["cover","scale-down"]},"required":false,"name":"fit","in":"query"},{"schema":{"type":"string","enum":["webp","jpeg","png"]},"required":false,"name":"format","in":"query"}],"responses":{"200":{"description":"Transformed image"},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/files/stats":{"get":{"tags":["Files"],"summary":"Storage statistics","description":"Get file storage usage and quota information.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/StorageStats"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/files/upload-url":{"post":{"tags":["Files"],"summary":"Get presigned upload URL","description":"Returns a presigned URL for direct client-side upload to R2, bypassing the Worker size limit.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"filename":{"type":"string"},"mime_type":{"type":"string"},"size_bytes":{"type":"integer"},"access":{"$ref":"#/components/schemas/FileAccess"},"folder":{"type":"string"},"meta":{"type":"object","additionalProperties":{}}},"required":["filename","mime_type","size_bytes","access","folder","meta"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"file_id":{"type":"string"},"r2_key":{"type":"string"},"upload_endpoint":{"type":"string"},"expires_at":{"type":"string"}},"required":["file_id","r2_key","upload_endpoint","expires_at"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/files/trash":{"get":{"tags":["Files"],"summary":"List trashed files","description":"List soft-deleted files that can be restored.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"cursor","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/FileRecord"}},"next_cursor":{},"total":{"type":"integer"}},"required":["results","total"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/files/{file_id}/versions":{"get":{"tags":["Files"],"summary":"List file versions","description":"Get the version history for a file.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"file_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/FileRecord"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/files/folders":{"get":{"tags":["Files"],"summary":"List folders","description":"List all file folders with counts and sizes.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/FolderInfo"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/files/{file_id}/restore":{"post":{"tags":["Files"],"summary":"Restore deleted file","description":"Restore a soft-deleted file from trash.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"file_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/FileRecord"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/files/search":{"post":{"tags":["Files"],"summary":"Search files","description":"Filter files by MIME type, access level, folder, filename, date range, and linked objects.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"mime_type":{"type":"string"},"mime_category":{"type":"string"},"access":{"$ref":"#/components/schemas/FileAccess"},"status":{"$ref":"#/components/schemas/FileStatus"},"folder":{"type":"string"},"filename":{"type":"string"},"object_type_id":{"type":"string"},"object_id":{"type":"string"},"created_after":{"type":"string"},"created_before":{"type":"string"},"sort":{"type":"string","enum":["size_bytes","filename","created_at"]},"sort_dir":{"$ref":"#/components/schemas/SortDirection"},"limit":{"type":"integer"},"cursor":{}},"required":["mime_type","mime_category","access","status","folder","filename","object_type_id","object_id","created_after","created_before","sort","sort_dir","limit"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/FileRecord"}},"next_cursor":{},"total":{"type":"integer"}},"required":["results","total"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/files/{file_id}/stale-cleanup":{"post":{"tags":["Files"],"summary":"Clean stale uploads","description":"Remove pending files older than 24 hours that were never completed.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"file_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"cleaned":{"type":"integer"}},"required":["cleaned"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/files/upload":{"post":{"tags":["Files"],"summary":"Upload file","description":"Direct multipart upload. Max 25MB per file. For larger files, use the presigned URL flow.","security":[{"BearerAuth":[]}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/FileRecord"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/files/{file_id}/upload-put":{"post":{"tags":["Files"],"summary":"Upload file content to presigned slot","description":"Upload raw file content for a presigned upload slot.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"file_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/FileRecord"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/data/export/{export_id}":{"get":{"tags":["Import / Export"],"summary":"Download export","description":"Download the exported data file.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"export_id","in":"path"}],"responses":{"200":{"description":"Exported data file","content":{"application/json":{"schema":{"type":"string"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/data/import":{"post":{"tags":["Import / Export"],"summary":"Import data","description":"Bulk import up to 10,000 rows from CSV, JSON file, or inline JSON body.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"object_type_id":{"type":"string"},"format":{"type":"string","enum":["json","csv"]},"data":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["object_type_id","format","data"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"imported":{"type":"integer"},"errors":{"type":"array","items":{"type":"object","additionalProperties":{}}},"total":{"type":"integer"}},"required":["imported","errors","total"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/data/export":{"post":{"tags":["Import / Export"],"summary":"Start data export","description":"Initiate an async export of all objects of a type. Max 100,000 records.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"object_type_id":{"type":"string"},"format":{"type":"string","enum":["json","csv"]}},"required":["object_type_id","format"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"export_id":{"type":"string"},"format":{"type":"string"},"record_count":{"type":"integer"},"download_path":{"type":"string"}},"required":["export_id","format","record_count","download_path"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/objects/{object_type_id}/batch/read":{"post":{"tags":["Objects"],"summary":"Batch read objects","description":"Retrieve multiple objects by ID in a single request. Max 100 IDs.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"object_ids":{"type":"array","items":{"type":"string"}}},"required":["object_ids"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/ObjectRecord"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/objects/{object_type_id}/batch/update":{"post":{"tags":["Objects"],"summary":"Batch update objects","description":"Update multiple objects in a single request. Max 100 items.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"updates":{"type":"array","items":{"type":"object","properties":{"object_id":{"type":"string"},"properties":{"type":"object","additionalProperties":{}}},"required":["object_id","properties"]}}},"required":["updates"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","properties":{"object_id":{"type":"string"},"version":{"type":"integer"}},"required":["object_id","version"]}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/objects/{object_type_id}/trash":{"get":{"tags":["Objects"],"summary":"List trashed objects","description":"List soft-deleted objects that can be restored.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"cursor","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/ObjectRecord"}},"next_cursor":{},"total":{"type":"integer"}},"required":["results","total"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/objects/{object_type_id}/{object_id}/restore":{"post":{"tags":["Objects"],"summary":"Restore deleted object","description":"Restore a soft-deleted object from trash.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"object_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ObjectRecord"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/forms/{form_id}/submit":{"post":{"tags":["Public Forms"],"summary":"Submit public form","description":"Submit data through a public form. Creates an object in the linked type. Rate-limited.","parameters":[{"schema":{"type":"string"},"required":true,"name":"form_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"submitted":{"type":"boolean"},"object_id":{"type":"string"}},"required":["submitted","object_id"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/docs":{"get":{"tags":["Public"],"summary":"API documentation UI","description":"Returns the interactive HTML API documentation.","responses":{"200":{"description":"HTML docs page"},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/health":{"get":{"tags":["Public"],"summary":"Health check","description":"Returns service status, version, deployment region, and timestamp.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"status":{"type":"string"},"service":{"type":"string"},"version":{"type":"string"},"timestamp":{"type":"string"},"region":{"type":"string"},"uptime":{"type":"string"}},"required":["status","service","version","timestamp","region","uptime"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/":{"get":{"tags":["Public"],"summary":"Landing page","description":"Returns the HTML landing page for the API.","responses":{"200":{"description":"HTML landing page"},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/docs/openapi.json":{"get":{"tags":["Public"],"summary":"OpenAPI specification","description":"Returns this OpenAPI 3.1 JSON specification.","responses":{"200":{"description":"OpenAPI spec","content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/ready":{"get":{"tags":["Public"],"summary":"Readiness probe","description":"Lightweight probe for load balancer health checks.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"status":{"type":"string","enum":["ready"]},"service":{"type":"string"},"timestamp":{"type":"string"}},"required":["status","service","timestamp"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/tenant-config":{"get":{"tags":["Public"],"summary":"Get tenant config (public)","description":"Returns public-facing tenant configuration (branding, auth config). No auth required but tenant must be identifiable.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/TenantConfig"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/tenants/lookup":{"post":{"tags":["Public"],"summary":"Lookup tenants by email","description":"Find tenants associated with an email address.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"}},"required":["email"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","properties":{"tenant_id":{"type":"string"},"brand_name":{"type":"string"}},"required":["tenant_id","brand_name"]}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/realtime":{"get":{"tags":["Realtime"],"summary":"WebSocket upgrade","description":"Upgrades to a WebSocket connection for real-time event subscriptions. Uses Durable Objects with WebSocket Hibernation. Channels: objects:<type_id>, files, files:<folder>.","parameters":[{"schema":{"type":"string"},"required":true,"name":"token","in":"query"},{"schema":{"type":"string"},"required":true,"name":"tenant_id","in":"query"}],"responses":{"101":{"description":"WebSocket upgrade"},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"426":{"description":"Not a WebSocket upgrade request"},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/reports/funnel":{"post":{"tags":["Reports"],"summary":"Funnel report","description":"Generate a multi-step funnel conversion report.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"object_type_id":{"type":"string"},"steps":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"filters":{"type":"array","items":{"$ref":"#/components/schemas/SearchFilter"}}},"required":["name","filters"]}}},"required":["object_type_id","steps"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"steps":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["steps"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/reports/leaderboard":{"post":{"tags":["Reports"],"summary":"Leaderboard report","description":"Generate a ranked leaderboard by a property value.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"object_type_id":{"type":"string"},"group_by":{"type":"string"},"aggregation":{"type":"string","enum":["count","sum","avg"]},"value_property":{"type":"string"},"limit":{"type":"integer"},"filters":{"type":"array","items":{"$ref":"#/components/schemas/SearchFilter"}}},"required":["object_type_id","group_by","aggregation","value_property","limit","filters"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"entries":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["entries"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/reports/pipeline":{"post":{"tags":["Reports"],"summary":"Pipeline report","description":"Generate a pipeline/funnel stage breakdown report.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"object_type_id":{"type":"string"},"stage_property":{"type":"string"},"filters":{"type":"array","items":{"$ref":"#/components/schemas/SearchFilter"}}},"required":["object_type_id","stage_property","filters"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"stages":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["stages"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/reports/timeseries":{"post":{"tags":["Reports"],"summary":"Time series report","description":"Generate a time series report with configurable intervals.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"object_type_id":{"type":"string"},"date_property":{"type":"string"},"interval":{"type":"string","enum":["hour","day","week","month"]},"aggregation":{"type":"string","enum":["count","sum","avg"]},"value_property":{"type":"string"},"filters":{"type":"array","items":{"$ref":"#/components/schemas/SearchFilter"}},"start_date":{"type":"string"},"end_date":{"type":"string"}},"required":["object_type_id","date_property","interval","aggregation","value_property","filters","start_date","end_date"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"series":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["series"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/auth/saml/{provider}/acs":{"post":{"tags":["SAML / SSO"],"summary":"SAML ACS","description":"Assertion Consumer Service endpoint. Receives SAML response from IdP, creates/links user, and redirects with session.","parameters":[{"schema":{"type":"string"},"required":true,"name":"provider","in":"path"}],"responses":{"302":{"description":"Redirect to app with session tokens"},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/auth/saml/{provider}/login":{"get":{"tags":["SAML / SSO"],"summary":"SAML login redirect","description":"Initiate SAML SSO by redirecting to the IdP.","parameters":[{"schema":{"type":"string"},"required":true,"name":"provider","in":"path"}],"responses":{"302":{"description":"Redirect to SAML IdP"},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/auth/saml/{provider}/metadata":{"get":{"tags":["SAML / SSO"],"summary":"SAML metadata","description":"Returns SAML SP metadata XML for configuring the IdP.","parameters":[{"schema":{"type":"string"},"required":true,"name":"provider","in":"path"}],"responses":{"200":{"description":"SAML metadata XML"},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/objects/{object_type_id}/aggregate":{"post":{"tags":["Search"],"summary":"Aggregate objects","description":"Run aggregate queries (count, sum, avg, min, max) on object properties with optional filtering and grouping.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"aggregations":{"type":"array","items":{"type":"object","properties":{"function":{"type":"string","enum":["count","sum","avg","min","max"]},"property_id":{"type":"string"},"alias":{"type":"string"}},"required":["function","property_id","alias"]}},"filters":{"type":"array","items":{"$ref":"#/components/schemas/SearchFilter"}},"group_by":{"type":"array","items":{"type":"string"}}},"required":["aggregations","filters","group_by"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["results"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/short-urls":{"post":{"tags":["Short URLs"],"summary":"Create a short URL","description":"Create a short URL","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShortUrlCreate"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ShortUrl"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"409":{"description":"Slug already taken","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Short URLs"],"summary":"List short URLs","description":"List short URLs","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer"},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/ShortUrl"}},"total":{"type":"integer"}},"required":["results","total"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/short-urls/{slug}":{"delete":{"tags":["Short URLs"],"summary":"Delete a short URL","description":"Delete a short URL","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"slug","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"slug":{"type":"string"},"deleted":{"type":"boolean","enum":[true]}},"required":["slug","deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Short URLs"],"summary":"Get short URL details","description":"Get short URL details","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"slug","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ShortUrl"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Short URLs"],"summary":"Update a short URL","description":"Update a short URL","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"slug","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShortUrlUpdate"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ShortUrl"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/objects/{object_type_id}/{object_id}/versions":{"get":{"tags":["Versions"],"summary":"List object version history","description":"Returns all previous versions of an object, newest first.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"object_id","in":"path"},{"schema":{"type":"integer"},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/ObjectVersion"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/object-types/{object_type_id}/views":{"post":{"tags":["Views"],"summary":"Create saved view","description":"Create a saved view with filters, sort, and column configuration.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"filters":{"type":"array","items":{"$ref":"#/components/schemas/SearchFilter"}},"sort":{"$ref":"#/components/schemas/SearchSort"},"columns":{"type":"array","items":{"type":"string"}}},"required":["name","filters","sort","columns"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/View"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Views"],"summary":"List saved views","description":"List saved views (filter presets) for an object type.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/View"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/object-types/{object_type_id}/views/{view_id}":{"delete":{"tags":["Views"],"summary":"Delete saved view","description":"Delete a saved view.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"view_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Views"],"summary":"Update saved view","description":"Update an existing saved view.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"view_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"filters":{"type":"array","items":{"$ref":"#/components/schemas/SearchFilter"}},"sort":{"$ref":"#/components/schemas/SearchSort"},"columns":{"type":"array","items":{"type":"string"}}},"required":["name","filters","sort","columns"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/View"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/objects/{object_type_id}/{object_id}/approve":{"post":{"tags":["Workflows"],"summary":"Approve object","description":"Approve an object in the current workflow stage.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"object_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"comment":{"type":"string"}},"required":["comment"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"approved":{"type":"boolean"},"stage":{"type":"string"}},"required":["approved","stage"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/objects/{object_type_id}/{object_id}/workflow-status":{"get":{"tags":["Workflows"],"summary":"Get workflow status","description":"Get the current approval workflow status for an object.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"object_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"status":{"type":"string"},"stage":{"type":"string"},"history":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["status","stage","history"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/objects/{object_type_id}/{object_id}/reject":{"post":{"tags":["Workflows"],"summary":"Reject object","description":"Reject an object in the current workflow stage.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"object_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string"}},"required":["reason"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"rejected":{"type":"boolean"},"stage":{"type":"string"}},"required":["rejected","stage"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/objects/{object_type_id}/{object_id}/submit-for-review":{"post":{"tags":["Workflows"],"summary":"Submit for review","description":"Submit an object for approval workflow review.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"object_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"submitted":{"type":"boolean"},"stage":{"type":"string"}},"required":["submitted","stage"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/object-types/{object_type_id}/workflows":{"post":{"tags":["Workflows"],"summary":"Create workflow","description":"Create workflow","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"stages":{"type":"array","items":{"type":"object","additionalProperties":{}}},"enabled":{"type":"boolean"}},"required":["name","stages","enabled"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Workflow"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"get":{"tags":["Workflows"],"summary":"List workflows","description":"List workflows","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Workflow"}},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}},"/v1/object-types/{object_type_id}/workflows/{workflow_id}":{"delete":{"tags":["Workflows"],"summary":"Delete workflow","description":"Delete workflow","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"workflow_id","in":"path"},{"schema":{"type":"boolean"},"required":false,"name":"force","in":"query"},{"schema":{"type":"string"},"required":false,"name":"confirm_token","in":"query"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"]},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"409":{"description":"Dependency exists — dependent records must be removed first","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DependencyExistsResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}},"patch":{"tags":["Workflows"],"summary":"Update workflow","description":"Update workflow","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"object_type_id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"workflow_id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"stages":{"type":"array","items":{"type":"object","additionalProperties":{}}},"enabled":{"type":"boolean"}},"required":["name","stages","enabled"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Workflow"},"request_id":{"type":"string"}},"required":["success","data","request_id"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"401":{"description":"Unauthorized — missing or invalid token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"403":{"description":"Forbidden — insufficient permissions or scope","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"allOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"properties":{}}]},"request_id":{"type":"string"}},"required":["success","error","request_id"]}}}}}}}},"webhooks":{}}