Contacts
List your company's contacts and create new ones — the people you send documents to.
Contacts are your company's shared address book — the people you send documents to. The API lets you look them up and add new ones. Reads and writes are scoped separately, so a key that only needs to find recipients can't grow your contact book.
List contacts
Requires the contacts:read scope.
Endpoint
GET https://api2.bunnydoc.com/v1/contacts
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 name or email, up to 200 characters. |
Example request
curl "https://api2.bunnydoc.com/v1/contacts?search=acme" \
-H "Authorization: Bearer <access_token>"GET /v1/contacts?search=acme HTTP/1.1
Host: api2.bunnydoc.com
Authorization: Bearer <access_token>Response
{
"data": [
{
"id": "018f7a1b-2c3d-7e4f-8a9b-0c1d2e3f4a5b",
"first_name": "Jane",
"middle_name": null,
"surname": "Doe",
"email": "jane@acme.com",
"contact_number": "+15551234567",
"job_title": "Head of Legal",
"company_name": "Acme Ltd",
"custom_fields": {},
"created_at": "2026-06-14T08:00:00.000Z",
"updated_at": "2026-06-14T08:00:00.000Z"
}
],
"pagination": { "page": 1, "per_page": 25, "total": 1, "total_pages": 1 }
}Create a contact
Requires the contacts:write scope. Creating a contact consumes your plan's contact allowance.
Endpoint
POST https://api2.bunnydoc.com/v1/contacts
Body
| Field | Type | Required | Notes |
|---|---|---|---|
first_name | string | Yes | Up to 100 characters. |
surname | string | Yes | Up to 100 characters. |
email | string | Yes | Valid email, up to 255 characters. |
contact_number | string | Yes | Up to 50 characters. |
middle_name | string | No | Up to 100 characters. |
job_title | string | No | Up to 150 characters. |
company_name | string | No | Up to 200 characters. |
secondary_phone | string | No | Up to 50 characters. |
notes | string | No | Up to 2000 characters. |
custom_fields | object | No | Key–value pairs for your company's custom fields. |
Example request
curl -X POST https://api2.bunnydoc.com/v1/contacts \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"first_name": "Jane",
"surname": "Doe",
"email": "jane@acme.com",
"contact_number": "+15551234567",
"job_title": "Head of Legal",
"company_name": "Acme Ltd"
}'POST /v1/contacts HTTP/1.1
Host: api2.bunnydoc.com
Authorization: Bearer <access_token>
Content-Type: application/json
{
"first_name": "Jane",
"surname": "Doe",
"email": "jane@acme.com",
"contact_number": "+15551234567",
"job_title": "Head of Legal",
"company_name": "Acme Ltd"
}Response
{
"id": "018f7a1b-2c3d-7e4f-8a9b-0c1d2e3f4a5b",
"first_name": "Jane",
"middle_name": null,
"surname": "Doe",
"email": "jane@acme.com",
"contact_number": "+15551234567",
"job_title": "Head of Legal",
"company_name": "Acme Ltd",
"custom_fields": {},
"created_at": "2026-07-28T10:15:00.000Z",
"updated_at": "2026-07-28T10:15:00.000Z"
}Errors
| Status | error.code | When it happens |
|---|---|---|
403 | quota_exceeded | Your company has reached its contact limit. |
422 | validation_failed | The body is missing a required field or a value is invalid. |
You don't have to store contacts to send to them
Creating a contact is optional. When you send from a template you provide each recipient's name and email inline — the address book is for reuse, not a prerequisite for sending.