{"openapi":"3.0.0","paths":{"/api/v1/auth/features":{"get":{"operationId":"AuthController_features","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/register":{"post":{"operationId":"AuthController_register","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":254},"password":{"type":"string","minLength":12,"maxLength":128},"display_name":{"type":"string","minLength":1,"maxLength":64}},"required":["email","password","display_name"]}}}},"responses":{"202":{"description":""}},"tags":["auth"]}},"/api/v1/auth/verify-email":{"post":{"operationId":"AuthController_verifyEmail","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","minLength":20,"maxLength":200}},"required":["token"]}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/verify-email/resend":{"post":{"operationId":"AuthController_resend","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":254}},"required":["email"]}}}},"responses":{"202":{"description":""}},"tags":["auth"]}},"/api/v1/auth/login":{"post":{"operationId":"AuthController_login","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":254},"password":{"type":"string","minLength":1,"maxLength":256}},"required":["email","password"]}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/login/mfa":{"post":{"operationId":"AuthController_loginMfa","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mfa_token":{"type":"string","minLength":20,"maxLength":200},"code":{"type":"string","minLength":6,"maxLength":32}},"required":["mfa_token","code"]}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/passkeys/login/options":{"post":{"operationId":"AuthController_passkeyLoginOptions","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/passkeys/login/verify":{"post":{"operationId":"AuthController_passkeyLogin","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/password/forgot":{"post":{"operationId":"AuthController_forgot","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":254}},"required":["email"]}}}},"responses":{"202":{"description":""}},"tags":["auth"]}},"/api/v1/auth/password/reset":{"post":{"operationId":"AuthController_reset","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","minLength":20,"maxLength":200},"password":{"type":"string","minLength":12,"maxLength":128}},"required":["token","password"]}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/me":{"get":{"operationId":"AuthController_me","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/logout":{"post":{"operationId":"AuthController_logout","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/profile":{"patch":{"operationId":"AuthController_updateProfile","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"display_name":{"type":"string","minLength":1,"maxLength":64}},"required":["display_name"]}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/password/change":{"post":{"operationId":"AuthController_changePassword","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"current_password":{"type":"string","minLength":1,"maxLength":256},"new_password":{"type":"string","minLength":12,"maxLength":128}},"required":["current_password","new_password"]}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/reauth":{"post":{"operationId":"AuthController_reauth","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"password":{"type":"string","minLength":1,"maxLength":256},"code":{"type":"string","minLength":6,"maxLength":32}},"required":["password"]}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/sessions":{"get":{"operationId":"AuthController_listSessions","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/sessions/{id}":{"delete":{"operationId":"AuthController_revokeSession","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/sessions/revoke-others":{"post":{"operationId":"AuthController_revokeOthers","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/mfa/totp/setup":{"post":{"operationId":"AuthController_totpSetup","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/mfa/totp/confirm":{"post":{"operationId":"AuthController_totpConfirm","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","pattern":"^\\d{6}$"}},"required":["code"]}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/mfa/totp/disable":{"post":{"operationId":"AuthController_totpDisable","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"password":{"type":"string","minLength":1,"maxLength":256},"code":{"type":"string","minLength":6,"maxLength":32}},"required":["password","code"]}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/mfa/recovery-codes":{"post":{"operationId":"AuthController_regenerateRecoveryCodes","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/passkeys":{"get":{"operationId":"AuthController_listPasskeys","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/passkeys/register/options":{"post":{"operationId":"AuthController_passkeyRegisterOptions","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/passkeys/register/verify":{"post":{"operationId":"AuthController_passkeyRegister","parameters":[],"responses":{"201":{"description":""}},"tags":["auth"]}},"/api/v1/auth/passkeys/{id}":{"delete":{"operationId":"AuthController_removePasskey","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/organizations":{"post":{"operationId":"OrganizationsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":64}},"required":["name"]}}}},"responses":{"201":{"description":""}},"tags":["organizations"]}},"/api/v1/organizations/invites/accept":{"post":{"operationId":"OrganizationsController_accept","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","minLength":20,"maxLength":200}},"required":["token"]}}}},"responses":{"200":{"description":""}},"tags":["organizations"]}},"/api/v1/organizations/{id}/leave":{"post":{"operationId":"OrganizationsController_leave","parameters":[],"responses":{"200":{"description":""}},"tags":["organizations"]}},"/api/v1/roles":{"get":{"operationId":"OrganizationsController_roles","parameters":[],"responses":{"200":{"description":""}},"tags":["organizations"]}},"/api/v1/admin/organization":{"get":{"operationId":"OrganizationsController_get","parameters":[],"responses":{"200":{"description":""}},"tags":["organizations"]},"patch":{"operationId":"OrganizationsController_update","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":64}}}}}},"responses":{"200":{"description":""}},"tags":["organizations"]}},"/api/v1/admin/members":{"get":{"operationId":"OrganizationsController_members","parameters":[],"responses":{"200":{"description":""}},"tags":["organizations"]}},"/api/v1/admin/members/{id}":{"patch":{"operationId":"OrganizationsController_updateMember","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["org_admin","app_manager","support","read_only"]}},"required":["role"]}}}},"responses":{"200":{"description":""}},"tags":["organizations"]},"delete":{"operationId":"OrganizationsController_removeMember","parameters":[],"responses":{"200":{"description":""}},"tags":["organizations"]}},"/api/v1/admin/invites":{"get":{"operationId":"OrganizationsController_invites","parameters":[],"responses":{"200":{"description":""}},"tags":["organizations"]},"post":{"operationId":"OrganizationsController_invite","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":254},"role":{"type":"string","enum":["org_admin","app_manager","support","read_only"]}},"required":["email","role"]}}}},"responses":{"201":{"description":""}},"tags":["organizations"]}},"/api/v1/admin/invites/{id}":{"delete":{"operationId":"OrganizationsController_revokeInvite","parameters":[],"responses":{"200":{"description":""}},"tags":["organizations"]}},"/api/v1/admin/invite-links":{"get":{"operationId":"OrganizationsController_inviteLinks","parameters":[],"responses":{"200":{"description":""}},"tags":["organizations"]},"post":{"operationId":"OrganizationsController_createInviteLink","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["app_manager","support","read_only"]},"max_uses":{"type":"integer","minimum":1,"maximum":100},"expires_in_hours":{"type":"integer","minimum":1,"maximum":720}},"required":["role","max_uses","expires_in_hours"]}}}},"responses":{"201":{"description":""}},"tags":["organizations"]}},"/api/v1/admin/invite-links/{id}":{"delete":{"operationId":"OrganizationsController_revokeInviteLink","parameters":[],"responses":{"200":{"description":""}},"tags":["organizations"]}},"/api/v1/organizations/invite-links/preview":{"post":{"operationId":"OrganizationsController_previewInviteLink","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","minLength":20,"maxLength":200}},"required":["token"]}}}},"responses":{"200":{"description":""}},"tags":["organizations"]}},"/api/v1/organizations/invite-links/join":{"post":{"operationId":"OrganizationsController_joinWithInviteLink","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","minLength":20,"maxLength":200}},"required":["token"]}}}},"responses":{"200":{"description":""}},"tags":["organizations"]}},"/api/v1/admin/applications":{"get":{"operationId":"ApplicationsController_list","parameters":[{"name":"page","required":false,"in":"query","schema":{"default":1,"type":"integer","minimum":1,"maximum":100000}},{"name":"per_page","required":false,"in":"query","schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"q","required":false,"in":"query","schema":{"type":"string","maxLength":64}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["active","disabled","archived"]}}],"responses":{"200":{"description":""}},"tags":["admin: applications"]},"post":{"operationId":"ApplicationsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":64},"description":{"type":"string","maxLength":500},"version":{"type":"string","maxLength":32}},"required":["name"]}}}},"responses":{"201":{"description":""}},"tags":["admin: applications"]}},"/api/v1/admin/applications/{id}":{"get":{"operationId":"ApplicationsController_get","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: applications"]},"patch":{"operationId":"ApplicationsController_update","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":64},"description":{"nullable":true,"type":"string","maxLength":500},"version":{"nullable":true,"type":"string","maxLength":32},"status":{"type":"string","enum":["active","disabled"]},"settings":{"type":"object","properties":{"licensing_enabled":{"type":"boolean"},"maintenance_mode":{"type":"boolean"},"maintenance_message":{"nullable":true,"type":"string","maxLength":280},"min_version":{"nullable":true,"type":"string","maxLength":32},"default_max_devices":{"type":"integer","minimum":1,"maximum":1000},"allowed_durations":{"minItems":1,"type":"array","items":{"type":"string","enum":["trial","1d","3d","7d","30d","90d","1y","lifetime","custom"]}},"trial_duration_seconds":{"type":"integer","minimum":3600,"maximum":7776000},"session_ttl_seconds":{"type":"integer","minimum":60,"maximum":86400},"max_sessions_per_license":{"type":"integer","minimum":1,"maximum":1000},"session_limit_strategy":{"type":"string","enum":["reject","revoke_oldest"]},"new_activations_enabled":{"type":"boolean"},"key_prefix":{"type":"string"},"key_recovery_enabled":{"type":"boolean"},"customer_self_reset_enabled":{"type":"boolean"},"hwid_reset_cooldown_hours":{"type":"integer","minimum":0,"maximum":2160},"rate_limit_per_minute":{"type":"integer","minimum":10,"maximum":100000}}}}}}}},"responses":{"200":{"description":""}},"tags":["admin: applications"]},"delete":{"operationId":"ApplicationsController_archive","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: applications"]}},"/api/v1/admin/applications/{id}/revoke-sessions":{"post":{"operationId":"ApplicationsController_revokeSessions","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: applications"]}},"/api/v1/admin/applications/{id}/signing-keys":{"post":{"operationId":"ApplicationsController_createKey","parameters":[],"responses":{"201":{"description":""}},"tags":["admin: applications"]}},"/api/v1/admin/applications/{id}/signing-keys/{kid}/activate":{"post":{"operationId":"ApplicationsController_activateKey","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: applications"]}},"/api/v1/admin/applications/{id}/signing-keys/{kid}":{"delete":{"operationId":"ApplicationsController_deleteKey","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: applications"]}},"/api/v1/admin/products":{"get":{"operationId":"ApplicationsController_listProducts","parameters":[{"name":"application_id","required":false,"in":"query","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"responses":{"200":{"description":""}},"tags":["admin: applications"]},"post":{"operationId":"ApplicationsController_createProduct","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"application_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":1,"maxLength":64},"description":{"type":"string","maxLength":500},"duration":{"type":"string","enum":["trial","1d","3d","7d","30d","90d","1y","lifetime","custom"]},"duration_seconds":{"type":"integer","minimum":60,"maximum":630720000},"expiration_mode":{"type":"string","enum":["from_creation","from_first_activation","never"]},"max_devices":{"type":"integer","minimum":1,"maximum":1000},"max_activations":{"nullable":true,"type":"integer","minimum":1,"maximum":1000000}},"required":["application_id","name","duration"]}}}},"responses":{"201":{"description":""}},"tags":["admin: applications"]}},"/api/v1/admin/products/{id}":{"patch":{"operationId":"ApplicationsController_updateProduct","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":64},"description":{"type":"string","maxLength":500},"duration":{"type":"string","enum":["trial","1d","3d","7d","30d","90d","1y","lifetime","custom"]},"duration_seconds":{"type":"integer","minimum":60,"maximum":630720000},"expiration_mode":{"type":"string","enum":["from_creation","from_first_activation","never"]},"max_devices":{"type":"integer","minimum":1,"maximum":1000},"max_activations":{"nullable":true,"type":"integer","minimum":1,"maximum":1000000},"is_active":{"type":"boolean"}}}}}},"responses":{"200":{"description":""}},"tags":["admin: applications"]},"delete":{"operationId":"ApplicationsController_removeProduct","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: applications"]}},"/api/v1/admin/licenses":{"post":{"operationId":"LicensesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"application_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"product_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"duration":{"type":"string","enum":["trial","1d","3d","7d","30d","90d","1y","lifetime","custom"]},"duration_seconds":{"type":"integer","minimum":60,"maximum":630720000},"expiration_mode":{"type":"string","enum":["from_creation","from_first_activation","fixed_date","never"]},"expires_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"max_devices":{"type":"integer","minimum":1,"maximum":1000},"max_activations":{"nullable":true,"type":"integer","minimum":1,"maximum":1000000},"customer_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"note":{"type":"string","maxLength":2000},"tags":{"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":32,"pattern":"^[a-z0-9][a-z0-9_.-]*$"}},"metadata":{"type":"object","additionalProperties":{"anyOf":[{"type":"string","maxLength":1000},{"type":"number"},{"type":"boolean"},{"type":"string","nullable":true,"enum":[null]}]}}},"required":["application_id"]}}}},"responses":{"201":{"description":""}},"tags":["admin: licenses"]},"get":{"operationId":"LicensesController_list","parameters":[{"name":"page","required":false,"in":"query","schema":{"default":1,"type":"integer","minimum":1,"maximum":100000}},{"name":"per_page","required":false,"in":"query","schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"application_id","required":false,"in":"query","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"product_id","required":false,"in":"query","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"customer_id","required":false,"in":"query","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["active","suspended","revoked","expired","unused"]}},{"name":"tag","required":false,"in":"query","schema":{"type":"string","minLength":1,"maxLength":32,"pattern":"^[a-z0-9][a-z0-9_.-]*$"}},{"name":"q","required":false,"in":"query","schema":{"type":"string","maxLength":128}},{"name":"created_from","required":false,"in":"query","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},{"name":"created_to","required":false,"in":"query","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},{"name":"expires_before","required":false,"in":"query","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},{"name":"expires_after","required":false,"in":"query","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},{"name":"sort","required":false,"in":"query","schema":{"default":"created_at","type":"string","enum":["created_at","expires_at","last_activity_at"]}},{"name":"order","required":false,"in":"query","schema":{"default":"desc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/licenses/bulk":{"post":{"operationId":"LicensesController_bulk","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"application_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"product_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"duration":{"type":"string","enum":["trial","1d","3d","7d","30d","90d","1y","lifetime","custom"]},"duration_seconds":{"type":"integer","minimum":60,"maximum":630720000},"expiration_mode":{"type":"string","enum":["from_creation","from_first_activation","fixed_date","never"]},"expires_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"max_devices":{"type":"integer","minimum":1,"maximum":1000},"max_activations":{"nullable":true,"type":"integer","minimum":1,"maximum":1000000},"customer_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"note":{"type":"string","maxLength":2000},"tags":{"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":32,"pattern":"^[a-z0-9][a-z0-9_.-]*$"}},"metadata":{"type":"object","additionalProperties":{"anyOf":[{"type":"string","maxLength":1000},{"type":"number"},{"type":"boolean"},{"type":"string","nullable":true,"enum":[null]}]}},"count":{"type":"integer","minimum":1,"maximum":1000}},"required":["application_id","count"]}}}},"responses":{"201":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/licenses/bulk-action":{"post":{"operationId":"LicensesController_bulkAction","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"action":{"type":"string","enum":["revoke","suspend","unsuspend","reset_devices","add_tags","remove_tags"]},"reason":{"type":"string","maxLength":500},"tags":{"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":32,"pattern":"^[a-z0-9][a-z0-9_.-]*$"}}},"required":["ids","action"]}}}},"responses":{"200":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/licenses/export":{"get":{"operationId":"LicensesController_export","parameters":[{"name":"application_id","required":false,"in":"query","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"product_id","required":false,"in":"query","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"customer_id","required":false,"in":"query","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["active","suspended","revoked","expired","unused"]}},{"name":"tag","required":false,"in":"query","schema":{"type":"string","minLength":1,"maxLength":32,"pattern":"^[a-z0-9][a-z0-9_.-]*$"}},{"name":"q","required":false,"in":"query","schema":{"type":"string","maxLength":128}},{"name":"created_from","required":false,"in":"query","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},{"name":"created_to","required":false,"in":"query","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},{"name":"expires_before","required":false,"in":"query","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},{"name":"expires_after","required":false,"in":"query","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},{"name":"sort","required":false,"in":"query","schema":{"default":"created_at","type":"string","enum":["created_at","expires_at","last_activity_at"]}},{"name":"order","required":false,"in":"query","schema":{"default":"desc","type":"string","enum":["asc","desc"]}},{"name":"include_keys","required":false,"in":"query","schema":{"type":"string","enum":["0","1","true","false"]}}],"responses":{"200":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/licenses/{id}":{"get":{"operationId":"LicensesController_get","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: licenses"]},"patch":{"operationId":"LicensesController_update","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"note":{"nullable":true,"type":"string","maxLength":2000},"tags":{"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":32,"pattern":"^[a-z0-9][a-z0-9_.-]*$"}},"metadata":{"type":"object","additionalProperties":{"anyOf":[{"type":"string","maxLength":1000},{"type":"number"},{"type":"boolean"},{"type":"string","nullable":true,"enum":[null]}]}},"max_devices":{"type":"integer","minimum":1,"maximum":1000},"max_activations":{"nullable":true,"type":"integer","minimum":1,"maximum":1000000},"customer_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"expires_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}}}}}},"responses":{"200":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/licenses/{id}/history":{"get":{"operationId":"LicensesController_history","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/licenses/{id}/revoke":{"post":{"operationId":"LicensesController_revoke","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","maxLength":500}}}}}},"responses":{"200":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/licenses/{id}/suspend":{"post":{"operationId":"LicensesController_suspend","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","maxLength":500}}}}}},"responses":{"200":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/licenses/{id}/unsuspend":{"post":{"operationId":"LicensesController_unsuspend","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/licenses/{id}/renew":{"post":{"operationId":"LicensesController_renew","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"duration":{"type":"string","enum":["trial","1d","3d","7d","30d","90d","1y","lifetime","custom"]},"duration_seconds":{"type":"integer","minimum":60,"maximum":630720000},"expires_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}}}}}},"responses":{"200":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/licenses/{id}/reset-devices":{"post":{"operationId":"LicensesController_resetDevices","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/licenses/{id}/reveal":{"post":{"operationId":"LicensesController_reveal","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/licenses/{id}/activations/{activationId}/revoke":{"post":{"operationId":"LicensesController_revokeActivation","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/devices/{id}/block":{"post":{"operationId":"LicensesController_blockDevice","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","maxLength":500}}}}}},"responses":{"200":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/devices/{id}/unblock":{"post":{"operationId":"LicensesController_unblockDevice","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/customers":{"get":{"operationId":"LicensesController_listCustomers","parameters":[{"name":"page","required":false,"in":"query","schema":{"default":1,"type":"integer","minimum":1,"maximum":100000}},{"name":"per_page","required":false,"in":"query","schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"q","required":false,"in":"query","schema":{"type":"string","maxLength":128}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["active","banned"]}}],"responses":{"200":{"description":""}},"tags":["admin: licenses"]},"post":{"operationId":"LicensesController_createCustomer","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":254},"display_name":{"type":"string","maxLength":64},"external_ref":{"type":"string","maxLength":128},"note":{"type":"string","maxLength":2000},"metadata":{"type":"object","additionalProperties":{"anyOf":[{"type":"string","maxLength":1000},{"type":"number"},{"type":"boolean"},{"type":"string","nullable":true,"enum":[null]}]}}}}}}},"responses":{"201":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/customers/{id}":{"get":{"operationId":"LicensesController_getCustomer","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: licenses"]},"patch":{"operationId":"LicensesController_updateCustomer","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":254},"display_name":{"type":"string","maxLength":64},"external_ref":{"type":"string","maxLength":128},"note":{"type":"string","maxLength":2000},"metadata":{"type":"object","additionalProperties":{"anyOf":[{"type":"string","maxLength":1000},{"type":"number"},{"type":"boolean"},{"type":"string","nullable":true,"enum":[null]}]}}}}}}},"responses":{"200":{"description":""}},"tags":["admin: licenses"]},"delete":{"operationId":"LicensesController_deleteCustomer","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/customers/{id}/ban":{"post":{"operationId":"LicensesController_ban","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","maxLength":500}}}}}},"responses":{"200":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/customers/{id}/unban":{"post":{"operationId":"LicensesController_unban","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/sessions":{"get":{"operationId":"LicensesController_listSessions","parameters":[{"name":"page","required":false,"in":"query","schema":{"default":1,"type":"integer","minimum":1,"maximum":100000}},{"name":"per_page","required":false,"in":"query","schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"application_id","required":false,"in":"query","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"license_id","required":false,"in":"query","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"active_only","required":false,"in":"query","schema":{"type":"string","enum":["0","1","true","false"]}}],"responses":{"200":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/admin/sessions/{id}":{"delete":{"operationId":"LicensesController_revokeSession","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: licenses"]}},"/api/v1/licenses/activate":{"post":{"operationId":"LicensingController_activate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"application_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nonce":{"type":"string","minLength":16,"maxLength":128,"pattern":"^[A-Za-z0-9_-]+$"},"app_version":{"type":"string","maxLength":32},"license_key":{"type":"string","minLength":10,"maxLength":64},"device_id":{"type":"string","minLength":8,"maxLength":256,"pattern":"^[\\x21-\\x7E]+$"}},"required":["application_id","license_key","device_id"]}}}},"responses":{"200":{"description":""}},"tags":["licensing (public)"]}},"/api/v1/licenses/validate":{"post":{"operationId":"LicensingController_validate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"application_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nonce":{"type":"string","minLength":16,"maxLength":128,"pattern":"^[A-Za-z0-9_-]+$"},"app_version":{"type":"string","maxLength":32},"session_token":{"type":"string","minLength":20,"maxLength":200},"license_key":{"type":"string","minLength":10,"maxLength":64},"device_id":{"type":"string","minLength":8,"maxLength":256,"pattern":"^[\\x21-\\x7E]+$"}},"required":["application_id"]}}}},"responses":{"200":{"description":""}},"tags":["licensing (public)"]}},"/api/v1/licenses/heartbeat":{"post":{"operationId":"LicensingController_heartbeat","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"application_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nonce":{"type":"string","minLength":16,"maxLength":128,"pattern":"^[A-Za-z0-9_-]+$"},"app_version":{"type":"string","maxLength":32},"session_token":{"type":"string","minLength":20,"maxLength":200}},"required":["application_id","session_token"]}}}},"responses":{"200":{"description":""}},"tags":["licensing (public)"]}},"/api/v1/licenses/deactivate":{"post":{"operationId":"LicensingController_deactivate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"application_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"nonce":{"type":"string","minLength":16,"maxLength":128,"pattern":"^[A-Za-z0-9_-]+$"},"app_version":{"type":"string","maxLength":32},"session_token":{"type":"string","minLength":20,"maxLength":200},"license_key":{"type":"string","minLength":10,"maxLength":64},"device_id":{"type":"string","minLength":8,"maxLength":256,"pattern":"^[\\x21-\\x7E]+$"}},"required":["application_id"]}}}},"responses":{"200":{"description":""}},"tags":["licensing (public)"]}},"/api/v1/admin/webhooks":{"get":{"operationId":"WebhooksController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: webhooks"]},"post":{"operationId":"WebhooksController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","maxLength":2048,"format":"uri"},"description":{"type":"string","maxLength":200},"events":{"minItems":1,"type":"array","items":{"type":"string","enum":["license.created","license.activated","license.expired","license.renewed","license.revoked","license.suspended","license.device_reset","user.created","user.banned","application.disabled"]}},"application_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["url","events"]}}}},"responses":{"201":{"description":""}},"tags":["admin: webhooks"]}},"/api/v1/admin/webhooks/{id}":{"get":{"operationId":"WebhooksController_get","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: webhooks"]},"patch":{"operationId":"WebhooksController_update","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","maxLength":2048,"format":"uri"},"description":{"nullable":true,"type":"string","maxLength":200},"events":{"minItems":1,"type":"array","items":{"type":"string","enum":["license.created","license.activated","license.expired","license.renewed","license.revoked","license.suspended","license.device_reset","user.created","user.banned","application.disabled"]}},"enabled":{"type":"boolean"}}}}}},"responses":{"200":{"description":""}},"tags":["admin: webhooks"]},"delete":{"operationId":"WebhooksController_remove","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: webhooks"]}},"/api/v1/admin/webhooks/{id}/rotate-secret":{"post":{"operationId":"WebhooksController_rotate","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: webhooks"]}},"/api/v1/admin/webhooks/{id}/test":{"post":{"operationId":"WebhooksController_test","parameters":[],"responses":{"202":{"description":""}},"tags":["admin: webhooks"]}},"/api/v1/admin/webhooks/{id}/deliveries":{"get":{"operationId":"WebhooksController_deliveries","parameters":[{"name":"page","required":false,"in":"query","schema":{"default":1,"type":"integer","minimum":1,"maximum":100000}},{"name":"per_page","required":false,"in":"query","schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["pending","succeeded","failed"]}}],"responses":{"200":{"description":""}},"tags":["admin: webhooks"]}},"/api/v1/admin/webhooks/{id}/deliveries/{deliveryId}/redeliver":{"post":{"operationId":"WebhooksController_redeliver","parameters":[],"responses":{"202":{"description":""}},"tags":["admin: webhooks"]}},"/api/v1/admin/api-keys":{"get":{"operationId":"ApiKeysController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: api keys"]},"post":{"operationId":"ApiKeysController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":64},"scopes":{"minItems":1,"type":"array","items":{"type":"string","enum":["org:read","org:update","member:read","member:invite","member:update","member:remove","application:read","application:create","application:update","application:delete","application:secrets","product:read","product:write","license:read","license:create","license:update","license:suspend","license:revoke","license:renew","license:reset_devices","license:export","license:reveal","customer:read","customer:write","customer:ban","session:read","session:revoke","analytics:read","audit:read","webhook:read","webhook:write","apikey:read","apikey:write","discord:read","discord:write","discord:bot"]}},"application_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"expires_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"require_signature":{"default":false,"type":"boolean"}},"required":["name","scopes"]}}}},"responses":{"201":{"description":""}},"tags":["admin: api keys"]}},"/api/v1/admin/api-keys/{id}/rotate":{"post":{"operationId":"ApiKeysController_rotate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"grace_period_seconds":{"default":0,"type":"integer","minimum":0,"maximum":604800}}}}}},"responses":{"200":{"description":""}},"tags":["admin: api keys"]}},"/api/v1/admin/api-keys/{id}":{"delete":{"operationId":"ApiKeysController_revoke","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: api keys"]}},"/api/v1/admin/overview":{"get":{"operationId":"AnalyticsController_overview","parameters":[],"responses":{"200":{"description":""}},"tags":["admin: analytics & audit"]}},"/api/v1/admin/analytics":{"get":{"operationId":"AnalyticsController_get","parameters":[{"name":"range","required":false,"in":"query","schema":{"default":"7d","type":"string","enum":["24h","7d","30d","90d"]}},{"name":"application_id","required":false,"in":"query","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"responses":{"200":{"description":""}},"tags":["admin: analytics & audit"]}},"/api/v1/admin/audit-logs":{"get":{"operationId":"AnalyticsController_audit","parameters":[{"name":"page","required":false,"in":"query","schema":{"default":1,"type":"integer","minimum":1,"maximum":100000}},{"name":"per_page","required":false,"in":"query","schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"action","required":false,"in":"query","schema":{"type":"string","maxLength":64}},{"name":"actor_id","required":false,"in":"query","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"target_type","required":false,"in":"query","schema":{"type":"string","maxLength":32}},{"name":"target_id","required":false,"in":"query","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"application_id","required":false,"in":"query","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"from","required":false,"in":"query","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},{"name":"to","required":false,"in":"query","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}}],"responses":{"200":{"description":""}},"tags":["admin: analytics & audit"]}},"/api/v1/discord/oauth/authorize":{"post":{"operationId":"DiscordController_authorize","parameters":[],"responses":{"200":{"description":""}},"tags":["discord"]}},"/api/v1/discord/oauth/complete":{"post":{"operationId":"DiscordController_complete","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":512},"state":{"type":"string","minLength":20,"maxLength":200}},"required":["code","state"]}}}},"responses":{"200":{"description":""}},"tags":["discord"]}},"/api/v1/discord/link":{"delete":{"operationId":"DiscordController_unlink","parameters":[],"responses":{"200":{"description":""}},"tags":["discord"]}},"/api/v1/admin/discord":{"get":{"operationId":"DiscordController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["discord"]},"post":{"operationId":"DiscordController_upsert","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"admin_role_ids":{"default":[],"maxItems":20,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"log_channel_id":{"nullable":true,"type":"string","pattern":"^\\d{17,20}$"},"notify_channel_id":{"nullable":true,"type":"string","pattern":"^\\d{17,20}$"},"default_application_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"enabled":{"default":true,"type":"boolean"}},"required":["guild_id"]}}}},"responses":{"201":{"description":""}},"tags":["discord"]}},"/api/v1/admin/discord/{id}":{"delete":{"operationId":"DiscordController_remove","parameters":[],"responses":{"200":{"description":""}},"tags":["discord"]}},"/api/v1/admin/discord/{id}/role-mappings":{"post":{"operationId":"DiscordController_addMapping","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"product_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"discord_role_id":{"type":"string","pattern":"^\\d{17,20}$"}},"required":["product_id","discord_role_id"]}}}},"responses":{"201":{"description":""}},"tags":["discord"]}},"/api/v1/admin/discord/{id}/role-mappings/{mappingId}":{"delete":{"operationId":"DiscordController_removeMapping","parameters":[],"responses":{"200":{"description":""}},"tags":["discord"]}},"/api/v1/admin/discord/{id}/sync":{"post":{"operationId":"DiscordController_sync","parameters":[],"responses":{"202":{"description":""}},"tags":["discord"]}},"/api/v1/discord/bot/whoami":{"post":{"operationId":"DiscordBotController_whoami","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"}},"required":["guild_id","discord_user_id"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/licenses/generate":{"post":{"operationId":"DiscordBotController_generate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"},"application_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"product_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"duration":{"type":"string","enum":["trial","1d","3d","7d","30d","90d","1y","lifetime","custom"]},"duration_seconds":{"type":"integer","minimum":60,"maximum":630720000},"max_devices":{"type":"integer","minimum":1,"maximum":1000},"count":{"default":1,"type":"integer","minimum":1,"maximum":100},"note":{"type":"string","maxLength":500}},"required":["guild_id","discord_user_id"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/licenses/revoke":{"post":{"operationId":"DiscordBotController_revoke","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"},"license":{"type":"string","minLength":10,"maxLength":64},"reason":{"type":"string","maxLength":500},"duration":{"type":"string","enum":["trial","1d","3d","7d","30d","90d","1y","lifetime","custom"]}},"required":["guild_id","discord_user_id","license"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/licenses/suspend":{"post":{"operationId":"DiscordBotController_suspend","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"},"license":{"type":"string","minLength":10,"maxLength":64},"reason":{"type":"string","maxLength":500},"duration":{"type":"string","enum":["trial","1d","3d","7d","30d","90d","1y","lifetime","custom"]}},"required":["guild_id","discord_user_id","license"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/licenses/unsuspend":{"post":{"operationId":"DiscordBotController_unsuspend","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"},"license":{"type":"string","minLength":10,"maxLength":64},"reason":{"type":"string","maxLength":500},"duration":{"type":"string","enum":["trial","1d","3d","7d","30d","90d","1y","lifetime","custom"]}},"required":["guild_id","discord_user_id","license"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/licenses/renew":{"post":{"operationId":"DiscordBotController_renew","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"},"license":{"type":"string","minLength":10,"maxLength":64},"reason":{"type":"string","maxLength":500},"duration":{"type":"string","enum":["trial","1d","3d","7d","30d","90d","1y","lifetime","custom"]}},"required":["guild_id","discord_user_id","license"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/licenses/reset-hwid":{"post":{"operationId":"DiscordBotController_resetHwid","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"},"license":{"type":"string","minLength":10,"maxLength":64},"reason":{"type":"string","maxLength":500},"duration":{"type":"string","enum":["trial","1d","3d","7d","30d","90d","1y","lifetime","custom"]}},"required":["guild_id","discord_user_id","license"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/licenses/info":{"post":{"operationId":"DiscordBotController_info","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"},"license":{"type":"string","minLength":10,"maxLength":64},"reason":{"type":"string","maxLength":500},"duration":{"type":"string","enum":["trial","1d","3d","7d","30d","90d","1y","lifetime","custom"]}},"required":["guild_id","discord_user_id","license"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/licenses/list":{"post":{"operationId":"DiscordBotController_listLicenses","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"},"application_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"page":{"default":1,"type":"integer","minimum":1,"maximum":1000}},"required":["guild_id","discord_user_id"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/apps/create":{"post":{"operationId":"DiscordBotController_createApp","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"},"name":{"type":"string","minLength":2,"maxLength":64}},"required":["guild_id","discord_user_id","name"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/apps/list":{"post":{"operationId":"DiscordBotController_listApps","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"},"application_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"page":{"default":1,"type":"integer","minimum":1,"maximum":1000}},"required":["guild_id","discord_user_id"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/apps/status":{"post":{"operationId":"DiscordBotController_appStatus","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"},"application_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"page":{"default":1,"type":"integer","minimum":1,"maximum":1000}},"required":["guild_id","discord_user_id"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/users/info":{"post":{"operationId":"DiscordBotController_userInfo","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"},"target_discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"reason":{"type":"string","maxLength":500}},"required":["guild_id","discord_user_id","target_discord_user_id"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/users/licenses":{"post":{"operationId":"DiscordBotController_userLicenses","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"},"target_discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"reason":{"type":"string","maxLength":500}},"required":["guild_id","discord_user_id","target_discord_user_id"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/users/ban":{"post":{"operationId":"DiscordBotController_ban","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"},"target_discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"reason":{"type":"string","maxLength":500}},"required":["guild_id","discord_user_id","target_discord_user_id"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/stats":{"post":{"operationId":"DiscordBotController_stats","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"},"application_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"page":{"default":1,"type":"integer","minimum":1,"maximum":1000}},"required":["guild_id","discord_user_id"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/audit/recent":{"post":{"operationId":"DiscordBotController_audit","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"},"application_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"page":{"default":1,"type":"integer","minimum":1,"maximum":1000}},"required":["guild_id","discord_user_id"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/me/redeem":{"post":{"operationId":"DiscordBotController_redeem","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"},"license_key":{"type":"string","minLength":10,"maxLength":64}},"required":["guild_id","discord_user_id","license_key"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/me/licenses":{"post":{"operationId":"DiscordBotController_myLicenses","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"}},"required":["guild_id","discord_user_id"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/me/license-status":{"post":{"operationId":"DiscordBotController_licenseStatus","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"},"license_key":{"type":"string","minLength":10,"maxLength":64}},"required":["guild_id","discord_user_id","license_key"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/me/unlink":{"post":{"operationId":"DiscordBotController_unlink","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"},"member_role_ids":{"default":[],"maxItems":250,"type":"array","items":{"type":"string","pattern":"^\\d{17,20}$"}},"has_manage_guild":{"default":false,"type":"boolean"}},"required":["guild_id","discord_user_id"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/role-sync/member":{"post":{"operationId":"DiscordBotController_syncMember","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"},"discord_user_id":{"type":"string","pattern":"^\\d{17,20}$"}},"required":["guild_id","discord_user_id"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/discord/bot/role-sync/guild":{"post":{"operationId":"DiscordBotController_syncGuild","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guild_id":{"type":"string","pattern":"^\\d{17,20}$"}},"required":["guild_id"]}}}},"responses":{"200":{"description":""}},"tags":["discord bot (service)"]}},"/api/v1/platform/stats":{"get":{"operationId":"PlatformController_stats","parameters":[],"responses":{"200":{"description":""}},"tags":["platform (super admin)"]}},"/api/v1/platform/health":{"get":{"operationId":"PlatformController_health","parameters":[],"responses":{"200":{"description":""}},"tags":["platform (super admin)"]}},"/api/v1/platform/organizations":{"get":{"operationId":"PlatformController_organizations","parameters":[{"name":"page","required":false,"in":"query","schema":{"default":1,"type":"integer","minimum":1,"maximum":100000}},{"name":"per_page","required":false,"in":"query","schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"q","required":false,"in":"query","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":""}},"tags":["platform (super admin)"]}},"/api/v1/platform/organizations/{id}":{"get":{"operationId":"PlatformController_organization","parameters":[],"responses":{"200":{"description":""}},"tags":["platform (super admin)"]}},"/api/v1/platform/organizations/{id}/join":{"post":{"operationId":"PlatformController_join","parameters":[],"responses":{"200":{"description":""}},"tags":["platform (super admin)"]}},"/api/v1/platform/organizations/{id}/suspend":{"post":{"operationId":"PlatformController_suspend","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","minLength":3,"maxLength":500}},"required":["reason"]}}}},"responses":{"200":{"description":""}},"tags":["platform (super admin)"]}},"/api/v1/platform/organizations/{id}/unsuspend":{"post":{"operationId":"PlatformController_unsuspend","parameters":[],"responses":{"200":{"description":""}},"tags":["platform (super admin)"]}},"/api/v1/platform/organizations/{id}/quotas":{"patch":{"operationId":"PlatformController_quotas","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"plan_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"max_applications":{"nullable":true,"type":"integer","minimum":0,"maximum":100000},"max_licenses":{"nullable":true,"type":"integer","minimum":0,"maximum":100000000},"max_requests_per_minute":{"nullable":true,"type":"integer","minimum":0,"maximum":1000000}}}}}},"responses":{"200":{"description":""}},"tags":["platform (super admin)"]}},"/api/v1/platform/users":{"get":{"operationId":"PlatformController_users","parameters":[{"name":"page","required":false,"in":"query","schema":{"default":1,"type":"integer","minimum":1,"maximum":100000}},{"name":"per_page","required":false,"in":"query","schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"q","required":false,"in":"query","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":""}},"tags":["platform (super admin)"]}},"/api/v1/platform/users/{id}/ban":{"post":{"operationId":"PlatformController_ban","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","minLength":3,"maxLength":500}},"required":["reason"]}}}},"responses":{"200":{"description":""}},"tags":["platform (super admin)"]}},"/api/v1/platform/users/{id}/unban":{"post":{"operationId":"PlatformController_unban","parameters":[],"responses":{"200":{"description":""}},"tags":["platform (super admin)"]}},"/api/v1/platform/plans":{"get":{"operationId":"PlatformController_plans","parameters":[],"responses":{"200":{"description":""}},"tags":["platform (super admin)"]},"post":{"operationId":"PlatformController_upsertPlan","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string","pattern":"^[a-z0-9_-]{2,32}$"},"name":{"type":"string","minLength":2,"maxLength":64},"max_applications":{"type":"integer","minimum":1,"maximum":100000},"max_licenses":{"type":"integer","minimum":1,"maximum":100000000},"max_requests_per_minute":{"type":"integer","minimum":10,"maximum":1000000},"max_webhooks":{"type":"integer","minimum":0,"maximum":1000},"max_members":{"type":"integer","minimum":1,"maximum":10000}},"required":["key","name","max_applications","max_licenses","max_requests_per_minute","max_webhooks","max_members"]}}}},"responses":{"201":{"description":""}},"tags":["platform (super admin)"]}},"/api/v1/platform/security-events":{"get":{"operationId":"PlatformController_securityEvents","parameters":[{"name":"page","required":false,"in":"query","schema":{"default":1,"type":"integer","minimum":1,"maximum":100000}},{"name":"per_page","required":false,"in":"query","schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"q","required":false,"in":"query","schema":{"type":"string","maxLength":128}},{"name":"type","required":false,"in":"query","schema":{"type":"string","maxLength":64}}],"responses":{"200":{"description":""}},"tags":["platform (super admin)"]}},"/api/v1/platform/abuse":{"get":{"operationId":"PlatformController_abuse","parameters":[],"responses":{"200":{"description":""}},"tags":["platform (super admin)"]}},"/api/v1/platform/audit":{"get":{"operationId":"PlatformController_audit","parameters":[{"name":"page","required":false,"in":"query","schema":{"default":1,"type":"integer","minimum":1,"maximum":100000}},{"name":"per_page","required":false,"in":"query","schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"q","required":false,"in":"query","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":""}},"tags":["platform (super admin)"]}},"/api/v1/platform/discord-bot-key":{"post":{"operationId":"PlatformController_botKey","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"organization_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["organization_id"]}}}},"responses":{"201":{"description":""}},"tags":["platform (super admin)"]}},"/api/v1/me/licenses":{"get":{"operationId":"MeController_licenses","parameters":[],"responses":{"200":{"description":""}},"tags":["me (espace client)"]}},"/api/v1/me/licenses/redeem":{"post":{"operationId":"MeController_redeem","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"license_key":{"type":"string","minLength":10,"maxLength":64}},"required":["license_key"]}}}},"responses":{"200":{"description":""}},"tags":["me (espace client)"]}},"/api/v1/me/licenses/{id}/reveal":{"post":{"operationId":"MeController_reveal","parameters":[],"responses":{"200":{"description":""}},"tags":["me (espace client)"]}},"/api/v1/me/licenses/{id}/reset-devices":{"post":{"operationId":"MeController_resetDevices","parameters":[],"responses":{"200":{"description":""}},"tags":["me (espace client)"]}},"/api/v1/health":{"get":{"operationId":"HealthController_live","parameters":[],"responses":{"200":{"description":""}},"tags":["health"]}},"/api/v1/health/ready":{"get":{"operationId":"HealthController_ready","parameters":[],"responses":{"200":{"description":""}},"tags":["health"]}}},"info":{"title":"Keyline API","description":"API REST v1. Licensing public : /api/v1/licenses/* (sans secret, réponses signées ECDSA). Administration : /api/v1/admin/* (cookie de session + X-CSRF-Token + X-Organization-Id, ou clé API Bearer).","version":"1.0.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"Clé API kl_xxxxxxxxxxxx_<secret>"}},"schemas":{}}}