@sendmailos/sdk 1.2.2 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/errors.ts","../src/resources/emails.ts","../src/resources/subscribers.ts","../src/resources/campaigns.ts","../src/resources/domains.ts","../src/resources/organization.ts","../src/resources/workspaces.ts","../src/resources/workflows.ts","../src/resources/webhooks.ts","../src/client.ts","../src/pixel.ts","../src/utils/webhook.ts"],"names":["crypto"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Custom error classes for SendMailOS SDK\n */\n\nexport class SendMailOSError extends Error {\n public readonly code: string;\n public readonly statusCode: number;\n public readonly retryAfter?: number;\n\n constructor(\n message: string,\n code: string,\n statusCode: number,\n retryAfter?: number\n ) {\n super(message);\n this.name = 'SendMailOSError';\n this.code = code;\n this.statusCode = statusCode;\n this.retryAfter = retryAfter;\n \n // Maintains proper stack trace for where error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, SendMailOSError);\n }\n }\n\n /** Whether this error is retryable (rate limit or server error) */\n get isRetryable(): boolean {\n return this.statusCode === 429 || this.statusCode >= 500;\n }\n}\n\nexport class AuthenticationError extends SendMailOSError {\n constructor(message: string = 'Invalid API key') {\n super(message, 'UNAUTHORIZED', 401);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class ValidationError extends SendMailOSError {\n constructor(message: string) {\n super(message, 'VALIDATION_ERROR', 400);\n this.name = 'ValidationError';\n }\n}\n\nexport class RateLimitError extends SendMailOSError {\n constructor(message: string, retryAfter: number) {\n super(message, 'RATE_LIMITED', 429, retryAfter);\n this.name = 'RateLimitError';\n }\n}\n\nexport class NotFoundError extends SendMailOSError {\n constructor(message: string) {\n super(message, 'NOT_FOUND', 404);\n this.name = 'NotFoundError';\n }\n}\n","import type { SendEmailRequest, SendEmailResponse } from '../types';\n\n/**\n * Emails resource for sending transactional emails\n */\nexport class EmailsResource {\n constructor(\n private request: <T>(endpoint: string, options?: RequestInit) => Promise<T>\n ) {}\n\n /**\n * Send a transactional email\n *\n * @example\n * ```ts\n * // Business account (single-tenant)\n * const result = await client.emails.send({\n * to: 'user@example.com',\n * fromName: 'Your Company',\n * fromEmail: 'hello@yourcompany.com',\n * subject: 'Welcome!',\n * html: '<h1>Hello!</h1>'\n * });\n *\n * // Agency account (multi-tenant) - identify client by domain\n * const result = await agencyClient.emails.send({\n * to: 'customer@example.com',\n * fromName: 'Pizza Palace',\n * fromEmail: 'hello@pizzapalace.com',\n * subject: 'Your order is ready!',\n * html: '<h1>Order Ready!</h1>',\n * domain: 'pizzapalace.com' // Required for agency accounts\n * });\n * ```\n */\n async send(params: SendEmailRequest): Promise<SendEmailResponse> {\n return this.request<SendEmailResponse>('/send', {\n method: 'POST',\n body: JSON.stringify({\n to: params.to,\n subject: params.subject,\n html: params.html,\n templateId: params.templateId,\n from_name: params.fromName,\n from_email: params.fromEmail,\n variables: params.variables,\n type: params.type || 'transactional',\n workspace_id: params.workspaceId,\n domain: params.domain,\n }),\n });\n }\n\n /**\n * Send email using a template\n *\n * @example\n * ```ts\n * const result = await client.emails.sendTemplate({\n * to: 'user@example.com',\n * templateId: 'tmpl_welcome',\n * variables: { firstName: 'John' }\n * });\n * ```\n */\n async sendTemplate(params: {\n to: string;\n templateId: string;\n fromName?: string;\n fromEmail?: string;\n subject?: string;\n variables?: Record<string, unknown>;\n /** Workspace ID (for agency accounts) */\n workspaceId?: string;\n /** Client domain (for agency accounts) */\n domain?: string;\n }): Promise<SendEmailResponse> {\n return this.send({\n to: params.to,\n subject: params.subject || '',\n templateId: params.templateId,\n fromName: params.fromName,\n fromEmail: params.fromEmail,\n variables: params.variables,\n type: 'transactional',\n workspaceId: params.workspaceId,\n domain: params.domain,\n });\n }\n}\n","import type {\n Subscriber,\n CreateSubscriberRequest,\n CreateSubscriberResponse,\n ListSubscribersRequest,\n ListSubscribersResponse,\n} from '../types';\n\n/**\n * Subscribers resource for managing email contacts\n */\nexport class SubscribersResource {\n constructor(\n private request: <T>(endpoint: string, options?: RequestInit) => Promise<T>\n ) {}\n\n /**\n * Create or update a subscriber (upsert)\n *\n * @example\n * ```ts\n * // Business account\n * const { subscriber } = await client.subscribers.create({\n * email: 'user@example.com',\n * firstName: 'John',\n * tags: ['newsletter', 'premium']\n * });\n *\n * // Agency account - subscriber tracked to client domain\n * const { subscriber } = await agencyClient.subscribers.create({\n * email: 'customer@example.com',\n * firstName: 'Jane',\n * domain: 'pizzapalace.com', // Required for agency accounts\n * tags: ['loyalty-member']\n * });\n * ```\n */\n async create(params: CreateSubscriberRequest): Promise<CreateSubscriberResponse> {\n return this.request<CreateSubscriberResponse>('/subscribers', {\n method: 'POST',\n body: JSON.stringify({\n email: params.email,\n first_name: params.firstName,\n last_name: params.lastName,\n tags: params.tags,\n domain_id: params.domainId,\n workspace_id: params.workspaceId,\n domain: params.domain, // Alternative to workspace_id\n }),\n });\n }\n\n /**\n * List all subscribers with pagination\n * \n * @example\n * ```ts\n * const { subscribers, total } = await client.subscribers.list({\n * limit: 50,\n * offset: 0\n * });\n * ```\n */\n async list(params: ListSubscribersRequest = {}): Promise<ListSubscribersResponse> {\n const searchParams = new URLSearchParams();\n if (params.limit) searchParams.set('limit', String(params.limit));\n if (params.offset) searchParams.set('offset', String(params.offset));\n if (params.workspaceId) searchParams.set('workspace_id', params.workspaceId);\n if (params.domain) searchParams.set('domain', params.domain); // Alternative to workspace_id\n\n const query = searchParams.toString();\n const endpoint = query ? `/subscribers?${query}` : '/subscribers';\n\n return this.request<ListSubscribersResponse>(endpoint, {\n method: 'GET',\n });\n }\n\n /**\n * Get a single subscriber by ID\n */\n async get(subscriberId: string): Promise<{ success: boolean; subscriber: Subscriber }> {\n return this.request(`/subscribers/${subscriberId}`, {\n method: 'GET',\n });\n }\n\n /**\n * Update a subscriber by ID\n */\n async update(\n subscriberId: string,\n params: Partial<CreateSubscriberRequest>\n ): Promise<CreateSubscriberResponse> {\n return this.request<CreateSubscriberResponse>(`/subscribers/${subscriberId}`, {\n method: 'PATCH',\n body: JSON.stringify({\n first_name: params.firstName,\n last_name: params.lastName,\n tags: params.tags,\n }),\n });\n }\n\n /**\n * Update a subscriber by email address\n */\n async updateByEmail(\n email: string,\n params: Partial<Omit<CreateSubscriberRequest, 'email'>>\n ): Promise<CreateSubscriberResponse> {\n // Upsert via create endpoint\n return this.create({\n email,\n ...params,\n });\n }\n\n /**\n * Delete/unsubscribe a subscriber\n */\n async delete(subscriberId: string): Promise<{ success: boolean }> {\n return this.request(`/subscribers/${subscriberId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Add tags to a subscriber\n */\n async addTags(subscriberId: string, tags: string[]): Promise<CreateSubscriberResponse> {\n return this.request<CreateSubscriberResponse>(`/subscribers/${subscriberId}/tags`, {\n method: 'POST',\n body: JSON.stringify({ tags }),\n });\n }\n\n /**\n * Remove tags from a subscriber\n */\n async removeTags(subscriberId: string, tags: string[]): Promise<CreateSubscriberResponse> {\n return this.request<CreateSubscriberResponse>(`/subscribers/${subscriberId}/tags`, {\n method: 'DELETE',\n body: JSON.stringify({ tags }),\n });\n }\n}\n","import type { SendCampaignRequest, SendCampaignResponse } from '../types';\n\n/**\n * Campaigns resource for bulk email sending\n */\nexport class CampaignsResource {\n constructor(\n private request: <T>(endpoint: string, options?: RequestInit) => Promise<T>\n ) {}\n\n /**\n * Send a campaign to subscribers\n *\n * @example\n * ```ts\n * // Business account\n * const result = await client.campaigns.send({\n * name: 'January Newsletter',\n * subject: 'What\\'s new this month',\n * fromName: 'Your Company',\n * fromEmail: 'news@yourcompany.com',\n * html: '<h1>Hello {{first_name}}!</h1>',\n * tags: ['newsletter', 'active']\n * });\n *\n * // Agency account - send to specific client's subscribers\n * const result = await agencyClient.campaigns.send({\n * name: 'Pizza Promo',\n * subject: 'New menu items!',\n * fromName: 'Pizza Palace',\n * fromEmail: 'promo@pizzapalace.com',\n * html: '<h1>Check out our new menu!</h1>',\n * domain: 'pizzapalace.com', // Filter to this client's subscribers\n * sourceDomains: ['pizzapalace.com'] // Only subscribers who signed up on this domain\n * });\n * ```\n */\n async send(params: SendCampaignRequest): Promise<SendCampaignResponse> {\n return this.request<SendCampaignResponse>('/campaigns/send', {\n method: 'POST',\n body: JSON.stringify({\n name: params.name,\n subject: params.subject,\n from_name: params.fromName,\n from_email: params.fromEmail,\n html: params.html,\n templateId: params.templateId,\n tags: params.tags,\n variables: params.variables,\n workspace_id: params.workspaceId,\n domain: params.domain,\n sourceDomains: params.sourceDomains,\n }),\n });\n }\n\n /**\n * Send campaign using a saved template\n */\n async sendTemplate(params: {\n name?: string;\n templateId: string;\n subject: string;\n fromName: string;\n fromEmail: string;\n tags?: string[];\n variables?: Record<string, unknown>;\n /** Workspace ID (for agency accounts) */\n workspaceId?: string;\n /** Client domain (for agency accounts) */\n domain?: string;\n /** Filter by source domains */\n sourceDomains?: string[];\n }): Promise<SendCampaignResponse> {\n return this.send({\n name: params.name,\n subject: params.subject,\n fromName: params.fromName,\n fromEmail: params.fromEmail,\n templateId: params.templateId,\n tags: params.tags,\n variables: params.variables,\n workspaceId: params.workspaceId,\n domain: params.domain,\n sourceDomains: params.sourceDomains,\n });\n }\n}\n","import type {\n Domain,\n CreateDomainRequest,\n CreateDomainResponse,\n ListDomainsResponse,\n} from '../types';\n\n/**\n * Domains resource for managing sending domains\n */\nexport class DomainsResource {\n constructor(\n private request: <T>(endpoint: string, options?: RequestInit) => Promise<T>\n ) {}\n\n /**\n * Add a new sending domain\n * Returns DKIM tokens and DNS records for verification\n * \n * @example\n * ```ts\n * const { domain } = await client.domains.create({\n * domain: 'yourcompany.com'\n * });\n * \n * console.log('Add these DNS records:', domain.dnsRecords);\n * ```\n */\n async create(params: CreateDomainRequest): Promise<CreateDomainResponse> {\n return this.request<CreateDomainResponse>('/domains', {\n method: 'POST',\n body: JSON.stringify({\n domain: params.domain,\n }),\n });\n }\n\n /**\n * List all domains for the organization\n */\n async list(): Promise<ListDomainsResponse> {\n return this.request<ListDomainsResponse>('/domains', {\n method: 'GET',\n });\n }\n\n /**\n * Get a single domain by ID\n */\n async get(domainId: string): Promise<{ success: boolean; domain: Domain }> {\n return this.request(`/domains/${domainId}`, {\n method: 'GET',\n });\n }\n\n /**\n * Verify a domain (trigger DNS check)\n */\n async verify(domainId: string): Promise<{ success: boolean; domain: Domain }> {\n return this.request(`/domains/${domainId}/verify`, {\n method: 'POST',\n });\n }\n\n /**\n * Delete a domain\n */\n async delete(domainId: string): Promise<{ success: boolean }> {\n return this.request(`/domains/${domainId}`, {\n method: 'DELETE',\n });\n }\n}\n","/**\n * Organization management resource\n */\n\nexport type OrganizationType = 'business' | 'agency';\n\nexport type Industry =\n | 'hotels' | 'restaurants' | 'gyms' | 'travel_agencies' | 'real_estate'\n | 'schools' | 'ecommerce' | 'dentists' | 'car_dealerships' | 'events'\n | 'beauty_salons' | 'law_firms' | 'nonprofits' | 'saas' | 'recruitment'\n | 'insurance' | 'online_courses' | 'municipalities' | 'personal_trainers'\n | 'influencers' | 'doctors_clinics' | 'nightclubs' | 'coworking'\n | 'wedding_planners' | 'art_galleries' | 'car_rentals' | 'podcasters'\n | 'consultants' | 'bakeries' | 'veterinarians' | 'airbnb_hosts'\n | 'accountants' | 'developers' | 'musicians' | 'spas' | 'bookstores'\n | 'cleaning_services' | 'churches' | 'graphic_designers' | 'coffee_shops'\n | 'florists' | 'political' | 'libraries' | 'taxis_limos' | 'home_inspectors'\n | 'photographers' | 'universities' | 'fashion' | 'nutritionists' | 'startups'\n | 'other';\n\nexport interface Organization {\n id: string;\n name: string;\n org_type: OrganizationType;\n industries: Industry[];\n onboarding_completed: boolean;\n onboarding_step: string;\n created_at: string;\n}\n\nexport interface UpdateOrganizationRequest {\n name?: string;\n org_type?: OrganizationType;\n industries?: Industry[];\n onboarding_completed?: boolean;\n onboarding_step?: string;\n}\n\ninterface OrganizationResponse {\n success: boolean;\n organization: Organization;\n}\n\nexport class OrganizationResource {\n constructor(\n private request: <T>(endpoint: string, options?: RequestInit) => Promise<T>\n ) {}\n\n /**\n * Get current organization details\n */\n async get(): Promise<Organization> {\n const response = await this.request<OrganizationResponse>('/organization', {\n method: 'GET',\n });\n return response.organization;\n }\n\n /**\n * Update organization settings\n */\n async update(updates: UpdateOrganizationRequest): Promise<Organization> {\n const response = await this.request<OrganizationResponse>('/organization', {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n return response.organization;\n }\n\n /**\n * Set organization industries (during onboarding)\n *\n * @example\n * ```ts\n * await client.organization.setIndustries(['ecommerce', 'saas']);\n * ```\n */\n async setIndustries(industries: Industry[]): Promise<Organization> {\n return this.update({ industries });\n }\n\n /**\n * Convert to agency account (enables workspaces)\n *\n * @example\n * ```ts\n * await client.organization.convertToAgency();\n * // Now you can create client workspaces\n * await client.workspaces.create({ name: 'Client A', industry: 'ecommerce' });\n * ```\n */\n async convertToAgency(): Promise<Organization> {\n return this.update({ org_type: 'agency' });\n }\n\n /**\n * Complete onboarding\n */\n async completeOnboarding(): Promise<Organization> {\n return this.update({ onboarding_completed: true });\n }\n}\n\n/**\n * All available industries with human-readable labels\n */\nexport const INDUSTRIES: Record<Industry, string> = {\n hotels: 'Hotels & Hospitality',\n restaurants: 'Restaurants & Food Service',\n gyms: 'Gyms & Fitness',\n travel_agencies: 'Travel Agencies',\n real_estate: 'Real Estate',\n schools: 'Schools & Education',\n ecommerce: 'E-commerce',\n dentists: 'Dentists',\n car_dealerships: 'Car Dealerships',\n events: 'Events & Entertainment',\n beauty_salons: 'Beauty Salons',\n law_firms: 'Law Firms',\n nonprofits: 'Non-Profits',\n saas: 'SaaS & Software',\n recruitment: 'Recruitment & HR',\n insurance: 'Insurance',\n online_courses: 'Online Courses',\n municipalities: 'Government & Municipalities',\n personal_trainers: 'Personal Trainers',\n influencers: 'Influencers & Creators',\n doctors_clinics: 'Doctors & Clinics',\n nightclubs: 'Nightclubs & Bars',\n coworking: 'Coworking Spaces',\n wedding_planners: 'Wedding Planners',\n art_galleries: 'Art Galleries',\n car_rentals: 'Car Rentals',\n podcasters: 'Podcasters',\n consultants: 'Consultants',\n bakeries: 'Bakeries',\n veterinarians: 'Veterinarians',\n airbnb_hosts: 'Airbnb Hosts',\n accountants: 'Accountants',\n developers: 'Developers',\n musicians: 'Musicians & Bands',\n spas: 'Spas & Wellness',\n bookstores: 'Bookstores',\n cleaning_services: 'Cleaning Services',\n churches: 'Churches & Religious',\n graphic_designers: 'Graphic Designers',\n coffee_shops: 'Coffee Shops',\n florists: 'Florists',\n political: 'Political Campaigns',\n libraries: 'Libraries',\n taxis_limos: 'Taxis & Limos',\n home_inspectors: 'Home Inspectors',\n photographers: 'Photographers',\n universities: 'Universities',\n fashion: 'Fashion Brands',\n nutritionists: 'Nutritionists',\n startups: 'Startups',\n other: 'Other',\n};\n","/**\n * Workspace management resource (for agencies)\n */\n\nimport type { Industry } from './organization';\n\nexport interface Workspace {\n id: string;\n name: string;\n slug: string;\n industry: Industry | null;\n logo_url: string | null;\n website: string | null;\n is_active: boolean;\n client_email: string | null;\n client_can_view_reports: boolean;\n created_at: string;\n updated_at: string;\n stats?: WorkspaceStats;\n}\n\nexport interface WorkspaceStats {\n subscribers?: number;\n campaigns?: number;\n emails_30d?: number;\n total_subscribers?: number;\n active_subscribers?: number;\n total_campaigns?: number;\n sent_campaigns?: number;\n total_emails?: number;\n domains?: number;\n}\n\nexport interface CreateWorkspaceRequest {\n /** Client/workspace name */\n name: string;\n /** Industry for pre-built templates */\n industry?: Industry;\n /** Client website URL */\n website?: string;\n /** Logo URL */\n logo_url?: string;\n /** Client email for portal access */\n client_email?: string;\n /** Allow client to view reports */\n client_can_view_reports?: boolean;\n /** Import industry templates automatically */\n import_templates?: boolean;\n /** Custom settings */\n settings?: Record<string, unknown>;\n}\n\nexport interface ProvisionWorkspaceRequest {\n /** Client/workspace name */\n name: string;\n /** Client website URL - used for matching existing workspace */\n website?: string;\n /** Client email - used for matching existing workspace */\n client_email?: string;\n /** Industry for pre-built templates (used if creating new) */\n industry?: Industry;\n /** Logo URL */\n logo_url?: string;\n /** Allow client to view reports (default: true) */\n client_can_view_reports?: boolean;\n /** Import industry templates automatically (default: true) */\n import_templates?: boolean;\n /** Generate a workspace-scoped API key */\n generate_api_key?: boolean;\n /** Allowed origins for the generated API key */\n allowed_origins?: string[];\n /** Custom settings */\n settings?: Record<string, unknown>;\n}\n\nexport interface ProvisionWorkspaceResponse {\n workspace: Workspace;\n /** Whether this is a newly created workspace */\n is_new: boolean;\n /** Generated API key (only if generate_api_key was true) */\n api_key?: string;\n /** Human-readable message */\n message: string;\n}\n\nexport interface OnboardClientRequest {\n /** Client domain (e.g., \"pizzapalace.com\" or \"https://pizzapalace.com\") */\n domain: string;\n /** Client name (optional - derived from domain if not provided) */\n name?: string;\n /** Industry for templates (default: \"restaurants\") */\n industry?: Industry;\n /** Client email for notifications */\n client_email?: string;\n}\n\nexport interface OnboardClientResponse {\n /** Workspace token - USE THIS FOR ALL API CALLS */\n token: string;\n /** Workspace ID */\n workspace_id: string;\n /** Workspace name */\n workspace_name: string;\n /** Normalized domain */\n domain: string;\n /** Domain verification status */\n domain_status: string;\n /** DNS records to add for domain verification */\n dns_records: Array<{\n type: string;\n name: string;\n value: string;\n }>;\n /** Whether workspace was newly created */\n is_new: boolean;\n /** Human-readable message */\n message: string;\n}\n\nexport interface UpdateWorkspaceRequest {\n name?: string;\n industry?: Industry;\n website?: string;\n logo_url?: string;\n is_active?: boolean;\n client_email?: string;\n client_can_view_reports?: boolean;\n billing_enabled?: boolean;\n billing_email?: string;\n settings?: Record<string, unknown>;\n}\n\ninterface ListWorkspacesResponse {\n success: boolean;\n workspaces: Workspace[];\n total: number;\n}\n\ninterface WorkspaceResponse {\n success: boolean;\n workspace: Workspace;\n}\n\ninterface DeleteWorkspaceResponse {\n success: boolean;\n message: string;\n}\n\ninterface ProvisionResponse {\n success: boolean;\n workspace: Workspace;\n is_new: boolean;\n api_key?: string;\n message: string;\n}\n\nexport class WorkspacesResource {\n constructor(\n private request: <T>(endpoint: string, options?: RequestInit) => Promise<T>\n ) {}\n\n /**\n * List all workspaces (clients)\n * @note Only available for agency accounts\n *\n * @example\n * ```ts\n * const { workspaces } = await client.workspaces.list();\n * for (const ws of workspaces) {\n * console.log(`${ws.name}: ${ws.stats?.subscribers} subscribers`);\n * }\n * ```\n */\n async list(): Promise<{ workspaces: Workspace[]; total: number }> {\n const response = await this.request<ListWorkspacesResponse>('/workspaces', {\n method: 'GET',\n });\n return { workspaces: response.workspaces, total: response.total };\n }\n\n /**\n * Create a new workspace (client)\n * @note Only available for agency accounts\n *\n * @example\n * ```ts\n * const workspace = await client.workspaces.create({\n * name: 'Pizza Palace',\n * industry: 'restaurants',\n * import_templates: true // Auto-import restaurant templates\n * });\n * ```\n */\n async create(workspace: CreateWorkspaceRequest): Promise<Workspace> {\n const response = await this.request<WorkspaceResponse>('/workspaces', {\n method: 'POST',\n body: JSON.stringify(workspace),\n });\n return response.workspace;\n }\n\n /**\n * Get a workspace by ID with detailed stats\n *\n * @example\n * ```ts\n * const workspace = await client.workspaces.get('ws_123');\n * console.log('Active subscribers:', workspace.stats.active_subscribers);\n * ```\n */\n async get(workspaceId: string): Promise<Workspace> {\n const response = await this.request<WorkspaceResponse>(`/workspaces/${workspaceId}`, {\n method: 'GET',\n });\n return response.workspace;\n }\n\n /**\n * Update a workspace\n *\n * @example\n * ```ts\n * await client.workspaces.update('ws_123', {\n * name: 'Pizza Palace - Main Location',\n * client_can_view_reports: true\n * });\n * ```\n */\n async update(workspaceId: string, updates: UpdateWorkspaceRequest): Promise<Workspace> {\n const response = await this.request<WorkspaceResponse>(`/workspaces/${workspaceId}`, {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n return response.workspace;\n }\n\n /**\n * Delete a workspace\n * @warning This will delete all associated data (subscribers, campaigns, etc.)\n *\n * @example\n * ```ts\n * await client.workspaces.delete('ws_123');\n * ```\n */\n async delete(workspaceId: string): Promise<{ message: string }> {\n const response = await this.request<DeleteWorkspaceResponse>(`/workspaces/${workspaceId}`, {\n method: 'DELETE',\n });\n return { message: response.message };\n }\n\n /**\n * Activate a workspace\n */\n async activate(workspaceId: string): Promise<Workspace> {\n return this.update(workspaceId, { is_active: true });\n }\n\n /**\n * Deactivate a workspace\n */\n async deactivate(workspaceId: string): Promise<Workspace> {\n return this.update(workspaceId, { is_active: false });\n }\n\n /**\n * Invite client to view reports\n *\n * @example\n * ```ts\n * await client.workspaces.inviteClient('ws_123', 'owner@pizzapalace.com');\n * // Client receives email with portal access\n * ```\n */\n async inviteClient(workspaceId: string, email: string): Promise<Workspace> {\n return this.update(workspaceId, {\n client_email: email,\n client_can_view_reports: true,\n });\n }\n\n /**\n * Smart workspace provisioning - finds existing or creates new\n *\n * This is the recommended method for agency client onboarding.\n * It will:\n * 1. Search for existing workspace by website URL or client_email\n * 2. Return existing workspace if found\n * 3. Create new workspace with industry templates if not found\n * 4. Optionally generate a workspace-scoped API key\n *\n * @note Only available for agency accounts\n *\n * @example\n * ```ts\n * // Auto-provision workspace for a new client\n * const result = await client.workspaces.provision({\n * name: 'Pizza Palace',\n * website: 'https://pizzapalace.com',\n * client_email: 'owner@pizzapalace.com',\n * industry: 'restaurants',\n * generate_api_key: true\n * });\n *\n * if (result.is_new) {\n * console.log('Created new workspace:', result.workspace.id);\n * console.log('API Key:', result.api_key);\n * } else {\n * console.log('Found existing workspace:', result.workspace.id);\n * }\n * ```\n *\n * @example\n * ```ts\n * // Idempotent client setup - safe to call multiple times\n * const { workspace, is_new } = await client.workspaces.provision({\n * name: 'Client Name',\n * website: 'https://client.com',\n * industry: 'ecommerce'\n * });\n * // Always returns the same workspace for the same website\n * ```\n */\n async provision(request: ProvisionWorkspaceRequest): Promise<ProvisionWorkspaceResponse> {\n const response = await this.request<ProvisionResponse>('/workspaces/provision', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n return {\n workspace: response.workspace,\n is_new: response.is_new,\n api_key: response.api_key,\n message: response.message,\n };\n }\n\n /**\n * Alias for provision() - find or create workspace\n * @see provision\n */\n async findOrCreate(request: ProvisionWorkspaceRequest): Promise<ProvisionWorkspaceResponse> {\n return this.provision(request);\n }\n\n /**\n * Complete client onboarding in ONE call (Agency only)\n *\n * This is the simplest way to onboard a new client:\n * 1. Creates or finds workspace by domain\n * 2. Registers domain for email verification\n * 3. Generates workspace token\n * 4. Returns DNS records + token\n *\n * After this, use the returned `token` for all API calls.\n *\n * @example\n * ```ts\n * // Your SaaS onboards a new restaurant\n * const result = await agency.workspaces.onboard({\n * domain: 'pizzapalace.com',\n * industry: 'restaurants'\n * });\n *\n * // Save this token - it's all you need\n * saveToDatabase(restaurantId, result.token);\n *\n * // Show DNS records to restaurant owner\n * console.log('Add these DNS records:', result.dns_records);\n *\n * // Later, use the token directly\n * const restaurant = new SendMailOS(result.token);\n * await restaurant.emails.send({ ... });\n * ```\n */\n async onboard(request: OnboardClientRequest): Promise<OnboardClientResponse> {\n const response = await this.request<OnboardClientResponse & { success: boolean }>('/workspaces/onboard', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n return {\n token: response.token,\n workspace_id: response.workspace_id,\n workspace_name: response.workspace_name,\n domain: response.domain,\n domain_status: response.domain_status,\n dns_records: response.dns_records,\n is_new: response.is_new,\n message: response.message,\n };\n }\n}\n","import type {\n CreateWorkflowRequest,\n CreateWorkflowResponse,\n UpdateWorkflowRequest,\n UpdateWorkflowResponse,\n ListWorkflowsRequest,\n ListWorkflowsResponse,\n GetWorkflowResponse,\n TriggerWorkflowRequest,\n TriggerWorkflowResponse,\n WorkflowStatusResponse,\n} from '../types';\n\n/**\n * Workflows resource for managing email automation workflows\n */\nexport class WorkflowsResource {\n constructor(\n private request: <T>(endpoint: string, options?: RequestInit) => Promise<T>\n ) {}\n\n /**\n * Create a new workflow\n *\n * @example\n * ```ts\n * // Create workflow for a specific client (multi-brand)\n * const result = await platform.workflows.create({\n * name: 'Welcome Sequence',\n * domain: 'pizzapalace.com',\n * trigger: { type: 'subscriber_created' }\n * });\n *\n * // Create workflow (single brand)\n * const result = await client.workflows.create({\n * name: 'Onboarding Flow',\n * trigger: { type: 'api' }\n * });\n * ```\n */\n async create(params: CreateWorkflowRequest): Promise<CreateWorkflowResponse> {\n return this.request<CreateWorkflowResponse>('/workflows', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * List all workflows\n *\n * @example\n * ```ts\n * // List all workflows\n * const { workflows } = await client.workflows.list();\n *\n * // List workflows for a specific client (multi-brand)\n * const { workflows } = await platform.workflows.list({ domain: 'pizzapalace.com' });\n * ```\n */\n async list(params: ListWorkflowsRequest = {}): Promise<ListWorkflowsResponse> {\n const searchParams = new URLSearchParams();\n if (params.domain) searchParams.set('domain', params.domain);\n if (params.workspace_id) searchParams.set('workspace_id', params.workspace_id);\n\n const query = searchParams.toString();\n const endpoint = query ? `/workflows?${query}` : '/workflows';\n\n return this.request<ListWorkflowsResponse>(endpoint, {\n method: 'GET',\n });\n }\n\n /**\n * Get a workflow by ID (includes nodes and edges)\n *\n * @example\n * ```ts\n * const { workflow } = await client.workflows.get('workflow-uuid');\n * console.log(workflow.nodes); // The workflow steps\n * console.log(workflow.edges); // Connections between steps\n * ```\n */\n async get(workflowId: string): Promise<GetWorkflowResponse> {\n return this.request<GetWorkflowResponse>(`/workflows/${workflowId}`, {\n method: 'GET',\n });\n }\n\n /**\n * Update a workflow (name, nodes, edges, trigger)\n *\n * @example\n * ```ts\n * // Update workflow name\n * await client.workflows.update('workflow-uuid', { name: 'New Name' });\n *\n * // Update workflow steps\n * await client.workflows.update('workflow-uuid', {\n * nodes: [\n * { id: '1', type: 'trigger', data: { triggerType: 'api' } },\n * { id: '2', type: 'email', data: { templateId: 'tmpl_xxx', subject: 'Welcome!' } },\n * { id: '3', type: 'delay', data: { duration: 3, unit: 'days' } }\n * ],\n * edges: [\n * { id: 'e1', source: '1', target: '2' },\n * { id: 'e2', source: '2', target: '3' }\n * ]\n * });\n * ```\n */\n async update(workflowId: string, params: UpdateWorkflowRequest): Promise<UpdateWorkflowResponse> {\n return this.request<UpdateWorkflowResponse>(`/workflows/${workflowId}`, {\n method: 'PUT',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Delete a workflow\n */\n async delete(workflowId: string): Promise<{ success: boolean; message: string }> {\n return this.request(`/workflows/${workflowId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Activate a workflow (start accepting triggers)\n *\n * @example\n * ```ts\n * await client.workflows.activate('workflow-uuid');\n * // Workflow is now active and will process triggers\n * ```\n */\n async activate(workflowId: string): Promise<WorkflowStatusResponse> {\n return this.request<WorkflowStatusResponse>(`/workflows/${workflowId}/activate`, {\n method: 'POST',\n });\n }\n\n /**\n * Pause a workflow (stop accepting new triggers)\n *\n * @example\n * ```ts\n * await client.workflows.pause('workflow-uuid');\n * // Workflow is paused - existing executions continue, but no new ones start\n * ```\n */\n async pause(workflowId: string): Promise<WorkflowStatusResponse> {\n return this.request<WorkflowStatusResponse>(`/workflows/${workflowId}/pause`, {\n method: 'POST',\n });\n }\n\n /**\n * Trigger a workflow for a subscriber\n *\n * @example\n * ```ts\n * // Trigger when a customer signs up\n * const result = await platform.workflows.trigger('workflow-uuid', {\n * email: 'customer@example.com',\n * data: {\n * firstName: 'John',\n * restaurantName: 'Pizza Palace',\n * signupSource: 'website'\n * }\n * });\n *\n * console.log(result.execution_id); // Track this execution\n * ```\n */\n async trigger(workflowId: string, params: TriggerWorkflowRequest): Promise<TriggerWorkflowResponse> {\n return this.request<TriggerWorkflowResponse>(`/webhooks/${workflowId}`, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Send a custom event to resume waiting workflows\n *\n * Use this when you have workflows waiting for specific events (e.g., \"purchase_completed\").\n * All workflows waiting for this event for the given subscriber will resume.\n *\n * @example\n * ```ts\n * // When a customer completes a purchase\n * await platform.workflows.sendEvent({\n * event: 'purchase_completed',\n * email: 'customer@example.com',\n * data: { orderTotal: 45.99, orderId: 'ORD-123' }\n * });\n *\n * // Any workflow with a \"wait_for_event: purchase_completed\" node will resume\n * ```\n */\n async sendEvent(params: {\n event: string;\n email: string;\n data?: Record<string, unknown>;\n }): Promise<{ success: boolean; processed: number }> {\n return this.request('/events', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n}\n","import type {\n Webhook,\n CreateWebhookRequest,\n UpdateWebhookRequest,\n ListWebhooksResponse,\n GetWebhookResponse,\n TestWebhookResponse,\n} from '../types';\n\n/**\n * Webhooks resource for managing webhook endpoints\n */\nexport class WebhooksResource {\n constructor(\n private request: <T>(endpoint: string, options?: RequestInit) => Promise<T>\n ) {}\n\n /**\n * Create a new webhook endpoint\n *\n * @example\n * ```ts\n * const webhook = await client.webhooks.create({\n * url: 'https://yourserver.com/webhooks',\n * events: ['email.sent', 'email.delivered', 'email.opened'],\n * secret: 'your-secret-key' // Optional, auto-generated if not provided\n * });\n *\n * console.log('Webhook secret:', webhook.secret);\n * ```\n */\n async create(params: CreateWebhookRequest): Promise<{ success: boolean; webhook: Webhook }> {\n return this.request('/webhooks', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * List all webhooks\n */\n async list(): Promise<ListWebhooksResponse> {\n return this.request<ListWebhooksResponse>('/webhooks', {\n method: 'GET',\n });\n }\n\n /**\n * Get a webhook by ID with recent delivery history\n */\n async get(webhookId: string): Promise<GetWebhookResponse> {\n return this.request<GetWebhookResponse>(`/webhooks/${webhookId}`, {\n method: 'GET',\n });\n }\n\n /**\n * Update a webhook\n *\n * @example\n * ```ts\n * // Update webhook URL\n * await client.webhooks.update('webhook-id', {\n * url: 'https://newserver.com/webhooks'\n * });\n *\n * // Add new events\n * await client.webhooks.update('webhook-id', {\n * events: ['email.sent', 'email.delivered', 'email.bounced']\n * });\n *\n * // Disable webhook\n * await client.webhooks.update('webhook-id', { active: false });\n * ```\n */\n async update(webhookId: string, params: UpdateWebhookRequest): Promise<{ success: boolean; webhook: Webhook }> {\n return this.request(`/webhooks/${webhookId}`, {\n method: 'PATCH',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Delete a webhook\n */\n async delete(webhookId: string): Promise<{ success: boolean }> {\n return this.request(`/webhooks/${webhookId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Test a webhook by sending a test event\n *\n * @example\n * ```ts\n * const result = await client.webhooks.test('webhook-id');\n * if (result.test.sent) {\n * console.log(`Test delivered in ${result.test.responseTimeMs}ms`);\n * } else {\n * console.log('Test failed:', result.test.error);\n * }\n * ```\n */\n async test(webhookId: string): Promise<TestWebhookResponse> {\n return this.request<TestWebhookResponse>(`/webhooks/${webhookId}/test`, {\n method: 'POST',\n });\n }\n\n /**\n * Enable a webhook\n */\n async enable(webhookId: string): Promise<{ success: boolean; webhook: Webhook }> {\n return this.update(webhookId, { active: true });\n }\n\n /**\n * Disable a webhook\n */\n async disable(webhookId: string): Promise<{ success: boolean; webhook: Webhook }> {\n return this.update(webhookId, { active: false });\n }\n}\n","import type { SendMailOSOptions, ApiError } from './types';\nimport { SendMailOSError, AuthenticationError, RateLimitError } from './utils/errors';\nimport { EmailsResource } from './resources/emails';\nimport { SubscribersResource } from './resources/subscribers';\nimport { CampaignsResource } from './resources/campaigns';\nimport { DomainsResource } from './resources/domains';\nimport { OrganizationResource } from './resources/organization';\nimport { WorkspacesResource } from './resources/workspaces';\nimport { WorkflowsResource } from './resources/workflows';\nimport { WebhooksResource } from './resources/webhooks';\n\nconst DEFAULT_BASE_URL = 'https://api.sendmailos.com/api/v1';\nconst DEFAULT_TIMEOUT = 30000;\nconst SDK_VERSION = '1.2.0';\n\n/**\n * SendMailOS SDK Client\n * \n * @example\n * ```ts\n * import { SendMailOS } from '@sendmailos/sdk';\n * \n * const client = new SendMailOS('sk_live_your_api_key');\n * \n * // Send an email\n * await client.emails.send({\n * to: 'user@example.com',\n * subject: 'Hello!',\n * html: '<h1>Welcome!</h1>'\n * });\n * \n * // Add a subscriber\n * await client.subscribers.create({\n * email: 'user@example.com',\n * tags: ['newsletter']\n * });\n * ```\n */\nexport class SendMailOS {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly fetchFn: typeof fetch;\n\n /** Email sending operations */\n public readonly emails: EmailsResource;\n /** Subscriber management */\n public readonly subscribers: SubscribersResource;\n /** Campaign operations */\n public readonly campaigns: CampaignsResource;\n /** Domain management */\n public readonly domains: DomainsResource;\n /** Organization settings (industries, type) */\n public readonly organization: OrganizationResource;\n /** Workspace management (for agencies) */\n public readonly workspaces: WorkspacesResource;\n /** Workflow automation */\n public readonly workflows: WorkflowsResource;\n /** Webhook management */\n public readonly webhooks: WebhooksResource;\n\n constructor(apiKey: string, options: SendMailOSOptions = {}) {\n // Validate API key format\n if (!apiKey) {\n throw new Error('API key is required');\n }\n \n if (!apiKey.startsWith('sk_live_') && !apiKey.startsWith('sk_test_')) {\n throw new Error(\n 'Invalid API key format. Keys should start with \"sk_live_\" or \"sk_test_\"'\n );\n }\n\n this.apiKey = apiKey;\n this.baseUrl = options.baseUrl?.replace(/\\/$/, '') || DEFAULT_BASE_URL;\n this.timeout = options.timeout || DEFAULT_TIMEOUT;\n this.fetchFn = options.fetch || globalThis.fetch;\n\n // Ensure fetch is available\n if (!this.fetchFn) {\n throw new Error(\n 'fetch is not available. Please provide a fetch implementation or use Node.js 18+'\n );\n }\n\n // Initialize resources with bound request method\n const boundRequest = this.request.bind(this);\n this.emails = new EmailsResource(boundRequest);\n this.subscribers = new SubscribersResource(boundRequest);\n this.campaigns = new CampaignsResource(boundRequest);\n this.domains = new DomainsResource(boundRequest);\n this.organization = new OrganizationResource(boundRequest);\n this.workspaces = new WorkspacesResource(boundRequest);\n this.workflows = new WorkflowsResource(boundRequest);\n this.webhooks = new WebhooksResource(boundRequest);\n }\n\n /**\n * Make an authenticated request to the API\n */\n private async request<T>(endpoint: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n \n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await this.fetchFn(url, {\n ...options,\n signal: controller.signal,\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `sendmailos-sdk/${SDK_VERSION}`,\n 'X-SDK-Version': SDK_VERSION,\n ...options.headers,\n },\n });\n\n clearTimeout(timeoutId);\n\n // Handle rate limiting\n if (response.status === 429) {\n const retryAfter = parseInt(response.headers.get('Retry-After') || '60', 10);\n const errorData = await this.safeParseJson(response);\n throw new RateLimitError(\n errorData?.error || 'Rate limit exceeded',\n retryAfter\n );\n }\n\n // Handle authentication errors\n if (response.status === 401) {\n throw new AuthenticationError();\n }\n\n // Handle other errors\n if (!response.ok) {\n const errorData = await this.safeParseJson(response) as ApiError | null;\n throw new SendMailOSError(\n errorData?.error || `Request failed with status ${response.status}`,\n errorData?.code || 'UNKNOWN_ERROR',\n response.status\n );\n }\n\n return response.json() as Promise<T>;\n } catch (error) {\n clearTimeout(timeoutId);\n \n if (error instanceof SendMailOSError) {\n throw error;\n }\n \n if (error instanceof Error && error.name === 'AbortError') {\n throw new SendMailOSError('Request timeout', 'TIMEOUT', 408);\n }\n \n throw new SendMailOSError(\n error instanceof Error ? error.message : 'Unknown error',\n 'NETWORK_ERROR',\n 0\n );\n }\n }\n\n private async safeParseJson(response: Response): Promise<ApiError | null> {\n try {\n return await response.json();\n } catch {\n return null;\n }\n }\n\n /**\n * Check if the API key is valid (test mode only)\n */\n get isTestMode(): boolean {\n return this.apiKey.startsWith('sk_test_');\n }\n\n /**\n * Get the SDK version\n */\n static get version(): string {\n return SDK_VERSION;\n }\n}\n","export interface PixelConfig {\n /** Public API key (pk_live_... or pk_test_...) or legacy token */\n token: string;\n /** API endpoint for tracking events */\n endpoint?: string;\n /** Cookie name for anonymous ID storage */\n cookieName?: string;\n /** Enable debug logging */\n debug?: boolean;\n /** Respect Do Not Track browser setting (default: true) */\n respectDNT?: boolean;\n}\n\n/** Alias for PixelConfig for SDK consistency */\nexport type PixelOptions = PixelConfig;\n\nexport interface TrackProps {\n [key: string]: string | number | boolean | null | undefined | object;\n}\n\n/** Alias for TrackProps */\nexport type TrackEventProperties = TrackProps;\n\n/** Traits for identify calls */\nexport interface IdentifyTraits {\n first_name?: string;\n last_name?: string;\n [key: string]: string | number | boolean | null | undefined | object;\n}\n\n/** Dynamic rule for context detection */\ninterface PixelRule {\n match_type: 'exact' | 'contains' | 'regex';\n url_pattern: string;\n page_type: string;\n selectors?: Record<string, string>;\n}\n\nconst OPT_OUT_KEY = 'smp_opt_out';\nconst IDENTIFIED_EMAIL_KEY = 'smp_identified_email';\n\nexport class SendmailPixel {\n private config: PixelConfig;\n private anonymousId: string;\n private initialized: boolean = false;\n private rules: PixelRule[] = [];\n private identifiedEmail: string | null = null;\n\n constructor(config: PixelConfig) {\n this.config = {\n endpoint: 'https://sendmailos.com/api/pixel/track',\n cookieName: 'sm_anon_id',\n debug: false,\n respectDNT: true,\n ...config\n };\n this.anonymousId = this.getOrSetAnonymousId();\n this.identifiedEmail = this.getStoredEmail();\n }\n\n public init() {\n if (this.initialized) return;\n\n if (typeof window === 'undefined') {\n return; // Server-side safety\n }\n\n // Check for opt-out\n if (this.isOptedOut()) {\n this.log('Tracking disabled (user opted out)');\n return;\n }\n\n // Check for Do Not Track\n if (this.config.respectDNT && this.isDNTEnabled()) {\n this.log('Tracking disabled (Do Not Track enabled)');\n return;\n }\n\n this.initialized = true;\n\n // Check URL for subscriber ID from email clicks\n this.checkUrlForSubscriber();\n\n // 0. Load Dynamic Rules (Async)\n this.loadRules();\n\n // 1. Auto-track Page View\n this.pageView();\n\n // 2. Setup Form Auto-Detection\n this.setupFormListeners();\n\n // 3. Track History State Changes (SPA Support)\n this.setupHistoryListeners();\n\n // 4. Setup data attribute tracking\n this.setupDataAttributeTracking();\n\n this.log('Pixel initialized with Token:', this.config.token);\n }\n\n /**\n * Opt out of all tracking\n */\n public optOut(): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(OPT_OUT_KEY, 'true');\n }\n this.log('User opted out of tracking');\n }\n\n /**\n * Opt back in to tracking\n */\n public optIn(): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(OPT_OUT_KEY);\n }\n if (!this.initialized && typeof window !== 'undefined') {\n this.init();\n }\n this.log('User opted in to tracking');\n }\n\n /**\n * Check if user has opted out\n */\n public isOptedOut(): boolean {\n if (typeof localStorage === 'undefined') return false;\n return localStorage.getItem(OPT_OUT_KEY) === 'true';\n }\n\n /**\n * Reset identity (e.g., on logout)\n */\n public reset(): void {\n this.identifiedEmail = null;\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(IDENTIFIED_EMAIL_KEY);\n }\n // Generate new anonymous ID\n this.anonymousId = crypto.randomUUID();\n this.setCookie(this.config.cookieName!, this.anonymousId, 365);\n this.log('Identity reset');\n }\n\n /**\n * Get current visitor/anonymous ID\n */\n public getVisitorId(): string {\n return this.anonymousId;\n }\n\n /**\n * Get identified email address\n */\n public getIdentifiedEmail(): string | null {\n return this.identifiedEmail;\n }\n\n public track(eventName: string, properties: TrackProps = {}) {\n this.sendEvent('track', {\n event_name: eventName,\n properties\n });\n }\n\n public identify(email: string, traits: TrackProps = {}) {\n if (this.isOptedOut()) return;\n\n this.identifiedEmail = email;\n this.storeEmail(email);\n\n this.sendEvent('identify', {\n email,\n traits\n });\n }\n\n public pageView() {\n this.track('page_view', {\n path: window.location.pathname,\n title: document.title,\n referrer: document.referrer,\n url: window.location.href\n });\n }\n\n // --- INTERNAL HELPERS ---\n\n private getOrSetAnonymousId(): string {\n if (typeof document === 'undefined') return '';\n\n let id = this.getCookie(this.config.cookieName!);\n if (!id) {\n id = crypto.randomUUID();\n this.setCookie(this.config.cookieName!, id, 365);\n }\n return id;\n }\n\n private sendEvent(type: 'track' | 'identify', payload: any) {\n if (typeof window === 'undefined') return;\n\n // Auto-Enrichment (Smart Context)\n const smartContext = this.detectContext();\n\n const body = {\n type,\n token: this.config.token, // Send Token\n anonymous_id: this.anonymousId,\n url: window.location.href,\n timestamp: new Date().toISOString(),\n ...payload\n };\n\n // Capture UTMs on first touch -> sent via context in API\n // For simplicity, we just send context\n const context = {\n userAgent: navigator.userAgent,\n locale: navigator.language,\n screen: { width: window.screen.width, height: window.screen.height },\n search: window.location.search,\n title: document.title,\n referrer: document.referrer,\n ...smartContext // Merge smart context\n };\n\n const finalBody = { ...body, context };\n\n // Use Beacon API if available (better for page unload)\n if (navigator.sendBeacon && type === 'track') {\n const blob = new Blob([JSON.stringify(finalBody)], { type: 'application/json' });\n navigator.sendBeacon(this.config.endpoint!, blob);\n } else {\n fetch(this.config.endpoint!, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(finalBody),\n keepalive: true\n }).catch(err => {\n if (this.config.debug) console.error('[Pixel Error]', err);\n });\n }\n\n this.log(`Event Sent [${type}]`, body);\n }\n\n // Call this after init to load rules\n public async loadRules() {\n if (typeof window === 'undefined') return;\n try {\n // Updated Endpoint Query Param\n const res = await fetch(`${this.config.endpoint?.replace('/track', '')}/rules?token=${this.config.token}`);\n if (res.ok) {\n const data = await res.json();\n this.rules = data.rules || [];\n }\n } catch (e) {\n // silent fail\n }\n }\n\n /**\n * Smart Auto-Detection of Page Type & Context\n * Uses Dynamic Rules + Static Heuristics\n */\n private detectContext(): any {\n if (typeof document === 'undefined') return {};\n\n const path = window.location.pathname.toLowerCase();\n let context: any = {\n page_type: 'general', // Default\n topics: []\n };\n\n // 0. CHECK DYNAMIC RULES (Database / AI Optimized)\n for (const rule of this.rules) {\n let matched = false;\n // URL Pattern Match\n try {\n if (rule.match_type === 'exact' && path === rule.url_pattern) matched = true;\n else if (rule.match_type === 'contains' && path.includes(rule.url_pattern)) matched = true;\n else if (rule.match_type === 'regex' && new RegExp(rule.url_pattern).test(path)) matched = true;\n } catch (e) { }\n\n if (matched) {\n context.page_type = rule.page_type;\n\n // Extract Data via Selectors\n if (rule.selectors) {\n for (const [key, selector] of Object.entries(rule.selectors)) {\n const el = document.querySelector(selector as string);\n if (el) {\n // Try value (input), then textContent, then content (meta)\n const val = (el as HTMLInputElement).value || el.textContent || el.getAttribute('content');\n if (val) context[key] = val.trim();\n }\n }\n }\n // Stop after first strong match? Or continue to merge? \n // Let's stop to allow override of default heuristics.\n return context;\n }\n }\n\n // --- FALLBACK TO STATIC HEURISTICS ---\n\n // 1. URL Heuristics\n if (path.match(/\\/(cart|basket|bag)/)) context.page_type = 'cart';\n else if (path.match(/\\/(checkout|payment|order)/)) context.page_type = 'checkout';\n else if (path.match(/\\/(product|item|p)\\//)) context.page_type = 'product';\n else if (path.match(/\\/(category|c|collection)\\//)) context.page_type = 'category';\n else if (path.match(/\\/(blog|article|post|news)/)) context.page_type = 'content';\n else if (path.match(/\\/(login|signin)/)) context.page_type = 'auth';\n else if (path.match(/\\/(signup|register)/)) context.page_type = 'auth';\n else if (path.match(/\\/(pricing|plans)/)) context.page_type = 'pricing';\n else if (path.match(/\\/(thank-you|confirmation|success)/)) context.page_type = 'purchase_success';\n\n // 2. DOM/Meta Heuristics (Stronger Signals)\n\n // Product? (Schema.org or OG Tags)\n const ogType = document.querySelector('meta[property=\"og:type\"]')?.getAttribute('content');\n if (ogType === 'product') {\n context.page_type = 'product';\n // Try to scrape price\n const price = document.querySelector('meta[property=\"product:price:amount\"]')?.getAttribute('content');\n if (price) context.product_price = price;\n const currency = document.querySelector('meta[property=\"product:price:currency\"]')?.getAttribute('content');\n if (currency) context.currency = currency;\n }\n\n // Cart?\n if (document.querySelector('.cart-total') || document.querySelector('#cart-summary')) {\n context.page_type = 'cart';\n }\n\n // Checkout?\n if (document.querySelector('#card-element') || document.querySelector('input[name=\"card_number\"]')) {\n context.page_type = 'checkout';\n }\n\n // 3. Content Scraping (Keywords)\n const text = document.body.innerText.toLowerCase().slice(0, 2000); // Check first 2k chars\n if (text.includes('out of stock')) context.stock_status = 'out_of_stock';\n if (text.includes('limited time')) context.urgency = 'high';\n\n return context;\n }\n\n private setupFormListeners() {\n if (typeof document === 'undefined') return;\n\n // Debounce to avoid performance hit\n document.addEventListener('submit', (e) => {\n const form = e.target as HTMLFormElement;\n if (!form) return;\n\n // Look for email input\n const emailInput = form.querySelector('input[type=\"email\"]') as HTMLInputElement;\n if (emailInput && emailInput.value) {\n this.log('Auto-detected email form submission', emailInput.value);\n this.identify(emailInput.value);\n }\n }, true); // Capture phase to catch it before propagation stops\n }\n\n private setupHistoryListeners() {\n if (typeof window === 'undefined') return;\n\n const pushState = history.pushState;\n history.pushState = (...args) => {\n pushState.apply(history, args);\n this.pageView();\n };\n\n window.addEventListener('popstate', () => {\n this.pageView();\n });\n }\n\n // --- COOKIE UTILS ---\n\n private setCookie(name: string, value: string, days: number) {\n const d = new Date();\n d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));\n const expires = \"expires=\" + d.toUTCString();\n document.cookie = name + \"=\" + value + \";\" + expires + \";path=/;SameSite=Lax\";\n }\n\n private getCookie(name: string): string | null {\n const nameEQ = name + \"=\";\n const ca = document.cookie.split(';');\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) == ' ') c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);\n }\n return null;\n }\n\n private log(...args: unknown[]) {\n if (this.config.debug) {\n console.log('[SendmailPixel]', ...args);\n }\n }\n\n private isDNTEnabled(): boolean {\n if (typeof navigator === 'undefined') return false;\n return navigator.doNotTrack === '1' ||\n (window as unknown as { doNotTrack?: string }).doNotTrack === '1';\n }\n\n private checkUrlForSubscriber(): void {\n if (typeof window === 'undefined') return;\n\n const params = new URLSearchParams(window.location.search);\n const subscriberEmail = params.get('smp_email');\n const subscriberId = params.get('smp_sub');\n\n if (subscriberEmail) {\n try {\n const email = atob(subscriberEmail);\n if (this.isValidEmail(email)) {\n this.identify(email);\n }\n } catch {\n if (this.isValidEmail(subscriberEmail)) {\n this.identify(subscriberEmail);\n }\n }\n } else if (subscriberId) {\n this.track('email_link_clicked', { subscriber_id: subscriberId });\n }\n }\n\n private setupDataAttributeTracking(): void {\n if (typeof document === 'undefined') return;\n\n document.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n const tracked = target.closest('[data-smp-track]');\n\n if (tracked) {\n const eventName = tracked.getAttribute('data-smp-track');\n const properties: TrackProps = {};\n\n Array.from(tracked.attributes).forEach((attr) => {\n if (attr.name.startsWith('data-smp-track-') && attr.name !== 'data-smp-track') {\n const propName = attr.name.replace('data-smp-track-', '').replace(/-/g, '_');\n properties[propName] = attr.value;\n }\n });\n\n if (eventName) {\n this.track(eventName, properties);\n }\n }\n });\n }\n\n private getStoredEmail(): string | null {\n if (typeof localStorage === 'undefined') return null;\n return localStorage.getItem(IDENTIFIED_EMAIL_KEY);\n }\n\n private storeEmail(email: string): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(IDENTIFIED_EMAIL_KEY, email);\n }\n }\n\n private isValidEmail(email: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n }\n}\n\n/** Alias for SendmailPixel for SDK consistency */\nexport const Pixel = SendmailPixel;\n\n/**\n * Create pixel and attach global smp() function\n */\nexport function createGlobalPixel(config: PixelConfig): SendmailPixel {\n const pixel = new SendmailPixel(config);\n\n if (typeof window !== 'undefined') {\n const smpFunction = (method: string, ...args: unknown[]): unknown => {\n switch (method) {\n case 'track':\n pixel.track(args[0] as string, args[1] as TrackProps);\n return undefined;\n case 'identify':\n pixel.identify(args[0] as string, args[1] as TrackProps);\n return undefined;\n case 'page':\n pixel.pageView();\n return undefined;\n case 'optOut':\n pixel.optOut();\n return undefined;\n case 'optIn':\n pixel.optIn();\n return undefined;\n case 'isOptedOut':\n return pixel.isOptedOut();\n case 'reset':\n pixel.reset();\n return undefined;\n default:\n console.warn(`[SendmailPixel] Unknown method: ${method}`);\n return undefined;\n }\n };\n (window as unknown as { smp: typeof smpFunction }).smp = smpFunction;\n }\n\n pixel.init();\n return pixel;\n}\n","/**\n * Webhook signature verification utilities\n * \n * IMPORTANT: This module uses timing-safe comparison to prevent timing attacks.\n */\n\nexport interface VerifyWebhookParams {\n /** Raw request body as string */\n payload: string;\n /** Value of X-SendMailOS-Signature header */\n signature: string;\n /** Value of X-SendMailOS-Timestamp header */\n timestamp: string;\n /** Your webhook signing secret */\n secret: string;\n /** Maximum age in seconds (default: 300 = 5 minutes) */\n tolerance?: number;\n}\n\n/**\n * Verify a webhook signature to ensure the request came from SendMailOS\n * \n * @example\n * ```ts\n * import { verifyWebhookSignature } from '@sendmailos/sdk';\n * \n * app.post('/webhooks', (req, res) => {\n * const isValid = verifyWebhookSignature({\n * payload: JSON.stringify(req.body),\n * signature: req.headers['x-sendmailos-signature'],\n * timestamp: req.headers['x-sendmailos-timestamp'],\n * secret: process.env.WEBHOOK_SECRET\n * });\n * \n * if (!isValid) {\n * return res.status(401).json({ error: 'Invalid signature' });\n * }\n * \n * // Process webhook...\n * });\n * ```\n */\nexport function verifyWebhookSignature(params: VerifyWebhookParams): boolean {\n const { payload, signature, timestamp, secret, tolerance = 300 } = params;\n\n // Validate inputs\n if (!payload || !signature || !timestamp || !secret) {\n return false;\n }\n\n // Prevent replay attacks - check timestamp age\n const timestampInt = parseInt(timestamp, 10);\n if (isNaN(timestampInt)) {\n return false;\n }\n\n const age = Math.floor(Date.now() / 1000) - timestampInt;\n if (age > tolerance) {\n console.warn('[SendMailOS] Webhook timestamp too old:', age, 'seconds');\n return false;\n }\n\n // Node.js crypto (server-side)\n if (typeof globalThis.crypto !== 'undefined' && 'subtle' in globalThis.crypto) {\n // Use SubtleCrypto for browser/edge environments\n // Note: This is synchronous verification, use verifyWebhookSignatureAsync for async\n return verifySync(payload, signature, timestamp, secret);\n }\n\n return verifySync(payload, signature, timestamp, secret);\n}\n\n/**\n * Async version of webhook verification (recommended for edge/browser)\n */\nexport async function verifyWebhookSignatureAsync(params: VerifyWebhookParams): Promise<boolean> {\n const { payload, signature, timestamp, secret, tolerance = 300 } = params;\n\n if (!payload || !signature || !timestamp || !secret) {\n return false;\n }\n\n const timestampInt = parseInt(timestamp, 10);\n if (isNaN(timestampInt)) {\n return false;\n }\n\n const age = Math.floor(Date.now() / 1000) - timestampInt;\n if (age > tolerance) {\n return false;\n }\n\n const message = `${timestamp}.${payload}`;\n \n // Use Web Crypto API\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n \n const signatureBytes = await crypto.subtle.sign(\n 'HMAC',\n key,\n encoder.encode(message)\n );\n \n const expectedSig = bufferToHex(signatureBytes);\n \n // Timing-safe comparison\n return timingSafeEqual(signature, expectedSig);\n}\n\n// ============ Internal Helpers ============\n\nfunction verifySync(payload: string, signature: string, timestamp: string, secret: string): boolean {\n try {\n // Try Node.js crypto first\n const crypto = require('crypto');\n const message = `${timestamp}.${payload}`;\n const expectedSig = crypto\n .createHmac('sha256', secret)\n .update(message)\n .digest('hex');\n \n // Use timing-safe comparison\n return crypto.timingSafeEqual(\n Buffer.from(signature),\n Buffer.from(expectedSig)\n );\n } catch {\n // Fallback for non-Node environments\n console.warn('[SendMailOS] Use verifyWebhookSignatureAsync for browser/edge');\n return false;\n }\n}\n\nfunction bufferToHex(buffer: ArrayBuffer): string {\n return Array.from(new Uint8Array(buffer))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nfunction timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false;\n }\n \n let result = 0;\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return result === 0;\n}\n\n/**\n * Construct a webhook event from raw request data\n */\nexport function constructWebhookEvent<T = unknown>(\n payload: string,\n headers: { signature: string; timestamp: string },\n secret: string\n): T {\n const isValid = verifyWebhookSignature({\n payload,\n signature: headers.signature,\n timestamp: headers.timestamp,\n secret,\n });\n\n if (!isValid) {\n throw new Error('Invalid webhook signature');\n }\n\n return JSON.parse(payload) as T;\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/errors.ts","../src/resources/emails.ts","../src/resources/subscribers.ts","../src/resources/campaigns.ts","../src/resources/domains.ts","../src/resources/organization.ts","../src/resources/workspaces.ts","../src/resources/workflows.ts","../src/resources/webhooks.ts","../src/client.ts","../src/pixel.ts","../src/utils/webhook.ts"],"names":["crypto"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Custom error classes for SendMailOS SDK\n */\n\nexport class SendMailOSError extends Error {\n public readonly code: string;\n public readonly statusCode: number;\n public readonly retryAfter?: number;\n\n constructor(\n message: string,\n code: string,\n statusCode: number,\n retryAfter?: number\n ) {\n super(message);\n this.name = 'SendMailOSError';\n this.code = code;\n this.statusCode = statusCode;\n this.retryAfter = retryAfter;\n \n // Maintains proper stack trace for where error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, SendMailOSError);\n }\n }\n\n /** Whether this error is retryable (rate limit or server error) */\n get isRetryable(): boolean {\n return this.statusCode === 429 || this.statusCode >= 500;\n }\n}\n\nexport class AuthenticationError extends SendMailOSError {\n constructor(message: string = 'Invalid API key') {\n super(message, 'UNAUTHORIZED', 401);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class ValidationError extends SendMailOSError {\n constructor(message: string) {\n super(message, 'VALIDATION_ERROR', 400);\n this.name = 'ValidationError';\n }\n}\n\nexport class RateLimitError extends SendMailOSError {\n constructor(message: string, retryAfter: number) {\n super(message, 'RATE_LIMITED', 429, retryAfter);\n this.name = 'RateLimitError';\n }\n}\n\nexport class NotFoundError extends SendMailOSError {\n constructor(message: string) {\n super(message, 'NOT_FOUND', 404);\n this.name = 'NotFoundError';\n }\n}\n","import type { SendEmailRequest, SendEmailResponse } from '../types';\n\n/**\n * Emails resource for sending transactional emails\n */\nexport class EmailsResource {\n constructor(\n private request: <T>(endpoint: string, options?: RequestInit) => Promise<T>\n ) {}\n\n /**\n * Send a transactional email\n *\n * @example\n * ```ts\n * // Business account (single-tenant)\n * const result = await client.emails.send({\n * to: 'user@example.com',\n * fromName: 'Your Company',\n * fromEmail: 'hello@yourcompany.com',\n * subject: 'Welcome!',\n * html: '<h1>Hello!</h1>'\n * });\n *\n * // Agency account (multi-tenant) - identify client by domain\n * const result = await agencyClient.emails.send({\n * to: 'customer@example.com',\n * fromName: 'Pizza Palace',\n * fromEmail: 'hello@pizzapalace.com',\n * subject: 'Your order is ready!',\n * html: '<h1>Order Ready!</h1>',\n * domain: 'pizzapalace.com' // Required for agency accounts\n * });\n * ```\n */\n async send(params: SendEmailRequest): Promise<SendEmailResponse> {\n return this.request<SendEmailResponse>('/send', {\n method: 'POST',\n body: JSON.stringify({\n to: params.to,\n subject: params.subject,\n html: params.html,\n templateId: params.templateId,\n from_name: params.fromName,\n from_email: params.fromEmail,\n variables: params.variables,\n type: params.type || 'transactional',\n workspace_id: params.workspaceId,\n domain: params.domain,\n attachments: params.attachments,\n }),\n });\n }\n\n /**\n * Send email using a template\n *\n * @example\n * ```ts\n * const result = await client.emails.sendTemplate({\n * to: 'user@example.com',\n * templateId: 'tmpl_welcome',\n * variables: { firstName: 'John' }\n * });\n * ```\n */\n async sendTemplate(params: {\n to: string;\n templateId: string;\n fromName?: string;\n fromEmail?: string;\n subject?: string;\n variables?: Record<string, unknown>;\n /** Workspace ID (for agency accounts) */\n workspaceId?: string;\n /** Client domain (for agency accounts) */\n domain?: string;\n }): Promise<SendEmailResponse> {\n return this.send({\n to: params.to,\n subject: params.subject || '',\n templateId: params.templateId,\n fromName: params.fromName,\n fromEmail: params.fromEmail,\n variables: params.variables,\n type: 'transactional',\n workspaceId: params.workspaceId,\n domain: params.domain,\n });\n }\n}\n","import type {\n Subscriber,\n CreateSubscriberRequest,\n CreateSubscriberResponse,\n ListSubscribersRequest,\n ListSubscribersResponse,\n} from '../types';\n\n/**\n * Subscribers resource for managing email contacts\n */\nexport class SubscribersResource {\n constructor(\n private request: <T>(endpoint: string, options?: RequestInit) => Promise<T>\n ) {}\n\n /**\n * Create or update a subscriber (upsert)\n *\n * @example\n * ```ts\n * // Business account\n * const { subscriber } = await client.subscribers.create({\n * email: 'user@example.com',\n * firstName: 'John',\n * tags: ['newsletter', 'premium']\n * });\n *\n * // Agency account - subscriber tracked to client domain\n * const { subscriber } = await agencyClient.subscribers.create({\n * email: 'customer@example.com',\n * firstName: 'Jane',\n * domain: 'pizzapalace.com', // Required for agency accounts\n * tags: ['loyalty-member']\n * });\n * ```\n */\n async create(params: CreateSubscriberRequest): Promise<CreateSubscriberResponse> {\n return this.request<CreateSubscriberResponse>('/subscribers', {\n method: 'POST',\n body: JSON.stringify({\n email: params.email,\n first_name: params.firstName,\n last_name: params.lastName,\n tags: params.tags,\n domain_id: params.domainId,\n workspace_id: params.workspaceId,\n domain: params.domain, // Alternative to workspace_id\n }),\n });\n }\n\n /**\n * List all subscribers with pagination\n * \n * @example\n * ```ts\n * const { subscribers, total } = await client.subscribers.list({\n * limit: 50,\n * offset: 0\n * });\n * ```\n */\n async list(params: ListSubscribersRequest = {}): Promise<ListSubscribersResponse> {\n const searchParams = new URLSearchParams();\n if (params.limit) searchParams.set('limit', String(params.limit));\n if (params.offset) searchParams.set('offset', String(params.offset));\n if (params.workspaceId) searchParams.set('workspace_id', params.workspaceId);\n if (params.domain) searchParams.set('domain', params.domain); // Alternative to workspace_id\n\n const query = searchParams.toString();\n const endpoint = query ? `/subscribers?${query}` : '/subscribers';\n\n return this.request<ListSubscribersResponse>(endpoint, {\n method: 'GET',\n });\n }\n\n /**\n * Get a single subscriber by ID\n */\n async get(subscriberId: string): Promise<{ success: boolean; subscriber: Subscriber }> {\n return this.request(`/subscribers/${subscriberId}`, {\n method: 'GET',\n });\n }\n\n /**\n * Update a subscriber by ID\n */\n async update(\n subscriberId: string,\n params: Partial<CreateSubscriberRequest>\n ): Promise<CreateSubscriberResponse> {\n return this.request<CreateSubscriberResponse>(`/subscribers/${subscriberId}`, {\n method: 'PATCH',\n body: JSON.stringify({\n first_name: params.firstName,\n last_name: params.lastName,\n tags: params.tags,\n }),\n });\n }\n\n /**\n * Update a subscriber by email address\n */\n async updateByEmail(\n email: string,\n params: Partial<Omit<CreateSubscriberRequest, 'email'>>\n ): Promise<CreateSubscriberResponse> {\n // Upsert via create endpoint\n return this.create({\n email,\n ...params,\n });\n }\n\n /**\n * Delete/unsubscribe a subscriber\n */\n async delete(subscriberId: string): Promise<{ success: boolean }> {\n return this.request(`/subscribers/${subscriberId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Add tags to a subscriber\n */\n async addTags(subscriberId: string, tags: string[]): Promise<CreateSubscriberResponse> {\n return this.request<CreateSubscriberResponse>(`/subscribers/${subscriberId}/tags`, {\n method: 'POST',\n body: JSON.stringify({ tags }),\n });\n }\n\n /**\n * Remove tags from a subscriber\n */\n async removeTags(subscriberId: string, tags: string[]): Promise<CreateSubscriberResponse> {\n return this.request<CreateSubscriberResponse>(`/subscribers/${subscriberId}/tags`, {\n method: 'DELETE',\n body: JSON.stringify({ tags }),\n });\n }\n}\n","import type { SendCampaignRequest, SendCampaignResponse } from '../types';\n\n/**\n * Campaigns resource for bulk email sending\n */\nexport class CampaignsResource {\n constructor(\n private request: <T>(endpoint: string, options?: RequestInit) => Promise<T>\n ) {}\n\n /**\n * Send a campaign to subscribers\n *\n * @example\n * ```ts\n * // Business account\n * const result = await client.campaigns.send({\n * name: 'January Newsletter',\n * subject: 'What\\'s new this month',\n * fromName: 'Your Company',\n * fromEmail: 'news@yourcompany.com',\n * html: '<h1>Hello {{first_name}}!</h1>',\n * tags: ['newsletter', 'active']\n * });\n *\n * // Agency account - send to specific client's subscribers\n * const result = await agencyClient.campaigns.send({\n * name: 'Pizza Promo',\n * subject: 'New menu items!',\n * fromName: 'Pizza Palace',\n * fromEmail: 'promo@pizzapalace.com',\n * html: '<h1>Check out our new menu!</h1>',\n * domain: 'pizzapalace.com', // Filter to this client's subscribers\n * sourceDomains: ['pizzapalace.com'] // Only subscribers who signed up on this domain\n * });\n * ```\n */\n async send(params: SendCampaignRequest): Promise<SendCampaignResponse> {\n return this.request<SendCampaignResponse>('/campaigns/send', {\n method: 'POST',\n body: JSON.stringify({\n name: params.name,\n subject: params.subject,\n from_name: params.fromName,\n from_email: params.fromEmail,\n html: params.html,\n templateId: params.templateId,\n tags: params.tags,\n variables: params.variables,\n workspace_id: params.workspaceId,\n domain: params.domain,\n sourceDomains: params.sourceDomains,\n }),\n });\n }\n\n /**\n * Send campaign using a saved template\n */\n async sendTemplate(params: {\n name?: string;\n templateId: string;\n subject: string;\n fromName: string;\n fromEmail: string;\n tags?: string[];\n variables?: Record<string, unknown>;\n /** Workspace ID (for agency accounts) */\n workspaceId?: string;\n /** Client domain (for agency accounts) */\n domain?: string;\n /** Filter by source domains */\n sourceDomains?: string[];\n }): Promise<SendCampaignResponse> {\n return this.send({\n name: params.name,\n subject: params.subject,\n fromName: params.fromName,\n fromEmail: params.fromEmail,\n templateId: params.templateId,\n tags: params.tags,\n variables: params.variables,\n workspaceId: params.workspaceId,\n domain: params.domain,\n sourceDomains: params.sourceDomains,\n });\n }\n}\n","import type {\n Domain,\n CreateDomainRequest,\n CreateDomainResponse,\n ListDomainsResponse,\n} from '../types';\n\n/**\n * Domains resource for managing sending domains\n */\nexport class DomainsResource {\n constructor(\n private request: <T>(endpoint: string, options?: RequestInit) => Promise<T>\n ) {}\n\n /**\n * Add a new sending domain\n * Returns DKIM tokens and DNS records for verification\n * \n * @example\n * ```ts\n * const { domain } = await client.domains.create({\n * domain: 'yourcompany.com'\n * });\n * \n * console.log('Add these DNS records:', domain.dnsRecords);\n * ```\n */\n async create(params: CreateDomainRequest): Promise<CreateDomainResponse> {\n return this.request<CreateDomainResponse>('/domains', {\n method: 'POST',\n body: JSON.stringify({\n domain: params.domain,\n }),\n });\n }\n\n /**\n * List all domains for the organization\n */\n async list(): Promise<ListDomainsResponse> {\n return this.request<ListDomainsResponse>('/domains', {\n method: 'GET',\n });\n }\n\n /**\n * Get a single domain by ID\n */\n async get(domainId: string): Promise<{ success: boolean; domain: Domain }> {\n return this.request(`/domains/${domainId}`, {\n method: 'GET',\n });\n }\n\n /**\n * Verify a domain (trigger DNS check)\n */\n async verify(domainId: string): Promise<{ success: boolean; domain: Domain }> {\n return this.request(`/domains/${domainId}/verify`, {\n method: 'POST',\n });\n }\n\n /**\n * Delete a domain\n */\n async delete(domainId: string): Promise<{ success: boolean }> {\n return this.request(`/domains/${domainId}`, {\n method: 'DELETE',\n });\n }\n}\n","/**\n * Organization management resource\n */\n\nexport type OrganizationType = 'business' | 'agency';\n\nexport type Industry =\n | 'hotels' | 'restaurants' | 'gyms' | 'travel_agencies' | 'real_estate'\n | 'schools' | 'ecommerce' | 'dentists' | 'car_dealerships' | 'events'\n | 'beauty_salons' | 'law_firms' | 'nonprofits' | 'saas' | 'recruitment'\n | 'insurance' | 'online_courses' | 'municipalities' | 'personal_trainers'\n | 'influencers' | 'doctors_clinics' | 'nightclubs' | 'coworking'\n | 'wedding_planners' | 'art_galleries' | 'car_rentals' | 'podcasters'\n | 'consultants' | 'bakeries' | 'veterinarians' | 'airbnb_hosts'\n | 'accountants' | 'developers' | 'musicians' | 'spas' | 'bookstores'\n | 'cleaning_services' | 'churches' | 'graphic_designers' | 'coffee_shops'\n | 'florists' | 'political' | 'libraries' | 'taxis_limos' | 'home_inspectors'\n | 'photographers' | 'universities' | 'fashion' | 'nutritionists' | 'startups'\n | 'other';\n\nexport interface Organization {\n id: string;\n name: string;\n org_type: OrganizationType;\n industries: Industry[];\n onboarding_completed: boolean;\n onboarding_step: string;\n created_at: string;\n}\n\nexport interface UpdateOrganizationRequest {\n name?: string;\n org_type?: OrganizationType;\n industries?: Industry[];\n onboarding_completed?: boolean;\n onboarding_step?: string;\n}\n\ninterface OrganizationResponse {\n success: boolean;\n organization: Organization;\n}\n\nexport class OrganizationResource {\n constructor(\n private request: <T>(endpoint: string, options?: RequestInit) => Promise<T>\n ) {}\n\n /**\n * Get current organization details\n */\n async get(): Promise<Organization> {\n const response = await this.request<OrganizationResponse>('/organization', {\n method: 'GET',\n });\n return response.organization;\n }\n\n /**\n * Update organization settings\n */\n async update(updates: UpdateOrganizationRequest): Promise<Organization> {\n const response = await this.request<OrganizationResponse>('/organization', {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n return response.organization;\n }\n\n /**\n * Set organization industries (during onboarding)\n *\n * @example\n * ```ts\n * await client.organization.setIndustries(['ecommerce', 'saas']);\n * ```\n */\n async setIndustries(industries: Industry[]): Promise<Organization> {\n return this.update({ industries });\n }\n\n /**\n * Convert to agency account (enables workspaces)\n *\n * @example\n * ```ts\n * await client.organization.convertToAgency();\n * // Now you can create client workspaces\n * await client.workspaces.create({ name: 'Client A', industry: 'ecommerce' });\n * ```\n */\n async convertToAgency(): Promise<Organization> {\n return this.update({ org_type: 'agency' });\n }\n\n /**\n * Complete onboarding\n */\n async completeOnboarding(): Promise<Organization> {\n return this.update({ onboarding_completed: true });\n }\n}\n\n/**\n * All available industries with human-readable labels\n */\nexport const INDUSTRIES: Record<Industry, string> = {\n hotels: 'Hotels & Hospitality',\n restaurants: 'Restaurants & Food Service',\n gyms: 'Gyms & Fitness',\n travel_agencies: 'Travel Agencies',\n real_estate: 'Real Estate',\n schools: 'Schools & Education',\n ecommerce: 'E-commerce',\n dentists: 'Dentists',\n car_dealerships: 'Car Dealerships',\n events: 'Events & Entertainment',\n beauty_salons: 'Beauty Salons',\n law_firms: 'Law Firms',\n nonprofits: 'Non-Profits',\n saas: 'SaaS & Software',\n recruitment: 'Recruitment & HR',\n insurance: 'Insurance',\n online_courses: 'Online Courses',\n municipalities: 'Government & Municipalities',\n personal_trainers: 'Personal Trainers',\n influencers: 'Influencers & Creators',\n doctors_clinics: 'Doctors & Clinics',\n nightclubs: 'Nightclubs & Bars',\n coworking: 'Coworking Spaces',\n wedding_planners: 'Wedding Planners',\n art_galleries: 'Art Galleries',\n car_rentals: 'Car Rentals',\n podcasters: 'Podcasters',\n consultants: 'Consultants',\n bakeries: 'Bakeries',\n veterinarians: 'Veterinarians',\n airbnb_hosts: 'Airbnb Hosts',\n accountants: 'Accountants',\n developers: 'Developers',\n musicians: 'Musicians & Bands',\n spas: 'Spas & Wellness',\n bookstores: 'Bookstores',\n cleaning_services: 'Cleaning Services',\n churches: 'Churches & Religious',\n graphic_designers: 'Graphic Designers',\n coffee_shops: 'Coffee Shops',\n florists: 'Florists',\n political: 'Political Campaigns',\n libraries: 'Libraries',\n taxis_limos: 'Taxis & Limos',\n home_inspectors: 'Home Inspectors',\n photographers: 'Photographers',\n universities: 'Universities',\n fashion: 'Fashion Brands',\n nutritionists: 'Nutritionists',\n startups: 'Startups',\n other: 'Other',\n};\n","/**\n * Workspace management resource (for agencies)\n */\n\nimport type { Industry } from './organization';\n\nexport interface Workspace {\n id: string;\n name: string;\n slug: string;\n industry: Industry | null;\n logo_url: string | null;\n website: string | null;\n is_active: boolean;\n client_email: string | null;\n client_can_view_reports: boolean;\n created_at: string;\n updated_at: string;\n stats?: WorkspaceStats;\n}\n\nexport interface WorkspaceStats {\n subscribers?: number;\n campaigns?: number;\n emails_30d?: number;\n total_subscribers?: number;\n active_subscribers?: number;\n total_campaigns?: number;\n sent_campaigns?: number;\n total_emails?: number;\n domains?: number;\n}\n\nexport interface CreateWorkspaceRequest {\n /** Client/workspace name */\n name: string;\n /** Industry for pre-built templates */\n industry?: Industry;\n /** Client website URL */\n website?: string;\n /** Logo URL */\n logo_url?: string;\n /** Client email for portal access */\n client_email?: string;\n /** Allow client to view reports */\n client_can_view_reports?: boolean;\n /** Import industry templates automatically */\n import_templates?: boolean;\n /** Custom settings */\n settings?: Record<string, unknown>;\n}\n\nexport interface ProvisionWorkspaceRequest {\n /** Client/workspace name */\n name: string;\n /** Client website URL - used for matching existing workspace */\n website?: string;\n /** Client email - used for matching existing workspace */\n client_email?: string;\n /** Industry for pre-built templates (used if creating new) */\n industry?: Industry;\n /** Logo URL */\n logo_url?: string;\n /** Allow client to view reports (default: true) */\n client_can_view_reports?: boolean;\n /** Import industry templates automatically (default: true) */\n import_templates?: boolean;\n /** Generate a workspace-scoped API key */\n generate_api_key?: boolean;\n /** Allowed origins for the generated API key */\n allowed_origins?: string[];\n /** Custom settings */\n settings?: Record<string, unknown>;\n}\n\nexport interface ProvisionWorkspaceResponse {\n workspace: Workspace;\n /** Whether this is a newly created workspace */\n is_new: boolean;\n /** Generated API key (only if generate_api_key was true) */\n api_key?: string;\n /** Human-readable message */\n message: string;\n}\n\nexport interface OnboardClientRequest {\n /** Client domain (e.g., \"pizzapalace.com\" or \"https://pizzapalace.com\") */\n domain: string;\n /** Client name (optional - derived from domain if not provided) */\n name?: string;\n /** Industry for templates (default: \"restaurants\") */\n industry?: Industry;\n /** Client email for notifications */\n client_email?: string;\n}\n\nexport interface OnboardClientResponse {\n /** Workspace token - USE THIS FOR ALL API CALLS */\n token: string;\n /** Workspace ID */\n workspace_id: string;\n /** Workspace name */\n workspace_name: string;\n /** Normalized domain */\n domain: string;\n /** Domain verification status */\n domain_status: string;\n /** DNS records to add for domain verification */\n dns_records: Array<{\n type: string;\n name: string;\n value: string;\n }>;\n /** Whether workspace was newly created */\n is_new: boolean;\n /** Human-readable message */\n message: string;\n}\n\nexport interface UpdateWorkspaceRequest {\n name?: string;\n industry?: Industry;\n website?: string;\n logo_url?: string;\n is_active?: boolean;\n client_email?: string;\n client_can_view_reports?: boolean;\n billing_enabled?: boolean;\n billing_email?: string;\n settings?: Record<string, unknown>;\n}\n\ninterface ListWorkspacesResponse {\n success: boolean;\n workspaces: Workspace[];\n total: number;\n}\n\ninterface WorkspaceResponse {\n success: boolean;\n workspace: Workspace;\n}\n\ninterface DeleteWorkspaceResponse {\n success: boolean;\n message: string;\n}\n\ninterface ProvisionResponse {\n success: boolean;\n workspace: Workspace;\n is_new: boolean;\n api_key?: string;\n message: string;\n}\n\nexport class WorkspacesResource {\n constructor(\n private request: <T>(endpoint: string, options?: RequestInit) => Promise<T>\n ) {}\n\n /**\n * List all workspaces (clients)\n * @note Only available for agency accounts\n *\n * @example\n * ```ts\n * const { workspaces } = await client.workspaces.list();\n * for (const ws of workspaces) {\n * console.log(`${ws.name}: ${ws.stats?.subscribers} subscribers`);\n * }\n * ```\n */\n async list(): Promise<{ workspaces: Workspace[]; total: number }> {\n const response = await this.request<ListWorkspacesResponse>('/workspaces', {\n method: 'GET',\n });\n return { workspaces: response.workspaces, total: response.total };\n }\n\n /**\n * Create a new workspace (client)\n * @note Only available for agency accounts\n *\n * @example\n * ```ts\n * const workspace = await client.workspaces.create({\n * name: 'Pizza Palace',\n * industry: 'restaurants',\n * import_templates: true // Auto-import restaurant templates\n * });\n * ```\n */\n async create(workspace: CreateWorkspaceRequest): Promise<Workspace> {\n const response = await this.request<WorkspaceResponse>('/workspaces', {\n method: 'POST',\n body: JSON.stringify(workspace),\n });\n return response.workspace;\n }\n\n /**\n * Get a workspace by ID with detailed stats\n *\n * @example\n * ```ts\n * const workspace = await client.workspaces.get('ws_123');\n * console.log('Active subscribers:', workspace.stats.active_subscribers);\n * ```\n */\n async get(workspaceId: string): Promise<Workspace> {\n const response = await this.request<WorkspaceResponse>(`/workspaces/${workspaceId}`, {\n method: 'GET',\n });\n return response.workspace;\n }\n\n /**\n * Update a workspace\n *\n * @example\n * ```ts\n * await client.workspaces.update('ws_123', {\n * name: 'Pizza Palace - Main Location',\n * client_can_view_reports: true\n * });\n * ```\n */\n async update(workspaceId: string, updates: UpdateWorkspaceRequest): Promise<Workspace> {\n const response = await this.request<WorkspaceResponse>(`/workspaces/${workspaceId}`, {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n return response.workspace;\n }\n\n /**\n * Delete a workspace\n * @warning This will delete all associated data (subscribers, campaigns, etc.)\n *\n * @example\n * ```ts\n * await client.workspaces.delete('ws_123');\n * ```\n */\n async delete(workspaceId: string): Promise<{ message: string }> {\n const response = await this.request<DeleteWorkspaceResponse>(`/workspaces/${workspaceId}`, {\n method: 'DELETE',\n });\n return { message: response.message };\n }\n\n /**\n * Activate a workspace\n */\n async activate(workspaceId: string): Promise<Workspace> {\n return this.update(workspaceId, { is_active: true });\n }\n\n /**\n * Deactivate a workspace\n */\n async deactivate(workspaceId: string): Promise<Workspace> {\n return this.update(workspaceId, { is_active: false });\n }\n\n /**\n * Invite client to view reports\n *\n * @example\n * ```ts\n * await client.workspaces.inviteClient('ws_123', 'owner@pizzapalace.com');\n * // Client receives email with portal access\n * ```\n */\n async inviteClient(workspaceId: string, email: string): Promise<Workspace> {\n return this.update(workspaceId, {\n client_email: email,\n client_can_view_reports: true,\n });\n }\n\n /**\n * Smart workspace provisioning - finds existing or creates new\n *\n * This is the recommended method for agency client onboarding.\n * It will:\n * 1. Search for existing workspace by website URL or client_email\n * 2. Return existing workspace if found\n * 3. Create new workspace with industry templates if not found\n * 4. Optionally generate a workspace-scoped API key\n *\n * @note Only available for agency accounts\n *\n * @example\n * ```ts\n * // Auto-provision workspace for a new client\n * const result = await client.workspaces.provision({\n * name: 'Pizza Palace',\n * website: 'https://pizzapalace.com',\n * client_email: 'owner@pizzapalace.com',\n * industry: 'restaurants',\n * generate_api_key: true\n * });\n *\n * if (result.is_new) {\n * console.log('Created new workspace:', result.workspace.id);\n * console.log('API Key:', result.api_key);\n * } else {\n * console.log('Found existing workspace:', result.workspace.id);\n * }\n * ```\n *\n * @example\n * ```ts\n * // Idempotent client setup - safe to call multiple times\n * const { workspace, is_new } = await client.workspaces.provision({\n * name: 'Client Name',\n * website: 'https://client.com',\n * industry: 'ecommerce'\n * });\n * // Always returns the same workspace for the same website\n * ```\n */\n async provision(request: ProvisionWorkspaceRequest): Promise<ProvisionWorkspaceResponse> {\n const response = await this.request<ProvisionResponse>('/workspaces/provision', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n return {\n workspace: response.workspace,\n is_new: response.is_new,\n api_key: response.api_key,\n message: response.message,\n };\n }\n\n /**\n * Alias for provision() - find or create workspace\n * @see provision\n */\n async findOrCreate(request: ProvisionWorkspaceRequest): Promise<ProvisionWorkspaceResponse> {\n return this.provision(request);\n }\n\n /**\n * Complete client onboarding in ONE call (Agency only)\n *\n * This is the simplest way to onboard a new client:\n * 1. Creates or finds workspace by domain\n * 2. Registers domain for email verification\n * 3. Generates workspace token\n * 4. Returns DNS records + token\n *\n * After this, use the returned `token` for all API calls.\n *\n * @example\n * ```ts\n * // Your SaaS onboards a new restaurant\n * const result = await agency.workspaces.onboard({\n * domain: 'pizzapalace.com',\n * industry: 'restaurants'\n * });\n *\n * // Save this token - it's all you need\n * saveToDatabase(restaurantId, result.token);\n *\n * // Show DNS records to restaurant owner\n * console.log('Add these DNS records:', result.dns_records);\n *\n * // Later, use the token directly\n * const restaurant = new SendMailOS(result.token);\n * await restaurant.emails.send({ ... });\n * ```\n */\n async onboard(request: OnboardClientRequest): Promise<OnboardClientResponse> {\n const response = await this.request<OnboardClientResponse & { success: boolean }>('/workspaces/onboard', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n return {\n token: response.token,\n workspace_id: response.workspace_id,\n workspace_name: response.workspace_name,\n domain: response.domain,\n domain_status: response.domain_status,\n dns_records: response.dns_records,\n is_new: response.is_new,\n message: response.message,\n };\n }\n}\n","import type {\n CreateWorkflowRequest,\n CreateWorkflowResponse,\n UpdateWorkflowRequest,\n UpdateWorkflowResponse,\n ListWorkflowsRequest,\n ListWorkflowsResponse,\n GetWorkflowResponse,\n TriggerWorkflowRequest,\n TriggerWorkflowResponse,\n WorkflowStatusResponse,\n} from '../types';\n\n/**\n * Workflows resource for managing email automation workflows\n */\nexport class WorkflowsResource {\n constructor(\n private request: <T>(endpoint: string, options?: RequestInit) => Promise<T>\n ) {}\n\n /**\n * Create a new workflow\n *\n * @example\n * ```ts\n * // Create workflow for a specific client (multi-brand)\n * const result = await platform.workflows.create({\n * name: 'Welcome Sequence',\n * domain: 'pizzapalace.com',\n * trigger: { type: 'subscriber_created' }\n * });\n *\n * // Create workflow (single brand)\n * const result = await client.workflows.create({\n * name: 'Onboarding Flow',\n * trigger: { type: 'api' }\n * });\n * ```\n */\n async create(params: CreateWorkflowRequest): Promise<CreateWorkflowResponse> {\n return this.request<CreateWorkflowResponse>('/workflows', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * List all workflows\n *\n * @example\n * ```ts\n * // List all workflows\n * const { workflows } = await client.workflows.list();\n *\n * // List workflows for a specific client (multi-brand)\n * const { workflows } = await platform.workflows.list({ domain: 'pizzapalace.com' });\n * ```\n */\n async list(params: ListWorkflowsRequest = {}): Promise<ListWorkflowsResponse> {\n const searchParams = new URLSearchParams();\n if (params.domain) searchParams.set('domain', params.domain);\n if (params.workspace_id) searchParams.set('workspace_id', params.workspace_id);\n\n const query = searchParams.toString();\n const endpoint = query ? `/workflows?${query}` : '/workflows';\n\n return this.request<ListWorkflowsResponse>(endpoint, {\n method: 'GET',\n });\n }\n\n /**\n * Get a workflow by ID (includes nodes and edges)\n *\n * @example\n * ```ts\n * const { workflow } = await client.workflows.get('workflow-uuid');\n * console.log(workflow.nodes); // The workflow steps\n * console.log(workflow.edges); // Connections between steps\n * ```\n */\n async get(workflowId: string): Promise<GetWorkflowResponse> {\n return this.request<GetWorkflowResponse>(`/workflows/${workflowId}`, {\n method: 'GET',\n });\n }\n\n /**\n * Update a workflow (name, nodes, edges, trigger)\n *\n * @example\n * ```ts\n * // Update workflow name\n * await client.workflows.update('workflow-uuid', { name: 'New Name' });\n *\n * // Update workflow steps\n * await client.workflows.update('workflow-uuid', {\n * nodes: [\n * { id: '1', type: 'trigger', data: { triggerType: 'api' } },\n * { id: '2', type: 'email', data: { templateId: 'tmpl_xxx', subject: 'Welcome!' } },\n * { id: '3', type: 'delay', data: { duration: 3, unit: 'days' } }\n * ],\n * edges: [\n * { id: 'e1', source: '1', target: '2' },\n * { id: 'e2', source: '2', target: '3' }\n * ]\n * });\n * ```\n */\n async update(workflowId: string, params: UpdateWorkflowRequest): Promise<UpdateWorkflowResponse> {\n return this.request<UpdateWorkflowResponse>(`/workflows/${workflowId}`, {\n method: 'PUT',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Delete a workflow\n */\n async delete(workflowId: string): Promise<{ success: boolean; message: string }> {\n return this.request(`/workflows/${workflowId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Activate a workflow (start accepting triggers)\n *\n * @example\n * ```ts\n * await client.workflows.activate('workflow-uuid');\n * // Workflow is now active and will process triggers\n * ```\n */\n async activate(workflowId: string): Promise<WorkflowStatusResponse> {\n return this.request<WorkflowStatusResponse>(`/workflows/${workflowId}/activate`, {\n method: 'POST',\n });\n }\n\n /**\n * Pause a workflow (stop accepting new triggers)\n *\n * @example\n * ```ts\n * await client.workflows.pause('workflow-uuid');\n * // Workflow is paused - existing executions continue, but no new ones start\n * ```\n */\n async pause(workflowId: string): Promise<WorkflowStatusResponse> {\n return this.request<WorkflowStatusResponse>(`/workflows/${workflowId}/pause`, {\n method: 'POST',\n });\n }\n\n /**\n * Trigger a workflow for a subscriber\n *\n * @example\n * ```ts\n * // Trigger when a customer signs up\n * const result = await platform.workflows.trigger('workflow-uuid', {\n * email: 'customer@example.com',\n * data: {\n * firstName: 'John',\n * restaurantName: 'Pizza Palace',\n * signupSource: 'website'\n * }\n * });\n *\n * console.log(result.execution_id); // Track this execution\n * ```\n */\n async trigger(workflowId: string, params: TriggerWorkflowRequest): Promise<TriggerWorkflowResponse> {\n return this.request<TriggerWorkflowResponse>(`/webhooks/${workflowId}`, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Send a custom event to resume waiting workflows\n *\n * Use this when you have workflows waiting for specific events (e.g., \"purchase_completed\").\n * All workflows waiting for this event for the given subscriber will resume.\n *\n * @example\n * ```ts\n * // When a customer completes a purchase\n * await platform.workflows.sendEvent({\n * event: 'purchase_completed',\n * email: 'customer@example.com',\n * data: { orderTotal: 45.99, orderId: 'ORD-123' }\n * });\n *\n * // Any workflow with a \"wait_for_event: purchase_completed\" node will resume\n * ```\n */\n async sendEvent(params: {\n event: string;\n email: string;\n data?: Record<string, unknown>;\n }): Promise<{ success: boolean; processed: number }> {\n return this.request('/events', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n}\n","import type {\n Webhook,\n CreateWebhookRequest,\n UpdateWebhookRequest,\n ListWebhooksResponse,\n GetWebhookResponse,\n TestWebhookResponse,\n} from '../types';\n\n/**\n * Webhooks resource for managing webhook endpoints\n */\nexport class WebhooksResource {\n constructor(\n private request: <T>(endpoint: string, options?: RequestInit) => Promise<T>\n ) {}\n\n /**\n * Create a new webhook endpoint\n *\n * @example\n * ```ts\n * const webhook = await client.webhooks.create({\n * url: 'https://yourserver.com/webhooks',\n * events: ['email.sent', 'email.delivered', 'email.opened'],\n * secret: 'your-secret-key' // Optional, auto-generated if not provided\n * });\n *\n * console.log('Webhook secret:', webhook.secret);\n * ```\n */\n async create(params: CreateWebhookRequest): Promise<{ success: boolean; webhook: Webhook }> {\n return this.request('/webhooks', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * List all webhooks\n */\n async list(): Promise<ListWebhooksResponse> {\n return this.request<ListWebhooksResponse>('/webhooks', {\n method: 'GET',\n });\n }\n\n /**\n * Get a webhook by ID with recent delivery history\n */\n async get(webhookId: string): Promise<GetWebhookResponse> {\n return this.request<GetWebhookResponse>(`/webhooks/${webhookId}`, {\n method: 'GET',\n });\n }\n\n /**\n * Update a webhook\n *\n * @example\n * ```ts\n * // Update webhook URL\n * await client.webhooks.update('webhook-id', {\n * url: 'https://newserver.com/webhooks'\n * });\n *\n * // Add new events\n * await client.webhooks.update('webhook-id', {\n * events: ['email.sent', 'email.delivered', 'email.bounced']\n * });\n *\n * // Disable webhook\n * await client.webhooks.update('webhook-id', { active: false });\n * ```\n */\n async update(webhookId: string, params: UpdateWebhookRequest): Promise<{ success: boolean; webhook: Webhook }> {\n return this.request(`/webhooks/${webhookId}`, {\n method: 'PATCH',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Delete a webhook\n */\n async delete(webhookId: string): Promise<{ success: boolean }> {\n return this.request(`/webhooks/${webhookId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Test a webhook by sending a test event\n *\n * @example\n * ```ts\n * const result = await client.webhooks.test('webhook-id');\n * if (result.test.sent) {\n * console.log(`Test delivered in ${result.test.responseTimeMs}ms`);\n * } else {\n * console.log('Test failed:', result.test.error);\n * }\n * ```\n */\n async test(webhookId: string): Promise<TestWebhookResponse> {\n return this.request<TestWebhookResponse>(`/webhooks/${webhookId}/test`, {\n method: 'POST',\n });\n }\n\n /**\n * Enable a webhook\n */\n async enable(webhookId: string): Promise<{ success: boolean; webhook: Webhook }> {\n return this.update(webhookId, { active: true });\n }\n\n /**\n * Disable a webhook\n */\n async disable(webhookId: string): Promise<{ success: boolean; webhook: Webhook }> {\n return this.update(webhookId, { active: false });\n }\n}\n","import type { SendMailOSOptions, ApiError } from './types';\nimport { SendMailOSError, AuthenticationError, RateLimitError } from './utils/errors';\nimport { EmailsResource } from './resources/emails';\nimport { SubscribersResource } from './resources/subscribers';\nimport { CampaignsResource } from './resources/campaigns';\nimport { DomainsResource } from './resources/domains';\nimport { OrganizationResource } from './resources/organization';\nimport { WorkspacesResource } from './resources/workspaces';\nimport { WorkflowsResource } from './resources/workflows';\nimport { WebhooksResource } from './resources/webhooks';\n\nconst DEFAULT_BASE_URL = 'https://sendmailos.com/api/v1';\nconst DEFAULT_TIMEOUT = 30000;\nconst SDK_VERSION = '1.3.1';\n\n/**\n * SendMailOS SDK Client\n * \n * @example\n * ```ts\n * import { SendMailOS } from '@sendmailos/sdk';\n * \n * const client = new SendMailOS('sk_live_your_api_key');\n * \n * // Send an email\n * await client.emails.send({\n * to: 'user@example.com',\n * subject: 'Hello!',\n * html: '<h1>Welcome!</h1>'\n * });\n * \n * // Add a subscriber\n * await client.subscribers.create({\n * email: 'user@example.com',\n * tags: ['newsletter']\n * });\n * ```\n */\nexport class SendMailOS {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly fetchFn: typeof fetch;\n\n /** Email sending operations */\n public readonly emails: EmailsResource;\n /** Subscriber management */\n public readonly subscribers: SubscribersResource;\n /** Campaign operations */\n public readonly campaigns: CampaignsResource;\n /** Domain management */\n public readonly domains: DomainsResource;\n /** Organization settings (industries, type) */\n public readonly organization: OrganizationResource;\n /** Workspace management (for agencies) */\n public readonly workspaces: WorkspacesResource;\n /** Workflow automation */\n public readonly workflows: WorkflowsResource;\n /** Webhook management */\n public readonly webhooks: WebhooksResource;\n\n constructor(apiKey: string, options: SendMailOSOptions = {}) {\n // Validate API key format\n if (!apiKey) {\n throw new Error('API key is required');\n }\n \n if (!apiKey.startsWith('sk_live_') && !apiKey.startsWith('sk_test_')) {\n throw new Error(\n 'Invalid API key format. Keys should start with \"sk_live_\" or \"sk_test_\"'\n );\n }\n\n this.apiKey = apiKey;\n this.baseUrl = options.baseUrl?.replace(/\\/$/, '') || DEFAULT_BASE_URL;\n this.timeout = options.timeout || DEFAULT_TIMEOUT;\n this.fetchFn = options.fetch || globalThis.fetch;\n\n // Ensure fetch is available\n if (!this.fetchFn) {\n throw new Error(\n 'fetch is not available. Please provide a fetch implementation or use Node.js 18+'\n );\n }\n\n // Initialize resources with bound request method\n const boundRequest = this.request.bind(this);\n this.emails = new EmailsResource(boundRequest);\n this.subscribers = new SubscribersResource(boundRequest);\n this.campaigns = new CampaignsResource(boundRequest);\n this.domains = new DomainsResource(boundRequest);\n this.organization = new OrganizationResource(boundRequest);\n this.workspaces = new WorkspacesResource(boundRequest);\n this.workflows = new WorkflowsResource(boundRequest);\n this.webhooks = new WebhooksResource(boundRequest);\n }\n\n /**\n * Make an authenticated request to the API\n */\n private async request<T>(endpoint: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n \n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await this.fetchFn(url, {\n ...options,\n signal: controller.signal,\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `sendmailos-sdk/${SDK_VERSION}`,\n 'X-SDK-Version': SDK_VERSION,\n ...options.headers,\n },\n });\n\n clearTimeout(timeoutId);\n\n // Handle rate limiting\n if (response.status === 429) {\n const retryAfter = parseInt(response.headers.get('Retry-After') || '60', 10);\n const errorData = await this.safeParseJson(response);\n throw new RateLimitError(\n errorData?.error || 'Rate limit exceeded',\n retryAfter\n );\n }\n\n // Handle authentication errors\n if (response.status === 401) {\n throw new AuthenticationError();\n }\n\n // Handle other errors\n if (!response.ok) {\n const errorData = await this.safeParseJson(response) as ApiError | null;\n throw new SendMailOSError(\n errorData?.error || `Request failed with status ${response.status}`,\n errorData?.code || 'UNKNOWN_ERROR',\n response.status\n );\n }\n\n return response.json() as Promise<T>;\n } catch (error) {\n clearTimeout(timeoutId);\n \n if (error instanceof SendMailOSError) {\n throw error;\n }\n \n if (error instanceof Error && error.name === 'AbortError') {\n throw new SendMailOSError('Request timeout', 'TIMEOUT', 408);\n }\n \n throw new SendMailOSError(\n error instanceof Error ? error.message : 'Unknown error',\n 'NETWORK_ERROR',\n 0\n );\n }\n }\n\n private async safeParseJson(response: Response): Promise<ApiError | null> {\n try {\n return await response.json();\n } catch {\n return null;\n }\n }\n\n /**\n * Check if the API key is valid (test mode only)\n */\n get isTestMode(): boolean {\n return this.apiKey.startsWith('sk_test_');\n }\n\n /**\n * Get the SDK version\n */\n static get version(): string {\n return SDK_VERSION;\n }\n}\n","export interface PixelConfig {\n /** Public API key (pk_live_... or pk_test_...) or legacy token */\n token: string;\n /** API endpoint for tracking events */\n endpoint?: string;\n /** Cookie name for anonymous ID storage */\n cookieName?: string;\n /** Enable debug logging */\n debug?: boolean;\n /** Respect Do Not Track browser setting (default: true) */\n respectDNT?: boolean;\n}\n\n/** Alias for PixelConfig for SDK consistency */\nexport type PixelOptions = PixelConfig;\n\nexport interface TrackProps {\n [key: string]: string | number | boolean | null | undefined | object;\n}\n\n/** Alias for TrackProps */\nexport type TrackEventProperties = TrackProps;\n\n/** Traits for identify calls */\nexport interface IdentifyTraits {\n first_name?: string;\n last_name?: string;\n [key: string]: string | number | boolean | null | undefined | object;\n}\n\n/** Dynamic rule for context detection */\ninterface PixelRule {\n match_type: 'exact' | 'contains' | 'regex';\n url_pattern: string;\n page_type: string;\n selectors?: Record<string, string>;\n}\n\nconst OPT_OUT_KEY = 'smp_opt_out';\nconst IDENTIFIED_EMAIL_KEY = 'smp_identified_email';\n\nexport class SendmailPixel {\n private config: PixelConfig;\n private anonymousId: string;\n private initialized: boolean = false;\n private rules: PixelRule[] = [];\n private identifiedEmail: string | null = null;\n\n constructor(config: PixelConfig) {\n this.config = {\n endpoint: 'https://sendmailos.com/api/pixel/track',\n cookieName: 'sm_anon_id',\n debug: false,\n respectDNT: true,\n ...config\n };\n this.anonymousId = this.getOrSetAnonymousId();\n this.identifiedEmail = this.getStoredEmail();\n }\n\n public init() {\n if (this.initialized) return;\n\n if (typeof window === 'undefined') {\n return; // Server-side safety\n }\n\n // Check for opt-out\n if (this.isOptedOut()) {\n this.log('Tracking disabled (user opted out)');\n return;\n }\n\n // Check for Do Not Track\n if (this.config.respectDNT && this.isDNTEnabled()) {\n this.log('Tracking disabled (Do Not Track enabled)');\n return;\n }\n\n this.initialized = true;\n\n // Check URL for subscriber ID from email clicks\n this.checkUrlForSubscriber();\n\n // 0. Load Dynamic Rules (Async)\n this.loadRules();\n\n // 1. Auto-track Page View\n this.pageView();\n\n // 2. Setup Form Auto-Detection\n this.setupFormListeners();\n\n // 3. Track History State Changes (SPA Support)\n this.setupHistoryListeners();\n\n // 4. Setup data attribute tracking\n this.setupDataAttributeTracking();\n\n this.log('Pixel initialized with Token:', this.config.token);\n }\n\n /**\n * Opt out of all tracking\n */\n public optOut(): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(OPT_OUT_KEY, 'true');\n }\n this.log('User opted out of tracking');\n }\n\n /**\n * Opt back in to tracking\n */\n public optIn(): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(OPT_OUT_KEY);\n }\n if (!this.initialized && typeof window !== 'undefined') {\n this.init();\n }\n this.log('User opted in to tracking');\n }\n\n /**\n * Check if user has opted out\n */\n public isOptedOut(): boolean {\n if (typeof localStorage === 'undefined') return false;\n return localStorage.getItem(OPT_OUT_KEY) === 'true';\n }\n\n /**\n * Reset identity (e.g., on logout)\n */\n public reset(): void {\n this.identifiedEmail = null;\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(IDENTIFIED_EMAIL_KEY);\n }\n // Generate new anonymous ID\n this.anonymousId = crypto.randomUUID();\n this.setCookie(this.config.cookieName!, this.anonymousId, 365);\n this.log('Identity reset');\n }\n\n /**\n * Get current visitor/anonymous ID\n */\n public getVisitorId(): string {\n return this.anonymousId;\n }\n\n /**\n * Get identified email address\n */\n public getIdentifiedEmail(): string | null {\n return this.identifiedEmail;\n }\n\n public track(eventName: string, properties: TrackProps = {}) {\n this.sendEvent('track', {\n event_name: eventName,\n properties\n });\n }\n\n public identify(email: string, traits: TrackProps = {}) {\n if (this.isOptedOut()) return;\n\n this.identifiedEmail = email;\n this.storeEmail(email);\n\n this.sendEvent('identify', {\n email,\n traits\n });\n }\n\n public pageView() {\n this.track('page_view', {\n path: window.location.pathname,\n title: document.title,\n referrer: document.referrer,\n url: window.location.href\n });\n }\n\n // --- INTERNAL HELPERS ---\n\n private getOrSetAnonymousId(): string {\n if (typeof document === 'undefined') return '';\n\n let id = this.getCookie(this.config.cookieName!);\n if (!id) {\n id = crypto.randomUUID();\n this.setCookie(this.config.cookieName!, id, 365);\n }\n return id;\n }\n\n private sendEvent(type: 'track' | 'identify', payload: any) {\n if (typeof window === 'undefined') return;\n\n // Auto-Enrichment (Smart Context)\n const smartContext = this.detectContext();\n\n const body = {\n type,\n token: this.config.token, // Send Token\n anonymous_id: this.anonymousId,\n url: window.location.href,\n timestamp: new Date().toISOString(),\n ...payload\n };\n\n // Capture UTMs on first touch -> sent via context in API\n // For simplicity, we just send context\n const context = {\n userAgent: navigator.userAgent,\n locale: navigator.language,\n screen: { width: window.screen.width, height: window.screen.height },\n search: window.location.search,\n title: document.title,\n referrer: document.referrer,\n ...smartContext // Merge smart context\n };\n\n const finalBody = { ...body, context };\n\n // Use Beacon API if available (better for page unload)\n if (navigator.sendBeacon && type === 'track') {\n const blob = new Blob([JSON.stringify(finalBody)], { type: 'application/json' });\n navigator.sendBeacon(this.config.endpoint!, blob);\n } else {\n fetch(this.config.endpoint!, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(finalBody),\n keepalive: true\n }).catch(err => {\n if (this.config.debug) console.error('[Pixel Error]', err);\n });\n }\n\n this.log(`Event Sent [${type}]`, body);\n }\n\n // Call this after init to load rules\n public async loadRules() {\n if (typeof window === 'undefined') return;\n try {\n // Updated Endpoint Query Param\n const res = await fetch(`${this.config.endpoint?.replace('/track', '')}/rules?token=${this.config.token}`);\n if (res.ok) {\n const data = await res.json();\n this.rules = data.rules || [];\n }\n } catch (e) {\n // silent fail\n }\n }\n\n /**\n * Smart Auto-Detection of Page Type & Context\n * Uses Dynamic Rules + Static Heuristics\n */\n private detectContext(): any {\n if (typeof document === 'undefined') return {};\n\n const path = window.location.pathname.toLowerCase();\n let context: any = {\n page_type: 'general', // Default\n topics: []\n };\n\n // 0. CHECK DYNAMIC RULES (Database / AI Optimized)\n for (const rule of this.rules) {\n let matched = false;\n // URL Pattern Match\n try {\n if (rule.match_type === 'exact' && path === rule.url_pattern) matched = true;\n else if (rule.match_type === 'contains' && path.includes(rule.url_pattern)) matched = true;\n else if (rule.match_type === 'regex' && new RegExp(rule.url_pattern).test(path)) matched = true;\n } catch (e) { }\n\n if (matched) {\n context.page_type = rule.page_type;\n\n // Extract Data via Selectors\n if (rule.selectors) {\n for (const [key, selector] of Object.entries(rule.selectors)) {\n const el = document.querySelector(selector as string);\n if (el) {\n // Try value (input), then textContent, then content (meta)\n const val = (el as HTMLInputElement).value || el.textContent || el.getAttribute('content');\n if (val) context[key] = val.trim();\n }\n }\n }\n // Stop after first strong match? Or continue to merge? \n // Let's stop to allow override of default heuristics.\n return context;\n }\n }\n\n // --- FALLBACK TO STATIC HEURISTICS ---\n\n // 1. URL Heuristics\n if (path.match(/\\/(cart|basket|bag)/)) context.page_type = 'cart';\n else if (path.match(/\\/(checkout|payment|order)/)) context.page_type = 'checkout';\n else if (path.match(/\\/(product|item|p)\\//)) context.page_type = 'product';\n else if (path.match(/\\/(category|c|collection)\\//)) context.page_type = 'category';\n else if (path.match(/\\/(blog|article|post|news)/)) context.page_type = 'content';\n else if (path.match(/\\/(login|signin)/)) context.page_type = 'auth';\n else if (path.match(/\\/(signup|register)/)) context.page_type = 'auth';\n else if (path.match(/\\/(pricing|plans)/)) context.page_type = 'pricing';\n else if (path.match(/\\/(thank-you|confirmation|success)/)) context.page_type = 'purchase_success';\n\n // 2. DOM/Meta Heuristics (Stronger Signals)\n\n // Product? (Schema.org or OG Tags)\n const ogType = document.querySelector('meta[property=\"og:type\"]')?.getAttribute('content');\n if (ogType === 'product') {\n context.page_type = 'product';\n // Try to scrape price\n const price = document.querySelector('meta[property=\"product:price:amount\"]')?.getAttribute('content');\n if (price) context.product_price = price;\n const currency = document.querySelector('meta[property=\"product:price:currency\"]')?.getAttribute('content');\n if (currency) context.currency = currency;\n }\n\n // Cart?\n if (document.querySelector('.cart-total') || document.querySelector('#cart-summary')) {\n context.page_type = 'cart';\n }\n\n // Checkout?\n if (document.querySelector('#card-element') || document.querySelector('input[name=\"card_number\"]')) {\n context.page_type = 'checkout';\n }\n\n // 3. Content Scraping (Keywords)\n const text = document.body.innerText.toLowerCase().slice(0, 2000); // Check first 2k chars\n if (text.includes('out of stock')) context.stock_status = 'out_of_stock';\n if (text.includes('limited time')) context.urgency = 'high';\n\n return context;\n }\n\n private setupFormListeners() {\n if (typeof document === 'undefined') return;\n\n // Debounce to avoid performance hit\n document.addEventListener('submit', (e) => {\n const form = e.target as HTMLFormElement;\n if (!form) return;\n\n // Look for email input\n const emailInput = form.querySelector('input[type=\"email\"]') as HTMLInputElement;\n if (emailInput && emailInput.value) {\n this.log('Auto-detected email form submission', emailInput.value);\n this.identify(emailInput.value);\n }\n }, true); // Capture phase to catch it before propagation stops\n }\n\n private setupHistoryListeners() {\n if (typeof window === 'undefined') return;\n\n const pushState = history.pushState;\n history.pushState = (...args) => {\n pushState.apply(history, args);\n this.pageView();\n };\n\n window.addEventListener('popstate', () => {\n this.pageView();\n });\n }\n\n // --- COOKIE UTILS ---\n\n private setCookie(name: string, value: string, days: number) {\n const d = new Date();\n d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));\n const expires = \"expires=\" + d.toUTCString();\n document.cookie = name + \"=\" + value + \";\" + expires + \";path=/;SameSite=Lax\";\n }\n\n private getCookie(name: string): string | null {\n const nameEQ = name + \"=\";\n const ca = document.cookie.split(';');\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) == ' ') c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);\n }\n return null;\n }\n\n private log(...args: unknown[]) {\n if (this.config.debug) {\n console.log('[SendmailPixel]', ...args);\n }\n }\n\n private isDNTEnabled(): boolean {\n if (typeof navigator === 'undefined') return false;\n return navigator.doNotTrack === '1' ||\n (window as unknown as { doNotTrack?: string }).doNotTrack === '1';\n }\n\n private checkUrlForSubscriber(): void {\n if (typeof window === 'undefined') return;\n\n const params = new URLSearchParams(window.location.search);\n const subscriberEmail = params.get('smp_email');\n const subscriberId = params.get('smp_sub');\n\n if (subscriberEmail) {\n try {\n const email = atob(subscriberEmail);\n if (this.isValidEmail(email)) {\n this.identify(email);\n }\n } catch {\n if (this.isValidEmail(subscriberEmail)) {\n this.identify(subscriberEmail);\n }\n }\n } else if (subscriberId) {\n this.track('email_link_clicked', { subscriber_id: subscriberId });\n }\n }\n\n private setupDataAttributeTracking(): void {\n if (typeof document === 'undefined') return;\n\n document.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n const tracked = target.closest('[data-smp-track]');\n\n if (tracked) {\n const eventName = tracked.getAttribute('data-smp-track');\n const properties: TrackProps = {};\n\n Array.from(tracked.attributes).forEach((attr) => {\n if (attr.name.startsWith('data-smp-track-') && attr.name !== 'data-smp-track') {\n const propName = attr.name.replace('data-smp-track-', '').replace(/-/g, '_');\n properties[propName] = attr.value;\n }\n });\n\n if (eventName) {\n this.track(eventName, properties);\n }\n }\n });\n }\n\n private getStoredEmail(): string | null {\n if (typeof localStorage === 'undefined') return null;\n return localStorage.getItem(IDENTIFIED_EMAIL_KEY);\n }\n\n private storeEmail(email: string): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(IDENTIFIED_EMAIL_KEY, email);\n }\n }\n\n private isValidEmail(email: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n }\n}\n\n/** Alias for SendmailPixel for SDK consistency */\nexport const Pixel = SendmailPixel;\n\n/**\n * Create pixel and attach global smp() function\n */\nexport function createGlobalPixel(config: PixelConfig): SendmailPixel {\n const pixel = new SendmailPixel(config);\n\n if (typeof window !== 'undefined') {\n const smpFunction = (method: string, ...args: unknown[]): unknown => {\n switch (method) {\n case 'track':\n pixel.track(args[0] as string, args[1] as TrackProps);\n return undefined;\n case 'identify':\n pixel.identify(args[0] as string, args[1] as TrackProps);\n return undefined;\n case 'page':\n pixel.pageView();\n return undefined;\n case 'optOut':\n pixel.optOut();\n return undefined;\n case 'optIn':\n pixel.optIn();\n return undefined;\n case 'isOptedOut':\n return pixel.isOptedOut();\n case 'reset':\n pixel.reset();\n return undefined;\n default:\n console.warn(`[SendmailPixel] Unknown method: ${method}`);\n return undefined;\n }\n };\n (window as unknown as { smp: typeof smpFunction }).smp = smpFunction;\n }\n\n pixel.init();\n return pixel;\n}\n","/**\n * Webhook signature verification utilities\n * \n * IMPORTANT: This module uses timing-safe comparison to prevent timing attacks.\n */\n\nexport interface VerifyWebhookParams {\n /** Raw request body as string */\n payload: string;\n /** Value of X-SendMailOS-Signature header */\n signature: string;\n /** Value of X-SendMailOS-Timestamp header */\n timestamp: string;\n /** Your webhook signing secret */\n secret: string;\n /** Maximum age in seconds (default: 300 = 5 minutes) */\n tolerance?: number;\n}\n\n/**\n * Verify a webhook signature to ensure the request came from SendMailOS\n * \n * @example\n * ```ts\n * import { verifyWebhookSignature } from '@sendmailos/sdk';\n * \n * app.post('/webhooks', (req, res) => {\n * const isValid = verifyWebhookSignature({\n * payload: JSON.stringify(req.body),\n * signature: req.headers['x-sendmailos-signature'],\n * timestamp: req.headers['x-sendmailos-timestamp'],\n * secret: process.env.WEBHOOK_SECRET\n * });\n * \n * if (!isValid) {\n * return res.status(401).json({ error: 'Invalid signature' });\n * }\n * \n * // Process webhook...\n * });\n * ```\n */\nexport function verifyWebhookSignature(params: VerifyWebhookParams): boolean {\n const { payload, signature, timestamp, secret, tolerance = 300 } = params;\n\n // Validate inputs\n if (!payload || !signature || !timestamp || !secret) {\n return false;\n }\n\n // Prevent replay attacks - check timestamp age\n const timestampInt = parseInt(timestamp, 10);\n if (isNaN(timestampInt)) {\n return false;\n }\n\n const age = Math.floor(Date.now() / 1000) - timestampInt;\n if (age > tolerance) {\n console.warn('[SendMailOS] Webhook timestamp too old:', age, 'seconds');\n return false;\n }\n\n // Node.js crypto (server-side)\n if (typeof globalThis.crypto !== 'undefined' && 'subtle' in globalThis.crypto) {\n // Use SubtleCrypto for browser/edge environments\n // Note: This is synchronous verification, use verifyWebhookSignatureAsync for async\n return verifySync(payload, signature, timestamp, secret);\n }\n\n return verifySync(payload, signature, timestamp, secret);\n}\n\n/**\n * Async version of webhook verification (recommended for edge/browser)\n */\nexport async function verifyWebhookSignatureAsync(params: VerifyWebhookParams): Promise<boolean> {\n const { payload, signature, timestamp, secret, tolerance = 300 } = params;\n\n if (!payload || !signature || !timestamp || !secret) {\n return false;\n }\n\n const timestampInt = parseInt(timestamp, 10);\n if (isNaN(timestampInt)) {\n return false;\n }\n\n const age = Math.floor(Date.now() / 1000) - timestampInt;\n if (age > tolerance) {\n return false;\n }\n\n const message = `${timestamp}.${payload}`;\n \n // Use Web Crypto API\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n \n const signatureBytes = await crypto.subtle.sign(\n 'HMAC',\n key,\n encoder.encode(message)\n );\n \n const expectedSig = bufferToHex(signatureBytes);\n \n // Timing-safe comparison\n return timingSafeEqual(signature, expectedSig);\n}\n\n// ============ Internal Helpers ============\n\nfunction verifySync(payload: string, signature: string, timestamp: string, secret: string): boolean {\n try {\n // Try Node.js crypto first\n const crypto = require('crypto');\n const message = `${timestamp}.${payload}`;\n const expectedSig = crypto\n .createHmac('sha256', secret)\n .update(message)\n .digest('hex');\n \n // Use timing-safe comparison\n return crypto.timingSafeEqual(\n Buffer.from(signature),\n Buffer.from(expectedSig)\n );\n } catch {\n // Fallback for non-Node environments\n console.warn('[SendMailOS] Use verifyWebhookSignatureAsync for browser/edge');\n return false;\n }\n}\n\nfunction bufferToHex(buffer: ArrayBuffer): string {\n return Array.from(new Uint8Array(buffer))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nfunction timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false;\n }\n \n let result = 0;\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return result === 0;\n}\n\n/**\n * Construct a webhook event from raw request data\n */\nexport function constructWebhookEvent<T = unknown>(\n payload: string,\n headers: { signature: string; timestamp: string },\n secret: string\n): T {\n const isValid = verifyWebhookSignature({\n payload,\n signature: headers.signature,\n timestamp: headers.timestamp,\n secret,\n });\n\n if (!isValid) {\n throw new Error('Invalid webhook signature');\n }\n\n return JSON.parse(payload) as T;\n}\n"]}
@@ -7,7 +7,7 @@ var jsxRuntime = require('react/jsx-runtime');
7
7
  var SendMailOSContext = react.createContext(null);
8
8
  function SendMailOSProvider({
9
9
  publicKey,
10
- baseUrl = "https://api.sendmailos.com/api/v1",
10
+ baseUrl = "https://sendmailos.com/api/v1",
11
11
  children
12
12
  }) {
13
13
  if (!publicKey) {