BunnyDoc
APIE-Signing API

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

ParameterTypeDescription
pageintegerPage number, from 1. Default 1.
per_pageintegerResults per page, 1–100. Default 25.
searchstringOptional. Filter by name or email, up to 200 characters.
statusstringOptional. One of pending, accepted, declined, archived. Omit to get every status.

Example request

List members who can actually send
curl "https://api2.bunnydoc.com/v1/users?status=accepted&per_page=100" \
  -H "Authorization: Bearer <access_token>"

Response

200 OK
{
  "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 }
}
FieldTypeDescription
idstringThe user id. This is the person sender_email resolves to.
emailstringTheir email — the value to pass as sender_email.
first_name / surnamestringTheir name parts. Either can be empty.
namestringConvenience full name, trimmed.
rolestringOrganisation role: owner, admin, or member.
statusstringMembership status: accepted, pending, declined, or archived.
productsstring[]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 products contains eSign.

Filter on both before offering someone in a picker:

Only offer members who can actually send
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

Statuserror.codeWhen it happens
403insufficient_scopeThe key doesn't carry users:read.
403forbiddenAPI access isn't included in your company's current plan.
429rate_limitedMore than 1000 requests in 15 minutes for this key.

Next steps

On this page