Waivers API
Digital waiver management for liability and consent forms.
Overview
The Waivers API enables:
- Creating and managing waiver templates
- Signing waivers during the booking flow
- Per-participant waiver signing with guardian support for minors
- Tracking waiver compliance across bookings
Authentication
| Endpoint | Authentication |
|---|---|
GET /active | Public (tenant header required) |
POST /sign | Public (tenant header required) |
GET /booking/:id/status | Public (tenant header required) |
POST /booking/:id/participants/:id/sign | Public (tenant header required) |
GET /booking/:id/participants/status | Public (tenant header required) |
| All other endpoints | JWT + Tenant Guard |
Endpoints
Get Active Waiver Template
GET /api/v1/waivers/active
Returns the active waiver template for the tenant, optionally filtered by product or site.
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
locale | string | Optional. Locale for template content (e.g., "en", "fi") |
productId | string | Optional. Filter by product |
siteId | string | Optional. Filter by site |
Response:
{
"success": true,
"data": {
"id": "wt_abc123",
"name": "Activity Liability Waiver",
"content": "I acknowledge the risks...",
"version": "1.0",
"locale": "en",
"isActive": true
}
}
Sign Waiver (Legacy)
POST /api/v1/waivers/sign
Sign a waiver for a booking. This is the legacy single-waiver-per-booking endpoint.
Request Body:
{
"bookingId": "bk_abc123",
"templateId": "wt_xyz789",
"signedByEmail": "customer@example.com",
"signedByName": "John Doe",
"signatureData": "base64_signature_image",
"ipAddress": "192.168.1.1"
}
Response:
{
"success": true,
"data": {
"signatureId": "ws_def456",
"signedAt": "2026-01-19T10:30:00Z"
}
}
Get Booking Waiver Status
GET /api/v1/waivers/booking/:bookingId/status
Check if waivers have been signed for a booking.
Response:
{
"success": true,
"data": {
"requiresWaiver": true,
"waiverSigned": true,
"signatureId": "ws_def456",
"signedAt": "2026-01-19T10:30:00Z",
"signedByName": "John Doe"
}
}
Per-Participant Waivers
For activities requiring individual waivers per participant, use these endpoints.
Get Participant Waiver Status
GET /api/v1/waivers/booking/:bookingId/participants/status
Returns waiver status for all participants in a booking.
Response:
{
"success": true,
"data": {
"bookingId": "bk_abc123",
"requiresWaiver": true,
"allParticipantsSigned": false,
"participantCount": 4,
"signedCount": 2,
"pendingCount": 2,
"participants": [
{
"participantId": "bp_001",
"participantName": "John Doe",
"participantType": "adult",
"isMinor": false,
"requiresWaiver": true,
"isSigned": true,
"signatureId": "ws_abc",
"signedAt": "2026-01-19T10:30:00Z",
"signedByEmail": "john@example.com",
"signedByName": "John Doe",
"isGuardianSignature": false
},
{
"participantId": "bp_002",
"participantName": "Jane Doe Jr",
"participantType": "child",
"isMinor": true,
"requiresWaiver": true,
"isSigned": true,
"signatureId": "ws_def",
"signedAt": "2026-01-19T10:31:00Z",
"signedByEmail": "john@example.com",
"signedByName": "John Doe",
"isGuardianSignature": true,
"guardianRelationship": "Parent"
},
{
"participantId": "bp_003",
"participantName": "Bob Smith",
"participantType": "adult",
"isMinor": false,
"requiresWaiver": true,
"isSigned": false
},
{
"participantId": "bp_004",
"participantName": "Child Smith",
"participantType": "child",
"isMinor": true,
"requiresWaiver": true,
"isSigned": false
}
]
}
}
Sign Participant Waiver
POST /api/v1/waivers/booking/:bookingId/participants/:participantId/sign
Sign a waiver for a specific participant. Supports guardian signatures for minors.
Request Body:
{
"signedByEmail": "parent@example.com",
"signedByName": "John Doe",
"signatureData": "base64_signature_image",
"isGuardianSignature": true,
"guardianRelationship": "Parent"
}
Parameters:
| Field | Type | Required | Description |
|---|---|---|---|
signedByEmail | string | Yes | Email of the person signing |
signedByName | string | Yes | Name of the person signing |
signatureData | string | No | Base64-encoded signature image |
isGuardianSignature | boolean | No | True if signing on behalf of a minor |
guardianRelationship | string | No | Relationship to minor (e.g., "Parent", "Guardian") |
Response:
{
"success": true,
"data": {
"signatureId": "ws_ghi789",
"templateId": "wt_abc123",
"isMinor": true
}
}
Notes:
- For minor participants (
isMinor: true),isGuardianSignatureis automatically set totrue - Guardian relationship is recommended for audit purposes
Admin Endpoints
Get Waiver Templates
GET /api/v1/waivers/templates
List all waiver templates for the tenant.
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
activeOnly | boolean | Filter to active templates only |
locale | string | Filter by locale |
Create Waiver Template
POST /api/v1/waivers/templates
Create a new waiver template.
Request Body:
{
"name": "Adventure Activity Waiver",
"content": "I acknowledge and accept the inherent risks...",
"locale": "en",
"version": "1.0",
"productIds": ["prod_abc", "prod_def"],
"siteIds": ["site_123"]
}
Deactivate Template
PATCH /api/v1/waivers/templates/:templateId/deactivate
Deactivate a waiver template. Existing signatures remain valid.
Get Signatures (Admin)
GET /api/v1/waivers/signatures
Query waiver signatures with filtering options.
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
bookingId | string | Filter by booking |
templateId | string | Filter by template |
signedAfter | ISO date | Signatures after this date |
signedBefore | ISO date | Signatures before this date |
page | number | Page number (default: 1) |
pageSize | number | Items per page (default: 20) |
Minor Detection
Participants are classified as minors based on:
ageAtBookingfield if set on the participantdateOfBirthfield calculated against booking date- Threshold: 18 years old
When signing for a minor:
- The waiver modal prompts for guardian information
isGuardianSignatureis automatically setguardianRelationshipcaptures the relationship (Parent, Guardian, etc.)
Error Codes
| Code | Description |
|---|---|
WAIVER_NOT_FOUND | Template or signature not found |
ALREADY_SIGNED | Participant has already signed |
BOOKING_NOT_FOUND | Invalid booking ID |
PARTICIPANT_NOT_FOUND | Invalid participant ID |
TEMPLATE_INACTIVE | Waiver template is not active |