Skip to main content

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

EndpointAuthentication
GET /activePublic (tenant header required)
POST /signPublic (tenant header required)
GET /booking/:id/statusPublic (tenant header required)
POST /booking/:id/participants/:id/signPublic (tenant header required)
GET /booking/:id/participants/statusPublic (tenant header required)
All other endpointsJWT + 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:

ParameterTypeDescription
localestringOptional. Locale for template content (e.g., "en", "fi")
productIdstringOptional. Filter by product
siteIdstringOptional. 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:

FieldTypeRequiredDescription
signedByEmailstringYesEmail of the person signing
signedByNamestringYesName of the person signing
signatureDatastringNoBase64-encoded signature image
isGuardianSignaturebooleanNoTrue if signing on behalf of a minor
guardianRelationshipstringNoRelationship to minor (e.g., "Parent", "Guardian")

Response:

{
"success": true,
"data": {
"signatureId": "ws_ghi789",
"templateId": "wt_abc123",
"isMinor": true
}
}

Notes:

  • For minor participants (isMinor: true), isGuardianSignature is automatically set to true
  • 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:

ParameterTypeDescription
activeOnlybooleanFilter to active templates only
localestringFilter 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:

ParameterTypeDescription
bookingIdstringFilter by booking
templateIdstringFilter by template
signedAfterISO dateSignatures after this date
signedBeforeISO dateSignatures before this date
pagenumberPage number (default: 1)
pageSizenumberItems per page (default: 20)

Minor Detection

Participants are classified as minors based on:

  1. ageAtBooking field if set on the participant
  2. dateOfBirth field calculated against booking date
  3. Threshold: 18 years old

When signing for a minor:

  • The waiver modal prompts for guardian information
  • isGuardianSignature is automatically set
  • guardianRelationship captures the relationship (Parent, Guardian, etc.)

Error Codes

CodeDescription
WAIVER_NOT_FOUNDTemplate or signature not found
ALREADY_SIGNEDParticipant has already signed
BOOKING_NOT_FOUNDInvalid booking ID
PARTICIPANT_NOT_FOUNDInvalid participant ID
TEMPLATE_INACTIVEWaiver template is not active