Renta Docs

Waivers API

Digital waiver templates and electronic signature collection.

The Waivers API manages digital liability waivers. Define waiver templates with custom content, then collect electronic signatures from customers before or during their rental.

Test vs live API keys

REST API keys carry an environment: test or live (see prefixes like renta_sk_test_… / renta_sk_live_…). There is no separate demo data: both kinds of key read and write the same live templates and bookings for your business.

The one difference is shared settings. On an active business, a test key cannot change coupons, pricing rules, add-ons, or the default waiver. Those calls return 409 (conflict). A live key can.

List templates returns your business's templates. Sign needs a valid waiver_template_id; an unknown ID returns 404 (not_found). If you pass booking_id, the booking must belong to your business; otherwise the API returns 403 (forbidden).

To try things safely, use Practice customers instead: bookings made as a practice customer use Stripe test mode and skip real effects. See the Practice customers help article.

Waiver Types

TypeDescription
singleOne waiver per booking (covers all riders/participants)
per_riderEach participant signs individually

List Waiver Templates

GET /v1/waivers/templates

Returns waiver templates for your tenant in the same data lane as your API key (see Test vs live API keys). Active templates only (unless using a secret key with active=false).

Query Parameters:

ParameterTypeDescription
activebooleanInclude inactive templates (secret key only)
cursorstringPagination cursor
limitintegerResults per page (1–100, default 20)
const templates = await renta.waivers.templates();
for (const t of templates.data) {
  console.log(`${t.name} (${t.type}) — is_demo: ${t.is_demo}`);
}
# Live key → live-lane templates only
curl https://api.getrenta.io/v1/waivers/templates \
  -H "Authorization: Bearer renta_sk_live_..."
# Test key → demo-lane templates only
curl https://api.getrenta.io/v1/waivers/templates \
  -H "Authorization: Bearer renta_sk_test_..."

Response:

Each template includes is_demo: true for the demo lane (test keys) and false for the live lane (live keys).

{
  "data": [
    {
      "id": "wt_liability",
      "name": "Liability Waiver",
      "content": "<h2>Release of Liability</h2><p>By signing this waiver...</p>",
      "type": "per_rider",
      "expiration_days": 365,
      "active": true,
      "is_demo": false
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Sign Waiver

POST /v1/waivers/sign

Submit a signed waiver. Works with both secret and publishable keys. The waiver_template_id must belong to the same lane as your API key (Test vs live API keys). When booking_id is supplied, the booking must be in that lane too (403 if you mix a live booking with a test key, or vice versa).

Body Parameters:

ParameterTypeRequiredDescription
booking_idstring—Associated booking (optional; required to match key lane when set)
waiver_template_idstring✅Template to sign (must exist in your tenant and in the key’s lane)
signer_namestring✅Full legal name of signer
signer_emailstring—Signer's email
signature_dataobject✅Signature data (see below)

Signature Data Format

// Typed signature
{ type: 'typed', value: 'John Doe' }

// Drawn signature (base64 image)
{ type: 'drawn', value: 'data:image/png;base64,...' }
const result = await renta.waivers.sign({
  booking_id: 'bk_def456',
  waiver_template_id: 'wt_liability',
  signer_name: 'John Doe',
  signature_data: { type: 'typed', value: 'John Doe' },
});

console.log(`Waiver ID: ${result.waiver_id}`);
console.log(`PDF: ${result.pdf_url}`);
curl -X POST https://api.getrenta.io/v1/waivers/sign \
  -H "Authorization: Bearer renta_sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "booking_id": "bk_def456",
    "waiver_template_id": "wt_liability",
    "signer_name": "John Doe",
    "signature_data": {
      "type": "typed",
      "value": "John Doe"
    }
  }'

Response (201 Created):

{
  "success": true,
  "waiver_id": "w_abc123",
  "pdf_url": "https://storage.getrenta.io/waivers/w_abc123.pdf"
}

Errors:

StatusWhen
404Booking or template not found (including wrong-lane template so it is not visible to your key)
403booking_id is present but its lane does not match the API key environment

Check Waiver Status

GET /v1/waivers/status/:booking_id

Check which waivers have been signed for a booking.

const status = await renta.waivers.status('bk_def456');
console.log(`All signed: ${status.all_signed}`);
for (const w of status.waivers) {
  console.log(`${w.signer_name}: ${w.signed ? '✅' : '❌'}`);
}
curl https://api.getrenta.io/v1/waivers/status/bk_def456 \
  -H "Authorization: Bearer renta_sk_live_..."

Signed waivers are stored as PDFs in Supabase Storage. The PDF URL is valid for 1 hour. Request a fresh URL by calling the status endpoint again.

Waivers API | Renta Docs