Users
List the members of your company — so your integration can let someone choose who an envelope is sent from.
GET /v1/users lists the people in your company. It exists for one practical reason: so your
integration can offer a "send as" picker instead of hard-coding one sender, and then pass the
chosen person's email as sender_email when it sends.
Requires the users:read scope. Read-only — there is no endpoint to invite, change, or remove a
member.
Endpoint
GET https://api2.bunnydoc.com/v1/users
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. |
status | string | Optional. One of pending, accepted, declined, archived. Omit to get every status. |
Example request
curl "https://api2.bunnydoc.com/v1/users?status=accepted&per_page=100" \
-H "Authorization: Bearer <access_token>"GET /v1/users?status=accepted&per_page=100 HTTP/1.1
Host: api2.bunnydoc.com
Authorization: Bearer <access_token>Response
{
"data": [
{
"id": "018f6b2c-3d4e-7f5a-8b6c-7d8e9f0a1b2c",
"email": "dana@yourco.com",
"first_name": "Dana",
"surname": "Lee",
"name": "Dana Lee",
"role": "admin",
"status": "accepted",
"products": ["eSign"]
}
],
"pagination": { "page": 1, "per_page": 25, "total": 1, "total_pages": 1 }
}| Field | Type | Description |
|---|---|---|
id | string | The user id. This is the person sender_email resolves to. |
email | string | Their email — the value to pass as sender_email. |
first_name / surname | string | Their name parts. Either can be empty. |
name | string | Convenience full name, trimmed. |
role | string | Organisation role: owner, admin, or member. |
status | string | Membership status: accepted, pending, declined, or archived. |
products | string[] | The seat-gated products this member holds, e.g. ["eSign"]. |
Picking a valid sender
Not everyone in the list can send. For sender_email to resolve, the member must be both:
status=accepted— a pending invitee or an archived member is not an active user, and- holding an eSign seat — check that
productscontainseSign.
Filter on both before offering someone in a picker:
const res = await fetch(
"https://api2.bunnydoc.com/v1/users?status=accepted&per_page=100",
{ headers: { Authorization: `Bearer ${token}` } },
);
const { data } = await res.json();
const senders = data.filter((u) => u.products.includes("eSign"));Anything else gives you 422 sender_not_found at send time.
One case this list can't warn you about: a member can have an accepted membership while their
user account has been deactivated. That isn't exposed here, so treat
422 sender_not_found on an otherwise-eligible member as "this person can no longer send" and fall
back to another sender or to the key owner.
Sending as someone else uses their permissions
sender_email is an in-company impersonation: the envelope is from that person, and the send is
authorised against their permissions, not the key owner's. It can only ever name someone in the
same company as the key — there is no way to send on behalf of another company.
Errors
| Status | error.code | When it happens |
|---|---|---|
403 | insufficient_scope | The key doesn't carry users:read. |
403 | forbidden | API access isn't included in your company's current plan. |
429 | rate_limited | More than 1000 requests in 15 minutes for this key. |