{"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 all private keys for the authenticated user.","operationId":"private_keys_list","responses":{"200":{"description":"List of private keys.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/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 all certificate templates for the authenticated user.","operationId":"certificate_templates_list","responses":{"200":{"description":"List of certificate templates.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/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/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/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/scripts":{"get":{"tags":["scripts"],"summary":"Lists all scripts for the authenticated user, 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"}]}}],"responses":{"200":{"description":"List of user scripts.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/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 all secrets for the authenticated user (metadata only, no values).","operationId":"user_secrets_list","responses":{"200":{"description":"List of user secrets.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/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 all tags for the authenticated user.","operationId":"user_tags_list","responses":{"200":{"description":"List of user tags.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/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/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."}}}},"/api/web_scraping/api_trackers":{"get":{"tags":["web_scraping"],"summary":"Lists all API trackers for the authenticated user.","operationId":"api_trackers_list","responses":{"200":{"description":"List of API trackers.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/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 all page trackers for the authenticated user.","operationId":"page_trackers_list","responses":{"200":{"description":"List of page trackers.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/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 all content security policies for the authenticated user.","operationId":"csp_list","responses":{"200":{"description":"List of content security policies.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/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 all responders for the authenticated user.","operationId":"responders_list","responses":{"200":{"description":"List of responders.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/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":{"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"}}},"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"}}},"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"]},"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"}},"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"}},"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"]},"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."},"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","required":["value"],"properties":{"tagIds":{"type":["array","null"],"items":{"type":"string","format":"uuid"}},"value":{"type":"string"}},"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"],"properties":{"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}}},"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"}},"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":false}},"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."}],"externalDocs":{"url":"https://secutils.dev/docs","description":"Secutils.dev documentation"}}