Developers

API reference

Generated from the live OpenAPI 3.1 document, so it always matches the API. Authentication, rate limits and errors are covered in getting started.

Signings

get/v1/signings

List signed waivers

Needs the `signings:read` permission.

Parameters

NameInTypeDescription
pagequeryintegerPage number, from 1.
per_pagequeryintegerRows per page, at most 100.
updated_sincequerystring (date-time)Changed at or after this time.
signed_sincequerystring (date-time)Signed at or after this time.
template_idquerystring (uuid)Signed on this waiver.
location_idquerystring (uuid)Signed at this location.
emailquerystringSigner's email, any case.
phonequerystringSigner's phone.
last_namequerystringSigner's last name, any case.
dobquerystring (date)Signer's date of birth.
tagquerystringCarries this tag.
review_statusquery"unreviewed" | "accepted" | "rejected"Review decision.
external_referencequerystringYour reference, from a signing link.
sortquery"signed_at" | "updated_at"signed_at: newest first. updated_at: oldest change first, for syncing.
curl https://app.onlinewaiversoftware.com/api/v1/signings \
  -H "Authorization: Bearer $KEY"

Responses

  • 200 OK
  • 400 Error (problem document)
  • 401 Error (problem document)
  • 403 Error (problem document)
  • 404 Error (problem document)
  • 429 Error (problem document)
Response fields and example
FieldTypeDescription
objectrequired"list"
datarequiredarray of Signing
pagerequiredinteger
per_pagerequiredinteger
totalrequiredinteger
has_morerequiredboolean
{
  "object": "list",
  "data": [
    {
      "id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
      "object": "signing",
      "template": {
        "id": null,
        "title": null,
        "version": null
      },
      "packet": {
        "id": null,
        "name": null
      },
      "location": {
        "id": null,
        "name": null
      },
      "signer": {
        "first_name": null,
        "last_name": null,
        "email": null,
        "phone": null,
        "dob": null
      },
      "customer_id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
      "signed_at": "2026-10-27T15:04:05.000Z",
      "last_confirmed_at": "2026-10-27T15:04:05.000Z",
      "expired": true,
      "review_status": "unreviewed",
      "tags": [
        "string"
      ],
      "external_reference": "string",
      "is_test": true,
      "archived": true,
      "packet_hash": "string",
      "created_at": "2026-10-27T15:04:05.000Z",
      "updated_at": "2026-10-27T15:04:05.000Z",
      "links": {
        "pdf": "string",
        "admin": "string"
      },
      "answers": [
        null
      ],
      "files": [
        null
      ]
    }
  ],
  "page": 1,
  "per_page": 1,
  "total": 1,
  "has_more": true
}
get/v1/signings/{id}

A signed waiver with its answers

Needs the `signings:read` permission.

Parameters

NameInTypeDescription
idrequiredpathstring (uuid)
curl https://app.onlinewaiversoftware.com/api/v1/signings/id_ID \
  -H "Authorization: Bearer $KEY"

Responses

  • 200 OK
  • 400 Error (problem document)
  • 401 Error (problem document)
  • 403 Error (problem document)
  • 404 Error (problem document)
  • 429 Error (problem document)
Response fields and example
FieldTypeDescription
idrequiredstring (uuid)
objectrequired"signing"
templaterequiredTemplateRef
packetrequiredobject or null
locationrequiredobject or null
signerrequiredSigner
customer_idrequiredstring (uuid) or null
signed_atrequiredstring (date-time)
last_confirmed_atrequiredstring (date-time)
expiredrequiredboolean
review_statusrequired"unreviewed" | "accepted" | "rejected"
tagsrequiredarray of string
external_referencerequiredstring or null
is_testrequiredboolean
archivedrequiredboolean
packet_hashrequiredstring or null
created_atrequiredstring (date-time)
updated_atrequiredstring (date-time)
linksrequiredobject
answersarray of Answer
filesarray of SigningFile
{
  "id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
  "object": "signing",
  "template": {
    "id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
    "title": "string",
    "version": 1
  },
  "packet": {
    "id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
    "name": "string"
  },
  "location": {
    "id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
    "name": "string"
  },
  "signer": {
    "first_name": "string",
    "last_name": "string",
    "email": "string",
    "phone": "string",
    "dob": "1990-04-12"
  },
  "customer_id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
  "signed_at": "2026-10-27T15:04:05.000Z",
  "last_confirmed_at": "2026-10-27T15:04:05.000Z",
  "expired": true,
  "review_status": "unreviewed",
  "tags": [
    "string"
  ],
  "external_reference": "string",
  "is_test": true,
  "archived": true,
  "packet_hash": "string",
  "created_at": "2026-10-27T15:04:05.000Z",
  "updated_at": "2026-10-27T15:04:05.000Z",
  "links": {
    "pdf": "string",
    "admin": "string"
  },
  "answers": [
    {
      "key": "string",
      "type": "string",
      "label": "string",
      "value": {},
      "health": true,
      "withheld": null
    }
  ],
  "files": [
    {
      "id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
      "question": "string",
      "name": "string",
      "content_type": "string",
      "bytes": 1,
      "sha256": "string",
      "uploaded_at": "2026-10-27T15:04:05.000Z",
      "download_url": "string",
      "download_expires_at": "2026-10-27T15:04:05.000Z"
    }
  ]
}
get/v1/signings/{id}/pdf

