use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Dimensions {
pub width: u32,
pub height: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RegisterRequest {
pub email: String,
pub password: String,
pub name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RegisterResponse {
pub user_id: String,
pub email: String,
pub api_key: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TokenRequest {
pub email: String,
pub password: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TokenResponse {
pub access_token: String,
pub refresh_token: String,
pub expires_at: String,
pub refresh_expires_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RefreshRequest {
pub refresh_token: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RefreshResponse {
pub access_token: String,
pub refresh_token: String,
pub expires_at: String,
pub refresh_expires_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct WebScreenshotOptions {
pub url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub element: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dimensions: Option<Dimensions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub full_page: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub paper_size: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub block_ads: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub accept_cookies: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bypass_cache: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stealth: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub proxy_location: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub webhook_url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct MobileScreenshotOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub app_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bundle_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub platform: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_store_listing: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub device_emulation: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub webhook_url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct HtmlScreenshotOptions {
pub html: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub css: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub paper_size: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct EnqueueResponse {
pub job_id: String,
pub status: String,
pub status_url: Option<String>,
pub estimated_seconds: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct JobStatusResponse {
pub job_id: String,
pub status: String,
pub progress: Option<u32>,
pub error: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct JobResult {
pub job_id: String,
pub job_type: Option<String>,
pub screenshots: Vec<Screenshot>,
pub metadata: Metadata,
pub completed_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Screenshot {
pub url: String,
pub format: String,
pub width: u32,
pub height: u32,
pub selector: Option<String>,
pub captured_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Metadata {
pub page_title: Option<String>,
pub ai_selector_used: bool,
pub raw_ai_selector: Option<String>,
pub ai_confidence: Option<f64>,
pub ai_model: Option<String>,
pub ai_selector_failed: Option<bool>,
pub ai_fallback_used: bool,
pub processing_ms: u32,
pub from_cache: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Plan {
pub id: String,
pub name: String,
pub price_monthly: f64,
pub screenshots_per_month: u64,
pub requests_per_minute: u32,
pub features: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CurrentPlan {
pub plan: Plan,
pub screenshots_used: u64,
pub screenshots_limit: u64,
pub period_start: String,
pub period_end: String,
pub status: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BillingUsage {
pub screenshots_used: u64,
pub screenshots_limit: u64,
pub period_start: String,
pub period_end: String,
pub daily: Vec<DailyUsage>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DailyUsage {
pub date: String,
pub count: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UpgradeRequest {
pub plan_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UpgradeResponse {
pub success: bool,
pub redirect_url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VerifyResponse {
pub success: bool,
pub plan: Option<Plan>,
pub message: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CancelResponse {
pub success: bool,
pub message: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Workspace {
pub id: String,
pub name: String,
pub owner_id: String,
pub member_count: u32,
pub created_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WorkspaceDetail {
pub id: String,
pub name: String,
pub owner_id: String,
pub members: Vec<WorkspaceMember>,
pub created_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WorkspaceMember {
pub user_id: String,
pub email: String,
pub name: Option<String>,
pub role: String,
pub joined_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateWorkspaceRequest {
pub name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct InviteRequest {
pub email: String,
pub role: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateRoleRequest {
pub role: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WorkspaceActionResponse {
pub success: bool,
pub message: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AppMonitor {
pub id: String,
pub app_id: String,
pub platform: String,
pub label: String,
pub schedule: String,
pub diff_threshold: f64,
pub webhook_url: Option<String>,
pub active: bool,
pub last_version: Option<String>,
pub last_checked_at: Option<String>,
pub created_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateMonitorRequest {
pub app_id: String,
pub platform: String,
pub schedule: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub webhook_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub diff_threshold: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub label: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MonitorHistory {
pub id: String,
pub job_id: String,
pub status: String,
pub screenshots: Option<Vec<Screenshot>>,
pub captured_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ZapierSubscribeRequest {
pub trigger_event: String,
pub target_url: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ZapierSubscribeResponse {
pub id: String,
pub event: String,
pub target_url: String,
pub created_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ZapierTriggerSample(pub serde_json::Value);
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ZapierUnsubscribeResponse {
pub success: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HealthResponse {
pub status: String,
pub version: Option<String>,
pub uptime: Option<f64>,
}