{"openapi":"3.0.0","info":{"title":"Rock Solid Waivers API","version":"1.0.0","description":"The Rock Solid Waivers API allows you to integrate digital waiver functionality into your applications. Built for Australian businesses, it provides waiver management, electronic signatures, video safety waiver evidence, webhooks, and compliance tracking.","contact":{"name":"Rock Solid Waivers Support","email":"support@rocksolidwaivers.com","url":"https://rocksolidwaivers.com"},"license":{"name":"Proprietary","url":"https://rocksolidwaivers.com/terms"},"x-logo":{"url":"https://rocksolidwaivers.com/logos/512x512-colour.png","altText":"Rock Solid Waivers Logo"}},"externalDocs":{"description":"Full API Documentation","url":"https://rocksolidwaivers.com/docs"},"servers":[{"url":"https://rocksolidwaivers.com/api","description":"Production server"}],"components":{"securitySchemes":{"sessionAuth":{"type":"apiKey","in":"header","name":"x-session-id","description":"Session-based authentication using session ID"},"apiKey":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key authentication for server-to-server integrations. Format: rsw_live_<32-char-hex>"}},"schemas":{"Organization":{"type":"object","properties":{"_id":{"type":"string","description":"Unique organization identifier"},"name":{"type":"string","description":"Organization name"},"slug":{"type":"string","description":"URL-friendly organization identifier"},"domain":{"type":"string","nullable":true,"description":"Organization website domain"},"contactEmail":{"type":"string","format":"email","description":"Primary contact email"},"isActive":{"type":"boolean","description":"Organization status"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["_id","name","slug","contactEmail","isActive","createdAt","updatedAt"]},"Template":{"type":"object","properties":{"_id":{"type":"string","description":"Unique template identifier"},"organizationId":{"type":"string","description":"Organization that owns this template"},"name":{"type":"string","description":"Template name"},"description":{"type":"string","description":"Template description"},"content":{"type":"object","properties":{"title":{"type":"string","description":"Waiver title"},"htmlContent":{"type":"string","description":"Rich HTML content"},"body":{"type":"string","description":"Plain text content"}}},"fields":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Field name"},"label":{"type":"string","description":"Field label"},"type":{"type":"string","enum":["text","email","phone","date","checkbox","signature"]},"required":{"type":"boolean","description":"Whether field is required"},"placeholder":{"type":"string","description":"Field placeholder text"}}}},"isActive":{"type":"boolean","description":"Template status"},"version":{"type":"number","description":"Template version number"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["_id","organizationId","name","content","fields","isActive","version","createdAt","updatedAt"]},"Waiver":{"type":"object","properties":{"_id":{"type":"string","description":"Unique waiver identifier"},"submissionId":{"type":"string","description":"Human-readable submission ID"},"organizationId":{"type":"string","description":"Organization that owns this waiver"},"templateId":{"type":"string","description":"Template used for this waiver"},"templateName":{"type":"string","description":"Template name at time of signing"},"participantData":{"type":"object","properties":{"name":{"type":"string","description":"Participant full name"},"email":{"type":"string","format":"email","description":"Participant email"},"phone":{"type":"string","description":"Participant phone number"},"dateOfBirth":{"type":"string","format":"date","description":"Participant date of birth"},"emergencyContact":{"type":"string","description":"Emergency contact name"},"emergencyPhone":{"type":"string","description":"Emergency contact phone"}},"required":["name","email"]},"formData":{"type":"object","description":"All form field responses"},"signature":{"type":"object","properties":{"data":{"type":"string","description":"Base64 encoded signature image"},"timestamp":{"type":"string","format":"date-time","description":"When signature was captured"}},"required":["data","timestamp"]},"ipAddress":{"type":"string","description":"IP address of signer"},"userAgent":{"type":"string","description":"Browser user agent"},"submittedAt":{"type":"string","format":"date-time","description":"Submission timestamp"},"status":{"type":"string","enum":["completed","pending","expired"],"description":"Waiver status"}},"required":["_id","submissionId","organizationId","templateId","participantData","signature","submittedAt","status"]},"User":{"type":"object","properties":{"_id":{"type":"string","description":"Unique user identifier"},"email":{"type":"string","format":"email","description":"User email address"},"name":{"type":"string","description":"User full name"},"organizationId":{"type":"string","description":"Organization user belongs to"},"role":{"type":"string","enum":["admin","manager","staff","user"],"description":"User role"},"permissions":{"type":"array","items":{"type":"string","enum":["read","write","delete","admin"]},"description":"User permissions"},"isActive":{"type":"boolean","description":"User status"},"emailVerified":{"type":"boolean","description":"Email verification status"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["_id","email","name","organizationId","role","permissions","isActive","createdAt","updatedAt"]},"ApiResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether request was successful"},"data":{"type":"object","description":"Response data"},"message":{"type":"string","description":"Response message"},"error":{"type":"string","description":"Error message if request failed"}},"required":["success"]},"ErrorResponse":{"type":"object","properties":{"error":{"type":"string","description":"Error message"},"code":{"type":"string","description":"Error code"},"details":{"type":"object","description":"Additional error details"}},"required":["error"]},"Module":{"type":"object","properties":{"_id":{"type":"string","description":"Unique module identifier"},"moduleId":{"type":"string","description":"Module identifier key"},"name":{"type":"string","description":"Module name"},"description":{"type":"string","description":"Module description"},"category":{"type":"string","enum":["essential","advanced","enterprise"],"description":"Module category"},"pricing":{"type":"object","properties":{"monthly":{"type":"number","description":"Monthly price in AUD"},"yearly":{"type":"number","description":"Yearly price in AUD"},"currency":{"type":"string","default":"AUD"}}},"features":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}}}},"icon":{"type":"string","description":"Module icon"},"isPopular":{"type":"boolean","description":"Whether module is marked as popular"},"isActive":{"type":"boolean","description":"Module availability status"},"metadata":{"type":"object","properties":{"trialIncluded":{"type":"boolean","description":"Whether module is included in trial"},"isFreeTier":{"type":"boolean","description":"Whether module is free"},"conflictsWith":{"type":"array","items":{"type":"string"},"description":"Conflicting module IDs"},"requires":{"type":"array","items":{"type":"string"},"description":"Required module dependencies"}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["_id","moduleId","name","description","category","pricing","features","isActive","createdAt","updatedAt"]},"Subscription":{"type":"object","properties":{"status":{"type":"string","enum":["trial","active","cancelled","past_due"],"description":"Subscription status"},"trialEndsAt":{"type":"string","format":"date-time","description":"Trial end date"},"nextBillingDate":{"type":"string","format":"date-time","description":"Next billing date"},"totalMonthlyCost":{"type":"number","description":"Total monthly cost in AUD"},"features":{"type":"object","properties":{"purchasedFeatures":{"type":"array","items":{"type":"string"},"description":"List of purchased module IDs"}}},"stripeCustomerId":{"type":"string","description":"Stripe customer ID"},"stripeSubscriptionId":{"type":"string","description":"Stripe subscription ID"}}},"WebhookConfig":{"type":"object","properties":{"_id":{"type":"string","description":"Unique webhook configuration identifier"},"organizationId":{"type":"string","description":"Organization that owns this webhook"},"configScope":{"type":"string","enum":["organization","tenant"],"description":"Whether the webhook is shared across the organization or limited to one tenant"},"tenantId":{"type":"string","description":"Server-derived tenant identifier for tenant-scoped webhooks"},"name":{"type":"string","description":"Webhook name for identification"},"url":{"type":"string","format":"uri","description":"Webhook endpoint URL (HTTPS recommended)"},"events":{"type":"array","items":{"type":"string","enum":["waiver.submitted","waiver.verified","waiver.expiring_soon","waiver.expired","waiver.updated","waiver.deleted","template.created","template.updated","template.archived","template.deleted"]},"description":"Events that trigger this webhook"},"isActive":{"type":"boolean","description":"Whether webhook is enabled"},"headers":{"type":"object","additionalProperties":{"type":"string"},"description":"Custom headers to include in webhook requests"},"retryPolicy":{"type":"object","properties":{"maxRetries":{"type":"number","minimum":0,"maximum":10,"default":3,"description":"Maximum retry attempts"},"retryDelay":{"type":"number","minimum":1,"maximum":3600,"default":60,"description":"Delay between retries in seconds"}}},"lastTriggered":{"type":"string","format":"date-time","description":"Last time webhook was triggered"},"successCount":{"type":"number","description":"Number of successful deliveries"},"failureCount":{"type":"number","description":"Number of failed deliveries"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["_id","organizationId","name","url","events","isActive","createdAt","updatedAt"]},"WebhookPayload":{"type":"object","properties":{"event":{"type":"string","description":"Event type that triggered the webhook"},"timestamp":{"type":"string","format":"date-time","description":"When the webhook was triggered"},"organizationId":{"type":"string","description":"Organization ID"},"data":{"type":"object","description":"Event-specific payload data (see webhook documentation for event schemas)"}},"required":["event","timestamp","organizationId","data"]},"WaiverSubmittedWebhook":{"type":"object","description":"The data object sent inside the webhook envelope for waiver.submitted events. All top-level fields are always present; non-applicable sections are null or empty arrays.","properties":{"waiverId":{"type":"string","description":"Unique signed waiver identifier"},"templateId":{"type":"string","description":"Template used for this waiver"},"templateName":{"type":"string","description":"Template name at the time of signing"},"templateType":{"type":"string","enum":["text","video"],"description":"Whether the signed template was a text or video waiver"},"isGuardianSigning":{"type":"boolean","description":"True when a parent/guardian signed on behalf of one or more minors"},"numberOfMinors":{"type":"integer","description":"Number of minors represented by this waiver; 0 for adult self-signing"},"signerInfo":{"type":"object","description":"The signer details. For guardian submissions this is the guardian, not the minor.","properties":{"firstName":{"type":"string","description":"Signer first name"},"lastName":{"type":"string","description":"Signer last name"},"email":{"type":"string","format":"email","description":"Signer email"},"phone":{"type":"string","description":"Signer phone number"},"dateOfBirth":{"type":"string","nullable":true,"description":"Signer date of birth for adult self-signing; null for guardian submissions"}},"required":["firstName","lastName","email","phone","dateOfBirth"]},"guardianInfo":{"type":"object","nullable":true,"description":"Guardian details for minor submissions; null for adult self-signing.","properties":{"fullName":{"type":"string","nullable":true},"email":{"type":"string","nullable":true,"format":"email"},"phone":{"type":"string","nullable":true},"relationship":{"type":"string"}}},"participants":{"type":"array","description":"Minor participants for guardian submissions. Empty for adult self-signing.","items":{"type":"object","properties":{"fullName":{"type":"string"},"dateOfBirth":{"type":"string"},"customFields":{"type":"object","additionalProperties":true}},"required":["fullName","dateOfBirth","customFields"]}},"videoCompletion":{"type":"object","nullable":true,"description":"Submission-time video summary generated from the template videos for video waivers; null for text waivers.","properties":{"completedAt":{"type":"string","format":"date-time"},"videosWatched":{"type":"array","items":{"type":"object","properties":{"videoId":{"type":"string","nullable":true},"name":{"type":"string"},"watchedPercentage":{"type":"number"},"checkpointsPassed":{"type":"integer"},"checkpointsTotal":{"type":"integer"}},"required":["name","watchedPercentage","checkpointsPassed","checkpointsTotal"]}},"passed":{"type":"boolean"}},"required":["completedAt","videosWatched","passed"]},"formData":{"type":"object","description":"Raw form field responses. Group submissions also include waiverGroupId, groupType, and groupRole.","additionalProperties":true},"compliance":{"type":"object","properties":{"certificateId":{"type":"string","description":"Compliance certificate/submission ID"},"signedAt":{"type":"string","format":"date-time","description":"When the waiver was signed/submitted"},"ipAddress":{"type":"string","description":"IP address of signer"},"userAgent":{"type":"string","description":"Browser user agent"},"signatureMethod":{"type":"string","enum":["electronic"],"description":"Signature method used by Rock Solid Waivers"},"devicePlatform":{"type":"string","enum":["mobile","desktop"],"description":"Derived from the signer user agent"}},"required":["certificateId","signedAt","ipAddress","userAgent","signatureMethod","devicePlatform"]},"organization":{"type":"object","properties":{"id":{"type":"string","description":"Organization ID"},"name":{"type":"string","description":"Organization name"}},"required":["id","name"]},"status":{"type":"string","enum":["completed"],"description":"Submitted waiver status"}},"required":["waiverId","templateId","templateName","templateType","isGuardianSigning","numberOfMinors","signerInfo","guardianInfo","participants","videoCompletion","formData","compliance","organization","status"]}}},"paths":{"/auth/signup":{"post":{"tags":["Authentication"],"summary":"Register new organization","description":"Create a new organization account with admin user","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"organizationName":{"type":"string","description":"Organization name"},"slug":{"type":"string","description":"URL-friendly organization identifier"},"contactEmail":{"type":"string","format":"email","description":"Organization contact email"},"adminName":{"type":"string","description":"Administrator full name"},"adminEmail":{"type":"string","format":"email","description":"Administrator email"},"phone":{"type":"string","description":"Administrator phone number"},"plan":{"type":"string","enum":["basic","starter","professional","enterprise"],"description":"Subscription plan"},"website":{"type":"string","description":"Organization website URL"}},"required":["organizationName","slug","contactEmail","adminName","adminEmail","phone","plan"]}}}},"responses":{"200":{"description":"Organization created successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"object","properties":{"organizationId":{"type":"string"},"organizationName":{"type":"string"},"adminEmail":{"type":"string"},"plan":{"type":"string"},"trialEndsAt":{"type":"string","format":"date-time"}}}}}]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Organization slug or email already exists","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/templates":{"get":{"tags":["Templates"],"summary":"List waiver templates","description":"Get all templates for the authenticated organization","security":[{"sessionAuth":[]},{"apiKey":[]}],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Page number"},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"description":"Items per page"},{"name":"active","in":"query","schema":{"type":"boolean"},"description":"Filter by active status"}],"responses":{"200":{"description":"Templates retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"object","properties":{"templates":{"type":"array","items":{"$ref":"#/components/schemas/Template"}},"pagination":{"type":"object","properties":{"page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"},"pages":{"type":"integer"}}}}}}}]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["Templates"],"summary":"Create waiver template","description":"Create a new waiver template","security":[{"sessionAuth":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Template name"},"description":{"type":"string","description":"Template description"},"content":{"type":"object","properties":{"title":{"type":"string","description":"Waiver title"},"htmlContent":{"type":"string","description":"Rich HTML content"},"body":{"type":"string","description":"Plain text content"}},"required":["title"]},"fields":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"label":{"type":"string"},"type":{"type":"string","enum":["text","email","phone","date","checkbox","signature"]},"required":{"type":"boolean"},"placeholder":{"type":"string"}},"required":["name","label","type"]}}},"required":["name","content","fields"]}}}},"responses":{"201":{"description":"Template created successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Template"}}}]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/templates/{id}":{"get":{"tags":["Templates"],"summary":"Get template by ID","description":"Retrieve a specific template by its ID","security":[{"sessionAuth":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Template ID"}],"responses":{"200":{"description":"Template retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Template"}}}]}}}},"404":{"description":"Template not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["Templates"],"summary":"Update template","description":"Update an existing template","security":[{"sessionAuth":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Template ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"content":{"type":"object","properties":{"title":{"type":"string"},"htmlContent":{"type":"string"},"body":{"type":"string"}}},"fields":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"label":{"type":"string"},"type":{"type":"string"},"required":{"type":"boolean"},"placeholder":{"type":"string"}}}},"isActive":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Template updated successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Template"}}}]}}}},"404":{"description":"Template not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["Templates"],"summary":"Delete template","description":"Delete a template (soft delete - marks as inactive)","security":[{"sessionAuth":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Template ID"}],"responses":{"200":{"description":"Template deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Template not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/waivers":{"get":{"tags":["Waivers"],"summary":"List signed waivers","description":"Get all signed waivers for the authenticated organization","security":[{"sessionAuth":[]},{"apiKey":[]}],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Page number"},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"description":"Items per page"},{"name":"templateId","in":"query","schema":{"type":"string"},"description":"Filter by template ID"},{"name":"startDate","in":"query","schema":{"type":"string","format":"date"},"description":"Filter waivers from this date"},{"name":"endDate","in":"query","schema":{"type":"string","format":"date"},"description":"Filter waivers until this date"},{"name":"search","in":"query","schema":{"type":"string"},"description":"Search by participant name or email"}],"responses":{"200":{"description":"Waivers retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"object","properties":{"waivers":{"type":"array","items":{"$ref":"#/components/schemas/Waiver"}},"pagination":{"type":"object","properties":{"page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"},"pages":{"type":"integer"}}}}}}}]}}}}}}},"/waivers/{id}":{"get":{"tags":["Waivers"],"summary":"Get waiver by ID","description":"Retrieve a specific signed waiver by its ID","security":[{"sessionAuth":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Waiver ID"}],"responses":{"200":{"description":"Waiver retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Waiver"}}}]}}}},"404":{"description":"Waiver not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/waivers/{id}/pdf":{"get":{"tags":["Waivers"],"summary":"Download waiver PDF","description":"Generate and download a PDF version of the signed waiver","security":[{"sessionAuth":[]},{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Waiver ID"}],"responses":{"200":{"description":"PDF generated successfully","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"404":{"description":"Waiver not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/modules":{"get":{"tags":["Modules"],"summary":"List available modules","description":"Get all available modules and current subscription status","security":[{"sessionAuth":[]}],"parameters":[{"name":"category","in":"query","schema":{"type":"string","enum":["essential","advanced","enterprise"]},"description":"Filter modules by category"}],"responses":{"200":{"description":"Modules retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"object","properties":{"modules":{"type":"array","items":{"$ref":"#/components/schemas/Module"}},"organization":{"type":"object","properties":{"isOnTrial":{"type":"boolean"},"trialEndsAt":{"type":"string","format":"date-time"},"subscription":{"$ref":"#/components/schemas/Subscription"}}}}}}}]}}}}}},"post":{"tags":["Modules"],"summary":"Subscribe to module","description":"Subscribe to a paid module to unlock additional features","security":[{"sessionAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"moduleId":{"type":"string","description":"Module identifier to subscribe to"}},"required":["moduleId"]}}}},"responses":{"200":{"description":"Module subscription successful","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"object","properties":{"module":{"type":"object","properties":{"moduleId":{"type":"string"},"name":{"type":"string"},"monthlyPrice":{"type":"number"},"trialEndsAt":{"type":"string","format":"date-time"}}},"subscription":{"type":"object","properties":{"totalMonthlyAmount":{"type":"number"},"nextBillingDate":{"type":"string","format":"date-time"}}}}}}}]}}}},"403":{"description":"Insufficient permissions - admin required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Module already subscribed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/public/sign/{templateId}":{"get":{"tags":["Public"],"summary":"Get public signing form","description":"Retrieve the public waiver signing form for a specific template","parameters":[{"name":"templateId","in":"path","required":true,"schema":{"type":"string"},"description":"Template ID"}],"responses":{"200":{"description":"Template form retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"object","properties":{"template":{"$ref":"#/components/schemas/Template"},"organization":{"type":"object","properties":{"name":{"type":"string"},"branding":{"type":"object","properties":{"logo":{"type":"string"},"primaryColor":{"type":"string"},"secondaryColor":{"type":"string"}}}}}}}}}]}}}},"404":{"description":"Template not found or inactive","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["Public"],"summary":"Submit signed waiver","description":"Submit a completed waiver form with digital signature","parameters":[{"name":"templateId","in":"path","required":true,"schema":{"type":"string"},"description":"Template ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"participantData":{"type":"object","properties":{"name":{"type":"string","description":"Participant full name"},"email":{"type":"string","format":"email","description":"Participant email"},"phone":{"type":"string","description":"Participant phone number"},"dateOfBirth":{"type":"string","format":"date","description":"Participant date of birth"},"emergencyContact":{"type":"string","description":"Emergency contact name"},"emergencyPhone":{"type":"string","description":"Emergency contact phone"}},"required":["name","email"]},"formData":{"type":"object","description":"All form field responses"},"signature":{"type":"object","properties":{"data":{"type":"string","description":"Base64 encoded signature image"},"timestamp":{"type":"string","format":"date-time","description":"When signature was captured"}},"required":["data","timestamp"]}},"required":["participantData","formData","signature"]}}}},"responses":{"201":{"description":"Waiver submitted successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"object","properties":{"submissionId":{"type":"string","description":"Unique submission identifier"},"waiverId":{"type":"string","description":"Waiver database ID"},"confirmationEmail":{"type":"boolean","description":"Whether confirmation email was sent"}}}}}]}}}},"400":{"description":"Validation error or missing signature","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Template not found or inactive","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/migration/upload":{"post":{"tags":["Migration"],"summary":"Upload data for migration","description":"Upload Smartwaiver or CSV data for migration to Rock Solid Waivers","security":[{"sessionAuth":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"JSON or CSV file containing waiver data"},"sourceType":{"type":"string","enum":["smartwaiver","csv"],"description":"Source system type"}},"required":["file","sourceType"]}}}},"responses":{"200":{"description":"File uploaded and validated successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"object","properties":{"batchId":{"type":"string","description":"Migration batch identifier"},"recordCount":{"type":"integer","description":"Number of records found"},"validationResults":{"type":"object","properties":{"valid":{"type":"integer","description":"Number of valid records"},"invalid":{"type":"integer","description":"Number of invalid records"},"warnings":{"type":"integer","description":"Number of records with warnings"}}}}}}}]}}}},"400":{"description":"Invalid file format or validation errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/analytics/dashboard":{"get":{"tags":["Analytics"],"summary":"Get analytics dashboard data","description":"Retrieve comprehensive analytics data for the dashboard","security":[{"sessionAuth":[]},{"apiKey":[]}],"parameters":[{"name":"timeRange","in":"query","schema":{"type":"string","enum":["7d","30d","90d","1y"],"default":"30d"},"description":"Time range for analytics data"},{"name":"templateId","in":"query","schema":{"type":"string"},"description":"Filter by specific template"}],"responses":{"200":{"description":"Analytics data retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"object","properties":{"overview":{"type":"object","properties":{"totalWaivers":{"type":"integer"},"thisMonth":{"type":"integer"},"completionRate":{"type":"number"},"avgCompletionTime":{"type":"number"}}},"dailySignings":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date"},"waivers":{"type":"integer"},"completions":{"type":"integer"}}}},"templateUsage":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"number"},"count":{"type":"integer"}}}}}}}}]}}}}}}},"/settings/webhooks":{"get":{"tags":["Webhooks"],"summary":"List webhook configurations","description":"Get all webhook configurations for the authenticated organization","security":[{"sessionAuth":[]}],"responses":{"200":{"description":"Webhooks retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookConfig"}}}}]}}}},"403":{"description":"Insufficient permissions - admin or owner role required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["Webhooks"],"summary":"Create webhook configuration","description":"Create a new webhook endpoint to receive event notifications","security":[{"sessionAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Webhook name for identification"},"url":{"type":"string","format":"uri","description":"HTTPS endpoint URL that will receive webhook POSTs"},"configScope":{"type":"string","enum":["organization","tenant"],"default":"organization","description":"Tenant scope requires an active authenticated tenant context; tenantId cannot be supplied by clients"},"events":{"type":"array","items":{"type":"string","enum":["waiver.submitted","waiver.verified","waiver.expiring_soon","waiver.expired","waiver.updated","waiver.deleted","template.created","template.updated","template.archived","template.deleted"]},"minItems":1,"description":"Array of events to subscribe to"},"headers":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional custom headers to include in webhook requests"}},"required":["name","url","events"]}}}},"responses":{"201":{"description":"Webhook created successfully - secret is returned ONCE","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/WebhookConfig"},{"type":"object","properties":{"secret":{"type":"string","description":"Webhook secret for signature verification - SAVE THIS! It will not be shown again."}}}]}}}]}}}},"400":{"description":"Validation error - invalid URL or events","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Webhooks not enabled for your organization or insufficient permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/settings/api-keys":{"get":{"tags":["Authentication"],"summary":"List API keys","description":"Get all API keys for your organization","security":[{"sessionAuth":[]}],"responses":{"200":{"description":"API keys retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"_id":{"type":"string","description":"API key ID"},"name":{"type":"string","description":"API key name"},"keyPreview":{"type":"string","description":"First 8 characters of key (rsw_live_...)"},"permissions":{"type":"array","items":{"type":"string"},"description":"API key permissions"},"lastUsed":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time","nullable":true}}}}}}]}}}},"403":{"description":"API access module not enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["Authentication"],"summary":"Create API key","description":"Generate a new API key for your organization. The full key is only shown once.","security":[{"sessionAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Friendly name for the API key"},"permissions":{"type":"array","items":{"type":"string","enum":["read","write","delete"]},"description":"Permissions to grant. Default: [\"read\"]"},"expiresInDays":{"type":"number","description":"Days until expiration (optional, null = never expires)"}},"required":["name"]}}}},"responses":{"201":{"description":"API key created - full key shown ONCE","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"type":"object","properties":{"_id":{"type":"string"},"name":{"type":"string"},"key":{"type":"string","description":"Full API key (rsw_live_...) - SAVE THIS! Only shown once."},"permissions":{"type":"array","items":{"type":"string"}},"expiresAt":{"type":"string","format":"date-time","nullable":true}}}}}]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access module not enabled or insufficient permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/settings/api-keys/{id}":{"delete":{"tags":["Authentication"],"summary":"Revoke API key","description":"Permanently revoke an API key. This cannot be undone.","security":[{"sessionAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"API key ID"}],"responses":{"200":{"description":"API key revoked successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"API key not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/settings/webhooks/{id}":{"get":{"tags":["Webhooks"],"summary":"Get webhook configuration","description":"Retrieve a single webhook configuration by ID","security":[{"sessionAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Webhook configuration ID"}],"responses":{"200":{"description":"Webhook retrieved successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookConfig"}}}]}}}},"404":{"description":"Webhook not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["Webhooks"],"summary":"Update webhook configuration","description":"Update an existing webhook configuration","security":[{"sessionAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Webhook configuration ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["waiver.submitted","waiver.verified","waiver.expiring_soon","waiver.expired","waiver.updated","waiver.deleted","template.created","template.updated","template.archived","template.deleted"]}},"isActive":{"type":"boolean","description":"Enable or disable webhook"},"headers":{"type":"object","additionalProperties":{"type":"string"}}}}}}},"responses":{"200":{"description":"Webhook updated successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponse"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookConfig"}}}]}}}},"404":{"description":"Webhook not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["Webhooks"],"summary":"Delete webhook configuration","description":"Permanently delete a webhook configuration","security":[{"sessionAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Webhook configuration ID"}],"responses":{"200":{"description":"Webhook deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Webhook not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"tags":[{"name":"Authentication","description":"User authentication and organization management"},{"name":"Templates","description":"Waiver template management"},{"name":"Waivers","description":"Signed waiver management and retrieval"},{"name":"Public","description":"Public-facing waiver signing endpoints"},{"name":"Migration","description":"Data migration from external systems"},{"name":"Analytics","description":"Analytics and reporting endpoints"},{"name":"Modules","description":"Module subscription and management system"},{"name":"Webhooks","description":"Webhook configuration and outgoing event notifications"}]}