Download the signer's copy as a PDF

Needs the `signings:read` permission.

Parameters

NameInTypeDescription
idrequiredpathstring (uuid)
curl https://app.onlinewaiversoftware.com/api/v1/signings/id_ID/pdf \
  -H "Authorization: Bearer $KEY"

Responses

  • 202 Still being made; try again after Retry-After seconds.
  • 302 Redirect to a download link that works for 15 minutes.
  • 400 Error (problem document)
  • 401 Error (problem document)
  • 403 Error (problem document)
  • 404 Error (problem document)
  • 429 Error (problem document)
Response fields and example
FieldTypeDescription
objectrequired"pdf"
statusrequired"pending"
{
  "object": "pdf",
  "status": "pending"
}

Customers

get/v1/customers

Find customers

Needs the `customers:read` permission.

Parameters

NameInTypeDescription
pagequeryintegerPage number, from 1.
per_pagequeryintegerRows per page, at most 100.
emailquerystringExact email, any case.
phonequerystringPhone number.
first_namequerystringFirst name, any case.
last_namequerystringLast name, any case.
dobquerystring (date)Date of birth.
updated_sincequerystring (date-time)Changed at or after this time.
curl https://app.onlinewaiversoftware.com/api/v1/customers \
  -H "Authorization: Bearer $KEY"

Responses

  • 200 OK
  • 400 Error (problem document)
  • 401 Error (problem document)
  • 403 Error (problem document)
  • 404 Error (problem document)
  • 429 Error (problem document)
Response fields and example
FieldTypeDescription
objectrequired"list"
datarequiredarray of Customer
pagerequiredinteger
per_pagerequiredinteger
totalrequiredinteger
has_morerequiredboolean
{
  "object": "list",
  "data": [
    {
      "id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
      "object": "customer",
      "first_name": "string",
      "last_name": "string",
      "email": "string",
      "phone": "string",
      "dob": "1990-04-12",
      "is_minor": true,
      "marketing_consent": true,
      "marketing_consent_at": "2026-10-27T15:04:05.000Z",
      "marketing_consent_source": "signing",
      "email_unsubscribed": true,
      "tags": [
        "string"
      ],
      "created_at": "2026-10-27T15:04:05.000Z",
      "updated_at": "2026-10-27T15:04:05.000Z"
    }
  ],
  "page": 1,
  "per_page": 1,
  "total": 1,
  "has_more": true
}
get/v1/customers/{id}

A customer and their signings

Needs the `customers:read` permission.

Parameters

NameInTypeDescription
idrequiredpathstring (uuid)
curl https://app.onlinewaiversoftware.com/api/v1/customers/id_ID \
  -H "Authorization: Bearer $KEY"

Responses

  • 200 OK
  • 400 Error (problem document)
  • 401 Error (problem document)
  • 403 Error (problem document)
  • 404 Error (problem document)
  • 429 Error (problem document)
Response fields and example

CustomerDetail

{
  "id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
  "object": "customer",
  "first_name": "string",
  "last_name": "string",
  "email": "string",
  "phone": "string",
  "dob": "1990-04-12",
  "is_minor": true,
  "marketing_consent": true,
  "marketing_consent_at": "2026-10-27T15:04:05.000Z",
  "marketing_consent_source": "signing",
  "email_unsubscribed": true,
  "tags": [
    "string"
  ],
  "created_at": "2026-10-27T15:04:05.000Z",
  "updated_at": "2026-10-27T15:04:05.000Z",
  "signings": [
    {
      "id": null,
      "template": null,
      "signed_at": null,
      "last_confirmed_at": null,
      "expired": null,
      "review_status": null,
      "external_reference": null
    }
  ]
}
get/v1/customers/{id}/status

