Waivers API

Read every waiver your prospects have signed: who signed, when, the agreement text exactly as it was signed, and the answers to each question. Templates give you the current agreement and question definitions once, rather than on every submission.

Requires the waivers permission. It includes the signer’s name and email: a signed waiver is by nature an identified document, and the CSV export carries them too.

Endpoint Returns
GET /api/v1/waiver_submissions A paginated list of signed waivers
GET /api/v1/waiver_submissions/:id One signed waiver
GET /api/v1/waiver_templates Every waiver template, with its question definitions
GET /api/v1/waiver_templates/:id One template

List waiver submissions

GET https://integrations.stokedhq.com/api/v1/waiver_submissions

Only real, signed waivers are listed. Drafts a prospect hasn’t finished and previews an admin generated while editing a template are never returned.

Parameters

Parameter Description
filter[conversation] Only waivers signed in this conversation, by conversation id
filter[prospect] Only waivers signed by this prospect, by prospect id
filter[template] Only waivers of this template, by template id
filter[created_since] Only waivers created at or after this time
filter[updated_since] Only waivers updated at or after this time. Use this for incremental syncing.
page[size] Waivers per page. Defaults to 50, maximum 200.
page[after] The cursor from a previous response’s links.next. See Pagination.
page[number] A page to jump to. Defaults to 1.

An id that doesn’t belong to your community returns a 400 error rather than an empty list. Any other parameter returns 400. Waivers come back least recently updated first; a signed waiver rarely changes after signing, so this is close to signing order.

Request

GET /api/v1/waiver_submissions

cURL

curl -G "https://integrations.stokedhq.com/api/v1/waiver_submissions" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/vnd.api+json" \
--data-urlencode "filter[updated_since]=2026-09-01T00:00:00Z"

Ruby

require "net/http"
require "json"
uri = URI("https://integrations.stokedhq.com/api/v1/waiver_submissions")
uri.query = URI.encode_www_form("filter[updated_since]" => "2026-09-01T00:00:00Z")
request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer YOUR_API_KEY"
request["Accept"] = "application/vnd.api+json"
response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(request) }
raise "HTTP #{response.code}: #{response.body}" unless response.is_a?(Net::HTTPSuccess)
puts JSON.parse(response.body)["data"]

Python

import requests
response = requests.get(
"https://integrations.stokedhq.com/api/v1/waiver_submissions",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Accept": "application/vnd.api+json",
},
params={"filter[updated_since]": "2026-09-01T00:00:00Z"},
)
response.raise_for_status()
print(response.json()["data"])

C#

using System.Net.Http.Headers;
using System.Text.Json;
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "YOUR_API_KEY");
client.DefaultRequestHeaders.Accept.ParseAdd("application/vnd.api+json");
using var response = await client.GetAsync("https://integrations.stokedhq.com/api/v1/waiver_submissions?filter[updated_since]=2026-09-01T00:00:00Z");
response.EnsureSuccessStatusCode();
using var document = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
Console.WriteLine(document.RootElement.GetProperty("data"));

JavaScript

