API reference
Customers
The people and companies you invoice, with their emails, phones and addresses.
A customer (a contact in the API) has a name or company, a VAT number, and any number of emails, phones and addresses. One of each can be primary: that's the one copied onto invoices.
- Create a customer with its emails, phones and addresses in one request.
- Afterwards, manage them with
/email,/phoneand/address, passing the customer'scontact_id. - Leave out
contact_idand the same endpoints manage your business's own details, the ones shown as the sender on invoices.
Customers
List contacts, or get one by id
/v1/contactquery searches first, last and company name. Contacts include their email, phone and address lists.
Needs the contact:read permission
Query parameters
idcustomer idcontact_
querytextUp to 200 characters
limitnumber1–50, default 20
aftercustomer idcontact_
beforecustomer idcontact_
curl https://api.zulu.ie/v1/contact \
-H "Authorization: Bearer $ZULU_API_KEY" \
-H "Zulu-Business-Id: $ZULU_BUSINESS_ID"Example response200
{
"data": [
{
"id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"first_name": "Aoife",
"last_name": "Murphy",
"company_name": "Globex Ireland Ltd",
"vat_number": "IE9876543W",
"email": [
{
"id": "email_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"contact_id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"name": "Main",
"email": "accounts@globex.ie",
"first_name": "Aoife",
"last_name": "Murphy",
"is_primary": true
}
],
"phone": [
{
"id": "phone_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"contact_id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"name": "Main",
"phone": "+353 1 234 5678",
"is_primary": true
}
],
"address": [
{
"id": "address_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"contact_id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"name": "Main",
"address_1": "Unit 4, Docklands Innovation Park",
"address_2": null,
"city": "Dublin 1",
"county": "Dublin",
"eircode": "D01 X2Y3",
"country": "Ireland",
"is_primary": true
}
]
}
],
"has_more": false
}Create a contact
/v1/contactEmail, phone and address entries can be created with the contact. In each list, the entry marked is_primary (or else the first) is primary.
Needs the contact:write permission
Body
first_nametextUp to 200 characters
last_nametextUp to 200 characters
company_nametextUp to 200 characters
vat_numbertextUp to 30 characters
emaillist of objects5 fields inside
nametextrequiredUp to 200 characters
emailemailrequiredUp to 254 characters
first_nametextUp to 200 characters
last_nametextUp to 200 characters
is_primarytrue or false
phonelist of objects3 fields inside
nametextrequiredUp to 200 characters
phonetextrequiredUp to 50 characters
is_primarytrue or false
addresslist of objects8 fields inside
nametextrequiredUp to 200 characters
address_1textUp to 200 characters
address_2textUp to 200 characters
citytextUp to 200 characters
countytextUp to 200 characters
eircodetextUp to 200 characters
countrytextUp to 200 characters
is_primarytrue or false
curl -X POST https://api.zulu.ie/v1/contact \
-H "Authorization: Bearer $ZULU_API_KEY" \
-H "Zulu-Business-Id: $ZULU_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{
"company_name": "Globex Ireland Ltd",
"first_name": "Aoife",
"last_name": "Murphy",
"vat_number": "IE9876543W",
"email": [
{
"name": "Accounts",
"email": "accounts@globex.ie",
"is_primary": true
}
],
"address": [
{
"name": "Head office",
"address_1": "Unit 4, Docklands Innovation Park",
"city": "Dublin 1",
"eircode": "D01 X2Y3",
"country": "Ireland",
"is_primary": true
}
]
}'Example response201
{
"id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"first_name": "Aoife",
"last_name": "Murphy",
"company_name": "Globex Ireland Ltd",
"vat_number": "IE9876543W",
"email": [
{
"id": "email_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"contact_id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"name": "Main",
"email": "accounts@globex.ie",
"first_name": "Aoife",
"last_name": "Murphy",
"is_primary": true
}
],
"phone": [
{
"id": "phone_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"contact_id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"name": "Main",
"phone": "+353 1 234 5678",
"is_primary": true
}
],
"address": [
{
"id": "address_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"contact_id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"name": "Main",
"address_1": "Unit 4, Docklands Innovation Park",
"address_2": null,
"city": "Dublin 1",
"county": "Dublin",
"eircode": "D01 X2Y3",
"country": "Ireland",
"is_primary": true
}
]
}Update a contact
/v1/contactChange email, phone and address entries through /email, /phone and /address.
Needs the contact:write permission
Body
idcustomer idrequiredfirst_nametextUp to 200 characters
last_nametextUp to 200 characters
company_nametextUp to 200 characters
vat_numbertextUp to 30 characters
curl -X PATCH https://api.zulu.ie/v1/contact \
-H "Authorization: Bearer $ZULU_API_KEY" \
-H "Zulu-Business-Id: $ZULU_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{
"id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d"
}'Example response200
{
"id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"first_name": "Aoife",
"last_name": "Murphy",
"company_name": "Globex Ireland Ltd",
"vat_number": "IE9876543W",
"email": [
{
"id": "email_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"contact_id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"name": "Main",
"email": "accounts@globex.ie",
"first_name": "Aoife",
"last_name": "Murphy",
"is_primary": true
}
],
"phone": [
{
"id": "phone_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"contact_id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"name": "Main",
"phone": "+353 1 234 5678",
"is_primary": true
}
],
"address": [
{
"id": "address_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"contact_id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"name": "Main",
"address_1": "Unit 4, Docklands Innovation Park",
"address_2": null,
"city": "Dublin 1",
"county": "Dublin",
"eircode": "D01 X2Y3",
"country": "Ireland",
"is_primary": true
}
]
}Delete a contact
/v1/contactAlso deletes the contact's email, phone and address entries.
Needs the contact:delete permission
Body
idcustomer idrequired
curl -X DELETE https://api.zulu.ie/v1/contact \
-H "Authorization: Bearer $ZULU_API_KEY" \
-H "Zulu-Business-Id: $ZULU_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{
"id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d"
}'Returns 204 with no body.
Email addresses
List email addresses, or get one by id
/v1/emailquery searches name and email. contact_id lists one contact's entries.
Needs the email:read permission
Query parameters
idemail idemail_
querytextUp to 200 characters
limitnumber1–50, default 20
afteremail idemail_
beforeemail idemail_
contact_idcustomer idcontact_
curl https://api.zulu.ie/v1/email \
-H "Authorization: Bearer $ZULU_API_KEY" \
-H "Zulu-Business-Id: $ZULU_BUSINESS_ID"Example response200
{
"data": [
{
"id": "email_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"contact_id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"name": "Main",
"email": "accounts@globex.ie",
"first_name": "Aoife",
"last_name": "Murphy",
"is_primary": true
}
],
"has_more": false
}Create an email address
/v1/emailWithout contact_id, the entry belongs to the business and needs business:manage. The first entry for an owner is primary.
Needs the email:write permission
Body
contact_idcustomer idnametextrequiredUp to 200 characters
emailemailrequiredUp to 254 characters
first_nametextUp to 200 characters
last_nametextUp to 200 characters
is_primarytrue or false
curl -X POST https://api.zulu.ie/v1/email \
-H "Authorization: Bearer $ZULU_API_KEY" \
-H "Zulu-Business-Id: $ZULU_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{
"name": "Main",
"email": "accounts@globex.ie"
}'Example response201
{
"id": "email_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"contact_id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"name": "Main",
"email": "accounts@globex.ie",
"first_name": "Aoife",
"last_name": "Murphy",
"is_primary": true
}Update an email address
/v1/emailSetting is_primary clears it on the owner's other entries. To change the primary entry, set it on another entry.
Needs the email:write permission
Body
idemail idrequirednametextUp to 200 characters
emailemailUp to 254 characters
first_nametextUp to 200 characters
last_nametextUp to 200 characters
is_primarytrue or false
curl -X PATCH https://api.zulu.ie/v1/email \
-H "Authorization: Bearer $ZULU_API_KEY" \
-H "Zulu-Business-Id: $ZULU_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{
"id": "email_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b"
}'Example response200
{
"id": "email_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"contact_id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"name": "Main",
"email": "accounts@globex.ie",
"first_name": "Aoife",
"last_name": "Murphy",
"is_primary": true
}Delete an email address
/v1/emailIf the primary entry is deleted, the oldest remaining one becomes primary.
Needs the email:delete permission
Body
idemail idrequired
curl -X DELETE https://api.zulu.ie/v1/email \
-H "Authorization: Bearer $ZULU_API_KEY" \
-H "Zulu-Business-Id: $ZULU_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{
"id": "email_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b"
}'Returns 204 with no body.
Phone numbers
List phone numbers, or get one by id
/v1/phonequery searches name and number. contact_id lists one contact's entries.
Needs the phone:read permission
Query parameters
idphone idphone_
querytextUp to 200 characters
limitnumber1–50, default 20
afterphone idphone_
beforephone idphone_
contact_idcustomer idcontact_
curl https://api.zulu.ie/v1/phone \
-H "Authorization: Bearer $ZULU_API_KEY" \
-H "Zulu-Business-Id: $ZULU_BUSINESS_ID"Example response200
{
"data": [
{
"id": "phone_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"contact_id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"name": "Main",
"phone": "+353 1 234 5678",
"is_primary": true
}
],
"has_more": false
}Create a phone number
/v1/phoneWithout contact_id, the entry belongs to the business and needs business:manage. The first entry for an owner is primary.
Needs the phone:write permission
Body
contact_idcustomer idnametextrequiredUp to 200 characters
phonetextrequiredUp to 50 characters
is_primarytrue or false
curl -X POST https://api.zulu.ie/v1/phone \
-H "Authorization: Bearer $ZULU_API_KEY" \
-H "Zulu-Business-Id: $ZULU_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{
"name": "Main",
"phone": "+353 1 234 5678"
}'Example response201
{
"id": "phone_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"contact_id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"name": "Main",
"phone": "+353 1 234 5678",
"is_primary": true
}Update a phone number
/v1/phoneSetting is_primary clears it on the owner's other entries. To change the primary entry, set it on another entry.
Needs the phone:write permission
Body
idphone idrequirednametextUp to 200 characters
phonetextUp to 50 characters
is_primarytrue or false
curl -X PATCH https://api.zulu.ie/v1/phone \
-H "Authorization: Bearer $ZULU_API_KEY" \
-H "Zulu-Business-Id: $ZULU_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{
"id": "phone_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b"
}'Example response200
{
"id": "phone_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"contact_id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"name": "Main",
"phone": "+353 1 234 5678",
"is_primary": true
}Delete a phone number
/v1/phoneIf the primary entry is deleted, the oldest remaining one becomes primary.
Needs the phone:delete permission
Body
idphone idrequired
curl -X DELETE https://api.zulu.ie/v1/phone \
-H "Authorization: Bearer $ZULU_API_KEY" \
-H "Zulu-Business-Id: $ZULU_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{
"id": "phone_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b"
}'Returns 204 with no body.
Addresses
List addresses, or get one by id
/v1/addressquery searches name, first line, city and eircode. contact_id lists one contact's entries.
Needs the address:read permission
Query parameters
idaddress idaddress_
querytextUp to 200 characters
limitnumber1–50, default 20
afteraddress idaddress_
beforeaddress idaddress_
contact_idcustomer idcontact_
curl https://api.zulu.ie/v1/address \
-H "Authorization: Bearer $ZULU_API_KEY" \
-H "Zulu-Business-Id: $ZULU_BUSINESS_ID"Example response200
{
"data": [
{
"id": "address_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"contact_id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"name": "Main",
"address_1": "Unit 4, Docklands Innovation Park",
"address_2": null,
"city": "Dublin 1",
"county": "Dublin",
"eircode": "D01 X2Y3",
"country": "Ireland",
"is_primary": true
}
],
"has_more": false
}Create an address
/v1/addressWithout contact_id, the entry belongs to the business and needs business:manage. The first entry for an owner is primary.
Needs the address:write permission
Body
contact_idcustomer idnametextrequiredUp to 200 characters
address_1textUp to 200 characters
address_2textUp to 200 characters
citytextUp to 200 characters
countytextUp to 200 characters
eircodetextUp to 200 characters
countrytextUp to 200 characters
is_primarytrue or false
curl -X POST https://api.zulu.ie/v1/address \
-H "Authorization: Bearer $ZULU_API_KEY" \
-H "Zulu-Business-Id: $ZULU_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{
"name": "Main"
}'Example response201
{
"id": "address_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"contact_id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"name": "Main",
"address_1": "Unit 4, Docklands Innovation Park",
"address_2": null,
"city": "Dublin 1",
"county": "Dublin",
"eircode": "D01 X2Y3",
"country": "Ireland",
"is_primary": true
}Update an address
/v1/addressSetting is_primary clears it on the owner's other entries. To change the primary entry, set it on another entry.
Needs the address:write permission
Body
idaddress idrequirednametextUp to 200 characters
address_1textUp to 200 characters
address_2textUp to 200 characters
citytextUp to 200 characters
countytextUp to 200 characters
eircodetextUp to 200 characters
countrytextUp to 200 characters
is_primarytrue or false
curl -X PATCH https://api.zulu.ie/v1/address \
-H "Authorization: Bearer $ZULU_API_KEY" \
-H "Zulu-Business-Id: $ZULU_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{
"id": "address_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b"
}'Example response200
{
"id": "address_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b",
"created_at": "2026-10-27T09:30:00.000Z",
"updated_at": "2026-10-27T09:30:00.000Z",
"contact_id": "contact_8a3e2c1d-4b5f-4e6a-9c7d-1e2f3a4b5c6d",
"name": "Main",
"address_1": "Unit 4, Docklands Innovation Park",
"address_2": null,
"city": "Dublin 1",
"county": "Dublin",
"eircode": "D01 X2Y3",
"country": "Ireland",
"is_primary": true
}Delete an address
/v1/addressIf the primary entry is deleted, the oldest remaining one becomes primary.
Needs the address:delete permission
Body
idaddress idrequired
curl -X DELETE https://api.zulu.ie/v1/address \
-H "Authorization: Bearer $ZULU_API_KEY" \
-H "Zulu-Business-Id: $ZULU_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{
"id": "address_3f2b8c1e-7a6d-4e5f-9b0a-1c2d3e4f5a6b"
}'Returns 204 with no body.