Is this customer covered by a waiver or packet right now?

Needs the `customers:read` permission.

Parameters

NameInTypeDescription
idrequiredpathstring (uuid)
template_idquerystring (uuid)Check one waiver. Pass this or packet_id.
packet_idquerystring (uuid)Check every waiver in a packet. Pass this or template_id.
curl https://app.onlinewaiversoftware.com/api/v1/customers/id_ID/status \
  -H "Authorization: Bearer $KEY"

Responses

  • 200 OK
  • 400 Error (problem document)
  • 401 Error (problem document)
  • 403 Error (problem document)
  • 404 Error (problem document)
  • 429 Error (problem document)
Response fields and example
FieldTypeDescription
objectrequired"customer_status"
customer_idrequiredstring (uuid)
template_idrequiredstring (uuid) or null
packet_idrequiredstring (uuid) or null
coveredrequiredboolean
reasonrequired"covered" | "not_signed" | "rejected" | "reconfirm_due"
waiversrequiredarray of object
sign_urlrequiredstring or null
checked_atrequiredstring (date-time)
{
  "object": "customer_status",
  "customer_id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
  "template_id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
  "packet_id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
  "covered": true,
  "reason": "covered",
  "waivers": [
    {
      "template": {
        "id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
        "title": "string"
      },
      "covered": true,
      "reason": "covered",
      "signing": null
    }
  ],
  "sign_url": "string",
  "checked_at": "2026-10-27T15:04:05.000Z"
}

Waivers and locations

get/v1/templates

Published waivers

Any API key.

curl https://app.onlinewaiversoftware.com/api/v1/templates \
  -H "Authorization: Bearer $KEY"

Responses

  • 200 OK
  • 400 Error (problem document)
  • 401 Error (problem document)
  • 403 Error (problem document)
  • 404 Error (problem document)
  • 429 Error (problem document)
Response fields and example
FieldTypeDescription
objectrequired"list"
datarequiredarray of Template
pagerequiredinteger
per_pagerequiredinteger
totalrequiredinteger
has_morerequiredboolean
{
  "object": "list",
  "data": [
    {
      "id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
      "object": "template",
      "title": "string",
      "version": 1,
      "share_url": "string",
      "updated_at": "2026-10-27T15:04:05.000Z"
    }
  ],
  "page": 1,
  "per_page": 1,
  "total": 1,
  "has_more": true
}
get/v1/packets

Waiver packets ready to sign

Any API key.

curl https://app.onlinewaiversoftware.com/api/v1/packets \
  -H "Authorization: Bearer $KEY"

Responses

  • 200 OK
  • 400 Error (problem document)
  • 401 Error (problem document)
  • 403 Error (problem document)
  • 404 Error (problem document)
  • 429 Error (problem document)
Response fields and example
FieldTypeDescription
objectrequired"list"
datarequiredarray of Packet
pagerequiredinteger
per_pagerequiredinteger
totalrequiredinteger
has_morerequiredboolean
{
  "object": "list",
  "data": [
    {
      "id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
      "object": "packet",
      "name": "string",
      "templates": [
        {
          "id": null,
          "title": null,
          "rule": null
        }
      ],
      "updated_at": "2026-10-27T15:04:05.000Z"
    }
  ],
  "page": 1,
  "per_page": 1,
  "total": 1,
  "has_more": true
}
get/v1/locations

Active locations

Any API key.

curl https://app.onlinewaiversoftware.com/api/v1/locations \
  -H "Authorization: Bearer $KEY"

Responses

  • 200 OK
  • 400 Error (problem document)
  • 401 Error (problem document)
  • 403 Error (problem document)
  • 404 Error (problem document)
  • 429 Error (problem document)
Response fields and example
FieldTypeDescription
objectrequired"list"
datarequiredarray of Location
pagerequiredinteger
per_pagerequiredinteger
totalrequiredinteger
has_morerequiredboolean
{
  "object": "list",
  "data": [
    {
      "id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
      "object": "location",
      "name": "string",
      "address": "string",
      "city": "string",
      "state": "string",
      "zip": "string",
      "phone": "string",
      "timezone": "string",
      "is_primary": true
    }
  ],
  "page": 1,
  "per_page": 1,
  "total": 1,
  "has_more": true
}

Webhooks

get/v1/webhooks

Webhook endpoints

