This portion of the API provides endpoints for managing contact records, including addresses, contact details, and associations between contacts.
Servers
https://api.ezyvet.comezyVet production environment
https://api.trial.ezyvet.comezyVet trial environment
Fetches a list containing Address(es)
GET
/v1/address
Authorizations
bearerAuth
clientCredentials Flow
Token URL
"https://api.ezyvet.com/v1/oauth/access_token"Scopes:
"read-address"Read address resources
Parameters
Query Parameters
id
Type
string
active
Type
string
created_at
Type
string
modified_at
Type
string
name
Type
string
street_1
Type
string
street_2
Type
string
suburb
Type
string
city
Type
string
region
Type
string
post_code
Type
string
state
Type
string
country_id
Type
string
longitude
Type
string
latitude
Type
string
Responses
A list of Addresses
application/json
JSON "meta": { "timestamp": "string", "items_page": "string", "items_page_total": "string", "items_page_size": "string", "items_total": "string" }, "items": [ { "address": { "id": "string", "active": "string", "created_at": "string", "modified_at": "string", "name": "string", "street_1": "string", "street_2": "string", "suburb": "string", "city": "string", "region": "string", "post_code": "string", "country_id": "string", "state": "string", "longitude": "string", "latitude": "string", "for_resource": { "Contact": { "id": "string" } } } } ], "messages": [ ]
{
}
GET
/v1/address
Samples
Communication
Records of communications with a contact — email, SMS, phone call, in-person conversation or letter — including their content and delivery status.
Get a Communication
GET
/v2/communication
Authorizations
bearerAuth
clientCredentials Flow
Token URL
"https://api.ezyvet.com/v1/oauth/access_token"Scopes:
"read-communication"Read communication resources
Parameters
Query Parameters
uid
The unique identifier of the communication
Type
string
Example
"communication_BPSHlXlBrdLKxqyVtEtcz"associated_type
The name of the record type the Communication is directed at. Examples are 'Contact', 'Animal', 'Consult'.
Type
string
associated_id
The ID of the record the Communication is directed at.
Type
number
content_format
The format of the content. This will be one of the following: SMS, PlainText, HTML.
Type
string
Valid values
"SMS""PlainText""HTML"status
The status of the Communication. This will be one of the following: Pending, Done, Sending, Failed.
Type
string
Valid values
"Pending""Done""Sending""Failed"communicating_type
The name of the record type the Communication is communicating. Examples are 'Contact', 'Animal', 'Consult'.
Type
string
communicating_id
The ID of the record the Communication is communicating.
Type
number
Responses
A list of Communications
application/json
JSON "meta": { "timestamp": "string", "items_page": "string", "items_page_total": "string", "items_page_size": "string", "items_total": "string" }, "items": [ { "communication": { "id": 0, "uid": "string", "created_at": 0, "modified_at": 0, "active": true, "associated_type": "string", "associated_id": 0, "contact_detail_type_id": 0, "destination": "string", "origin": "string", "direction": "string", "sent_as_user": { "id": 0, "created_at": 0, "modified_at": 0, "active": true, "is_vet": true, "is_salesperson": true, "name": "string", "code": "string" }, "content": "string", "content_format": "string", "status": "string", "subject": "string", "communicating_type": "string", "communicating_id": 0, "template": { "id": 0, "created_at": 0, "modified_at": 0, "active": true, "name": "string", "type": "string", "subtype": "string", "additional_information": { } }, "read_at": 0 } } ], "messages": [ "string" ]
{
}
GET
/v2/communication
Samples
Records one or more sent communication records in bulk.
POST
/v4/communication/sentCommunication
Accepts an array of communication records that have already been sent.
All communications are automatically marked as "Done" status and externally managed.
Authorizations
bearerAuth
clientCredentials Flow
Token URL
"https://api.ezyvet.com/v1/oauth/access_token"Scopes:
"write-communication"Create and update communication resources
Request Body
application/json
JSON { "associatedType": "Contact", "associatedId": "contact_HfoQJT3F4pk4DPGPn131C", "communicationType": "Email", "destination": "demo@demo.com", "direction": "Outgoing", "content": "This is a reminder that Rader is due for their wellness exam.", "contentFormat": "PlainText", "subject": "Wellness Exam Reminder", "userId": "user_B4vrE744DdwUXqFxHntAY", "departmentId": "ownershipSeparation_wQU1jqt39kjns3XvzqXqL", "communicationTimestamp": "2024-01-15T14:30:00Z", "hospitalId": "hospital_apJEA7ntuKKhpa0a9Hlya", "origin": "noreply@clinic.com" }
[
]
Responses
Successfully recorded communication(s)
POST
/v4/communication/sentCommunication
Samples
Fetches a list containing Contacts
GET
/v1/contact
Authorizations
bearerAuth
clientCredentials Flow
Token URL
"https://api.ezyvet.com/v1/oauth/access_token"Scopes:
"read-contact"Read contact resources
Parameters
Query Parameters
id
The ID number used by the system to uniquely identify a Contact.
active
If true, the Contact is active and usable in ezyVet.
created_at
The epoch time when the Contact was created.
modified_at
The epoch time when the Contact was last modified.
ownership_id
The ID of the ownership Separation to which this Contact belongs.
code
The custom code override for the Contact.
Type
string
first_name
The Contact's first name.
Type
string
last_name
The Contact's last/family name.
Type
string
business_name
The Contact's business name, if it is a business.
Type
string
is_business
If true, the Contact is a business.
is_customer
If true, the Contact is a customer.
is_supplier
If true, the Contact is a supplier.
is_vet
If true, the Contact is a vet.
is_syndicate
If true, the Contact is a syndicate.
is_staff_member
If true, the Contact is a staff member.
website
The Contact's website.
Type
string
address_postal
The unique identifier of the PostalAddress.
stop_credit
Specifies if the Contact can be invoiced: OK (invoiceable), WARNING (issues a warning when invoiced), STOP (cannot be invoiced).
Type
string
Valid values
"OK""WARNING""STOP"limit
Sets the limit on the number of items returned (range: 1 - 50).
Default
10page
Specifies the page number of the result.
Default
1date_of_birth
The date of birth of the primary contact.
Type
number
Default
0driver_license_number
The driver license number of the primary contact.
Type
string
Default
nulldriver_license_issuer
The issuer of the driver license of the primary contact.
Type
string
Default
nulldriver_license_expiry
The expiry date of the driver license of the primary contact.
Responses
A list of Contacts.
application/json
JSON "meta": { "timestamp": "string", "items_page": "string", "items_page_total": "string", "items_page_size": "string", "items_total": "string" }, "items": [ { "contact": { "id": "string", "active": "string", "created_at": "string", "modified_at": "string", "code": "string", "first_name": "string", "last_name": "string", "business_name": "string", "is_business": "string", "is_customer": "string", "is_supplier": "string", "is_vet": "string", "is_syndicate": "string", "is_staff_member": "string", "website": "string", "stop_credit": "string", "contact_detail_list": [ 0 ], "address_physical": "string", "address_postal": "string", "date_of_birth": 0, "driver_license_number": "string", "driver_license_issuer": "string", "driver_license_expiry": 0, "ownership_id": "string" } } ], "messages": [ ]
{
}
GET
/v1/contact
Samples
Contact Association
Manages relationships or associations between contacts (e.g., owner and emergency contact).
Operations
Fetch a list of contact associations
GET
/v1/contactassociation
Fetches a list of ContactAssociations.
Authorizations
bearerAuth
clientCredentials Flow
Token URL
"https://api.ezyvet.com/v1/oauth/access_token"Scopes:
"read-contactassociation"Read contact association resources
Parameters
Query Parameters
id
The ID number used by the system to uniquely identify a ContactAssociation.
Type
string
contact_id
The Contact to fetch the associated contact ids for
Type
string
Default
"61"active
If true, the ContactAssociation is active and usable in ezyVet.
Type
string
created_at
The epoch time when the ContactAssociation was created.
Type
string
modified_at
The epoch time when the ContactAssociation was last modified.
Type
string
limit
Limits the number of items returned.
Type
number
Default
10page
Specifies the page number of the result.
Type
number
Default
1Responses
A list of ContactAssociations.
application/json
JSON "meta": { "items_page": 0, "items_page_total": 0, "items_page_size": 0, "items_total": 0, "transaction_id": "string", "timestamp": 0 }, "items": [ { "contactassociation": { "id": 0, "created_at": 0, "modified_at": 0, "active": true, "contact_id": 0, "associatedcontact_id": 0, "associationclass": "string" } } ], "messages": [ "string" ]
{
}
GET
/v1/contactassociation
Samples
Fetch a ContactDetail list
GET
/v1/contactdetail
Fetches a list containing ContactDetail(s). (up to 10)
Authorizations
bearerAuth
clientCredentials Flow
Token URL
"https://api.ezyvet.com/v1/oauth/access_token"Scopes:
"read-contactdetail"Read contact detail resources
Parameters
Query Parameters
id
The ID number used by the system to uniquely identify a ContactDetail.
Type
string
active
If true, the ContactDetail is active and usable in ezyVet.
Type
boolean
Default
truecreated_at
The epoch time when the ContactDetail was created.
Type
string
modified_at
The epoch time when the ContactDetail was last modified.
Type
string
name
The name of the ContactDetail, such as "Home Phone" or "Business E-mail".
Type
string
value
The value of the ContactDetail, such as the number, or the email (depending on its ContactDetailType).
Type
string
value_cleaned
The value of the ContactDetail record which has been cleaned of all special characters and prefixed with the country code. This filter can be used for phone or fax numbers but it should not be used for email addresses.
Type
string
contact_id
The ID of the Contact to whom this ContactDetail is assigned.
Type
string
contact_detail_type_id
The ID of the ContactDetailType of this ContactDetail.
Type
string
preferred
If true, this ContactDetail is a preferred contact method for the related Contact.
Type
boolean
Default
falsesubscription_groups
A list of subscription groups that this ContactDetail is subscribed to (General, Reminders, Accounts).
Type
array
Responses
Successful response
application/json
JSON "meta": { "timestamp": "string", "items_page": "string", "items_page_total": "string", "items_page_size": "string", "items_total": "string" }, "items": [ { "contactdetail": { "id": "string", "active": true, "created_at": "string", "modified_at": "string", "name": "string", "value": "string", "contact_id": "string", "value_cleaned": "string", "contact_detail_type_id": "string", "preferred": false, "subscription_groups": [ "string" ] } } ], "messages": [ ]
{
}
GET
/v1/contactdetail
Samples
Fetch a ContactDetailType list
GET
/v1/contactdetailtype
Fetches a list containing ContactDetailType(s). (up to 10)
Authorizations
bearerAuth
clientCredentials Flow
Token URL
"https://api.ezyvet.com/v1/oauth/access_token"Scopes:
"read-contactdetailtype"Read contact detail type resources
Parameters
Query Parameters
id
The ID number used by the system to uniquely identify an ContactDetailType.
active
If true, the ContactDetailType is active and usable in ezyVet.
created_at
The epoch time when the ContactDetailType was created.
modified_at
The epoch time when the ContactDetailType was last modified.
name
The name of the ContactDetailType.
Type
string
Responses
Successful response
application/json
JSON "meta": { "timestamp": "string", "items_page": "string", "items_page_total": "string", "items_page_size": "string", "items_total": "string" }, "items": [ { "contactdetailtype": { "id": "string", "active": "string", "created_at": "string", "modified_at": "string", "name": "string" } } ], "messages": [ ]
{
}
GET
/v1/contactdetailtype
Samples
Fetch a Country list
GET
/v1/country
Fetches a list containing Country(s). (up to 10)
Authorizations
bearerAuth
clientCredentials Flow
Token URL
"https://api.ezyvet.com/v1/oauth/access_token"Scopes:
"read-country"Read country resources
Parameters
Query Parameters
id
The ID number used by the system to uniquely identify a Country.
Type
string
active
If true, the Country is active and usable in ezyVet.
Type
string
created_at
The epoch time when the Country was created.
Type
string
modified_at
The epoch time when the Country was last modified.
Type
string
name
The name of the Country.
Type
string
limit
Limits the number of items returned.
Type
string
Default
10page
Specifies the page number of the result.
Type
string
Default
1Responses
A list of countries
application/json
JSON "meta": { "timestamp": "string", "items_page": "string", "items_page_total": "string", "items_page_size": "string", "items_total": "string" }, "items": [ { "country": { "id": "string", "active": "string", "created_at": 0, "modified_at": 0, "name": "string" } } ], "messages": [ { } ]
{
}
GET
/v1/country
Samples
Fetches a list containing Contacts
GET
/v2/contact
Authorizations
bearerAuth
clientCredentials Flow
Token URL
"https://api.ezyvet.com/v1/oauth/access_token"Scopes:
"read-contact"Read contact resources
Parameters
Query Parameters
id
The ID number used by the system to uniquely identify a Contact.
Type
string
uid
The globally unique identifier to identify a Contact.
Type
string
created_at
The epoch time when the Contact was created.
Type
string
modified_at
The epoch time when the Contact was last modified.
Type
string
active
If true, the Contact is active and usable in ezyVet.
Type
string
code
The custom code override for the Contact.
Type
string
first_name
The Contact's first name.
Type
string
last_name
The Contact's last/family name.
Type
string
business_name
The Contact's business name, if it is a business.
Type
string
is_customer
If true, the Contact is a customer.
Type
string
is_vet
If true, the Contact is a vet.
Type
string
is_supplier
If true, the Contact is a supplier.
Type
string
is_syndicate
If true, the Contact is a syndicate.
Type
string
is_staff_member
If true, the Contact is a staff member.
Type
string
stop_credit
Specifies if the Contact can be invoiced: OK (invoiceable), WARNING (issues a warning when invoiced), STOP (cannot be invoiced).
Type
string
Valid values
"OK""WARNING""STOP"website
The Contact's website.
Type
string
address_physical
The unique identifier of the PhysicalAddress.
Type
string
address_postal
The unique identifier of the PostalAddress.
Type
string
Responses
Successful response
application/json
JSON "meta": { "timestamp": "string" }, "items": [ { "contact": { "id": 0, "uid": "string", "created_at": 0, "modified_at": 0, "active": true, "code": "string", "first_name": "string", "last_name": "string", "business_name": "string", "is_customer": true, "is_business": true, "is_vet": true, "is_supplier": true, "is_syndicate": true, "is_staff_member": true, "stop_credit": "string", "website": "string", "address_physical": 0, "address_postal": 0, "contact_detail_list": [ { "id": 0, "name": "string", "type_id": 0, "preferred": true, "value": "string", "value_cleaned": "string" } ] } } ], "messages": [ ]
{
}
GET
/v2/contact
Samples
Contact V4
Contact management for customers, vets, suppliers and businesses. Version 4.0 uses token
pagination and returns each contact's addresses, emails, phones, subscriptions and associations
as nested objects.
Filterable columns on GET /v4/contact and the shapes they accept:
| Column | Accepted value |
|---|---|
| id | scalar — exact match |
| active | scalar — exact match (0 or 1) |
| code | scalar — exact match |
| name | scalar — exact match |
| createdAt | URL-encoded JSON comparator object (eq/gt/lt/gte/lte) |
| updatedAt | URL-encoded JSON comparator object (eq/gt/lt/gte/lte) |
Only createdAt and updatedAt accept the comparator object described in the
filtering guide; note that v4 date
filters take RFC-3339 instants (2024-05-17T13:00:00Z), not the Unix epoch values shown
there. Every other filter is scalar exact-match only — sending a comparator object for one is
not supported.
Contact associations
A contact association is a link between two contacts (the UI's Associated Contacts, e.g. a
referring vet linked to a referral clinic, or two household members). It is stored as two
directional rows, A → B and B → A, which always share type; description is
per direction. Associations are exposed nested on the contact, never as a separate resource:
- Every Contact carries
associations[]: the contact's active outgoing rows, one per associated
contact, whosecontactIdis the other party (the parent is implied). Each entry has its
ownid, andpairIdidentifies the reciprocal row on the other contact. Inactive (deleted)
associations are not listed. The per-contact internalSELFrow is never exposed. PATCH /v4/contact/{id}withassociations[]replaces the contact's active associations
with the list sent, keyed bycontactId(the same model asroleson
PATCH /v4/user/{id}): entries with no active association are created (or revive a previously
deactivated pair between the same contacts), entries matching an active association are updated
in place, and active associations not in the list are deactivated.[]deactivates them
all; omitting the field leaves them unchanged. Both rows of every affected pair are written in
one transaction, and the call is idempotent.POST /v4/contactaccepts the sameassociations[]to link a new contact on creation.referring-vet-managementis a workflow scope that grants every v4 contact operation (like
user-managementon the user endpoints), so a referring-vet integration needs only that
scope; the resource scopesread-contact/write-contactwork as before.onBillPercent
is read-only in this release.- Creating, reviving or deactivating an association re-indexes both contacts for search, so the
linked contact appears in ezyVet's Referring Vet pickers shortly after the call.
List all contacts
GET
/v4/contact
Retrieve a paginated list of all contacts with optional filtering.
Returns complete contact data including addresses, emails, phones, and subscriptions (same as individual contact endpoints). Successful responses include meta (with nextToken when another page exists).
Pagination (same pattern as GET /v4/species): On the first page, send pageSize and any list filters as query parameters. The nextToken value is a Base64URL-encoded JSON object that embeds lastContactId, pageSize, and a snapshot of the supported filters (id, active, createdAt, updatedAt, code, name). For the next page, send only nextToken (plus optional infrastructure keys such as _ezyhost); do not repeat pageSize or list filters in the query string.
Authorizations
bearerAuth
clientCredentials Flow
Token URL
"https://api.ezyvet.com/v1/oauth/access_token"Scopes:
"read-contact"Read contact resources
or
bearerAuth
clientCredentials Flow
Token URL
"https://api.ezyvet.com/v1/oauth/access_token"Scopes:
"referring-vet-management"Workflow scope for referring-vet integrations; grants every v4 contact operation (GET/POST /v4/contact, GET/PATCH /v4/contact/{id})
Parameters
Query Parameters
pageSize
Sets the number of items to be returned in each page. Default is 2000, Limit is 2000.
Type
integer
Example
200Default
2000Maximum
2000nextToken
Opaque Base64URL token for the next page. Embeds lastContactId, pageSize, and the supported list filters from the request that produced it (same pattern as GET /v4/species). When using nextToken, send only nextToken in the query string (no pageSize or list filters).
Type
string
Example
"AB3e7Z2i9FJu0j7hLExLp"id
Filter by contact UID (contact_uid) — exact match only.
Type
string
active
Filter by active flag — exact match only. 1 returns active contacts; 0 returns inactive contacts (stored as contactdata_active IS NULL for v1 parity, so 0 matches NULL as well as any legacy literal 0).
Type
string
createdAt
Filter by created time (contact_time). Value is a URL-encoded JSON object keyed by comparator, per the IDEXX API filtering standard. Supported comparators: eq, gt, lt, gte, lte. Multiple comparators may be combined in one object to express a range (e.g. gte + lte). Examples (raw JSON, before URL-encoding):
- exact match —
createdAt={"eq":"2022-01-05T23:23:43Z"} - one-week range —
createdAt={"gte":"2024-05-17T00:00:00Z","lte":"2024-05-24T00:00:00Z"}
Each value must be a strict RFC-3339 instant: YYYY-MM-DD + T + HH:MM:SS (seconds required) + Z or ±HH:MM (colon required). Lowercase z, compact ±HHMM, missing seconds, fractional seconds, epoch-seconds, date-only, and bare non-JSON scalars all return 400 Bad Request. Unknown comparator keys (neq, in, between, etc.) also return 400 Bad Request.
Type
string
Example
{"gte":"2024-05-17T13:00:00Z","lte":"2024-05-24T00:00:00Z"}updatedAt
Filter by last updated time (contactdata_time). Value is a URL-encoded JSON object keyed by comparator, per the IDEXX API filtering standard. Supported comparators: eq, gt, lt, gte, lte. Multiple comparators may be combined in one object to express a range (e.g. gte + lte). Examples (raw JSON, before URL-encoding):
- exact match —
updatedAt={"eq":"2022-01-05T23:23:43Z"} - one-week range —
updatedAt={"gte":"2024-05-17T00:00:00Z","lte":"2024-05-24T00:00:00Z"}
Each value must be a strict RFC-3339 instant: YYYY-MM-DD + T + HH:MM:SS (seconds required) + Z or ±HH:MM (colon required). Lowercase z, compact ±HHMM, missing seconds, fractional seconds, epoch-seconds, date-only, and bare non-JSON scalars all return 400 Bad Request. Unknown comparator keys (neq, in, between, etc.) also return 400 Bad Request.
Type
string
Example
{"gte":"2024-05-17T13:00:00Z","lte":"2024-05-24T00:00:00Z"}code
Filter by contact code (contactdata_code) — exact match only.
Type
string
name
Filter by contact name (contactdata_name) — exact match only.
Type
string
Responses
Contacts retrieved successfully
application/json
JSON "meta": { "nextToken": "AB3e7Z2i9FJu0j7hLExLp" }, "data": [ { "id": "contact-abc123", "legacyId": 1, "code": "CUST001", "name": "John Smith", "title": "Mr", "first": "John", "last": "Smith", "secondaryTitle": "Mrs", "secondaryFirst": "Jane", "secondaryLast": "Smith", "website": "https://johnsmith.com", "confirmed": true, "notes": "Preferred customer", "active": true, "hospitalUid": "hosp-9z8y7x", "ownershipseparationUid": "ownsep-1a2b3c", "isBusiness": false, "isCustomer": true, "isSupplier": false, "isVet": false, "isSyndicate": false, "isStaffMember": false, "isPharmacy": false, "associations": [ { "id": "contactAssociation_7AZREcNqie6sMZAQ63J6J", "legacyId": 220, "contactId": "contact_DIV2GTZ2YTimamjTOHdTA", "type": "Employment", "onBillPercent": 0, "pairId": "contactAssociation_cBPqqQGMZ6z6J9Up4cPuH", "createdAt": "2026-05-09T02:29:54Z", "updatedAt": "2026-05-09T02:29:54Z" } ], "createdAt": "2024-01-15T10:30:00Z", "updatedAt": "2024-01-16T14:45:00Z", "addressPhysical": { "id": 1, "name": "John Smith Home", "street1": "123 Main Street", "city": "Los Angeles", "state": "California", "postcode": "90210", "country": "United States" }, "emails": [ { "emailId": "email_abc123def456", "legacyId": 1, "name": "Primary Email", "content": "john@example.com", "subscriptions": [ { "name": "General" } ] } ], "phones": [ { "phoneId": "phone_xyz789ghi012", "legacyId": 1, "name": "Mobile Phone", "content": "+16502530000", "subscriptions": [ { "name": "General" } ] } ] } ], "errors": [ ]
{
}
GET
/v4/contact
Samples
Fetch a ContactDetail list
GET
/v2/contactdetail
Authorizations
bearerAuth
clientCredentials Flow
Token URL
"https://api.ezyvet.com/v1/oauth/access_token"Scopes:
"read-contactdetail"Read contact detail resources
Parameters
Query Parameters
id
The ID number used by the system to uniquely identify a ContactDetail.
Type
number
active
If true, the ContactDetail is active and usable in ezyVet.
Type
boolean
Default
truecreated_at
The epoch time when the ContactDetail was created.
Type
number
modified_at
The epoch time when the ContactDetail was last modified.
Type
number
name
The name of the ContactDetail, such as 'Home Phone' or 'Business E-mail'.
Type
string
value
The value of the ContactDetail, such as the number, or the email (depending on its ContactDetailType).
Type
string
value_cleaned
The value of the ContactDetail record which has been cleaned of all special characters and prefixed with the country code. This filter can be used for phone or fax numbers but it should not be used for email addresses.
Type
string
contact_id
The ID of the Contact to whom this ContactDetail is assigned.
Type
number
type_id
The ID of the ContactDetailType of this ContactDetail.
Type
number
preferred
If true, this ContactDetail is a preferred contact method for the related Contact.
Type
boolean
Default
falseResponses
A list of ContactDetails
application/json
JSON "meta": { "timestamp": "string", "items_page": "string", "items_page_total": "string", "items_page_size": "string", "items_total": "string" }, "items": [ { "contactdetail": { "id": 0, "uid": "string", "active": true, "created_at": 0, "modified_at": 0, "name": "string", "value": "string", "contact_id": 0, "contact_uid": "string", "value_cleaned": "string", "type_id": "string", "preferred": false } } ], "messages": [ ]
{
}
GET
/v2/contactdetail