const url = new URL("https://integrations.stokedhq.com/api/v1/waiver_submissions");
url.searchParams.set("filter[updated_since]", "2026-09-01T00:00:00Z");
const response = await fetch(url, {
headers: {
Authorization: "Bearer YOUR_API_KEY",
Accept: "application/vnd.api+json",
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const { data } = await response.json();
console.log(data);

Response

Response waiver-submissions-index.json Download
{
"data": [
{
"type": "waiver_submissions",
"id": "01k5examplewa1vers1gn00001",
"attributes": {
"signed_at": "2026-09-05T10:00:00Z",
"signer_name": "Mike Sample",
"signer_email": "mike@example.com",
"template_version": 1,
"title": "Test Ride Waiver",
"agreement": "<p>I, Mike, accept the risks of a test ride with Example Bikes.</p>",
"fields": [
{
"identifier": "emergency_contact",
"label": "Emergency contact",
"type": "short_text",
"value": "Pat Sample"
},
{
"identifier": "email_opt_in",
"label": "Email me news and offers",
"type": "checkbox",
"value": true
}
],
"ip_address": "203.0.113.42",
"user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)",
"created_at": "2026-09-05T10:00:00Z",
"updated_at": "2026-09-05T10:00:00Z"
},
"relationships": {
"template": {
"data": {
"type": "waiver_templates",
"id": "01k5examplewa1vertempl0001"
},
"links": {
"related": "https://integrations.stokedhq.com/api/v1/waiver_templates/01k5examplewa1vertempl0001"
}
},
"conversation": {
"data": {
"type": "conversations",
"id": "01k5examplec0nversat10n001"
},
"links": {
"related": "https://integrations.stokedhq.com/api/v1/conversations/01k5examplec0nversat10n001"
}
},
"advocate": {
"data": {
"type": "advocates",
"id": "01k5exampleadv0cate0000001"
},
"links": {
"related": "https://integrations.stokedhq.com/api/v1/advocates/01k5exampleadv0cate0000001"
}
},
"prospect": {
"data": {
"type": "prospects",
"id": "01k5examplepr0spect0000001"
},
"links": {
"related": "https://integrations.stokedhq.com/api/v1/prospects/01k5examplepr0spect0000001"
}
}
},
"links": {
"self": "https://integrations.stokedhq.com/api/v1/waiver_submissions/01k5examplewa1vers1gn00001"
}
}
],
"links": {
"self": "https://integrations.stokedhq.com/api/v1/waiver_submissions?filter%5Bupdated_since%5D=2026-09-01T00%3A00%3A00Z&page%5Bnumber%5D=1&page%5Bsize%5D=50",
"first": "https://integrations.stokedhq.com/api/v1/waiver_submissions?filter%5Bupdated_since%5D=2026-09-01T00%3A00%3A00Z&page%5Bnumber%5D=1&page%5Bsize%5D=50",
"prev": null,
"next": null,
"last": "https://integrations.stokedhq.com/api/v1/waiver_submissions?filter%5Bupdated_since%5D=2026-09-01T00%3A00%3A00Z&page%5Bnumber%5D=1&page%5Bsize%5D=50"
},
"meta": {
"page": 1,
"per_page": 50,
"total_count": 1,
"total_pages": 1
}
}

Get a waiver submission

GET https://integrations.stokedhq.com/api/v1/waiver_submissions/:id

Returns the same record as the list. An ID that doesn’t exist in your community returns 404.

Request

GET /api/v1/waiver_submissions/01k5examplewa1vers1gn00001

cURL

curl "https://integrations.stokedhq.com/api/v1/waiver_submissions/01k5examplewa1vers1gn00001" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/vnd.api+json"

Ruby

require "net/http"
require "json"
uri = URI("https://integrations.stokedhq.com/api/v1/waiver_submissions/01k5examplewa1vers1gn00001")
request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer YOUR_API_KEY"
request["Accept"] = "application/vnd.api+json"
response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(request) }
raise "HTTP #{response.code}: #{response.body}" unless response.is_a?(Net::HTTPSuccess)
puts JSON.parse(response.body)["data"]

Python

import requests
response = requests.get(
"https://integrations.stokedhq.com/api/v1/waiver_submissions/01k5examplewa1vers1gn00001",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Accept": "application/vnd.api+json",
},
)
response.raise_for_status()
print(response.json()["data"])

C#

using System.Net.Http.Headers;
using System.Text.Json;
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "YOUR_API_KEY");
client.DefaultRequestHeaders.Accept.ParseAdd("application/vnd.api+json");
using var response = await client.GetAsync("https://integrations.stokedhq.com/api/v1/waiver_submissions/01k5examplewa1vers1gn00001");
response.EnsureSuccessStatusCode();
using var document = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
Console.WriteLine(document.RootElement.GetProperty("data"));

