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
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
{
"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
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
{
"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
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
{
"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.