{"openapi":"3.1.0","info":{"title":"Secutils","description":"An open-source, versatile, yet simple security toolbox for engineers and researchers.","contact":{"name":"Aleh Zasypkin","email":"dev@secutils.dev"},"license":{"name":"AGPL-3.0","url":"https://github.com/secutils-dev/secutils/blob/main/LICENSE"},"version":"1.0.0-beta.2"},"paths":{"/api/certificates/_fetch":{"post":{"tags":["certificates"],"summary":"Fetches the TLS certificate chain from a remote HTTPS endpoint.","operationId":"certificates_fetch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplatesFetchCertificatesParams"}}},"required":true},"responses":{"200":{"description":"PEM-encoded certificate chain.","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"}}}}},"400":{"description":"Invalid or unreachable URL."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/certificates/private_keys":{"get":{"tags":["certificates"],"summary":"Lists private keys for the authenticated user (paginated).","operationId":"private_keys_list","parameters":[{"name":"page","in":"query","description":"Zero-based page index. Defaults to `0`.","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"pageSize","in":"query","description":"Number of items per page. Defaults to 15, clamped to a maximum of 100.","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"sort","in":"query","description":"Field to sort by. Entity-specific; falls back to the entity default when not in the\nallowlist.","required":false,"schema":{"type":"string"}},{"name":"order","in":"query","description":"Sort direction (`asc` or `desc`).","required":false,"schema":{"$ref":"#/components/schemas/SortOrder"}},{"name":"q","in":"query","description":"Free-text query matched (case-insensitively) against the entity name, or matched verbatim\nagainst the entity id (used by \"filter to a single entity\" workspace links that navigate to\n`?q=<entity-id>`).","required":false,"schema":{"type":"string"}},{"name":"tags","in":"query","description":"Page-level tag filter (OR): a comma-separated list of tag IDs, items having ANY of these\ntags are returned.","required":false,"schema":{"type":"string"}},{"name":"globalTags","in":"query","description":"Global-scope tag filter (AND): a comma-separated list of tag IDs, only items having ALL of\nthese tags are returned.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of private keys.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_PrivateKey"}}}},"401":{"description":"Missing or invalid authentication credentials."}}},"post":{"tags":["certificates"],"summary":"Creates a new private key.","operationId":"private_keys_create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivateKeysCreateParams"}}},"required":true},"responses":{"201":{"description":"Private key was successfully created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivateKey"}}}},"400":{"description":"Invalid private key parameters."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/certificates/private_keys/{key_id}":{"get":{"tags":["certificates"],"summary":"Gets a private key by ID.","operationId":"private_keys_get","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Private key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivateKey"}}}},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Private key not found."}}},"put":{"tags":["certificates"],"summary":"Updates an existing private key.","operationId":"private_keys_update","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivateKeysUpdateParams"}}},"required":true},"responses":{"204":{"description":"Private key was successfully updated."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Private key not found."}}},"delete":{"tags":["certificates"],"summary":"Deletes a private key by ID.","operationId":"private_keys_delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Private key was successfully deleted."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Private key not found."}}}},"/api/certificates/private_keys/{key_id}/_export":{"post":{"tags":["certificates"],"summary":"Exports a private key in the specified format.","operationId":"private_keys_export","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivateKeysExportParams"}}},"required":true},"responses":{"200":{"description":"Exported private key data."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Private key not found."}}}},"/api/certificates/templates":{"get":{"tags":["certificates"],"summary":"Lists certificate templates for the authenticated user (paginated).","operationId":"certificate_templates_list","parameters":[{"name":"page","in":"query","description":"Zero-based page index. Defaults to `0`.","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"pageSize","in":"query","description":"Number of items per page. Defaults to 15, clamped to a maximum of 100.","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"sort","in":"query","description":"Field to sort by. Entity-specific; falls back to the entity default when not in the\nallowlist.","required":false,"schema":{"type":"string"}},{"name":"order","in":"query","description":"Sort direction (`asc` or `desc`).","required":false,"schema":{"$ref":"#/components/schemas/SortOrder"}},{"name":"q","in":"query","description":"Free-text query matched (case-insensitively) against the entity name, or matched verbatim\nagainst the entity id (used by \"filter to a single entity\" workspace links that navigate to\n`?q=<entity-id>`).","required":false,"schema":{"type":"string"}},{"name":"tags","in":"query","description":"Page-level tag filter (OR): a comma-separated list of tag IDs, items having ANY of these\ntags are returned.","required":false,"schema":{"type":"string"}},{"name":"globalTags","in":"query","description":"Global-scope tag filter (AND): a comma-separated list of tag IDs, only items having ALL of\nthese tags are returned.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of certificate templates.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_CertificateTemplate"}}}},"401":{"description":"Missing or invalid authentication credentials."}}},"post":{"tags":["certificates"],"summary":"Creates a new certificate template.","operationId":"certificate_templates_create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplatesCreateParams"}}},"required":true},"responses":{"201":{"description":"Template was successfully created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CertificateTemplate"}}}},"400":{"description":"Invalid template parameters."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/certificates/templates/{template_id}":{"get":{"tags":["certificates"],"summary":"Gets a certificate template by ID, including its share status.","description":"Supports shared access: when an `X-User-Share-ID` header is present and points to\na share for this template, the request is served on behalf of the share owner - even\nif the caller is unauthenticated.","operationId":"certificate_templates_get","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Certificate template with share info.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CertificateTemplateGetResponse"}}}},"404":{"description":"Template not found."}},"security":[{},{"bearerAuth":[]}]},"put":{"tags":["certificates"],"summary":"Updates an existing certificate template.","operationId":"certificate_templates_update","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplatesUpdateParams"}}},"required":true},"responses":{"204":{"description":"Template was successfully updated."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Template not found."}}},"delete":{"tags":["certificates"],"summary":"Deletes a certificate template by ID.","operationId":"certificate_templates_delete","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Template was successfully deleted."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Template not found."}}}},"/api/certificates/templates/{template_id}/_generate":{"post":{"tags":["certificates"],"summary":"Generates a self-signed certificate from the template.","description":"Supports shared access (see `certificate_templates_get`).","operationId":"certificate_templates_generate","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplatesGenerateParams"}}},"required":true},"responses":{"200":{"description":"Generated certificate data (binary, base64-encoded in JSON)."},"404":{"description":"Template not found."}},"security":[{},{"bearerAuth":[]}]}},"/api/certificates/templates/{template_id}/_share":{"post":{"tags":["certificates"],"summary":"Shares a certificate template, making it accessible via a share link.","operationId":"certificate_templates_share","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Share info for the template."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Template not found."}}}},"/api/certificates/templates/{template_id}/_unshare":{"post":{"tags":["certificates"],"summary":"Removes sharing from a certificate template.","operationId":"certificate_templates_unshare","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Template was successfully unshared."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/notifications/unsubscribe":{"get":{"tags":["notifications"],"summary":"Identical to the POST endpoint, but accessible via GET so that legacy mail clients which\nonly follow the `List-Unsubscribe: <https://...>` URL on click also work. The token is\nsupplied as a query parameter.","description":"Unlike the POST surface (which returns 204 per RFC 8058 §3.1), the GET surface is what a\nhuman's browser actually navigates to when they click the visible unsubscribe link in the\nemail body. Returning an empty 204 there leaves the user staring at a blank tab with no\nconfirmation that anything happened, so we render a small server-side branded page that\nreuses the email-styles partial for visual continuity. The page is intentionally\nself-contained (logo embedded as a base64 `data:` URI, no JS, no SPA dependency) so it\nworks even when the user is signed out, on a flaky connection, or behind extensions that\nwould block the webui bundle.","operationId":"notifications_unsubscribe_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Unsubscribe request accepted, an HTML confirmation page is returned.","content":{"text/html":{}}}},"security":[{}]},"post":{"tags":["notifications"],"summary":"One-click unsubscribe endpoint. Authentication is intentionally absent: the bearer of the\ntoken is the only proof of intent we have, mirroring how every transactional-email vendor\nimplements RFC 8058. We always return 204, regardless of whether the token exists or has\nalready been used, to avoid leaking an enumeration oracle.","operationId":"notifications_unsubscribe","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationsUnsubscribeParams"}}},"required":true},"responses":{"204":{"description":"Unsubscribe request accepted (token may or may not exist, the response is identical either way)."}},"security":[{}]}},"/api/scheduler/parse_schedule":{"post":{"tags":["scheduler"],"summary":"Parses a cron schedule and returns the minimum interval and next occurrences.","operationId":"scheduler_parse_schedule","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulerParseScheduleParams"}}},"required":true},"responses":{"200":{"description":"Parsed schedule information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulerParseScheduleResult"}}}},"400":{"description":"Invalid schedule or interval too small."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/search":{"post":{"tags":["search"],"summary":"Searches across user resources.","operationId":"search","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchParams"}}},"required":true},"responses":{"200":{"description":"Search results."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/send_message":{"post":{"tags":["messages"],"summary":"Sends a contact message via email.","operationId":"send_message","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMessageParams"}}},"required":true},"responses":{"204":{"description":"Message was successfully sent."},"403":{"description":"SMTP is not configured."}},"security":[{},{"bearerAuth":[]}]}},"/api/status":{"get":{"tags":["status"],"summary":"Returns the current server status.","operationId":"status_get","responses":{"200":{"description":"Current server status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}}}},"security":[{}]},"post":{"tags":["status"],"summary":"Sets the server status level (operator-only).","operationId":"status_set","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetStatusAPIParams"}}},"required":true},"responses":{"204":{"description":"Status was successfully updated."},"401":{"description":"Missing or invalid authentication credentials."},"403":{"description":"Caller is not an operator."},"500":{"description":"Failed to update status."}}}},"/api/user/api_keys":{"get":{"tags":["api_keys"],"summary":"Lists all API keys for the authenticated user.","operationId":"user_api_keys_list","responses":{"200":{"description":"List of user API keys.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserApiKey"}}}}},"401":{"description":"Missing or invalid authentication credentials."},"403":{"description":"API keys cannot manage API keys."}}},"post":{"tags":["api_keys"],"summary":"Creates a new API key. The plaintext token is included in the response and\ncannot be retrieved again.","operationId":"user_api_keys_create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateParams"}}},"required":true},"responses":{"201":{"description":"API key was successfully created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateResponse"}}}},"400":{"description":"Invalid API key parameters."},"401":{"description":"Missing or invalid authentication credentials."},"403":{"description":"API keys cannot manage API keys."}}}},"/api/user/api_keys/{api_key_id}":{"put":{"tags":["api_keys"],"summary":"Updates an existing API key's name.","operationId":"user_api_keys_update","parameters":[{"name":"api_key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyUpdateParams"}}},"required":true},"responses":{"200":{"description":"API key was successfully updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserApiKey"}}}},"401":{"description":"Missing or invalid authentication credentials."},"403":{"description":"API keys cannot manage API keys."},"404":{"description":"API key not found."}}},"delete":{"tags":["api_keys"],"summary":"Deletes an API key by ID.","operationId":"user_api_keys_delete","parameters":[{"name":"api_key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"API key was successfully deleted."},"401":{"description":"Missing or invalid authentication credentials."},"403":{"description":"API keys cannot manage API keys."},"404":{"description":"API key not found."}}}},"/api/user/api_keys/{api_key_id}/_regenerate":{"post":{"tags":["api_keys"],"summary":"Regenerates the token for an existing API key. The old token is immediately\ninvalidated and the new plaintext token is returned (shown once).","operationId":"user_api_keys_regenerate","parameters":[{"name":"api_key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyRegenerateParams"}}},"required":true},"responses":{"200":{"description":"API key was successfully regenerated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateResponse"}}}},"401":{"description":"Missing or invalid authentication credentials."},"403":{"description":"API keys cannot manage API keys."},"404":{"description":"API key not found."}}}},"/api/user/data/_export":{"post":{"tags":["user-data"],"summary":"Exports user data as a downloadable JSON file.","operationId":"user_data_export","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDataExportParams"}}},"required":true},"responses":{"200":{"description":"User data export."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/user/data/_import":{"post":{"tags":["user-data"],"summary":"Executes the data import.","operationId":"user_data_import","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDataImportParams"}}},"required":true},"responses":{"200":{"description":"Import result."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/user/data/_import_preview":{"post":{"tags":["user-data"],"summary":"Previews what would be imported from the provided data.","operationId":"user_data_import_preview","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDataImportPreviewParams"}}},"required":true},"responses":{"200":{"description":"Import preview result."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/user/notification_email":{"get":{"tags":["settings"],"summary":"Returns the user's notification email destination, or `null` if none is configured.","operationId":"user_notification_email_get","responses":{"200":{"description":"Current notification email destination, or null when unset.","content":{"application/json":{"schema":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/UserNotificationDestination"}]}}}},"401":{"description":"Missing or invalid authentication credentials."}}},"put":{"tags":["settings"],"summary":"Begins (or restarts) verification for the supplied notification email. The address is\npersisted in a \"pending\" state and a 6-digit verification code is emailed to it. Until the\ncode is entered via `_verify`, notifications continue to be delivered to the login email.","operationId":"user_notification_email_set","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationEmailSetParams"}}},"required":true},"responses":{"200":{"description":"Verification email scheduled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserNotificationDestination"}}}},"400":{"description":"Invalid email or attempted to set the override to the login email."},"401":{"description":"Missing or invalid authentication credentials."}}},"delete":{"tags":["settings"],"summary":"Removes the user's notification email. Routing falls back to the login email immediately.","operationId":"user_notification_email_delete","responses":{"204":{"description":"Notification email removed."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/user/notification_email/_resend":{"post":{"tags":["settings"],"summary":"Re-sends the active verification code. Subject to a 1-minute cooldown and a 5/hour cap.","operationId":"user_notification_email_resend","responses":{"204":{"description":"Verification email re-scheduled."},"400":{"description":"Already verified, code expired, or rate limit exceeded."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"No notification email is configured."}}}},"/api/user/notification_email/_verify":{"post":{"tags":["settings"],"summary":"Submits the 6-digit code emailed by `set`/`_resend`. On success the destination is marked\nverified and starts receiving notifications.","operationId":"user_notification_email_verify","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationEmailVerifyParams"}}},"required":true},"responses":{"200":{"description":"Notification email verified.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserNotificationDestination"}}}},"400":{"description":"Invalid or expired code, or no verification is in progress."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"No notification email is configured."}}}},"/api/user/scripts":{"get":{"tags":["scripts"],"summary":"Lists scripts for the authenticated user (paginated), optionally filtered by context.","operationId":"user_scripts_list","parameters":[{"name":"context","in":"query","description":"Optional context to filter scripts by compatibility.","required":false,"schema":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ScriptContext"}]}},{"name":"page","in":"query","description":"Zero-based page index. Defaults to `0`.","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"pageSize","in":"query","description":"Number of items per page. Defaults to 15, clamped to a maximum of 100.","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"sort","in":"query","description":"Field to sort by. Entity-specific; falls back to the entity default when not in the\nallowlist.","required":false,"schema":{"type":"string"}},{"name":"order","in":"query","description":"Sort direction (`asc` or `desc`).","required":false,"schema":{"$ref":"#/components/schemas/SortOrder"}},{"name":"q","in":"query","description":"Free-text query matched (case-insensitively) against the entity name, or matched verbatim\nagainst the entity id (used by \"filter to a single entity\" workspace links that navigate to\n`?q=<entity-id>`).","required":false,"schema":{"type":"string"}},{"name":"tags","in":"query","description":"Page-level tag filter (OR): a comma-separated list of tag IDs, items having ANY of these\ntags are returned.","required":false,"schema":{"type":"string"}},{"name":"globalTags","in":"query","description":"Global-scope tag filter (AND): a comma-separated list of tag IDs, only items having ALL of\nthese tags are returned.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of user scripts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_UserScript"}}}},"401":{"description":"Missing or invalid authentication credentials."}}},"post":{"tags":["scripts"],"summary":"Creates a new script.","operationId":"user_scripts_create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptCreateParams"}}},"required":true},"responses":{"201":{"description":"Script was successfully created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserScript"}}}},"400":{"description":"Invalid script parameters."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/user/scripts/{script_id}":{"get":{"tags":["scripts"],"summary":"Gets a single script by ID, including its content.","operationId":"user_scripts_get","parameters":[{"name":"script_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Script with the specified ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserScript"}}}},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Script not found."}}},"put":{"tags":["scripts"],"summary":"Updates an existing script's content.","operationId":"user_scripts_update","parameters":[{"name":"script_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptUpdateParams"}}},"required":true},"responses":{"200":{"description":"Script was successfully updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserScript"}}}},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Script not found."}}},"delete":{"tags":["scripts"],"summary":"Deletes a script by ID.","operationId":"user_scripts_delete","parameters":[{"name":"script_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Script was successfully deleted."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Script not found."}}}},"/api/user/secrets":{"get":{"tags":["secrets"],"summary":"Lists a page of secrets for the authenticated user (metadata only, no values).","operationId":"user_secrets_list","parameters":[{"name":"page","in":"query","description":"Zero-based page index. Defaults to `0`.","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"pageSize","in":"query","description":"Number of items per page. Defaults to 15, clamped to a maximum of 100.","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"sort","in":"query","description":"Field to sort by. Entity-specific; falls back to the entity default when not in the\nallowlist.","required":false,"schema":{"type":"string"}},{"name":"order","in":"query","description":"Sort direction (`asc` or `desc`).","required":false,"schema":{"$ref":"#/components/schemas/SortOrder"}},{"name":"q","in":"query","description":"Free-text query matched (case-insensitively) against the entity name, or matched verbatim\nagainst the entity id (used by \"filter to a single entity\" workspace links that navigate to\n`?q=<entity-id>`).","required":false,"schema":{"type":"string"}},{"name":"tags","in":"query","description":"Page-level tag filter (OR): a comma-separated list of tag IDs, items having ANY of these\ntags are returned.","required":false,"schema":{"type":"string"}},{"name":"globalTags","in":"query","description":"Global-scope tag filter (AND): a comma-separated list of tag IDs, only items having ALL of\nthese tags are returned.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of user secrets.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_UserSecret"}}}},"401":{"description":"Missing or invalid authentication credentials."}}},"post":{"tags":["secrets"],"summary":"Creates a new secret.","operationId":"user_secrets_create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretCreateParams"}}},"required":true},"responses":{"201":{"description":"Secret was successfully created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSecret"}}}},"400":{"description":"Invalid secret parameters."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/user/secrets/{secret_id}":{"put":{"tags":["secrets"],"summary":"Updates an existing secret's value.","operationId":"user_secrets_update","parameters":[{"name":"secret_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretUpdateParams"}}},"required":true},"responses":{"200":{"description":"Secret was successfully updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSecret"}}}},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Secret not found."}}},"delete":{"tags":["secrets"],"summary":"Deletes a secret by ID.","operationId":"user_secrets_delete","parameters":[{"name":"secret_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Secret was successfully deleted."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Secret not found."}}}},"/api/user/settings":{"get":{"tags":["settings"],"summary":"Retrieves the authenticated user's settings.","operationId":"user_settings_get","responses":{"200":{"description":"User settings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettings"}}}},"401":{"description":"Missing or invalid authentication credentials."}}},"post":{"tags":["settings"],"summary":"Updates user settings. Keys map to new values, or null to remove a setting.","operationId":"user_settings_set","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettingsSetter"}}},"required":true},"responses":{"200":{"description":"Updated user settings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettings"}}}},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/user/subscription":{"post":{"tags":["users"],"summary":"Updates a user's subscription (operator-only).","operationId":"security_subscription_update","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSubscriptionParams"}}},"required":true},"responses":{"204":{"description":"Subscription was successfully updated."},"401":{"description":"Missing or invalid authentication credentials."},"403":{"description":"Caller is not an operator."},"404":{"description":"User not found."}}}},"/api/user/tags":{"get":{"tags":["tags"],"summary":"Lists tags for the authenticated user (paginated).","operationId":"user_tags_list","parameters":[{"name":"page","in":"query","description":"Zero-based page index. Defaults to `0`.","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"pageSize","in":"query","description":"Number of items per page. Defaults to 15, clamped to a maximum of 100.","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"sort","in":"query","description":"Field to sort by. Entity-specific; falls back to the entity default when not in the\nallowlist.","required":false,"schema":{"type":"string"}},{"name":"order","in":"query","description":"Sort direction (`asc` or `desc`).","required":false,"schema":{"$ref":"#/components/schemas/SortOrder"}},{"name":"q","in":"query","description":"Free-text query matched (case-insensitively) against the entity name, or matched verbatim\nagainst the entity id (used by \"filter to a single entity\" workspace links that navigate to\n`?q=<entity-id>`).","required":false,"schema":{"type":"string"}},{"name":"tags","in":"query","description":"Page-level tag filter (OR): a comma-separated list of tag IDs, items having ANY of these\ntags are returned.","required":false,"schema":{"type":"string"}},{"name":"globalTags","in":"query","description":"Global-scope tag filter (AND): a comma-separated list of tag IDs, only items having ALL of\nthese tags are returned.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of user tags.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_UserTag"}}}},"401":{"description":"Missing or invalid authentication credentials."}}},"post":{"tags":["tags"],"summary":"Creates a new tag.","operationId":"user_tags_create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagCreateParams"}}},"required":true},"responses":{"201":{"description":"Tag was successfully created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserTag"}}}},"400":{"description":"Invalid tag parameters."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/user/tags/{tag_id}":{"put":{"tags":["tags"],"summary":"Updates an existing tag's name and/or color.","operationId":"user_tags_update","parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagUpdateParams"}}},"required":true},"responses":{"200":{"description":"Tag was successfully updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserTag"}}}},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Tag not found."}}},"delete":{"tags":["tags"],"summary":"Deletes a tag by ID.","operationId":"user_tags_delete","parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Tag was successfully deleted."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Tag not found."}}}},"/api/users":{"get":{"tags":["users"],"summary":"Retrieves a user by email (operator-only).","operationId":"security_users_get_by_email","parameters":[{"name":"email","in":"query","description":"The email address to look up.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested user."},"401":{"description":"Missing or invalid authentication credentials."},"403":{"description":"Caller is not an operator."},"404":{"description":"User not found."}}}},"/api/users/_clone":{"post":{"tags":["users"],"summary":"Clones a user (operator-only).","description":"Creates a fresh, email-verified Kratos identity for the destination email, copies every piece of\nsource data (tags, scripts, secrets, responders, certificate templates, private keys, content\nsecurity policies, page/API trackers, settings, optionally including history) under regenerated\nIDs, and returns a Kratos-issued recovery link the operator clicks to set a password and log in\nas the clone.\n\nUse this to reproduce a customer's issue without ever touching their live state. After\ndebugging, remove the clone via `DELETE /api/users/{user_id}` or `POST /api/users/remove`.","operationId":"security_users_clone","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloneParams"}}},"required":true},"responses":{"200":{"description":"Clone was successfully created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloneResponse"}}}},"400":{"description":"Invalid parameters or destination already registered."},"401":{"description":"Missing or invalid authentication credentials."},"403":{"description":"Caller is not an operator."},"404":{"description":"Source user not found."}}}},"/api/users/email":{"post":{"tags":["users"],"summary":"Handles Kratos email webhook (operator-only).","operationId":"security_users_email","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailParams"}}},"required":true},"responses":{"204":{"description":"Email notification scheduled."},"401":{"description":"Missing or invalid authentication credentials."},"403":{"description":"Caller is not an operator."}}}},"/api/users/remove":{"post":{"tags":["users"],"summary":"Removes a user by email (operator-only).","operationId":"security_users_remove","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveParams"}}},"required":true},"responses":{"204":{"description":"User was successfully removed."},"400":{"description":"Email cannot be empty."},"401":{"description":"Missing or invalid authentication credentials."},"403":{"description":"Caller is not an operator."}}}},"/api/users/self":{"get":{"tags":["users"],"summary":"Returns the currently authenticated user.","operationId":"security_users_get_self","responses":{"200":{"description":"The authenticated user."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/users/signup":{"post":{"tags":["users"],"summary":"Signs up a new user with the provided identity (operator-only).","operationId":"security_users_signup","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupParams"}}},"required":true},"responses":{"200":{"description":"User was successfully signed up."},"400":{"description":"Email already registered."},"401":{"description":"Missing or invalid authentication credentials."},"403":{"description":"Caller is not an operator."}}}},"/api/users/{user_id}":{"get":{"tags":["users"],"summary":"Retrieves a user by ID (operator-only).","operationId":"security_users_get","parameters":[{"name":"user_id","in":"path","description":"The user ID.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The requested user."},"401":{"description":"Missing or invalid authentication credentials."},"403":{"description":"Caller is not an operator."},"404":{"description":"User not found."}}},"delete":{"tags":["users"],"summary":"Removes a user by ID (operator-only). Sibling of `POST /api/users/remove` for cases\nwhere the operator has the user's UUID (e.g. a clone they just created) but not their\nemail.","operationId":"security_users_remove_by_id","parameters":[{"name":"user_id","in":"path","description":"The user ID to remove.","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"User was successfully removed."},"401":{"description":"Missing or invalid authentication credentials."},"403":{"description":"Caller is not an operator."},"404":{"description":"User not found."}}}},"/api/users/{user_id}/api_keys":{"post":{"tags":["api_keys"],"summary":"Creates an API key for a specific user (operator-only provisioning endpoint).","operationId":"user_api_keys_create_for_user","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateParams"}}},"required":true},"responses":{"201":{"description":"API key was successfully created for the user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateResponse"}}}},"400":{"description":"Invalid API key parameters."},"401":{"description":"Missing or invalid operator credentials."},"404":{"description":"User not found."}}}},"/api/web_scraping/api_trackers":{"get":{"tags":["web_scraping"],"summary":"Lists API trackers for the authenticated user (paginated).","operationId":"api_trackers_list","parameters":[{"name":"page","in":"query","description":"Zero-based page index. Defaults to `0`.","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"pageSize","in":"query","description":"Number of items per page. Defaults to 15, clamped to a maximum of 100.","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"sort","in":"query","description":"Field to sort by. Entity-specific; falls back to the entity default when not in the\nallowlist.","required":false,"schema":{"type":"string"}},{"name":"order","in":"query","description":"Sort direction (`asc` or `desc`).","required":false,"schema":{"$ref":"#/components/schemas/SortOrder"}},{"name":"q","in":"query","description":"Free-text query matched (case-insensitively) against the entity name, or matched verbatim\nagainst the entity id (used by \"filter to a single entity\" workspace links that navigate to\n`?q=<entity-id>`).","required":false,"schema":{"type":"string"}},{"name":"tags","in":"query","description":"Page-level tag filter (OR): a comma-separated list of tag IDs, items having ANY of these\ntags are returned.","required":false,"schema":{"type":"string"}},{"name":"globalTags","in":"query","description":"Global-scope tag filter (AND): a comma-separated list of tag IDs, only items having ALL of\nthese tags are returned.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of API trackers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_ApiTracker"}}}},"401":{"description":"Missing or invalid authentication credentials."}}},"post":{"tags":["web_scraping"],"summary":"Creates a new API tracker.","operationId":"api_trackers_create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTrackerCreateParams"}}},"required":true},"responses":{"201":{"description":"API tracker was successfully created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTracker"}}}},"400":{"description":"Invalid API tracker parameters."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/web_scraping/api_trackers/_debug":{"post":{"tags":["web_scraping"],"summary":"Runs the full debug pipeline for an API tracker without persisting anything.","operationId":"api_trackers_debug","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTrackerDebugParams"}}},"required":true},"responses":{"200":{"description":"Debug result."},"400":{"description":"Invalid debug parameters."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/web_scraping/api_trackers/_logs_summary":{"get":{"tags":["web_scraping"],"summary":"Returns a summary of recent execution logs for all API trackers.","operationId":"api_trackers_get_logs_summary","responses":{"200":{"description":"Logs summary keyed by tracker ID."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/web_scraping/api_trackers/_test":{"post":{"tags":["web_scraping"],"summary":"Sends a test HTTP request using the provided API tracker target configuration.","operationId":"api_trackers_test","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTrackerTestParams"}}},"required":true},"responses":{"200":{"description":"Test request result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTrackerTestResult"}}}},"400":{"description":"Invalid test parameters."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/web_scraping/api_trackers/{tracker_id}":{"put":{"tags":["web_scraping"],"summary":"Updates an existing API tracker.","operationId":"api_trackers_update","parameters":[{"name":"tracker_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTrackerUpdateParams"}}},"required":true},"responses":{"204":{"description":"API tracker was successfully updated."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"API tracker not found."}}},"delete":{"tags":["web_scraping"],"summary":"Deletes an API tracker by ID.","operationId":"api_trackers_delete","parameters":[{"name":"tracker_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"API tracker was successfully deleted."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"API tracker not found."}}}},"/api/web_scraping/api_trackers/{tracker_id}/_clear":{"post":{"tags":["web_scraping"],"summary":"Clears the revision history for an API tracker.","operationId":"api_trackers_clear_history","parameters":[{"name":"tracker_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"History was successfully cleared."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"API tracker not found."}}}},"/api/web_scraping/api_trackers/{tracker_id}/_clear_logs":{"post":{"tags":["web_scraping"],"summary":"Clears execution logs for a specific API tracker.","operationId":"api_trackers_clear_logs","parameters":[{"name":"tracker_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Logs were successfully cleared."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"API tracker not found."}}}},"/api/web_scraping/api_trackers/{tracker_id}/_history":{"post":{"tags":["web_scraping"],"summary":"Returns the revision history for an API tracker.","operationId":"api_trackers_get_history","parameters":[{"name":"tracker_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTrackerGetHistoryParams"}}},"required":true},"responses":{"200":{"description":"List of API tracker revisions."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"API tracker not found."}}}},"/api/web_scraping/api_trackers/{tracker_id}/_logs":{"get":{"tags":["web_scraping"],"summary":"Returns execution logs for a specific API tracker.","operationId":"api_trackers_get_logs","parameters":[{"name":"tracker_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"List of tracker execution logs."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"API tracker not found."}}}},"/api/web_scraping/page_trackers":{"get":{"tags":["web_scraping"],"summary":"Lists page trackers for the authenticated user (paginated).","operationId":"page_trackers_list","parameters":[{"name":"page","in":"query","description":"Zero-based page index. Defaults to `0`.","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"pageSize","in":"query","description":"Number of items per page. Defaults to 15, clamped to a maximum of 100.","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"sort","in":"query","description":"Field to sort by. Entity-specific; falls back to the entity default when not in the\nallowlist.","required":false,"schema":{"type":"string"}},{"name":"order","in":"query","description":"Sort direction (`asc` or `desc`).","required":false,"schema":{"$ref":"#/components/schemas/SortOrder"}},{"name":"q","in":"query","description":"Free-text query matched (case-insensitively) against the entity name, or matched verbatim\nagainst the entity id (used by \"filter to a single entity\" workspace links that navigate to\n`?q=<entity-id>`).","required":false,"schema":{"type":"string"}},{"name":"tags","in":"query","description":"Page-level tag filter (OR): a comma-separated list of tag IDs, items having ANY of these\ntags are returned.","required":false,"schema":{"type":"string"}},{"name":"globalTags","in":"query","description":"Global-scope tag filter (AND): a comma-separated list of tag IDs, only items having ALL of\nthese tags are returned.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of page trackers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_PageTracker"}}}},"401":{"description":"Missing or invalid authentication credentials."}}},"post":{"tags":["web_scraping"],"summary":"Creates a new page tracker.","operationId":"page_trackers_create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageTrackerCreateParams"}}},"required":true},"responses":{"201":{"description":"Page tracker was successfully created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageTracker"}}}},"400":{"description":"Invalid page tracker parameters."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/web_scraping/page_trackers/_debug":{"post":{"tags":["web_scraping"],"summary":"Runs a page tracker in debug mode without persisting results.","operationId":"page_trackers_debug","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageTrackerDebugParams"}}},"required":true},"responses":{"200":{"description":"Debug result for the page tracker."},"400":{"description":"Invalid debug parameters."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/web_scraping/page_trackers/_logs_summary":{"get":{"tags":["web_scraping"],"summary":"Returns a summary of logs across all page trackers.","operationId":"page_trackers_get_logs_summary","responses":{"200":{"description":"Logs summary for all page trackers."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/web_scraping/page_trackers/{tracker_id}":{"put":{"tags":["web_scraping"],"summary":"Updates an existing page tracker.","operationId":"page_trackers_update","parameters":[{"name":"tracker_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageTrackerUpdateParams"}}},"required":true},"responses":{"204":{"description":"Page tracker was successfully updated."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Page tracker not found."}}},"delete":{"tags":["web_scraping"],"summary":"Deletes a page tracker by ID.","operationId":"page_trackers_delete","parameters":[{"name":"tracker_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Page tracker was successfully deleted."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Page tracker not found."}}}},"/api/web_scraping/page_trackers/{tracker_id}/_clear":{"post":{"tags":["web_scraping"],"summary":"Clears the revision history for a page tracker.","operationId":"page_trackers_clear_history","parameters":[{"name":"tracker_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"History was successfully cleared."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Page tracker not found."}}}},"/api/web_scraping/page_trackers/{tracker_id}/_clear_logs":{"post":{"tags":["web_scraping"],"summary":"Clears the logs for a page tracker.","operationId":"page_trackers_clear_logs","parameters":[{"name":"tracker_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Logs were successfully cleared."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Page tracker not found."}}}},"/api/web_scraping/page_trackers/{tracker_id}/_history":{"post":{"tags":["web_scraping"],"summary":"Returns the revision history for a page tracker.","operationId":"page_trackers_get_history","parameters":[{"name":"tracker_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageTrackerGetHistoryParams"}}},"required":true},"responses":{"200":{"description":"List of page tracker history entries."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Page tracker not found."}}}},"/api/web_scraping/page_trackers/{tracker_id}/_logs":{"get":{"tags":["web_scraping"],"summary":"Returns the logs for a page tracker.","operationId":"page_trackers_get_logs","parameters":[{"name":"tracker_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"List of tracker logs."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Page tracker not found."}}}},"/api/web_security/csp":{"get":{"tags":["web_security"],"summary":"Lists content security policies for the authenticated user (paginated).","operationId":"csp_list","parameters":[{"name":"page","in":"query","description":"Zero-based page index. Defaults to `0`.","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"pageSize","in":"query","description":"Number of items per page. Defaults to 15, clamped to a maximum of 100.","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"sort","in":"query","description":"Field to sort by. Entity-specific; falls back to the entity default when not in the\nallowlist.","required":false,"schema":{"type":"string"}},{"name":"order","in":"query","description":"Sort direction (`asc` or `desc`).","required":false,"schema":{"$ref":"#/components/schemas/SortOrder"}},{"name":"q","in":"query","description":"Free-text query matched (case-insensitively) against the entity name, or matched verbatim\nagainst the entity id (used by \"filter to a single entity\" workspace links that navigate to\n`?q=<entity-id>`).","required":false,"schema":{"type":"string"}},{"name":"tags","in":"query","description":"Page-level tag filter (OR): a comma-separated list of tag IDs, items having ANY of these\ntags are returned.","required":false,"schema":{"type":"string"}},{"name":"globalTags","in":"query","description":"Global-scope tag filter (AND): a comma-separated list of tag IDs, only items having ALL of\nthese tags are returned.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of content security policies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_ContentSecurityPolicy"}}}},"401":{"description":"Missing or invalid authentication credentials."}}},"post":{"tags":["web_security"],"summary":"Creates a new content security policy.","operationId":"csp_create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentSecurityPoliciesCreateParams"}}},"required":true},"responses":{"201":{"description":"Policy was successfully created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentSecurityPolicy"}}}},"400":{"description":"Invalid policy parameters."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/web_security/csp/{policy_id}":{"get":{"tags":["web_security"],"summary":"Gets a content security policy by ID, including its share status.","description":"Supports shared access: when an `X-User-Share-ID` header is present and points to\na share for this policy, the request is served on behalf of the share owner - even\nif the caller is unauthenticated.","operationId":"csp_get","parameters":[{"name":"policy_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Content security policy with share info.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentSecurityPolicyGetResponse"}}}},"404":{"description":"Policy not found."}},"security":[{},{"bearerAuth":[]}]},"put":{"tags":["web_security"],"summary":"Updates an existing content security policy.","operationId":"csp_update","parameters":[{"name":"policy_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentSecurityPoliciesUpdateParams"}}},"required":true},"responses":{"204":{"description":"Policy was successfully updated."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Policy not found."}}},"delete":{"tags":["web_security"],"summary":"Deletes a content security policy by ID.","operationId":"csp_delete","parameters":[{"name":"policy_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Policy was successfully deleted."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Policy not found."}}}},"/api/web_security/csp/{policy_id}/_serialize":{"post":{"tags":["web_security"],"summary":"Serializes a content security policy into a header string.","description":"Supports shared access (see `csp_get`).","operationId":"csp_serialize","parameters":[{"name":"policy_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentSecurityPoliciesSerializeParams"}}},"required":true},"responses":{"200":{"description":"Serialized CSP header string.","content":{"text/plain":{"schema":{"type":"string"}}}},"404":{"description":"Policy not found."}},"security":[{},{"bearerAuth":[]}]}},"/api/web_security/csp/{policy_id}/_share":{"post":{"tags":["web_security"],"summary":"Shares a content security policy, making it accessible via a share link.","operationId":"csp_share","parameters":[{"name":"policy_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Share info for the policy."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Policy not found."}}}},"/api/web_security/csp/{policy_id}/_unshare":{"post":{"tags":["web_security"],"summary":"Removes sharing from a content security policy.","operationId":"csp_unshare","parameters":[{"name":"policy_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Policy was successfully unshared."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/webhooks/responders":{"get":{"tags":["webhooks"],"summary":"Lists responders for the authenticated user (paginated).","operationId":"responders_list","parameters":[{"name":"page","in":"query","description":"Zero-based page index. Defaults to `0`.","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"pageSize","in":"query","description":"Number of items per page. Defaults to 15, clamped to a maximum of 100.","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"sort","in":"query","description":"Field to sort by. Entity-specific; falls back to the entity default when not in the\nallowlist.","required":false,"schema":{"type":"string"}},{"name":"order","in":"query","description":"Sort direction (`asc` or `desc`).","required":false,"schema":{"$ref":"#/components/schemas/SortOrder"}},{"name":"q","in":"query","description":"Free-text query matched (case-insensitively) against the entity name, or matched verbatim\nagainst the entity id (used by \"filter to a single entity\" workspace links that navigate to\n`?q=<entity-id>`).","required":false,"schema":{"type":"string"}},{"name":"tags","in":"query","description":"Page-level tag filter (OR): a comma-separated list of tag IDs, items having ANY of these\ntags are returned.","required":false,"schema":{"type":"string"}},{"name":"globalTags","in":"query","description":"Global-scope tag filter (AND): a comma-separated list of tag IDs, only items having ALL of\nthese tags are returned.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of responders.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_Responder"}}}},"401":{"description":"Missing or invalid authentication credentials."}}},"post":{"tags":["webhooks"],"summary":"Creates a new responder.","operationId":"responders_create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RespondersCreateParams"}}},"required":true},"responses":{"201":{"description":"Responder was successfully created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Responder"}}}},"400":{"description":"Invalid responder parameters."},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/webhooks/responders/_stats":{"get":{"tags":["webhooks"],"summary":"Returns aggregate stats for all responders.","operationId":"responders_get_stats","responses":{"200":{"description":"List of responder stats.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResponderStats"}}}}},"401":{"description":"Missing or invalid authentication credentials."}}}},"/api/webhooks/responders/{responder_id}":{"put":{"tags":["webhooks"],"summary":"Updates an existing responder.","operationId":"responders_update","parameters":[{"name":"responder_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RespondersUpdateParams"}}},"required":true},"responses":{"204":{"description":"Responder was successfully updated."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Responder not found."}}},"delete":{"tags":["webhooks"],"summary":"Deletes a responder by ID.","operationId":"responders_delete","parameters":[{"name":"responder_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Responder was successfully deleted."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Responder not found."}}}},"/api/webhooks/responders/{responder_id}/_clear":{"post":{"tags":["webhooks"],"summary":"Clears the captured request history for a responder.","operationId":"responders_clear_history","parameters":[{"name":"responder_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"History was successfully cleared."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Responder not found."}}}},"/api/webhooks/responders/{responder_id}/_history":{"get":{"tags":["webhooks"],"summary":"Returns the captured request history for a responder.","operationId":"responders_get_history","parameters":[{"name":"responder_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"List of captured requests."},"401":{"description":"Missing or invalid authentication credentials."},"404":{"description":"Responder not found."}}}}},"components":{"schemas":{"ApiKeyCreateParams":{"type":"object","required":["name"],"properties":{"expiresAt":{"type":["string","null"],"format":"date-time"},"name":{"type":"string"}},"example":{"name":"CI deployment key","expiresAt":1750000000}},"ApiKeyCreateResponse":{"allOf":[{"$ref":"#/components/schemas/UserApiKey"},{"type":"object","required":["token"],"properties":{"token":{"type":"string","description":"The plaintext API key token. Store it securely - it cannot be retrieved again."}}}],"description":"Response returned when creating or regenerating an API key. Includes the\nplaintext token which is shown exactly once."},"ApiKeyRegenerateParams":{"type":"object","properties":{"expiresAt":{"type":["string","null"],"format":"date-time"}},"example":{"expiresAt":1760000000}},"ApiKeyUpdateParams":{"type":"object","required":["name"],"properties":{"name":{"type":"string"}},"example":{"name":"Production agent key"}},"ApiTarget":{"type":"object","description":"Tracker's target for HTTP API.","required":["requests"],"properties":{"configurator":{"type":["string","null"],"description":"Optional custom script (Deno) to configure request."},"extractor":{"type":["string","null"],"description":"Optional custom script (Deno) to extract only necessary data from the API response."},"params":{"description":"Optional parameters to pass to the scripts as part of the context."},"requests":{"type":"array","items":{"$ref":"#/components/schemas/TargetRequest"},"description":"A list of the requests to the HTTP endpoints to send when retrieving data for the target."}}},"ApiTracker":{"type":"object","required":["id","name","retrack","createdAt","updatedAt"],"properties":{"createdAt":{"type":"integer","format":"int64","description":"Date and time when the tracker was created."},"id":{"type":"string","format":"uuid","description":"Unique tracker id (UUIDv7)."},"name":{"type":"string","description":"Arbitrary name of the tracker."},"retrack":{"$ref":"#/components/schemas/RetrackTracker","description":"By-value or by-reference instance of the Retrack tracker associated with the current tracker."},"secrets":{"$ref":"#/components/schemas/SecretsAccess","description":"Controls which user secrets are available to this tracker's scripts."},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"},"description":"Tags assigned to this tracker."},"updatedAt":{"type":"integer","format":"int64","description":"Date and time when the tracker was last updated."}}},"ApiTrackerConfig":{"type":"object","required":["revisions"],"properties":{"job":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SchedulerJobConfig","description":"Configuration for a job, if the tracker needs to be scheduled for automatic change detection."}]},"revisions":{"type":"integer","description":"A number of revisions of the API response to track.","minimum":0}}},"ApiTrackerCreateParams":{"type":"object","required":["name","config","target"],"properties":{"config":{"$ref":"#/components/schemas/ApiTrackerConfig","description":"API tracker configuration."},"enabled":{"type":"boolean","description":"Whether the tracker is enabled."},"name":{"type":"string","description":"Arbitrary name of the API tracker."},"notifications":{"type":"boolean","description":"Indicates whether the user should be notified about changes."},"secrets":{"$ref":"#/components/schemas/SecretsAccess","description":"Controls which user secrets are available to this tracker's scripts."},"tagIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Tag IDs to assign to this API tracker."},"target":{"$ref":"#/components/schemas/ApiTrackerTarget","description":"API tracker target (single HTTP request definition)."}},"example":{"name":"my-api-tracker","config":{"revisions":3},"target":{"url":"https://api.example.com/data"},"tagIds":[]}},"ApiTrackerDebugParams":{"type":"object","required":["target","secrets"],"properties":{"secrets":{"$ref":"#/components/schemas/SecretsAccess"},"target":{"$ref":"#/components/schemas/ApiTrackerTarget"}},"example":{"target":{"url":"https://api.example.com/data"},"secrets":{"type":"none"}}},"ApiTrackerGetHistoryParams":{"type":"object","properties":{"refresh":{"type":"boolean"}},"example":{"refresh":false}},"ApiTrackerTarget":{"type":"object","description":"Flattened single-request API tracker target. Converted to/from Retrack's\n`TrackerTarget::Api(ApiTarget { requests: [TargetRequest], ... })` internally.","required":["url","body"],"properties":{"acceptInvalidCertificates":{"type":"boolean","description":"Whether to accept invalid TLS certificates."},"acceptStatuses":{"type":["array","null"],"items":{"type":"integer","format":"int32","minimum":0},"description":"HTTP status codes considered successful (defaults to 2xx)."},"body":{"type":"object","description":"Optional request body (JSON)."},"configurator":{"type":["string","null"],"description":"Optional Deno script to configure the request dynamically."},"extractor":{"type":["string","null"],"description":"Optional Deno script to extract data from the response."},"headers":{"type":["object","null"],"description":"Optional request headers.","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"mediaType":{"type":["string","null"],"description":"Expected media type of the response (defaults to application/json)."},"method":{"type":["string","null"],"description":"HTTP method (defaults to GET)."},"url":{"type":"string","description":"URL of the API endpoint."}}},"ApiTrackerTestParams":{"type":"object","required":["target"],"properties":{"target":{"$ref":"#/components/schemas/ApiTrackerTarget"}},"example":{"target":{"url":"https://api.example.com/data"}}},"ApiTrackerTestResult":{"type":"object","required":["status","headers","body","latencyMs"],"properties":{"body":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"latencyMs":{"type":"integer","format":"int64","minimum":0},"status":{"type":"integer","format":"int32","minimum":0}}},"ApiTrackerUpdateParams":{"type":"object","properties":{"config":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ApiTrackerConfig","description":"API tracker configuration."}],"default":null},"enabled":{"type":["boolean","null"],"description":"Whether the tracker is enabled.","default":null},"name":{"type":["string","null"],"description":"Arbitrary name of the API tracker.","default":null},"notifications":{"type":"boolean","description":"Indicates whether the user should be notified about changes.","default":false},"secrets":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SecretsAccess","description":"Controls which user secrets are available to this tracker's scripts."}],"default":null},"tagIds":{"type":["array","null"],"items":{"type":"string","format":"uuid"},"description":"Tag IDs to assign. When `Some`, replaces all tags; when `None`, tags are unchanged.","default":null},"target":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ApiTrackerTarget","description":"API tracker target (single HTTP request definition)."}],"default":null}},"example":{"name":"renamed-tracker"}},"ApplyDeletionSelections":{"type":"object","description":"Specifies which entities to delete in Apply mode (user-confirmed deletions).","properties":{"apiTrackers":{"type":"array","items":{"type":"string","format":"uuid"}},"certificateTemplates":{"type":"array","items":{"type":"string","format":"uuid"}},"contentSecurityPolicies":{"type":"array","items":{"type":"string","format":"uuid"}},"pageTrackers":{"type":"array","items":{"type":"string","format":"uuid"}},"privateKeys":{"type":"array","items":{"type":"string","format":"uuid"}},"responders":{"type":"array","items":{"type":"string","format":"uuid"}},"scripts":{"type":"array","items":{"type":"string","format":"uuid"}},"secrets":{"type":"array","items":{"type":"string","format":"uuid"}}}},"CertificateAttributes":{"type":"object","description":"Describes certificate attributes.","required":["keyAlgorithm","signatureAlgorithm","notValidBefore","notValidAfter","isCa"],"properties":{"commonName":{"type":["string","null"]},"country":{"type":["string","null"]},"extendedKeyUsage":{"type":["array","null"],"items":{"$ref":"#/components/schemas/ExtendedKeyUsage"},"uniqueItems":true},"isCa":{"type":"boolean"},"keyAlgorithm":{"$ref":"#/components/schemas/PrivateKeyAlgorithm"},"keyUsage":{"type":["array","null"],"items":{"$ref":"#/components/schemas/KeyUsage"},"uniqueItems":true},"locality":{"type":["string","null"]},"notValidAfter":{"type":"integer","format":"int64"},"notValidBefore":{"type":"integer","format":"int64"},"organization":{"type":["string","null"]},"organizationalUnit":{"type":["string","null"]},"signatureAlgorithm":{"$ref":"#/components/schemas/SignatureAlgorithm"},"stateOrProvince":{"type":["string","null"]},"version":{"$ref":"#/components/schemas/Version"}}},"CertificateTemplate":{"type":"object","description":"Describes stored certificate template.","required":["id","name","attributes","createdAt","updatedAt"],"properties":{"attributes":{"$ref":"#/components/schemas/CertificateAttributes","description":"Attributes of the certificate that the template defines."},"createdAt":{"type":"integer","format":"int64","description":"Date and time when the certificate template was created."},"id":{"type":"string","format":"uuid","description":"Unique certificate template id (UUIDv7)."},"name":{"type":"string","description":"Arbitrary name of the certificate template."},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"},"description":"Tags assigned to this certificate template."},"updatedAt":{"type":"integer","format":"int64","description":"Date and time when the certificate template was last updated."}}},"CertificateTemplateGetResponse":{"type":"object","description":"Response for GET /api/certificates/templates/{template_id}.","required":["template"],"properties":{"template":{"$ref":"#/components/schemas/CertificateTemplate"},"userShare":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ClientUserShare"}]}}},"ClientSharedResource":{"oneOf":[{"type":"object","required":["policyId","type"],"properties":{"policyId":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["contentSecurityPolicy"]}}},{"type":"object","required":["templateId","type"],"properties":{"templateId":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["certificateTemplate"]}}}],"description":"A special version of SharedResource that can be safely serialized for the client side since not\nall Serde attributes we need can be serialized with postcard (main serialization format)."},"ClientUserShare":{"type":"object","description":"A special version of UserShare that can be safely serialized for the client side since not\nall Serde attributes we need can be serialized with postcard (main serialization format). It\nalso excludes the user ID since it shouldn't be exposed to the client side.","required":["id","resource","createdAt"],"properties":{"createdAt":{"type":"integer","format":"int64"},"id":{"type":"string","format":"uuid"},"resource":{"$ref":"#/components/schemas/ClientSharedResource"}}},"CloneDestination":{"type":"object","description":"Destination credentials for the new clone.","required":["email"],"properties":{"email":{"type":"string","description":"Email address for the new clone."},"handle":{"type":["string","null"],"description":"Optional handle override. When omitted, a fresh random handle is generated."}}},"CloneParams":{"type":"object","description":"Parameters for the clone request.","required":["source","destination"],"properties":{"copySubscription":{"type":"boolean","description":"Whether the clone inherits the source user's subscription tier so feature gating\nbehaves identically. When false, the clone gets a fresh basic-tier trial."},"destination":{"$ref":"#/components/schemas/CloneDestination","description":"Email + optional handle for the new clone."},"includeHistory":{"type":"boolean","description":"Whether to copy responder request history and tracker revision history (default true)."},"recoveryLinkExpiresIn":{"type":"string","description":"Kratos recovery-link lifetime as a humantime-style string (e.g. `\"1h\"`, `\"15m\"`,\n`\"30s\"`). Bounded by Kratos's own configured maximum (typically 15 m). Defaults to 1 h.","example":"1h"},"source":{"$ref":"#/components/schemas/CloneSource","description":"Existing user to clone data from (looked up by ID or email)."}},"example":{"source":{"email":"user@example.com"},"destination":{"email":"user-clone@secutils.dev"},"includeHistory":true,"copySubscription":true,"recoveryLinkExpiresIn":"1h"}},"CloneResponse":{"type":"object","description":"Successful clone response.","required":["id","user","recoveryLink","summary"],"properties":{"id":{"type":"string","format":"uuid","description":"UUID of the newly created destination user. Exposed at the top level because [`User`] elides\nits `id` field from serialisation, but operator tooling needs it (e.g. to call\n`DELETE /api/users/{user_id}` later)."},"recoveryLink":{"$ref":"#/components/schemas/RecoveryLink","description":"Single-use Kratos URL the operator follows to set a password and complete login."},"summary":{"type":"object","description":"Per-entity-type summary of what was copied from source to destination. Mirrors the\nshape returned by `POST /api/user/data/_import`."},"user":{"type":"object","description":"The newly created destination user."}}},"CloneSource":{"oneOf":[{"type":"object","required":["email"],"properties":{"email":{"type":"string"}}},{"type":"object","required":["id"],"properties":{"id":{"type":"string","format":"uuid"}}}],"description":"Selects which existing user to clone from."},"ConflictResolution":{"type":"string","enum":["rename","overwrite","skip"]},"ContentSecurityPoliciesCreateParams":{"type":"object","required":["name","content"],"properties":{"content":{"$ref":"#/components/schemas/ContentSecurityPolicyContent"},"name":{"type":"string"},"tagIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Tag IDs to assign to this content security policy."}},"example":{"name":"my-csp","content":{"type":"serialized","value":"default-src 'self'"},"tagIds":[]}},"ContentSecurityPoliciesSerializeParams":{"type":"object","required":["source"],"properties":{"source":{"$ref":"#/components/schemas/ContentSecurityPolicySource"}},"example":{"source":"enforcingHeader"}},"ContentSecurityPoliciesUpdateParams":{"type":"object","properties":{"directives":{"type":["array","null"],"items":{"$ref":"#/components/schemas/ContentSecurityPolicyDirective"}},"name":{"type":["string","null"]},"tagIds":{"type":["array","null"],"items":{"type":"string","format":"uuid"},"description":"Tag IDs to assign. When `Some`, replaces all tags; when `None`, tags are unchanged."}},"example":{"name":"renamed-csp"}},"ContentSecurityPolicy":{"type":"object","description":"Represents content security policy (CSP) with the arbitrary name.","required":["id","name","directives","createdAt","updatedAt"],"properties":{"createdAt":{"type":"integer","format":"int64","description":"Date and time when the content security policy was created."},"directives":{"type":"array","items":{"$ref":"#/components/schemas/ContentSecurityPolicyDirective"},"description":"Content security policy directives."},"id":{"type":"string","format":"uuid","description":"Unique content security policy id (UUIDv7)."},"name":{"type":"string","description":"Arbitrary name of the content security policy."},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"},"description":"Tags assigned to this content security policy."},"updatedAt":{"type":"integer","format":"int64","description":"Date and time when the content security policy was last updated."}}},"ContentSecurityPolicyContent":{"oneOf":[{"type":"object","required":["value","type"],"properties":{"type":{"type":"string","enum":["directives"]},"value":{"type":"array","items":{"$ref":"#/components/schemas/ContentSecurityPolicyDirective"}}}},{"type":"object","required":["value","type"],"properties":{"type":{"type":"string","enum":["serialized"]},"value":{"type":"string"}}},{"type":"object","required":["value","type"],"properties":{"type":{"type":"string","enum":["remote"]},"value":{"type":"object","required":["url","source","followRedirects"],"properties":{"followRedirects":{"type":"boolean"},"source":{"$ref":"#/components/schemas/ContentSecurityPolicySource"},"url":{"type":"string","format":"uri"}}}}}]},"ContentSecurityPolicyDirective":{"oneOf":[{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["child-src"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["connect-src"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["default-src"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["font-src"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["frame-src"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["img-src"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["manifest-src"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["media-src"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["object-src"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["script-src"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["script-src-elem"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["script-src-attr"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["style-src"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["style-src-elem"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["style-src-attr"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["webrtc"]},"value":{"type":"array","items":{"$ref":"#/components/schemas/ContentSecurityPolicyWebrtcDirectiveValue"}}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["worker-src"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["base-uri"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["sandbox"]},"value":{"type":"array","items":{"$ref":"#/components/schemas/ContentSecurityPolicySandboxDirectiveValue"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["form-action"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["frame-ancestors"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["name"],"properties":{"name":{"type":"string","enum":["upgrade-insecure-requests"]}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["require-trusted-types-for"]},"value":{"type":"array","items":{"$ref":"#/components/schemas/ContentSecurityPolicyRequireTrustedTypesForDirectiveValue"}}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["trusted-types"]},"value":{"type":"array","items":{"$ref":"#/components/schemas/ContentSecurityPolicyTrustedTypesDirectiveValue"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["report-uri"]},"value":{"type":"array","items":{"type":"string"},"uniqueItems":true}}},{"type":"object","required":["value","name"],"properties":{"name":{"type":"string","enum":["report-to"]},"value":{"type":"array","items":{"type":"string"}}}}]},"ContentSecurityPolicyGetResponse":{"type":"object","description":"Response for GET /api/web_security/csp/{policy_id}.","required":["policy"],"properties":{"policy":{"$ref":"#/components/schemas/ContentSecurityPolicy"},"userShare":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ClientUserShare"}]}}},"ContentSecurityPolicyRequireTrustedTypesForDirectiveValue":{"type":"string","description":"See https://www.w3.org/TR/trusted-types.","enum":["'script'"]},"ContentSecurityPolicySandboxDirectiveValue":{"type":"string","enum":["allow-downloads","allow-forms","allow-modals","allow-orientation-lock","allow-pointer-lock","allow-popups","allow-popups-to-escape-sandbox","allow-presentation","allow-same-origin","allow-scripts","allow-top-navigation","allow-top-navigation-by-user-activation","allow-top-navigation-to-custom-protocols"]},"ContentSecurityPolicySource":{"type":"string","description":"Defines a source by means of which content security policy is delivered.","enum":["enforcingHeader","reportOnlyHeader","meta"]},"ContentSecurityPolicyTrustedTypesDirectiveValue":{"oneOf":[{"type":"string","enum":["'allow-duplicates'"]},{"type":"string","enum":["'none'"]},{"type":"string","enum":["*"]},{"type":"object","required":["PolicyName"],"properties":{"PolicyName":{"type":"string"}}}],"description":"See https://www.w3.org/TR/trusted-types."},"ContentSecurityPolicyWebrtcDirectiveValue":{"type":"string","enum":["'allow'","'block'"]},"DataFileSecret":{"type":"object","description":"Represents a secret as it appears in a data file (export or import).\n\nBoth the export writer and the import reader use this struct so the shape is defined once.\n`encrypted_value` is omitted from serialized output when absent but accepted as missing during\ndeserialization (treated as `None`).","required":["id","name","createdAt","updatedAt"],"properties":{"createdAt":{"type":"integer","format":"int64"},"encryptedValue":{"type":["string","null"],"description":"Base64-encoded passphrase-encrypted value, or `None` if values are not included."},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"}},"updatedAt":{"type":"integer","format":"int64"}}},"DatabaseStatus":{"type":"object","description":"Database connectivity status.","required":["operational"],"properties":{"operational":{"type":"boolean","description":"Indicates if the database is reachable."}}},"EmailParams":{"type":"object","description":"Kratos email request, see https://github.com/ory/kratos/blob/master/courier/stub/request.config.mailer.jsonnet","required":["recipient","template_type"],"properties":{"identity":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Identity"}]},"recipient":{"type":"string"},"recovery_code":{"type":["string","null"]},"template_type":{"type":"string"},"verification_url":{"type":["string","null"]}},"example":{"recipient":"user@example.com","template_type":"recovery_code","recovery_code":"123456"}},"EntityTag":{"type":"object","description":"Slim tag representation embedded in entity API responses and entity-level\nexport data. Contains only the fields the UI needs to render a tag badge.","required":["id","name","color"],"properties":{"color":{"type":"string"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}},"ExportFormat":{"type":"string","description":"Defines a format to use for the generated certificate(s) and keys.","enum":["pem","pkcs8","pkcs12"]},"ExportSelection":{"oneOf":[{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["all"]}}},{"type":"object","required":["ids","type"],"properties":{"ids":{"type":"array","items":{"type":"string","format":"uuid"}},"type":{"type":"string","enum":["selected"]}}}],"description":"Selects which entities to export: all or specific IDs."},"ExportTrackableSelection":{"oneOf":[{"type":"object","required":["type"],"properties":{"includeHistory":{"type":"boolean"},"type":{"type":"string","enum":["all"]}}},{"type":"object","required":["ids","type"],"properties":{"ids":{"type":"array","items":{"type":"string","format":"uuid"}},"includeHistory":{"type":"boolean"},"type":{"type":"string","enum":["selected"]}}}],"description":"Selects which trackable entities (responders/trackers) to export, with optional history."},"ExportedPrivateKey":{"type":"object","description":"An exported private key with PKCS#8 data as base64.","required":["id","name","alg","pkcs8","encrypted","createdAt","updatedAt"],"properties":{"alg":{"$ref":"#/components/schemas/PrivateKeyAlgorithm"},"createdAt":{"type":"integer","format":"int64"},"encrypted":{"type":"boolean"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"pkcs8":{"type":"string"},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"}},"updatedAt":{"type":"integer","format":"int64"}}},"ExportedResponder":{"allOf":[{"$ref":"#/components/schemas/Responder"},{"type":"object","properties":{"history":{"type":"array","items":{"$ref":"#/components/schemas/ExportedResponderRequest"}}}}],"description":"An exported responder with optional history."},"ExportedResponderRequest":{"type":"object","description":"An exported responder request (history entry).","required":["id","responderId","method","url","createdAt"],"properties":{"body":{"type":["string","null"]},"clientAddress":{"type":["string","null"]},"createdAt":{"type":"integer","format":"int64"},"durationMs":{"type":["integer","null"],"format":"int32","minimum":0},"headers":{"type":["object","null"]},"id":{"type":"string","format":"uuid"},"method":{"type":"string"},"responderId":{"type":"string","format":"uuid"},"responseBody":{"type":["string","null"]},"responseHeaders":{"type":["object","null"]},"responseStatusCode":{"type":["integer","null"],"format":"int32","minimum":0},"url":{"type":"string"}}},"ExportedRetrackData":{"type":"object","description":"The retrack tracker data as stored in the export file.\n\nUnlike `RetrackTrackerValue`, this uses the standard `TrackerTarget` serialization\n(internally tagged with `type`) so the format roundtrips cleanly for import.","required":["enabled","config","target","notifications"],"properties":{"config":{"$ref":"#/components/schemas/TrackerConfig"},"enabled":{"type":"boolean"},"notifications":{"type":"boolean"},"target":{"$ref":"#/components/schemas/TrackerTarget"}}},"ExportedTracker":{"type":"object","description":"An exported tracker (page or API) with optional revision history.","required":["id","name","retrack","createdAt","updatedAt"],"properties":{"createdAt":{"type":"integer","format":"int64"},"history":{"type":"array","items":{"$ref":"#/components/schemas/TrackerDataRevision"}},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"retrack":{"$ref":"#/components/schemas/ExportedRetrackData"},"secrets":{"$ref":"#/components/schemas/SecretsAccess"},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"}},"updatedAt":{"type":"integer","format":"int64"}}},"ExtendedKeyUsage":{"type":"string","description":"The extended key usage indicates one or more purposes for which the public key may be used, in\naddition to or in place of the basic purposes indicated in the key usage.\nSee https://www.ietf.org/rfc/rfc5280.html","enum":["codeSigning","emailProtection","timeStamping","tlsWebClientAuthentication","tlsWebServerAuthentication"]},"ExtractorEngine":{"oneOf":[{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["chromium"]}}},{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["camoufox"]}}}],"description":"Tracker's page target extractor engine (browser)."},"Identity":{"type":"object","description":"Kratos Identity struct, see https://www.ory.sh/kratos/docs/reference/api#models-identity","required":["id","traits","verifiable_addresses","created_at"],"properties":{"created_at":{"type":"string","description":"When the identity was created."},"id":{"type":"string","format":"uuid","description":"Identity's unique identifier."},"traits":{"$ref":"#/components/schemas/IdentityTraits","description":"Identity's traits that can be managed by the identity themselves."},"verifiable_addresses":{"type":"array","items":{"$ref":"#/components/schemas/IdentityVerifiableAddress"},"description":"Contains all the addresses that can be verified by the user."}}},"IdentityTraits":{"type":"object","description":"Traits represent an identity's traits. The identity is able to create, modify, and delete traits\nin a self-service manner. The input will always be validated against the JSON Schema.","required":["email"],"properties":{"email":{"type":"string","description":"Main user email address."}}},"IdentityVerifiableAddress":{"type":"object","description":"The address (email or SMS) that can be verified by the user.","required":["value","verified"],"properties":{"value":{"type":"string","description":"The address value."},"verified":{"type":"boolean","description":"Indicates if the address has already been verified"}}},"ImportAction":{"type":"string","enum":["import","skip"]},"ImportEntitySelection":{"type":"object","required":["sourceId","action"],"properties":{"action":{"$ref":"#/components/schemas/ImportAction"},"conflictResolution":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ConflictResolution"}]},"sourceId":{"type":"string","format":"uuid"}}},"ImportMode":{"type":"string","description":"Import mode.","enum":["merge","apply"]},"ImportSelections":{"type":"object","description":"Per-entity selections and conflict resolution.","properties":{"apiTrackers":{"type":"array","items":{"$ref":"#/components/schemas/ImportEntitySelection"}},"certificateTemplates":{"type":"array","items":{"$ref":"#/components/schemas/ImportEntitySelection"}},"contentSecurityPolicies":{"type":"array","items":{"$ref":"#/components/schemas/ImportEntitySelection"}},"importSettings":{"type":"boolean"},"pageTrackers":{"type":"array","items":{"$ref":"#/components/schemas/ImportEntitySelection"}},"privateKeys":{"type":"array","items":{"$ref":"#/components/schemas/ImportEntitySelection"}},"responders":{"type":"array","items":{"$ref":"#/components/schemas/ImportEntitySelection"}},"scripts":{"type":"array","items":{"$ref":"#/components/schemas/ImportEntitySelection"}},"secrets":{"type":"array","items":{"$ref":"#/components/schemas/ImportEntitySelection"}},"tags":{"type":"array","items":{"$ref":"#/components/schemas/ImportEntitySelection"}}}},"ImportedScript":{"type":"object","required":["id","name","scriptType","content","createdAt","updatedAt"],"properties":{"content":{"type":"string"},"createdAt":{"type":"integer","format":"int64"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"scriptType":{"type":"string"},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"}},"updatedAt":{"type":"integer","format":"int64"}}},"KdfParams":{"type":"object","required":["m","t","p"],"properties":{"m":{"type":"integer","format":"int32","minimum":0},"p":{"type":"integer","format":"int32","minimum":0},"t":{"type":"integer","format":"int32","minimum":0}}},"KeyUsage":{"type":"string","description":"The key usage extension defines the purpose of the public key contained in the certificate.\nSee https://www.ietf.org/rfc/rfc5280.html","enum":["crlSigning","dataEncipherment","decipherOnly","digitalSignature","encipherOnly","keyAgreement","keyCertificateSigning","keyEncipherment","nonRepudiation"]},"NotificationChannelKind":{"type":"string","description":"Channel discriminator for a [`super::UserNotificationDestination`].\n\nMarked `#[non_exhaustive]` so future channels (Slack, PagerDuty, generic webhook) widen the\nenum without forcing every consumer to update its `match` arms in lock-step.","enum":["email"]},"NotificationEmailSetParams":{"type":"object","required":["email"],"properties":{"email":{"type":"string"}},"example":{"email":"alerts@example.com"}},"NotificationEmailVerifyParams":{"type":"object","required":["code"],"properties":{"code":{"type":"string"}},"example":{"code":"123456"}},"NotificationsUnsubscribeParams":{"type":"object","description":"Body of the RFC 8058 one-click unsubscribe POST. Mail clients send the form-encoded\n`List-Unsubscribe=One-Click` value, but our endpoint additionally accepts a JSON body that\ncarries the token so a UI confirmation page can call it from the browser without scraping\nquery params.","required":["token"],"properties":{"token":{"type":"string"}},"example":{"token":"BPshNd1bvP72jY-bxmGLZGwj9D5GrPcA"}},"PageTarget":{"type":"object","description":"Tracker's target for a web page.","required":["extractor"],"properties":{"acceptInvalidCertificates":{"type":"boolean","description":"Whether to ignore invalid server certificates when sending network requests."},"engine":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ExtractorEngine","description":"Defines the engine (browser) to use to extract content. By default, the web scraper with\nthe Chromium browser backend is used."}]},"extractor":{"type":"string","description":"A custom script (Playwright scenario) to extract data from the page."},"params":{"description":"Optional parameters to pass to the scripts as part of the context."},"userAgent":{"type":["string","null"],"description":"Specific user agent to use for the browser context."}}},"PageTracker":{"type":"object","required":["id","name","retrack","createdAt","updatedAt"],"properties":{"createdAt":{"type":"integer","format":"int64","description":"Date and time when the tracker was created."},"id":{"type":"string","format":"uuid","description":"Unique tracker id (UUIDv7)."},"name":{"type":"string","description":"Arbitrary name of the tracker."},"retrack":{"$ref":"#/components/schemas/RetrackTracker","description":"By-value or by-reference instance of the Retrack tracker associated with the current tracker."},"secrets":{"$ref":"#/components/schemas/SecretsAccess","description":"Controls which user secrets are available to this tracker's extractor script."},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"},"description":"Tags assigned to this tracker."},"updatedAt":{"type":"integer","format":"int64","description":"Date and time when the tracker was last updated."}}},"PageTrackerConfig":{"type":"object","required":["revisions"],"properties":{"job":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SchedulerJobConfig","description":"Configuration for a job, if the tracker needs to be scheduled for automatic change detection."}]},"revisions":{"type":"integer","description":"A number of revisions of the page to track.","minimum":0}}},"PageTrackerCreateParams":{"type":"object","required":["name","config","target"],"properties":{"config":{"$ref":"#/components/schemas/PageTrackerConfig","description":"Page tracker configuration."},"enabled":{"type":"boolean","description":"Whether the tracker is enabled."},"name":{"type":"string","description":"Arbitrary name of the page tracker."},"notifications":{"type":"boolean","description":"Indicates whether the user should be notified about changes."},"secrets":{"$ref":"#/components/schemas/SecretsAccess","description":"Controls which user secrets are available to this tracker's extractor script."},"tagIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Tag IDs to assign to this page tracker."},"target":{"$ref":"#/components/schemas/PageTrackerTarget","description":"Page tracker configuration."}},"example":{"name":"my-page-tracker","config":{"revisions":3},"target":{"extractor":"export async function execute(p) { return await p.content(); }"},"tagIds":[]}},"PageTrackerDebugParams":{"type":"object","required":["target","secrets"],"properties":{"secrets":{"$ref":"#/components/schemas/SecretsAccess"},"target":{"$ref":"#/components/schemas/PageTrackerTarget"}},"example":{"target":{"extractor":"export async function execute(p) { return await p.content(); }"},"secrets":{"type":"none"}}},"PageTrackerGetHistoryParams":{"type":"object","properties":{"refresh":{"type":"boolean"}},"example":{"refresh":false}},"PageTrackerTarget":{"type":"object","required":["extractor"],"properties":{"acceptInvalidCertificates":{"type":"boolean","description":"Whether to accept invalid TLS certificates."},"engine":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ExtractorEngine","description":"The browser engine to use for content extraction. Defaults to Chromium when absent."}]},"extractor":{"type":"string","description":"A custom script (Playwright scenario) to extract data from the page."}}},"PageTrackerUpdateParams":{"type":"object","properties":{"config":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/PageTrackerConfig","description":"Page tracker configuration."}],"default":null},"enabled":{"type":["boolean","null"],"description":"Whether the tracker is enabled.","default":null},"name":{"type":["string","null"],"description":"Arbitrary name of the page tracker.","default":null},"notifications":{"type":"boolean","description":"Indicates whether the user should be notified about changes.","default":false},"secrets":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SecretsAccess","description":"Controls which user secrets are available to this tracker's extractor script."}],"default":null},"tagIds":{"type":["array","null"],"items":{"type":"string","format":"uuid"},"description":"Tag IDs to assign. When `Some`, replaces all tags; when `None`, tags are unchanged.","default":null},"target":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/PageTrackerTarget","description":"Page tracker configuration."}],"default":null}},"example":{"name":"renamed-tracker"}},"Page_ApiTracker":{"type":"object","description":"A page of results returned by a paginated list endpoint.\n\nutoipa 5 auto-collects the concrete schema (e.g. `Page<UserSecret>`) from the handler's\n`responses(... body = Page<UserSecret>)` declaration, so there is no need to register the\ninstantiations in the `#[openapi]` `schemas(...)`.","required":["items","total"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","name","retrack","createdAt","updatedAt"],"properties":{"createdAt":{"type":"integer","format":"int64","description":"Date and time when the tracker was created."},"id":{"type":"string","format":"uuid","description":"Unique tracker id (UUIDv7)."},"name":{"type":"string","description":"Arbitrary name of the tracker."},"retrack":{"$ref":"#/components/schemas/RetrackTracker","description":"By-value or by-reference instance of the Retrack tracker associated with the current tracker."},"secrets":{"$ref":"#/components/schemas/SecretsAccess","description":"Controls which user secrets are available to this tracker's scripts."},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"},"description":"Tags assigned to this tracker."},"updatedAt":{"type":"integer","format":"int64","description":"Date and time when the tracker was last updated."}}},"description":"Items on the current page."},"total":{"type":"integer","format":"int64","description":"Total number of items matching the filter across all pages."}}},"Page_CertificateTemplate":{"type":"object","description":"A page of results returned by a paginated list endpoint.\n\nutoipa 5 auto-collects the concrete schema (e.g. `Page<UserSecret>`) from the handler's\n`responses(... body = Page<UserSecret>)` declaration, so there is no need to register the\ninstantiations in the `#[openapi]` `schemas(...)`.","required":["items","total"],"properties":{"items":{"type":"array","items":{"type":"object","description":"Describes stored certificate template.","required":["id","name","attributes","createdAt","updatedAt"],"properties":{"attributes":{"$ref":"#/components/schemas/CertificateAttributes","description":"Attributes of the certificate that the template defines."},"createdAt":{"type":"integer","format":"int64","description":"Date and time when the certificate template was created."},"id":{"type":"string","format":"uuid","description":"Unique certificate template id (UUIDv7)."},"name":{"type":"string","description":"Arbitrary name of the certificate template."},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"},"description":"Tags assigned to this certificate template."},"updatedAt":{"type":"integer","format":"int64","description":"Date and time when the certificate template was last updated."}}},"description":"Items on the current page."},"total":{"type":"integer","format":"int64","description":"Total number of items matching the filter across all pages."}}},"Page_ContentSecurityPolicy":{"type":"object","description":"A page of results returned by a paginated list endpoint.\n\nutoipa 5 auto-collects the concrete schema (e.g. `Page<UserSecret>`) from the handler's\n`responses(... body = Page<UserSecret>)` declaration, so there is no need to register the\ninstantiations in the `#[openapi]` `schemas(...)`.","required":["items","total"],"properties":{"items":{"type":"array","items":{"type":"object","description":"Represents content security policy (CSP) with the arbitrary name.","required":["id","name","directives","createdAt","updatedAt"],"properties":{"createdAt":{"type":"integer","format":"int64","description":"Date and time when the content security policy was created."},"directives":{"type":"array","items":{"$ref":"#/components/schemas/ContentSecurityPolicyDirective"},"description":"Content security policy directives."},"id":{"type":"string","format":"uuid","description":"Unique content security policy id (UUIDv7)."},"name":{"type":"string","description":"Arbitrary name of the content security policy."},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"},"description":"Tags assigned to this content security policy."},"updatedAt":{"type":"integer","format":"int64","description":"Date and time when the content security policy was last updated."}}},"description":"Items on the current page."},"total":{"type":"integer","format":"int64","description":"Total number of items matching the filter across all pages."}}},"Page_PageTracker":{"type":"object","description":"A page of results returned by a paginated list endpoint.\n\nutoipa 5 auto-collects the concrete schema (e.g. `Page<UserSecret>`) from the handler's\n`responses(... body = Page<UserSecret>)` declaration, so there is no need to register the\ninstantiations in the `#[openapi]` `schemas(...)`.","required":["items","total"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","name","retrack","createdAt","updatedAt"],"properties":{"createdAt":{"type":"integer","format":"int64","description":"Date and time when the tracker was created."},"id":{"type":"string","format":"uuid","description":"Unique tracker id (UUIDv7)."},"name":{"type":"string","description":"Arbitrary name of the tracker."},"retrack":{"$ref":"#/components/schemas/RetrackTracker","description":"By-value or by-reference instance of the Retrack tracker associated with the current tracker."},"secrets":{"$ref":"#/components/schemas/SecretsAccess","description":"Controls which user secrets are available to this tracker's extractor script."},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"},"description":"Tags assigned to this tracker."},"updatedAt":{"type":"integer","format":"int64","description":"Date and time when the tracker was last updated."}}},"description":"Items on the current page."},"total":{"type":"integer","format":"int64","description":"Total number of items matching the filter across all pages."}}},"Page_PrivateKey":{"type":"object","description":"A page of results returned by a paginated list endpoint.\n\nutoipa 5 auto-collects the concrete schema (e.g. `Page<UserSecret>`) from the handler's\n`responses(... body = Page<UserSecret>)` declaration, so there is no need to register the\ninstantiations in the `#[openapi]` `schemas(...)`.","required":["items","total"],"properties":{"items":{"type":"array","items":{"type":"object","description":"Describes stored private key.","required":["id","name","alg","pkcs8","encrypted","createdAt","updatedAt"],"properties":{"alg":{"$ref":"#/components/schemas/PrivateKeyAlgorithm","description":"Algorithm of the private key (RSA, DSA, etc.)."},"createdAt":{"type":"integer","format":"int64","description":"Date and time when the private key was created."},"encrypted":{"type":"boolean","description":"Indicates whether the private key is encrypted."},"id":{"type":"string","format":"uuid","description":"Unique private key id (UUIDv7)."},"name":{"type":"string","description":"Arbitrary name of the private key."},"pkcs8":{"type":"array","items":{"type":"integer","format":"int32","minimum":0},"description":"Private key serialized to PKCS#8 format (with or without encryption)."},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"},"description":"Tags assigned to this private key."},"updatedAt":{"type":"integer","format":"int64","description":"Date and time when the private key was last updated."}}},"description":"Items on the current page."},"total":{"type":"integer","format":"int64","description":"Total number of items matching the filter across all pages."}}},"Page_Responder":{"type":"object","description":"A page of results returned by a paginated list endpoint.\n\nutoipa 5 auto-collects the concrete schema (e.g. `Page<UserSecret>`) from the handler's\n`responses(... body = Page<UserSecret>)` declaration, so there is no need to register the\ninstantiations in the `#[openapi]` `schemas(...)`.","required":["items","total"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","name","location","method","enabled","settings","createdAt","updatedAt"],"properties":{"createdAt":{"type":"integer","format":"int64","description":"Date and time when the responder was created."},"enabled":{"type":"boolean","description":"Indicates whether the responder is enabled."},"id":{"type":"string","format":"uuid","description":"Unique responder id (UUIDv7)."},"location":{"$ref":"#/components/schemas/ResponderLocation","description":"Location of the responder."},"method":{"$ref":"#/components/schemas/ResponderMethod","description":"HTTP method of the responder."},"name":{"type":"string","description":"Arbitrary name of the responder."},"settings":{"$ref":"#/components/schemas/ResponderSettings","description":"Miscellaneous responder settings."},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"},"description":"Tags assigned to this responder."},"updatedAt":{"type":"integer","format":"int64","description":"Date and time when the responder was last updated."}}},"description":"Items on the current page."},"total":{"type":"integer","format":"int64","description":"Total number of items matching the filter across all pages."}}},"Page_UserScript":{"type":"object","description":"A page of results returned by a paginated list endpoint.\n\nutoipa 5 auto-collects the concrete schema (e.g. `Page<UserSecret>`) from the handler's\n`responses(... body = Page<UserSecret>)` declaration, so there is no need to register the\ninstantiations in the `#[openapi]` `schemas(...)`.","required":["items","total"],"properties":{"items":{"type":"array","items":{"type":"object","description":"Represents a user-defined script for reuse across responders and trackers.","required":["id","name","scriptType","content","createdAt","updatedAt"],"properties":{"content":{"type":"string","description":"The script content (the actual code)."},"createdAt":{"type":"integer","format":"int64","description":"When the script was first created."},"id":{"type":"string","format":"uuid","description":"Unique identifier for the script."},"name":{"type":"string","description":"The script name (used to reference it in the UI)."},"scriptType":{"$ref":"#/components/schemas/UserScriptType","description":"The type of script, determining compatible contexts."},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"},"description":"Tags assigned to this script."},"updatedAt":{"type":"integer","format":"int64","description":"When the script content was last updated."}}},"description":"Items on the current page."},"total":{"type":"integer","format":"int64","description":"Total number of items matching the filter across all pages."}}},"Page_UserSecret":{"type":"object","description":"A page of results returned by a paginated list endpoint.\n\nutoipa 5 auto-collects the concrete schema (e.g. `Page<UserSecret>`) from the handler's\n`responses(... body = Page<UserSecret>)` declaration, so there is no need to register the\ninstantiations in the `#[openapi]` `schemas(...)`.","required":["items","total"],"properties":{"items":{"type":"array","items":{"type":"object","description":"Represents a user secret (key-value pair stored encrypted at rest).\nThe value is never returned to clients after creation.","required":["id","name","createdAt","updatedAt"],"properties":{"createdAt":{"type":"integer","format":"int64","description":"When the secret was first created."},"id":{"type":"string","format":"uuid","description":"Unique identifier for the secret."},"name":{"type":"string","description":"The secret name (used to reference it in scripts and templates)."},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"},"description":"Tags assigned to this secret."},"updatedAt":{"type":"integer","format":"int64","description":"When the secret value was last updated."}}},"description":"Items on the current page."},"total":{"type":"integer","format":"int64","description":"Total number of items matching the filter across all pages."}}},"Page_UserTag":{"type":"object","description":"A page of results returned by a paginated list endpoint.\n\nutoipa 5 auto-collects the concrete schema (e.g. `Page<UserSecret>`) from the handler's\n`responses(... body = Page<UserSecret>)` declaration, so there is no need to register the\ninstantiations in the `#[openapi]` `schemas(...)`.","required":["items","total"],"properties":{"items":{"type":"array","items":{"type":"object","description":"A user-managed tag with a name and display color.","required":["id","name","color","createdAt","updatedAt"],"properties":{"color":{"type":"string"},"createdAt":{"type":"integer","format":"int64"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"updatedAt":{"type":"integer","format":"int64"}}},"description":"Items on the current page."},"total":{"type":"integer","format":"int64","description":"Total number of items matching the filter across all pages."}}},"PrivateKey":{"type":"object","description":"Describes stored private key.","required":["id","name","alg","pkcs8","encrypted","createdAt","updatedAt"],"properties":{"alg":{"$ref":"#/components/schemas/PrivateKeyAlgorithm","description":"Algorithm of the private key (RSA, DSA, etc.)."},"createdAt":{"type":"integer","format":"int64","description":"Date and time when the private key was created."},"encrypted":{"type":"boolean","description":"Indicates whether the private key is encrypted."},"id":{"type":"string","format":"uuid","description":"Unique private key id (UUIDv7)."},"name":{"type":"string","description":"Arbitrary name of the private key."},"pkcs8":{"type":"array","items":{"type":"integer","format":"int32","minimum":0},"description":"Private key serialized to PKCS#8 format (with or without encryption)."},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"},"description":"Tags assigned to this private key."},"updatedAt":{"type":"integer","format":"int64","description":"Date and time when the private key was last updated."}}},"PrivateKeyAlgorithm":{"oneOf":[{"type":"object","required":["keySize","keyType"],"properties":{"keySize":{"$ref":"#/components/schemas/PrivateKeySize"},"keyType":{"type":"string","enum":["rsa"]}}},{"type":"object","required":["keySize","keyType"],"properties":{"keySize":{"$ref":"#/components/schemas/PrivateKeySize"},"keyType":{"type":"string","enum":["dsa"]}}},{"type":"object","required":["curve","keyType"],"properties":{"curve":{"$ref":"#/components/schemas/PrivateKeyEllipticCurve"},"keyType":{"type":"string","enum":["ecdsa"]}}},{"type":"object","required":["keyType"],"properties":{"keyType":{"type":"string","enum":["ed25519"]}}}]},"PrivateKeyEllipticCurve":{"type":"string","description":"Defines named elliptic curves used with Elliptic Curve Digital Signature Algorithm (ECDSA).\nSee https://www.rfc-editor.org/rfc/rfc8422.html#appendix-A.","enum":["secp256r1","secp384r1","secp521r1"]},"PrivateKeySize":{"type":"string","description":"The key size defines a number of bits in a key used by a cryptographic algorithm.","enum":["1024","2048","4096","8192"]},"PrivateKeysCreateParams":{"type":"object","required":["keyName","alg"],"properties":{"alg":{"$ref":"#/components/schemas/PrivateKeyAlgorithm"},"keyName":{"type":"string"},"passphrase":{"type":["string","null"]},"tagIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Tag IDs to assign to this private key."}},"example":{"keyName":"my-key","alg":{"keyType":"ed25519"},"tagIds":[]}},"PrivateKeysExportParams":{"type":"object","required":["format"],"properties":{"exportPassphrase":{"type":["string","null"]},"format":{"$ref":"#/components/schemas/ExportFormat"},"passphrase":{"type":["string","null"]}},"example":{"format":"pem"}},"PrivateKeysUpdateParams":{"type":"object","properties":{"keyName":{"type":["string","null"]},"newPassphrase":{"type":["string","null"]},"passphrase":{"type":["string","null"]},"tagIds":{"type":["array","null"],"items":{"type":"string","format":"uuid"},"description":"Tag IDs to assign. When `Some`, replaces all tags; when `None`, tags are unchanged."}},"example":{"keyName":"renamed-key"}},"RecoveryLink":{"type":"object","description":"Kratos admin-issued recovery link returned by `POST /admin/recovery/code` (or the legacy\n`POST /admin/recovery/link`).\n\nThe operator hands this URL to a user (or, in the clone case, opens it themselves) to set a\npassword and log in. When Kratos is configured with `recovery.use = \"code\"` (the modern\ndefault), the URL points at the recovery flow page and `recovery_code` carries the one-time code\nthe user has to enter there. With `use = \"link\"`, the URL is self-contained and `recovery_code` is absent.","required":["recovery_link","expires_at"],"properties":{"expires_at":{"type":"string","description":"When the link/code expires (Kratos returns RFC3339)."},"recovery_code":{"type":["string","null"],"description":"One-time code the user enters at `recovery_link` to complete recovery. Only present\nwhen Kratos uses the `code` recovery strategy."},"recovery_link":{"type":"string","description":"Single-use Kratos URL that starts the recovery flow."}}},"RemoveParams":{"type":"object","required":["email"],"properties":{"email":{"type":"string","description":"Email of the user to remove."}},"example":{"email":"user@example.com"}},"Responder":{"type":"object","required":["id","name","location","method","enabled","settings","createdAt","updatedAt"],"properties":{"createdAt":{"type":"integer","format":"int64","description":"Date and time when the responder was created."},"enabled":{"type":"boolean","description":"Indicates whether the responder is enabled."},"id":{"type":"string","format":"uuid","description":"Unique responder id (UUIDv7)."},"location":{"$ref":"#/components/schemas/ResponderLocation","description":"Location of the responder."},"method":{"$ref":"#/components/schemas/ResponderMethod","description":"HTTP method of the responder."},"name":{"type":"string","description":"Arbitrary name of the responder."},"settings":{"$ref":"#/components/schemas/ResponderSettings","description":"Miscellaneous responder settings."},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"},"description":"Tags assigned to this responder."},"updatedAt":{"type":"integer","format":"int64","description":"Date and time when the responder was last updated."}}},"ResponderLocation":{"type":"object","required":["pathType","path"],"properties":{"path":{"type":"string","description":"Responder location path."},"pathType":{"$ref":"#/components/schemas/ResponderPathType","description":"Responder location path type."},"subdomainPrefix":{"type":["string","null"],"description":"Optional subdomain prefix for a responder location (prefix-<user-handle>). If not specified\nsubdomain based on the user handle is used."}}},"ResponderMethod":{"type":"string","enum":["ANY","GET","POST","PUT","DELETE","HEAD","OPTIONS","CONNECT","TRACE","PATCH"]},"ResponderNotificationSettings":{"type":"object","description":"Settings that control whether and how a user is notified when their responder is hit.\n\nThe presence of these settings on a responder means notifications are enabled; their absence\nmeans notifications are disabled (the default). The `throttle_seconds` value is validated\nagainst the per-subscription allow-list in\n[`SubscriptionWebhooksConfig::notification_throttle_presets`].","required":["throttleSeconds"],"properties":{"throttleSeconds":{"type":"integer","format":"int32","description":"Minimum interval, in seconds, between consecutive notification emails for the responder.\nRequests received within a single window are coalesced into one email.","minimum":0}},"example":{"throttleSeconds":3600}},"ResponderPathType":{"type":"string","description":"Describe the responder path type.","enum":["=","^"]},"ResponderSettings":{"type":"object","required":["statusCode"],"properties":{"body":{"type":["string","null"],"description":"Optional body to respond with."},"headers":{"type":["array","null"],"items":{"type":"array","items":false,"prefixItems":[{"type":"string"},{"type":"string"}]},"description":"Optional headers to respond with."},"notifications":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ResponderNotificationSettings","description":"Controls whether and how the user is notified when the responder is hit. When `None`\n(the default) notifications are disabled."}]},"requestsToTrack":{"type":"integer","description":"Number of requests to track.","minimum":0},"script":{"type":["string","null"],"description":"Optional JavaScript code to execute for every received request that allows overriding\nresponse status code, body, and headers."},"secrets":{"$ref":"#/components/schemas/SecretsAccess","description":"Controls which user secrets are available to this responder."},"statusCode":{"type":"integer","format":"int32","description":"HTTP status code to respond with.","minimum":0}}},"ResponderStats":{"type":"object","description":"Represents a responder stat.","required":["responderId","requestCount"],"properties":{"lastRequestedAt":{"type":["integer","null"],"format":"int64","description":"The timestamp when the responder was last requested."},"requestCount":{"type":"integer","description":"Number of responder requests that are currently stored.","minimum":0},"responderId":{"type":"string","format":"uuid","description":"Unique responder ID that the stat belongs to (UUIDv7)."}}},"RespondersCreateParams":{"type":"object","required":["name","location","method","enabled","settings"],"properties":{"enabled":{"type":"boolean","description":"Indicates whether the responder is enabled."},"location":{"$ref":"#/components/schemas/ResponderLocation","description":"Location of the responder."},"method":{"$ref":"#/components/schemas/ResponderMethod","description":"HTTP method of the responder."},"name":{"type":"string"},"settings":{"$ref":"#/components/schemas/ResponderSettings"},"tagIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Tag IDs to assign to this responder."}},"example":{"name":"my-responder","location":{"pathType":"=","path":"/my-hook"},"method":"ANY","enabled":true,"settings":{"requestsToTrack":10,"statusCode":200},"tagIds":[]}},"RespondersUpdateParams":{"type":"object","properties":{"enabled":{"type":["boolean","null"],"description":"Whether the responder is enabled."},"location":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ResponderLocation","description":"Location of the responder."}]},"method":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ResponderMethod","description":"HTTP method of the responder."}]},"name":{"type":["string","null"]},"settings":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ResponderSettings"}]},"tagIds":{"type":["array","null"],"items":{"type":"string","format":"uuid"},"description":"Tag IDs to assign. When `Some` replaces all tags; when `None`, tags are unchanged."}},"example":{"name":"renamed-responder"}},"RetrackTracker":{"oneOf":[{"type":"object","required":["id"],"properties":{"id":{"type":"string","format":"uuid"}}},{"$ref":"#/components/schemas/RetrackTrackerValue"}]},"RetrackTrackerValue":{"type":"object","required":["id","enabled","config","target","notifications"],"properties":{"config":{"$ref":"#/components/schemas/TrackerConfig"},"enabled":{"type":"boolean"},"id":{"type":"string","format":"uuid"},"lastRanAt":{"type":["integer","null"],"format":"int64","description":"Date and time when the tracker last ran on schedule (derived from the scheduler)."},"notifications":{"type":"boolean"},"scheduledAt":{"type":["integer","null"],"format":"int64","description":"Date and time when the tracker is next scheduled to run (derived from the scheduler)."},"target":{"$ref":"#/components/schemas/TrackerTarget"}}},"SchedulerJobConfig":{"type":"object","description":"Represents a job configuration that can be scheduled.","required":["schedule"],"properties":{"retryStrategy":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SchedulerJobRetryStrategy","description":"Defines a retry strategy for the job."}]},"schedule":{"type":"string","description":"Defines a schedule for the job."}}},"SchedulerJobRetryStrategy":{"oneOf":[{"type":"object","description":"The job will be retried with a constant interval (1s -> 1s -> 1s).","required":["interval","maxAttempts","type"],"properties":{"interval":{"type":"string"},"maxAttempts":{"type":"integer","format":"int32","minimum":0},"type":{"type":"string","enum":["constant"]}}},{"type":"object","description":"The job will be retried with an exponential interval (1s -> 2s -> 4s -> 8s).","required":["initialInterval","multiplier","maxInterval","maxAttempts","type"],"properties":{"initialInterval":{"type":"string"},"maxAttempts":{"type":"integer","format":"int32","minimum":0},"maxInterval":{"type":"string"},"multiplier":{"type":"integer","format":"int32","minimum":0},"type":{"type":"string","enum":["exponential"]}}},{"type":"object","description":"The job will be retried with a linear interval (1s -> 2s -> 3s).","required":["initialInterval","increment","maxInterval","maxAttempts","type"],"properties":{"increment":{"type":"string"},"initialInterval":{"type":"string"},"maxAttempts":{"type":"integer","format":"int32","minimum":0},"maxInterval":{"type":"string"},"type":{"type":"string","enum":["linear"]}}}],"description":"Represents a retry strategy for a scheduler job."},"SchedulerParseScheduleParams":{"type":"object","required":["schedule"],"properties":{"schedule":{"type":"string","description":"A cron expression to parse (6 or 7 fields with seconds)."}},"example":{"schedule":"0 0 * * * *"}},"SchedulerParseScheduleResult":{"type":"object","required":["minInterval","nextOccurrences"],"properties":{"minInterval":{"type":"integer","format":"int64","description":"The minimum interval between two consequent scheduled tracker checks (milliseconds).","minimum":0},"nextOccurrences":{"type":"array","items":{"type":"integer","format":"int64"},"description":"The next 5 occurrences of the provided schedule (unix timestamps)."}}},"ScriptContext":{"type":"string","description":"Represents the context where a script can be used.","enum":["responder","api_tracker","page_tracker"]},"ScriptCreateParams":{"type":"object","required":["name","scriptType","content"],"properties":{"content":{"type":"string"},"name":{"type":"string"},"scriptType":{"type":"string"},"tagIds":{"type":"array","items":{"type":"string","format":"uuid"}}},"example":{"name":"my-extractor","scriptType":"api_extractor","content":"export default async function() { return document.title; }","tagIds":[]}},"ScriptUpdateParams":{"type":"object","required":["content"],"properties":{"content":{"type":"string"},"tagIds":{"type":["array","null"],"items":{"type":"string","format":"uuid"}}},"example":{"content":"export default async function() { return document.body.innerText; }"}},"SearchParams":{"type":"object","required":["query"],"properties":{"query":{"type":"string","description":"The search query string."}},"example":{"query":"certificate"}},"SecretCreateParams":{"type":"object","required":["name","value"],"properties":{"name":{"type":"string"},"tagIds":{"type":"array","items":{"type":"string","format":"uuid"}},"value":{"type":"string"}},"example":{"name":"GITHUB_TOKEN","value":"ghp_xxxxxxxxxxxx","tagIds":[]}},"SecretUpdateParams":{"type":"object","properties":{"tagIds":{"type":["array","null"],"items":{"type":"string","format":"uuid"}},"value":{"type":["string","null"]}},"example":{"value":"ghp_yyyyyyyyyyyy"}},"SecretsAccess":{"oneOf":[{"type":"object","description":"No secrets are exposed (default).","required":["type"],"properties":{"type":{"type":"string","enum":["none"]}}},{"type":"object","description":"All user secrets are exposed.","required":["type"],"properties":{"type":{"type":"string","enum":["all"]}}},{"type":"object","description":"Only the named secrets are exposed.","required":["secrets","type"],"properties":{"secrets":{"type":"array","items":{"type":"string"}},"type":{"type":"string","enum":["selected"]}}}],"description":"Controls which user secrets are exposed to a responder or tracker script."},"SecretsEncryptionMeta":{"type":"object","description":"Metadata stored alongside encrypted secrets in the export file.","required":["alg","kdf","kdfParams","salt"],"properties":{"alg":{"type":"string"},"kdf":{"type":"string"},"kdfParams":{"$ref":"#/components/schemas/KdfParams"},"salt":{"type":"string"}}},"SendMessageParams":{"type":"object","required":["message"],"properties":{"email":{"type":["string","null"],"description":"Optional sender email address."},"message":{"type":"string","description":"The message text."}},"example":{"message":"I'd like to request a feature.","email":"user@example.com"}},"SetStatusAPIParams":{"type":"object","required":["level"],"properties":{"level":{"$ref":"#/components/schemas/StatusLevel"}},"example":{"level":"available"}},"SignatureAlgorithm":{"type":"string","enum":["md5","sha1","sha256","sha384","sha512","ed25519"]},"SignupParams":{"type":"object","required":["identity"],"properties":{"identity":{"$ref":"#/components/schemas/Identity","description":"The Kratos identity for the new user."}},"example":{"identity":{"id":"00000000-0000-0000-0000-000000000001","traits":{"email":"user@example.com"},"verifiable_addresses":[{"value":"user@example.com","verified":false}],"created_at":"2025-01-01T00:00:00Z"}}},"Status":{"type":"object","description":"Server status information.","required":["version","level","db"],"properties":{"db":{"$ref":"#/components/schemas/DatabaseStatus","description":"Status of the database connection."},"level":{"$ref":"#/components/schemas/StatusLevel","description":"Current availability level."},"version":{"type":"string","description":"The server version string."}}},"StatusLevel":{"type":"string","description":"Server availability level.","enum":["available","unavailable"]},"SubscriptionTier":{"type":"string","description":"Represents the user subscription tier.","enum":["basic","standard","professional","ultimate"]},"TagCreateParams":{"type":"object","required":["name"],"properties":{"color":{"type":"string"},"name":{"type":"string"}},"example":{"name":"production","color":"primary"}},"TagUpdateParams":{"type":"object","properties":{"color":{"type":["string","null"]},"name":{"type":["string","null"]}},"example":{"name":"staging","color":"#54B399"}},"TargetRequest":{"type":"object","description":"Request structure for the API target.","required":["url"],"properties":{"acceptInvalidCertificates":{"type":"boolean","description":"Whether to ignore invalid server certificates when sending network requests."},"acceptStatuses":{"type":"array","items":{"type":"integer","format":"int32","maximum":999,"minimum":100},"description":"Optional list of response HTTP status codes that should be accepted as valid. If not\nspecified, only 200 codes are accepted.","uniqueItems":true},"body":{"description":"Optional body to include to the request."},"headers":{"type":"object","description":"Optional headers to include in the request.","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"mediaType":{"type":"string","description":"The media type of the content returned by the API. By default, application/json is assumed."},"method":{"type":"string","description":"The HTTP method to use to send a request to."},"url":{"type":"string","format":"uri","description":"URL of the API endpoint that returns JSON to track."}}},"TemplatesCreateParams":{"type":"object","required":["templateName","attributes"],"properties":{"attributes":{"$ref":"#/components/schemas/CertificateAttributes"},"tagIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Tag IDs to assign to this certificate template."},"templateName":{"type":"string"}},"example":{"templateName":"My CA","attributes":{"keyAlgorithm":{"keyType":"ed25519"},"signatureAlgorithm":"ed25519","notValidBefore":946720800,"notValidAfter":1893456000,"version":3,"isCa":true}}},"TemplatesFetchCertificatesParams":{"type":"object","required":["url"],"properties":{"url":{"type":"string"}},"example":{"url":"https://example.com"}},"TemplatesGenerateParams":{"type":"object","required":["format"],"properties":{"format":{"$ref":"#/components/schemas/ExportFormat"},"passphrase":{"type":["string","null"]}},"example":{"format":"pem"}},"TemplatesUpdateParams":{"type":"object","properties":{"attributes":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CertificateAttributes"}]},"tagIds":{"type":["array","null"],"items":{"type":"string","format":"uuid"},"description":"Tag IDs to assign. When `Some`, replaces all tags; when `None`, tags are unchanged."},"templateName":{"type":["string","null"]}},"example":{"templateName":"Renamed CA"}},"TrackerConfig":{"type":"object","required":["revisions"],"properties":{"job":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SchedulerJobConfig","description":"Configuration of the job that triggers tracker, if configured."}]},"revisions":{"type":"integer","description":"A number of revisions of the content to track.","minimum":0},"timeout":{"type":["string","null"],"description":"Number of milliseconds to wait content extraction is considered failed."}}},"TrackerDataRevision":{"type":"object","description":"Represents a tracker data revision.","required":["id","trackerId","data","createdAt"],"properties":{"createdAt":{"type":"string","format":"date-time","description":"Timestamp indicating when data was fetched."},"data":{"$ref":"#/components/schemas/TrackerDataValue_Value","description":"Array of tracker data revision values including the original one and the those potentially\ntransformed by the tracker actions, if any."},"id":{"type":"string","format":"uuid","description":"Unique tracker data revision id (UUIDv7)."},"trackerId":{"type":"string","format":"uuid","description":"ID of the tracker captured data belongs to."}}},"TrackerDataValue_Value":{"type":"object","description":"Represents a tracker data revision value.","required":["original"],"properties":{"mods":{"type":["array","null"],"items":{},"description":"A list of values after applying modification tracker actions, if any."},"original":{}}},"TrackerTarget":{"oneOf":[{"allOf":[{"$ref":"#/components/schemas/PageTarget","description":"Web page target."},{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["page"]}}}],"description":"Web page target."},{"allOf":[{"$ref":"#/components/schemas/ApiTarget","description":"HTTP API target."},{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["api"]}}}],"description":"HTTP API target."}],"description":"Tracker's target (web page, API, or file)."},"UpdateSubscriptionParams":{"type":"object","required":["user_email","subscription"],"properties":{"subscription":{"$ref":"#/components/schemas/UserSubscription"},"user_email":{"type":"string"}},"example":{"user_email":"user@example.com","subscription":{"tier":"standard","startedAt":1700000000}}},"UserApiKey":{"type":"object","description":"Represents a user API key for programmatic access to the Secutils API.\nThe plaintext token is only returned once at creation or regeneration.","required":["id","name","createdAt","updatedAt"],"properties":{"createdAt":{"type":"integer","format":"int64","description":"When the API key was created."},"expiresAt":{"type":["integer","null"],"format":"int64","description":"When the API key expires, or `None` if it never expires."},"id":{"type":"string","format":"uuid","description":"Unique identifier for the API key."},"lastUsedAt":{"type":["integer","null"],"format":"int64","description":"When the API key was last used for authentication."},"name":{"type":"string","description":"A user-assigned label for this key."},"updatedAt":{"type":"integer","format":"int64","description":"When the API key metadata was last updated."}}},"UserDataExportInclude":{"type":"object","description":"Specifies which entity types and individual items to include in the export.","properties":{"apiTrackers":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ExportTrackableSelection"}]},"certificateTemplates":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ExportSelection"}]},"contentSecurityPolicies":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ExportSelection"}]},"pageTrackers":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ExportTrackableSelection"}]},"privateKeys":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ExportSelection"}]},"responders":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ExportTrackableSelection"}]},"scripts":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ExportSelection"}]},"secrets":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ExportSelection"}]},"settings":{"type":"boolean"},"tags":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ExportSelection"}]}}},"UserDataExportParams":{"type":"object","description":"Parameters for the export request, specifying which entities to include.","required":["include"],"properties":{"include":{"$ref":"#/components/schemas/UserDataExportInclude"},"secretsPassphrase":{"type":["string","null"],"description":"Optional passphrase for encrypting secret values in the export.\nIf provided, secret values are decrypted with the server key and re-encrypted\nwith a passphrase-derived key. If omitted, only secret names are exported."}},"example":{"include":{"tags":{"type":"all"},"secrets":{"type":"all"}}}},"UserDataImportFile":{"type":"object","description":"The expected import file structure.","required":["version","exportedAt","data"],"properties":{"data":{"$ref":"#/components/schemas/UserDataImportFileData"},"exportedAt":{"type":"integer","format":"int64"},"secretsEncryption":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SecretsEncryptionMeta","description":"Encryption metadata for secret values (present when values are included)."}]},"version":{"type":"integer","format":"int32","minimum":0}}},"UserDataImportFileData":{"type":"object","description":"Data section of the import file.","properties":{"apiTrackers":{"type":"array","items":{"$ref":"#/components/schemas/ExportedTracker"}},"certificateTemplates":{"type":"array","items":{"$ref":"#/components/schemas/CertificateTemplate"}},"contentSecurityPolicies":{"type":"array","items":{"$ref":"#/components/schemas/ContentSecurityPolicy"}},"pageTrackers":{"type":"array","items":{"$ref":"#/components/schemas/ExportedTracker"}},"privateKeys":{"type":"array","items":{"$ref":"#/components/schemas/ExportedPrivateKey"}},"responders":{"type":"array","items":{"$ref":"#/components/schemas/ExportedResponder"}},"scripts":{"type":"array","items":{"$ref":"#/components/schemas/ImportedScript"}},"secrets":{"type":"array","items":{"$ref":"#/components/schemas/DataFileSecret"}},"settings":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/UserSettings"}]},"tags":{"type":"array","items":{"$ref":"#/components/schemas/UserTag"}}}},"UserDataImportParams":{"type":"object","description":"Parameters for the import execution request.","required":["data","mode"],"properties":{"applyDeletions":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ApplyDeletionSelections","description":"IDs of entities to delete in Apply mode (keyed by entity type)."}]},"data":{"$ref":"#/components/schemas/UserDataImportFile"},"mode":{"$ref":"#/components/schemas/ImportMode"},"secretsPassphrase":{"type":["string","null"],"description":"Passphrase to decrypt secret values from the import file.\nRequired when the file contains encrypted secret values."},"selections":{"$ref":"#/components/schemas/ImportSelections"}},"example":{"data":{"version":1,"exportedAt":1700000000,"data":{}},"mode":"merge","selections":{}}},"UserDataImportPreviewParams":{"type":"object","description":"Parameters for the preview request.","required":["data","mode"],"properties":{"data":{"$ref":"#/components/schemas/UserDataImportFile"},"mode":{"$ref":"#/components/schemas/ImportMode"}},"example":{"data":{"version":1,"exportedAt":1700000000,"data":{}},"mode":"merge"}},"UserNotificationDestination":{"type":"object","description":"Domain representation of a row in `user_notification_destinations`. Mirrors every column\non the table; secret fields are kept off the wire via `#[serde(skip)]`. Computed flags\n(`is_verified`, `is_unsubscribed`, `verification_pending`) are exposed as inherent methods\nrather than stored fields so consumers always see the right answer for the current `now`.","required":["id","kind","address","createdAt","updatedAt"],"properties":{"address":{"type":"string","description":"The channel-native handle. For email destinations this is the lowercased address."},"createdAt":{"type":"string","format":"date-time"},"id":{"type":"string","format":"uuid"},"kind":{"$ref":"#/components/schemas/NotificationChannelKind"},"unsubscribedAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"verificationExpiresAt":{"type":["string","null"],"format":"date-time"},"verificationSentAt":{"type":["string","null"],"format":"date-time"},"verifiedAt":{"type":["string","null"],"format":"date-time"}}},"UserScript":{"type":"object","description":"Represents a user-defined script for reuse across responders and trackers.","required":["id","name","scriptType","content","createdAt","updatedAt"],"properties":{"content":{"type":"string","description":"The script content (the actual code)."},"createdAt":{"type":"integer","format":"int64","description":"When the script was first created."},"id":{"type":"string","format":"uuid","description":"Unique identifier for the script."},"name":{"type":"string","description":"The script name (used to reference it in the UI)."},"scriptType":{"$ref":"#/components/schemas/UserScriptType","description":"The type of script, determining compatible contexts."},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"},"description":"Tags assigned to this script."},"updatedAt":{"type":"integer","format":"int64","description":"When the script content was last updated."}}},"UserScriptType":{"type":"string","description":"Represents the type of user script, determining where it can be used.","enum":["responder","api_configurator","api_extractor","page_extractor","universal"]},"UserSecret":{"type":"object","description":"Represents a user secret (key-value pair stored encrypted at rest).\nThe value is never returned to clients after creation.","required":["id","name","createdAt","updatedAt"],"properties":{"createdAt":{"type":"integer","format":"int64","description":"When the secret was first created."},"id":{"type":"string","format":"uuid","description":"Unique identifier for the secret."},"name":{"type":"string","description":"The secret name (used to reference it in scripts and templates)."},"tags":{"type":"array","items":{"$ref":"#/components/schemas/EntityTag"},"description":"Tags assigned to this secret."},"updatedAt":{"type":"integer","format":"int64","description":"When the secret value was last updated."}}},"UserSettings":{"type":"object","description":"User preferences stored as key-value pairs.","additionalProperties":{},"propertyNames":{"type":"string"},"example":{"common.uiTheme":"dark","common.sidebarCollapsed":{"nav":false,"sections":[]}}},"UserSettingsSetter":{"type":"object","description":"Partial update of user settings. Keys map to new values, or null to delete the setting.","additionalProperties":{},"propertyNames":{"type":"string"},"example":{"common.uiTheme":"dark"}},"UserSubscription":{"type":"object","description":"The subscription status of a user.","required":["tier","startedAt"],"properties":{"endsAt":{"type":["integer","null"],"format":"int64"},"startedAt":{"type":"integer","format":"int64"},"tier":{"$ref":"#/components/schemas/SubscriptionTier"},"trialEndsAt":{"type":["integer","null"],"format":"int64"},"trialStartedAt":{"type":["integer","null"],"format":"int64"}}},"UserTag":{"type":"object","description":"A user-managed tag with a name and display color.","required":["id","name","color","createdAt","updatedAt"],"properties":{"color":{"type":"string"},"createdAt":{"type":"integer","format":"int64"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"updatedAt":{"type":"integer","format":"int64"}}},"Version":{"type":"integer","description":"X.509 certificate version (1, 2, or 3).","enum":[1,2,3]}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"JWT token obtained from the authentication service. Pass as `Authorization: Bearer <token>`."}}},"security":[{"bearerAuth":[]}],"tags":[{"name":"webhooks","description":"Create HTTP responders that capture and replay incoming requests."},{"name":"certificates","description":"Generate X.509 certificate templates and manage private keys."},{"name":"web_security","description":"Build, parse, and serialize Content Security Policy headers."},{"name":"tags","description":"Organize resources with colored tags."},{"name":"secrets","description":"Store encrypted secrets for use in responder and tracker scripts."},{"name":"scripts","description":"Manage reusable JavaScript scripts for responders and trackers."},{"name":"settings","description":"Read and update user preferences."},{"name":"data","description":"Export and import user data."},{"name":"status","description":"Application status and health."},{"name":"users","description":"User registration, lookup, and subscription management."},{"name":"scheduler","description":"Schedule parsing utilities."},{"name":"search","description":"Full-text search across user resources."},{"name":"messages","description":"Send messages and notifications."},{"name":"web_scraping","description":"Track changes to web pages and API endpoints."},{"name":"api_keys","description":"Create and manage API keys for programmatic access."},{"name":"notifications","description":"Public endpoints for managing notification delivery."}],"externalDocs":{"url":"https://secutils.dev/docs","description":"Secutils.dev documentation"}}