Skip to content

Contacts

Contacts represent customers, vendors, and other parties you transact with.

GET /api/v1/books/contacts

Scope: read

ParameterTypeDescription
contact_typestringFilter by type: customer, vendor, or both
emailstringFilter by exact email
qstringSearch by name or email
limitintegerRecords per page (default 25, max 100)
afterstringPagination cursor
{
"data": [
{
"id": 1,
"external_id": "cust-001",
"name": "Acme Corp",
"email": "billing@acme.com",
"phone": "555-0100",
"contact_type": "customer",
"billing_address": {
"line1": "123 Main St",
"city": "Springfield",
"state": "IL",
"zip": "62701"
},
"tax_id": null,
"is_1099_eligible": false,
"created_at": "2026-03-01T12:00:00Z",
"updated_at": "2026-03-01T12:00:00Z"
}
],
"page": { "limit": 25, "has_more": false, "next_cursor": null }
}

GET /api/v1/books/contacts/:id

Scope: read


GET /api/v1/books/contacts/by_external_id/:external_id

Scope: read


POST /api/v1/books/contacts

Scope: write | Idempotency: supported

{
"contact": {
"name": "Acme Corp",
"email": "billing@acme.com",
"phone": "555-0100",
"contact_type": "customer",
"external_id": "cust-001",
"tax_id": "12-3456789",
"is_1099_eligible": false,
"billing_address": {
"line1": "123 Main St",
"city": "Springfield",
"state": "IL",
"zip": "62701"
}
}
}
FieldTypeRequiredDescription
namestringyesContact name
emailstringnoEmail address
phonestringnoPhone number
contact_typestringnocustomer, vendor, or both
external_idstringnoYour system’s ID for this contact
tax_idstringnoTax identification number
is_1099_eligiblebooleannoWhether contact receives 1099s
billing_addressobjectnoAddress fields (line1, line2, city, state, zip, country)

Returns: 201 Created

Webhook: books.contact.created


POST /api/v1/books/contacts/find_or_create

Scope: write | Idempotency: supported

Upsert a contact by external_id. If a contact with the given external_id exists, returns it. Otherwise creates a new one.

{
"contact": {
"external_id": "cust-001",
"name": "Acme Corp",
"email": "billing@acme.com"
},
"update_existing": true
}
FieldTypeDescription
external_idstringRequired. Your system’s ID
update_existingbooleanIf true, updates existing contact with provided fields

Returns the contact with a created flag:

{
"data": { ... },
"created": false
}

PATCH /api/v1/books/contacts/:id

Scope: write

Same parameters as Create. Only provided fields are updated.