Needs the `webhooks:manage` permission.

curl https://app.onlinewaiversoftware.com/api/v1/webhooks \
  -H "Authorization: Bearer $KEY"

Responses

  • 200 OK
  • 400 Error (problem document)
  • 401 Error (problem document)
  • 403 Error (problem document)
  • 404 Error (problem document)
  • 429 Error (problem document)
Response fields and example
FieldTypeDescription
objectrequired"list"
datarequiredarray of WebhookEndpoint
pagerequiredinteger
per_pagerequiredinteger
totalrequiredinteger
has_morerequiredboolean
{
  "object": "list",
  "data": [
    {
      "id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
      "object": "webhook_endpoint",
      "url": "string",
      "description": "string",
      "events": [
        "signing.completed"
      ],
      "enabled": true,
      "disabled_reason": "string",
      "created_at": "2026-10-27T15:04:05.000Z"
    }
  ],
  "page": 1,
  "per_page": 1,
  "total": 1,
  "has_more": true
}
post/v1/webhooks

Add a webhook endpoint (the answer shows its signing secret once)

Needs the `webhooks:manage` permission.

Request body (JSON)

FieldTypeDescription
urlrequiredstring (uri)https only.
descriptionstring or null
eventsrequiredarray of "signing.completed" | "signing.reattested" | "signing.accepted" | "signing.rejected" | "signing.tagged" | "customer.created" | "customer.updated" | "signing_link.opened"
curl -X POST https://app.onlinewaiversoftware.com/api/v1/webhooks \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "url": "https://example.com",
  "description": "string",
  "events": [
    "signing.completed"
  ]
}'

Responses

  • 201 Created
  • 400 Error (problem document)
  • 401 Error (problem document)
  • 403 Error (problem document)
  • 404 Error (problem document)
  • 429 Error (problem document)
Response fields and example

WebhookEndpointWithSecret

{
  "id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
  "object": "webhook_endpoint",
  "url": "string",
  "description": "string",
  "events": [
    "signing.completed"
  ],
  "enabled": true,
  "disabled_reason": "string",
  "created_at": "2026-10-27T15:04:05.000Z",
  "secret": "string"
}
get/v1/webhooks/{id}

A webhook endpoint

Needs the `webhooks:manage` permission.

Parameters

NameInTypeDescription
idrequiredpathstring (uuid)
curl https://app.onlinewaiversoftware.com/api/v1/webhooks/id_ID \
  -H "Authorization: Bearer $KEY"

Responses

  • 200 OK
  • 400 Error (problem document)
  • 401 Error (problem document)
  • 403 Error (problem document)
  • 404 Error (problem document)
  • 429 Error (problem document)
Response fields and example
FieldTypeDescription
idrequiredstring (uuid)
objectrequired"webhook_endpoint"
urlrequiredstring
descriptionrequiredstring or null
eventsrequiredarray of "signing.completed" | "signing.reattested" | "signing.accepted" | "signing.rejected" | "signing.tagged" | "customer.created" | "customer.updated" | "signing_link.opened"
enabledrequiredboolean
disabled_reasonrequiredstring or null
created_atrequiredstring (date-time)
{
  "id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
  "object": "webhook_endpoint",
  "url": "string",
  "description": "string",
  "events": [
    "signing.completed"
  ],
  "enabled": true,
  "disabled_reason": "string",
  "created_at": "2026-10-27T15:04:05.000Z"
}
patch/v1/webhooks/{id}

Change a webhook endpoint, or turn it back on

Needs the `webhooks:manage` permission.

Parameters

NameInTypeDescription
idrequiredpathstring (uuid)

Request body (JSON)

FieldTypeDescription
urlstring (uri)
descriptionstring or null
eventsarray of "signing.completed" | "signing.reattested" | "signing.accepted" | "signing.rejected" | "signing.tagged" | "customer.created" | "customer.updated" | "signing_link.opened"
enabledboolean
curl -X PATCH https://app.onlinewaiversoftware.com/api/v1/webhooks/id_ID \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "url": "https://example.com",
  "description": "string",
  "events": [
    "signing.completed"
  ],
  "enabled": true
}'

Responses

  • 200 OK
  • 400 Error (problem document)
  • 401 Error (problem document)
  • 403 Error (problem document)
  • 404 Error (problem document)
  • 429 Error (problem document)