JavaScript

const url = new URL("https://integrations.stokedhq.com/api/v1/waiver_submissions/01k5examplewa1vers1gn00001");
const response = await fetch(url, {
headers: {
Authorization: "Bearer YOUR_API_KEY",
Accept: "application/vnd.api+json",
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const { data } = await response.json();
console.log(data);

Response

Response waiver-submissions-show.json Download
{
"data": {
"type": "waiver_submissions",
"id": "01k5examplewa1vers1gn00001",
"attributes": {
"signed_at": "2026-09-05T10:00:00Z",
"signer_name": "Mike Sample",
"signer_email": "mike@example.com",
"template_version": 1,
"title": "Test Ride Waiver",
"agreement": "<p>I, Mike, accept the risks of a test ride with Example Bikes.</p>",
"fields": [
{
"identifier": "emergency_contact",
"label": "Emergency contact",
"type": "short_text",
"value": "Pat Sample"
},
{
"identifier": "email_opt_in",
"label": "Email me news and offers",
"type": "checkbox",
"value": true
}
],
"ip_address": "203.0.113.42",
"user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)",
"created_at": "2026-09-05T10:00:00Z",
"updated_at": "2026-09-05T10:00:00Z"
},
"relationships": {
"template": {
"data": {
"type": "waiver_templates",
"id": "01k5examplewa1vertempl0001"
},
"links": {
"related": "https://integrations.stokedhq.com/api/v1/waiver_templates/01k5examplewa1vertempl0001"
}
},
"conversation": {
"data": {
"type": "conversations",
"id": "01k5examplec0nversat10n001"
},
"links": {
"related": "https://integrations.stokedhq.com/api/v1/conversations/01k5examplec0nversat10n001"
}
},
"advocate": {
"data": {
"type": "advocates",
"id": "01k5exampleadv0cate0000001"
},
"links": {
"related": "https://integrations.stokedhq.com/api/v1/advocates/01k5exampleadv0cate0000001"
}
},
"prospect": {
"data": {
"type": "prospects",
"id": "01k5examplepr0spect0000001"
},
"links": {
"related": "https://integrations.stokedhq.com/api/v1/prospects/01k5examplepr0spect0000001"
}
}
},
"links": {
"self": "https://integrations.stokedhq.com/api/v1/waiver_submissions/01k5examplewa1vers1gn00001"
}
}
}

Waiver submission attributes

Records with "type": "waiver_submissions". Everything textual is what the prospect saw and signed, captured at that moment. Editing the template later never changes a signed waiver.

Attribute Type Description
signed_at timestamp When the prospect signed
signer_name string The name the prospect signed with
signer_email string or null The email they gave, or their verified email
template_version integer Which version of the template they signed. Editing a template’s agreement after someone has signed it starts a new version.
title string The waiver’s title as signed
agreement string The full agreement as signed, as HTML, with the prospect’s and advocate’s details already filled in
fields array of objects The answers to the template’s questions. See The fields array.
ip_address string or null Where they signed from
user_agent string or null The browser they signed with
created_at timestamp  
updated_at timestamp  

The fields array

One object per question on the template at the time of signing, in template order:

Field Type Description
identifier string The question’s identifier, stable across relabelling
label string The question as it was worded when signed
type string or null short_text, long_text, select, or checkbox. null for waivers signed before question types were recorded.
value string, boolean, or null The answer. A checkbox is true or false; every other type is a string.

An email opt-in is a checkbox question on your template rather than a built-in flag, so read it from fields by its identifier.

Relationships

Relationship Type Description
template waiver_templates The template that was signed. links.related is its URL below.
conversation conversations The conversation the waiver was signed in. Requires the conversations permission to follow.
advocate advocates The advocate who hosted, that is, the advocate in the conversation. Requires the advocates permission to follow.
prospect prospects Who signed. Requires the prospects permission to follow.

A waiver never carries the advocate’s or prospect’s details, only their type, id, and link.


List waiver templates

GET https://integrations.stokedhq.com/api/v1/waiver_templates

Every template in your community, in the order set in Settings, drafts and archived templates included. Not paginated, no filters.

Request

GET /api/v1/waiver_templates

cURL

curl "https://integrations.stokedhq.com/api/v1/waiver_templates" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/vnd.api+json"

Ruby

require "net/http"
require "json"
uri = URI("https://integrations.stokedhq.com/api/v1/waiver_templates")
request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer YOUR_API_KEY"
request["Accept"] = "application/vnd.api+json"
response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(request) }
raise "HTTP #{response.code}: #{response.body}" unless response.is_a?(Net::HTTPSuccess)
puts JSON.parse(response.body)["data"]

Python

import requests
response = requests.get(
"https://integrations.stokedhq.com/api/v1/waiver_templates",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Accept": "application/vnd.api+json",
},
)
response.raise_for_status()
print(response.json()["data"])

C#

using System.Net.Http.Headers;
using System.Text.Json;
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "YOUR_API_KEY");
client.DefaultRequestHeaders.Accept.ParseAdd("application/vnd.api+json");
using var response = await client.GetAsync("https://integrations.stokedhq.com/api/v1/waiver_templates");
response.EnsureSuccessStatusCode();
using var document = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
Console.WriteLine(document.RootElement.GetProperty("data"));

