Templates
List your E-Signing templates and read a single template's roles — the starting point for sending an envelope from the API.
Templates are the reusable documents your team has already set up in the app, with their fields and signer roles laid out. To send an envelope through the API you start from one of these, so the two read endpoints here are usually the first calls after authentication.
Both require the templates:read scope, and a key only ever sees the templates its owner can see in
the app.
List templates
Endpoint
GET https://api2.bunnydoc.com/v1/templates
Query parameters
| Parameter | Type | Description |
|---|---|---|
page | integer | Page number, from 1. Default 1. |
per_page | integer | Results per page, 1–100. Default 25. |
search | string | Optional. Filter by template name, up to 200 characters. |
Example request
curl "https://api2.bunnydoc.com/v1/templates?per_page=25&search=nda" \
-H "Authorization: Bearer <access_token>"GET /v1/templates?per_page=25&search=nda HTTP/1.1
Host: api2.bunnydoc.com
Authorization: Bearer <access_token>Response
{
"data": [
{
"id": "018f2c3d-4e5f-7a8b-9c0d-1e2f3a4b5c6d",
"name": "Mutual NDA",
"description": "Standard two-way non-disclosure agreement",
"file_count": 1,
"role_count": 2,
"created_at": "2026-06-01T09:30:00.000Z",
"updated_at": "2026-07-10T14:12:00.000Z"
}
],
"pagination": { "page": 1, "per_page": 25, "total": 1, "total_pages": 1 }
}| Field | Type | Description |
|---|---|---|
id | string | The template id — pass it to POST /v1/envelopes/from-template. |
name | string | Template name. |
description | string | null | Optional description. |
file_count | integer | Number of documents in the template. |
role_count | integer | Number of signer roles. |
created_at / updated_at | string | ISO 8601 timestamps. |
Get a template
Returns one template including its roles. Call this before sending — the roles array tells you
exactly which role names to supply, and which ones are locked.
Endpoint
GET https://api2.bunnydoc.com/v1/templates/{id}
Example request
curl https://api2.bunnydoc.com/v1/templates/018f2c3d-4e5f-7a8b-9c0d-1e2f3a4b5c6d \
-H "Authorization: Bearer <access_token>"GET /v1/templates/018f2c3d-4e5f-7a8b-9c0d-1e2f3a4b5c6d HTTP/1.1
Host: api2.bunnydoc.com
Authorization: Bearer <access_token>Response
{
"id": "018f2c3d-4e5f-7a8b-9c0d-1e2f3a4b5c6d",
"name": "Mutual NDA",
"description": "Standard two-way non-disclosure agreement",
"file_count": 1,
"role_count": 2,
"created_at": "2026-06-01T09:30:00.000Z",
"updated_at": "2026-07-10T14:12:00.000Z",
"roles": [
{
"role": "Client",
"recipient_type": "need-to-sign",
"signing_order": 1,
"locked": false
},
{
"role": "Account manager",
"recipient_type": "need-to-sign",
"signing_order": 2,
"locked": true,
"name": "Dana Lee",
"email": "dana@yourco.com"
}
]
}| Role field | Type | Description |
|---|---|---|
role | string | The role name. Supply this in recipients[].role when you send. |
recipient_type | string | How the recipient participates, e.g. need-to-sign, receives-a-copy. |
signing_order | integer | The order this role signs in. |
locked | boolean | If true, the name and email are fixed on the template — omit this role from your send request. |
name / email | string | null | Present only for locked roles — the fixed recipient. |
Locked roles can't be reassigned
A locked role already has a person attached (or it's the template's own sender). Sending a recipient
for a locked role is rejected with unknown_signer_role. Only supply recipients for roles where
locked is false.
Errors
| Status | error.code | When it happens |
|---|---|---|
404 | template_not_found | No template with that id exists in your company. |