Response fields and example
FieldTypeDescription
idrequiredstring (uuid)
objectrequired"webhook_endpoint"
urlrequiredstring
descriptionrequiredstring or null
eventsrequiredarray of "signing.completed" | "signing.reattested" | "signing.accepted" | "signing.rejected" | "signing.tagged" | "customer.created" | "customer.updated" | "signing_link.opened"
enabledrequiredboolean
disabled_reasonrequiredstring or null
created_atrequiredstring (date-time)
{
  "id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
  "object": "webhook_endpoint",
  "url": "string",
  "description": "string",
  "events": [
    "signing.completed"
  ],
  "enabled": true,
  "disabled_reason": "string",
  "created_at": "2026-10-27T15:04:05.000Z"
}
delete/v1/webhooks/{id}

Delete a webhook endpoint

Needs the `webhooks:manage` permission.

Parameters

NameInTypeDescription
idrequiredpathstring (uuid)
curl -X DELETE https://app.onlinewaiversoftware.com/api/v1/webhooks/id_ID \
  -H "Authorization: Bearer $KEY"

Responses

  • 200 OK
  • 400 Error (problem document)
  • 401 Error (problem document)
  • 403 Error (problem document)
  • 404 Error (problem document)
  • 429 Error (problem document)
Response fields and example
FieldTypeDescription
idrequiredstring (uuid)
objectrequired"webhook_endpoint"
deletedrequiredboolean
{
  "id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
  "object": "webhook_endpoint",
  "deleted": true
}
post/v1/webhooks/{id}/rotate-secret

Replace an endpoint's signing secret (the answer shows the new one once)

Needs the `webhooks:manage` permission.

Parameters

NameInTypeDescription
idrequiredpathstring (uuid)
curl -X POST https://app.onlinewaiversoftware.com/api/v1/webhooks/id_ID/rotate-secret \
  -H "Authorization: Bearer $KEY"

Responses

  • 200 OK
  • 400 Error (problem document)
  • 401 Error (problem document)
  • 403 Error (problem document)
  • 404 Error (problem document)
  • 429 Error (problem document)
Response fields and example

WebhookEndpointWithSecret

{
  "id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
  "object": "webhook_endpoint",
  "url": "string",
  "description": "string",
  "events": [
    "signing.completed"
  ],
  "enabled": true,
  "disabled_reason": "string",
  "created_at": "2026-10-27T15:04:05.000Z",
  "secret": "string"
}

Other

post/v1/partner/token

Partners: swap a connect-flow code for a key to that business

For approved partners only. Send the customer to `/connect/<client_id>?redirect_uri=<registered address>&state=<8 to 500 characters>` (state is required; PKCE is supported: add code_challenge, the base64url SHA-256 of your code_verifier, and code_challenge_method=S256); after the owner approves, their browser comes back to redirect_uri with `code` and `state`. The code works once and expires in 5 minutes. Post it here with your client_id and client_secret; the access_token is an API key for that one business, sent as `Authorization: Bearer` like any other. A code presented twice also revokes the key it bought. Limited to 20 attempts a minute per address and per client_id.

Request body (JSON)

FieldTypeDescription
grant_typerequired"authorization_code"
coderequiredstring
client_idrequiredstring
client_secretrequiredstring
redirect_urirequiredstring (uri)Exactly as used on /connect.
code_verifierrequiredstringRequired when the connect address carried a code_challenge (PKCE, S256).
curl -X POST https://app.onlinewaiversoftware.com/api/v1/partner/token \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "grant_type": "authorization_code",
  "code": "string",
  "client_id": "string",
  "client_secret": "string",
  "redirect_uri": "https://example.com",
  "code_verifier": "string"
}'

Responses

  • 200 OK
  • 400 Error (problem document)
  • 401 Error (problem document)
  • 403 Error (problem document)
  • 404 Error (problem document)
  • 429 Error (problem document)
Response fields and example
FieldTypeDescription
access_tokenrequiredstringAn API key for the one business that approved.
token_typerequired"bearer"
businessrequiredobject
scopesrequiredarray of "signings:read" | "signings:read_health" | "customers:read" | "signing_links:write" | "webhooks:manage"
{
  "access_token": "string",
  "token_type": "bearer",
  "business": {
    "id": "3f2b8c1e-5d4a-4c7e-9a10-2b6f0d8e7c41",
    "name": "string"
  },
  "scopes": [
    "signings:read"
  ]
}

Errors

Every error is a problem document. code is stable, so match on it rather than on the message.

FieldTypeDescription
typestring
titlerequiredstring
statusrequiredinteger
coderequiredstring
detailrequiredstring
fixrequiredstring