JavaScript

const url = new URL("https://integrations.stokedhq.com/api/v1/waiver_templates");
const response = await fetch(url, {
headers: {
Authorization: "Bearer YOUR_API_KEY",
Accept: "application/vnd.api+json",
},
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const { data } = await response.json();
console.log(data);

Response

Response waiver-templates-index.json Download
{
"data": [
{
"type": "waiver_templates",
"id": "01k5examplewa1vertempl0001",
"attributes": {
"identifier": "test_ride_waiver",
"title": "Test Ride Waiver",
"description": "Signed before every test ride.",
"status": "active",
"version": 1,
"agreement": "<p>I, {{ prospect_first_name }}, accept the risks of a test ride with {{ community_brand_name }}.</p>",
"fields": [
{
"identifier": "emergency_contact",
"label": "Emergency contact",
"field_type": "short_text",
"required": true,
"response_options": [],
"helper_text": null,
"placeholder_text": null,
"position": 1
},
{
"identifier": "email_opt_in",
"label": "Email me news and offers",
"field_type": "checkbox",
"required": false,
"response_options": [],
"helper_text": null,
"placeholder_text": null,
"position": 2
}
],
"created_at": "2026-08-25T09:00:00Z",
"updated_at": "2026-08-25T09:00:00Z"
},
"relationships": {
"submissions": {
"links": {
"related": "https://integrations.stokedhq.com/api/v1/waiver_submissions?filter%5Btemplate%5D=01k5examplewa1vertempl0001"
}
}
},
"links": {
"self": "https://integrations.stokedhq.com/api/v1/waiver_templates/01k5examplewa1vertempl0001"
}
}
]
}

Template attributes

Records with "type": "waiver_templates".

Attribute Type Description
identifier string  
title string  
description string or null  
status string draft, active, or archived
version integer The current version. Submissions record the version they signed.
agreement string The agreement’s source, with its merge variables ({{ prospect_first_name }}) unfilled. Each submission carries the filled-in copy that was signed.
fields array of objects The current questions: identifier, label, field_type, required, response_options, helper_text, placeholder_text, position
created_at timestamp  
updated_at timestamp When the template last changed

Past versions of a template are not stored on their own. The text of an earlier version lives on in the submissions that signed it.

relationships.submissions.links.related is the submissions list filtered to this template.


© 2024-2026 Stoked — Real conversations. Real trust.