Skip to content

This portion of the API provides endpoints for managing inventory records, including products, purchase orders, and inventory levels

Servers​

https://api.ezyvet.comezyVet production environment
https://api.trial.ezyvet.comezyVet trial environment

Barcode​


Fetch a list of Barcodes​

GET
/v1/barcode

Fetches a list containing Barcodes (up to 10).

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "read-barcode"Read barcode resources

Parameters​

Query Parameters

id

The ID number used by the system to uniquely identify a Barcode.

Type
number
created_at

The epoch time when the Barcode was created.

Type
number
modified_at

The epoch time when the Barcode was last modified.

Type
number
for_type

The type of record that the Barcode is for. EG: 'product'.

Type
string
for_id

The ID of the record that the Barcode is for.

Type
number
active

If true, the Barcode is active and usable in ezyVet.

Type
boolean
Default
true
format

The format or standard of the system used Barcode. EG: 'EAN-13', or 'CODE128'.

Type
string
barcode

The text content for the Barcode.

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": [
  
  
{
  
  
  
"barcode": {
  
  
  
  
"id": "string",
  
  
  
  
"active": "string",
  
  
  
  
"created_at": "string",
  
  
  
  
"modified_at": "string",
  
  
  
  
"for_type": "string",
  
  
  
  
"for_id": "string",
  
  
  
  
"format": "string",
  
  
  
  
"barcode": "string"
  
  
  
}
  
  
}
  
],
  
"messages": [
  
  
{
  
  
}
  
]
}

Samples​


Product​


Fetch a Product list​

GET
/v1/product

Fetches a list containing Product(s). (up to 10)

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "read-product"Read product resources

Parameters​

Query Parameters

id

The ID number used by the system to uniquely identify a Product.

Type
string
active

If true, the Product is active and usable in ezyVet.

Type
string
created_at

The epoch time when the Product was created.

Type
string
modified_at

The epoch time when the Product was last modified.

Type
string
code

String generally used by clinic staff members to identify Products.

Type
string
questions

Complex inquiries about the Product. Refer to the Questions table.

Type
string
name

Name of the Product as it is visible on ezyVet.

Type
string
product_group_id

The ID of the ProductGroup where the Product is assigned. Every Product requires a ProductGroup. This shows up as the "Primary Product Group" on the Product screen.

Type
string
description

The description of the Product.

Type
string
warning

This is where clinic staff can write warning messages regarding the Product, such as "For external use only".

Type
string
type

Specifies the Product type, and where it can be used: Standard, Medication, Vaccination, Diagnostic, Integrated Diagnostic, Procedure

Type
string
Valid values
"Standard""Medication""Vaccination""Diagnostic""Integrated Diagnostic""Procedure"
Default
"Standard"
is_sold

If true, the Product can be sold.

Type
string
is_purchased

If true, the Product can be bought.

Type
string
is_container

If true, the Product acts as a container for other Product(s).

Type
string
is_derived_price

If true, the price is derived from all the Product(s) contained.

Type
string
has_direct_cost

If true, the Product has the "has direct cost" checkmark set and can use markup.

Type
string
product_identifier

For the US, this is the 11 digit NDC or product ID for compounds.

Type
string
product_schedule_or_class

This is the controlled substances for controlled drugs. For the US, this value is in roman numerals, Eg. II, III, IV,V.

Type
string
limit

Limits the number of results returned.

Type
string
Default
10
page

Specifies the page number of the result.

Type
string
Default
1

Responses​

A list of products with stock levels

application/json
JSON
{
  
"meta": {
  
  
"timestamp": "string",
  
  
"items_page": "string",
  
  
"items_page_total": "string",
  
  
"items_page_size": "string",
  
  
"items_total": "string"
  
},
  
"items": [
  
  
{
  
  
  
"product": {
  
  
  
  
"id": "string",
  
  
  
  
"active": "string",
  
  
  
  
"created_at": "string",
  
  
  
  
"modified_at": "string",
  
  
  
  
"name": "string",
  
  
  
  
"code": "string",
  
  
  
  
"product_group_id": "string",
  
  
  
  
"description": "string",
  
  
  
  
"warning": "string",
  
  
  
  
"is_sold": "string",
  
  
  
  
"is_purchased": "string",
  
  
  
  
"is_container": "string",
  
  
  
  
"product_identifier": "string",
  
  
  
  
"product_schedule_or_class": "string",
  
  
  
  
"is_derived_price": "string",
  
  
  
  
"has_direct_cost": "string",
  
  
  
  
"type": "string",
  
  
  
  
"_answers": {
  
  
  
  
  
"stocklevel": {
  
  
  
  
  
  
"in_stock": "string",
  
  
  
  
  
  
"allocated": "string",
  
  
  
  
  
  
"available": "string",
  
  
  
  
  
  
"on_order_for_inventory": "string",
  
  
  
  
  
  
"on_order_total": "string",
  
  
  
  
  
  
"being_receipted": "string",
  
  
  
  
  
  
"inventory_turn": "string"
  
  
  
  
  
}
  
  
  
  
}
  
  
  
}
  
  
}
  
],
  
"messages": [
  
  
{
  
  
}
  
]
}

Samples​


Product Group​


Fetch a ProductGroup list​

GET
/v1/productgroup

Fetches a list containing ProductGroup(s). (up to 10)

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "read-productgroup"Read product group resources

Parameters​

Query Parameters

id

The ID number used by the system to uniquely identify a ProductGroup.

Type
string
active

If true, the ProductGroup is active and usable in ezyVet.

Type
string
created_at

The epoch time when the ProductGroup was created.

Type
string
modified_at

The epoch time when the ProductGroup was last modified.

Type
string
name

The name of the ProductGroup.

Type
string
description

The description of the ProductGroup.

Type
string
limit

Limits the number of items returned.

Type
string
Default
10
page

Specifies the page number of the result.

Type
string
Default
1

Responses​

A list of ProductGroups

application/json
JSON
{
  
"meta": {
  
  
"timestamp": "string",
  
  
"items_page": "string",
  
  
"items_page_total": "string",
  
  
"items_page_size": "string",
  
  
"items_total": "string"
  
},
  
"items": [
  
  
{
  
  
  
"productgroup": {
  
  
  
  
"id": "string",
  
  
  
  
"active": "string",
  
  
  
  
"created_at": "string",
  
  
  
  
"modified_at": "string",
  
  
  
  
"name": "string",
  
  
  
  
"description": "string"
  
  
  
}
  
  
}
  
],
  
"messages": [
  
]
}

Samples​


Purchase Order​


Fetch a PurchaseOrder list​

GET
/v1/purchaseorder

Fetches a list containing PurchaseOrder(s). (up to 10)

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "read-purchaseorder"Read purchase order resources

Parameters​

Query Parameters

client_id*

The ID of the client linked to the PurchaseOrder.

Type
number
Required
id

The ID number used by the system to uniquely identify a PurchaseOrder.

active

If true, the PurchaseOrder is active and usable in ezyVet.

created_at

The epoch time when the PurchaseOrder was created.

modified_at

The epoch time when the PurchaseOrder was last modified.

date

The epoch time of the PurchaseOrder transaction date.

shipping_address_id

The ID of the shipping Address for the order.

comments

Any comments left by the User placing the order.

Type
string
freight

The total monetary cost of the freight (inc tax).

freight_tax

The total tax content in the freight amount.

tax

The total tax content of the PurchaseOrder.

total

The total monetary amount of the PurchaseOrder. This value can be negative, indicating its a return of items. This value is tax inclusive.

supplier_id

The ID of the supplier to whom the order is sent.

status

The status of the PurchaseOrder. Can only be one of the following: Created, Approved, Sent, Confirmed, Partial, Received, Completed or Cancelled.

Type
string
supplier_order_number

A number assigned by the supplier once an order is placed.

supplier_account_number

A string assigned on the supplier to identify the account the order is made from.

ownership_id

The ID of the Ownership Separation to which this PurchaseOrder belongs.

Responses​

A list of PurchaseOrders

application/json
JSON
{
  
"meta": {
  
  
"timestamp": "string",
  
  
"items_page": "string",
  
  
"items_page_total": "string",
  
  
"items_page_size": "string",
  
  
"items_total": "string"
  
},
  
"items": [
  
  
{
  
  
  
"purchaseorder": {
  
  
  
  
"id": "string",
  
  
  
  
"active": "string",
  
  
  
  
"created_at": "string",
  
  
  
  
"modified_at": "string",
  
  
  
  
"date": "string",
  
  
  
  
"shipping_address_id": "string",
  
  
  
  
"comments": "string",
  
  
  
  
"freight": "string",
  
  
  
  
"freight_tax": "string",
  
  
  
  
"tax": "string",
  
  
  
  
"total": "string",
  
  
  
  
"client_id": "string",
  
  
  
  
"supplier_id": "string",
  
  
  
  
"status": "string",
  
  
  
  
"supplier_order_number": "string",
  
  
  
  
"supplier_account_number": "string",
  
  
  
  
"ownership_id": "string",
  
  
  
  
"purchase_order_item_list": [
  
  
  
  
  
0
  
  
  
  
]
  
  
  
}
  
  
}
  
],
  
"messages": [
  
]
}

Samples​


Purchase Order Item​


Fetches a list containing PurchaseOrderItem(s)​

GET
/v1/purchaseorderitem

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "read-purchaseorderitem"Read purchase order item resources

Parameters​

Query Parameters

id

The ID number used by the system to uniquely identify a PurchaseOrderItem.

Type
string
active

If true, the PurchaseOrderItem is active and usable in ezyVet.

Type
string
created_at

The epoch time when the PurchaseOrderItem was created.

Type
string
modified_at

The epoch time when the PurchaseOrderItem was last modified.

Type
string
purchase_order_id

The ID of the PurchaseOrder to which this PurchaseOrderItem is linked.

Type
string
product_id

The ID of the product on the PurchaseOrderItem.

Type
string
supplier_code

The code of the product in the supplier's records.

Type
string
outers

The number of outers being ordered for the given product.

Type
string
units_per_outer

The number of units of the product included in one outer.

Type
string
price_per_unit

The price of one unit in an outer.

Type
string
tax_per_unit

The tax content per unit.

Type
string
quantity

The number of units being ordered for the given product.

Type
string
total

The total monetary amount of the PurchaseOrderItem excluding tax.

Type
string
total_tax

The total tax content of the PurchaseOrderItem.

Type
string
ownership_id

The ID of the Ownership Separation to which this PurchaseOrderItem belongs.

Type
string

Responses​

A list of PurchaseOrderItems

application/json
JSON
{
  
"meta": {
  
  
"timestamp": "string",
  
  
"items_page": "string",
  
  
"items_page_total": "string",
  
  
"items_page_size": "string",
  
  
"items_total": "string"
  
},
  
"items": [
  
  
{
  
  
  
"purchaseorderitem": {
  
  
  
  
"id": "string",
  
  
  
  
"active": "string",
  
  
  
  
"created_at": "string",
  
  
  
  
"modified_at": "string",
  
  
  
  
"purchase_order_id": "string",
  
  
  
  
"product_id": "string",
  
  
  
  
"supplier_code": "string",
  
  
  
  
"outers": "string",
  
  
  
  
"units_per_outer": "string",
  
  
  
  
"price_per_unit": "string",
  
  
  
  
"tax_per_unit": "string",
  
  
  
  
"quantity": "string",
  
  
  
  
"total": "string",
  
  
  
  
"total_tax": "string",
  
  
  
  
"ownership_id": "string"
  
  
  
}
  
  
}
  
],
  
"messages": [
  
]
}

Samples​


Fetch a list of Receive Invoices​

GET
/v1/receiveinvoice

Gets a ReceiveInvoice and any included ReceiveInvoiceItems
It's recommended to use the v2/receiveinvoice endpoint

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "read-receiveinvoice"Read receive invoice resources

Parameters​

Query Parameters

id

The ID number used by the system to uniquely identify a ReceiveInvoice.

Type
string
active

If true, the ReceiveInvoice is active and usable in ezyVet.

Type
string
created_at

The epoch time when the ReceiveInvoice was created.

Type
string
modified_at

The epoch time when the ReceiveInvoice was last modified.

Type
string
invoice_number

The value given by a Supplier to track the invoice on their end.

Type
string
date

The epoch time of the ReceiveInvoice transaction date.

Type
string
due_date

The due date of the ReceiveInvoice in epoch time.

Type
string
supplier_id

The ID of the Supplier who sent the ReceiveInvoice.

Type
string
freight

The total monetary cost of the freight (inc tax).

Type
string
freight_tax

The total tax content in the freight amount.

Type
string
comments

Any comments.

Type
string
tax

The total tax content of the ReceiveInvoice.

Type
string
total

The total monetary amount of the ReceiveInvoice. This value is tax inclusive.

Type
string
ownership_id

The ID of the Ownership Separation to which this ReceiveInvoice belongs.

Type
string

Responses​

A list of Receive Invoices

application/json
JSON
{
  
"meta": {
  
  
"timestamp": "string",
  
  
"items_page": "string",
  
  
"items_page_total": "string",
  
  
"items_page_size": "string",
  
  
"items_total": "string"
  
},
  
"items": [
  
  
{
  
  
  
"receiveinvoice": {
  
  
  
  
"id": "string",
  
  
  
  
"active": "string",
  
  
  
  
"created_at": "string",
  
  
  
  
"modified_at": "string",
  
  
  
  
"invoice_number": "string",
  
  
  
  
"date": "string",
  
  
  
  
"due_date": "string",
  
  
  
  
"supplier_id": "string",
  
  
  
  
"freight": "string",
  
  
  
  
"freight_tax": "string",
  
  
  
  
"comments": "string",
  
  
  
  
"tax": "string",
  
  
  
  
"total": "string",
  
  
  
  
"purchase_order_list": [
  
  
  
  
  
"string"
  
  
  
  
],
  
  
  
  
"receive_invoice_item_list": [
  
  
  
  
  
"string"
  
  
  
  
],
  
  
  
  
"ownership_id": "string"
  
  
  
}
  
  
}
  
],
  
"messages": [
  
  
"string"
  
]
}

Samples​


Fetch a list of Receive Invoice Items​

GET
/v1/receiveinvoiceitem

Fetches a list containing ReceiveInvoiceItem(s). (up to 10)

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "read-receiveinvoiceitem"Read receive invoice item resources

Parameters​

Query Parameters

product_id

The product ID used by the system to uniquely identify a ReceiveInvoiceItem.

Type
string

Responses​

A list of Receive Invoice Items

application/json
JSON
{
  
"meta": {
  
  
"timestamp": "string",
  
  
"items_page": "string",
  
  
"items_page_total": "string",
  
  
"items_page_size": "string",
  
  
"items_total": "string"
  
},
  
"items": [
  
  
{
  
  
  
"id": 0,
  
  
  
"created_at": 0,
  
  
  
"modified_at": 0,
  
  
  
"active": true,
  
  
  
"stockadjustment_id": 0,
  
  
  
"product_id": 0,
  
  
  
"name": "string",
  
  
  
"code": "string",
  
  
  
"quantity": 0,
  
  
  
"price": 0,
  
  
  
"cost_price": 0,
  
  
  
"ledger_account": 0,
  
  
  
"status": "string",
  
  
  
"batch": [
  
  
  
  
{
  
  
  
  
  
"id": 0,
  
  
  
  
  
"created_at": 0,
  
  
  
  
  
"modified_at": 0,
  
  
  
  
  
"active": true,
  
  
  
  
  
"name": "string",
  
  
  
  
  
"type": "string",
  
  
  
  
  
"parent": 0,
  
  
  
  
  
"expiry": 0
  
  
  
  
}
  
  
  
],
  
  
  
"location_id": 0
  
  
}
  
],
  
"messages": [
  
  
"string"
  
]
}

Samples​


Batch​


Fetch a list of Batches​

GET
/v2/batch

Fetches a list containing Batches (up to 10)

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "read-batch"Read batch resources

Parameters​

Query Parameters

id

The ID number used by the system to uniquely identify a Batch.

Type
number
uid

The ID number used by the system to uniquely identify an Batch across all ezyVet sites.

Type
string
created_at

The epoch time when the Batch was created.

Type
number
modified_at

The epoch time when the Batch was last modified.

Type
number
active

If true, the Batch is active and usable in ezyVet.

Type
boolean
Default
true
name

The name given for a Batch.

Type
string
type

The type of Batch.

Type
string

Responses​

A list of Batches

application/json
JSON
{
  
"meta": {
  
  
"timestamp": "string",
  
  
"items_page": "string",
  
  
"items_page_total": "string",
  
  
"items_page_size": "string",
  
  
"items_total": "string"
  
},
  
"items": [
  
  
{
  
  
  
"batch": {
  
  
  
  
"id": 0,
  
  
  
  
"uid": "string",
  
  
  
  
"created_at": 0,
  
  
  
  
"modified_at": 0,
  
  
  
  
"active": true,
  
  
  
  
"name": "string",
  
  
  
  
"type": "string",
  
  
  
  
"parent": 0,
  
  
  
  
"expiry": 0
  
  
  
}
  
  
}
  
],
  
"messages": [
  
  
{
  
  
}
  
]
}

Samples​


Product V2​


Fetch a Specific Product​

GET
/v2/product/{product_id}

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "read-product"Read product resources

Parameters​

Header Parameters

authorization*

Bearer token for authentication

Type
string
Required

Path Parameters

product_id*

The ID number used by the system to uniquely identify a Product.

Type
number
Required

Responses​

A specific product by its id.

application/json
JSON
{
  
"meta": {
  
  
"items_page": 1,
  
  
"items_page_total": 1,
  
  
"items_page_size": 10,
  
  
"items_total": 1,
  
  
"transaction_id": "abc123xyz",
  
  
"timestamp": 1706745600
  
},
  
"items": [
  
  
{
  
  
  
"product": {
  
  
  
  
"id": 1234,
  
  
  
  
"created_at": 1706745600,
  
  
  
  
"modified_at": 1706832000,
  
  
  
  
"active": true,
  
  
  
  
"name": "Amoxicillin 250mg",
  
  
  
  
"code": "AMOX250",
  
  
  
  
"description": "Broad-spectrum antibiotic for dogs and cats.",
  
  
  
  
"type": "Medication",
  
  
  
  
"tracking_level": "Batch",
  
  
  
  
"product_group_id": 12,
  
  
  
  
"warning": "For veterinary use only.",
  
  
  
  
"is_sold": true,
  
  
  
  
"is_purchased": true,
  
  
  
  
"is_container": false,
  
  
  
  
"is_derived_price": false,
  
  
  
  
"has_cost_price": true,
  
  
  
  
"lowest_dispensable_quantity": 1,
  
  
  
  
"lowest_dispensable_unit": "tablet",
  
  
  
  
"concentration": 250,
  
  
  
  
"concentration_unit": "mg",
  
  
  
  
"concentration_volume": "tablet",
  
  
  
  
"concentration_diluted": null,
  
  
  
  
"concentration_diluted_unit": null,
  
  
  
  
"concentration_diluted_volume": null,
  
  
  
  
"default_dosage_calculation_method": "mg/kg",
  
  
  
  
"is_constant_rate_infusion": false,
  
  
  
  
"default_infusion_rate_per": null,
  
  
  
  
"default_route_of_administration": "Oral",
  
  
  
  
"sheet_group": 3,
  
  
  
  
"sheet_group_name": "Antibiotics"
  
  
  
}
  
  
}
  
],
  
"messages": [
  
]
}

Samples​


Service Fee​


Bulk patch service fee associations for multiple products​

PATCH
/v2.1/product/servicefee/bulk

Add or remove service fees to products for given ownerships

Request Semantics

  • Submit only changed rows.
  • Each row requires productId and ownershipId.
  • Duplicate (productId, ownershipId) rows in one request are rejected.

Row Operation

  • serviceFeeProductId = null: remove the service fee association for this product at this ownership level.
  • serviceFeeProductId = <id>: add the service fee association for this product at this ownership level.
    • If a service fee association already exists with a different product, the existing one is removed and the new one is added.
    • If a service fee association already exists with the same product, no change is made.

Error and Transaction Behavior

  • Error responses return multiple errors if multiple service fee lines fail validation.
  • Requests are atomic: if any row fails validation or processing, the entire bulk operation is rolled back and no service fee rows are changed.
  • Hard limit: maximum 1000 rows per request.

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "write-productpricing"Create and update product pricing resources

Request Body​

application/json
JSON
[
  
{
  
  
"productId": 132,
  
  
"ownershipId": 465,
  
  
"serviceFeeProductId": 88
  
},
  
{
  
  
"productId": 132,
  
  
"ownershipId": 466,
  
  
"serviceFeeProductId": null
  
},
  
{
  
  
"productId": 133,
  
  
"ownershipId": 465,
  
  
"serviceFeeProductId": 91
  
}
]

Responses​

Service fees added or removed successfully

application/json
JSON
{
  
"data": [
  
  
{
  
  
  
"productId": 132,
  
  
  
"ownershipId": 465,
  
  
  
"serviceFeeProductId": 88
  
  
},
  
  
{
  
  
  
"productId": 132,
  
  
  
"ownershipId": 466,
  
  
  
"serviceFeeProductId": null
  
  
},
  
  
{
  
  
  
"productId": 133,
  
  
  
"ownershipId": 465,
  
  
  
"serviceFeeProductId": 91
  
  
}
  
],
  
"meta": {
  
  
"totalItems": 3
  
}
}

Samples​


Product Minimum Stock​


Fetches Product Minimum Stock​

GET
/v2/productminimumstock

Fetches a list containing ProductMinimumStock(s).

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "read-productminimumstock"Read product minimum stock resources

Parameters​

Query Parameters

product_id

The ID of the Product this ProductMinimumStock this relates to.

Type
number

Responses​

Successful response

application/json
JSON
{
  
"meta": {
  
  
"items_page": 0,
  
  
"items_page_total": 0,
  
  
"items_page_size": 0,
  
  
"items_total": 0,
  
  
"transaction_id": "string",
  
  
"timestamp": 0
  
},
  
"items": [
  
  
{
  
  
  
"productminimumstock": {
  
  
  
  
"id": 0,
  
  
  
  
"created_at": 0,
  
  
  
  
"modified_at": 0,
  
  
  
  
"active": true,
  
  
  
  
"product_id": 0,
  
  
  
  
"minimumstock": 0,
  
  
  
  
"re_order_to_max_level": true,
  
  
  
  
"re_order_qty": "string",
  
  
  
  
"start_day": 0,
  
  
  
  
"start_month": 0,
  
  
  
  
"end_day": 0,
  
  
  
  
"end_month": 0,
  
  
  
  
"ownership_id": 0
  
  
  
}
  
  
}
  
],
  
"messages": [
  
  
"string"
  
]
}

Samples​


Fetch a Product Pricing by ID​

GET
/v2/productpricing

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "read-productpricing"Read product pricing resources

Parameters​

Query Parameters

id

The ID number used by the system to uniquely identify a Product Pricing.

Type
number
created_at

The epoch time when the Product Pricing was created.

Type
number
modified_at

The epoch time when the Product Pricing was last modified.

Type
number
active

If true, the Product Pricing is active and usable in ezyVet.

Type
boolean
product_id

The ID of the Product this Product Pricing relates to.

Type
number
ownership_id

The ID of the ownership separation (site/practice) this Product Pricing applies to.

Type
number

Responses​

A JSON object containing product pricing details

application/json
JSON
{
  
"meta": {
  
  
"items_page": 1,
  
  
"items_page_total": 1,
  
  
"items_page_size": 10,
  
  
"items_total": 1,
  
  
"transaction_id": "abc123xyz",
  
  
"timestamp": 1706745600
  
},
  
"items": [
  
  
{
  
  
  
"productpricing": {
  
  
  
  
"id": 567,
  
  
  
  
"created_at": 1706745600,
  
  
  
  
"modified_at": 1706832000,
  
  
  
  
"active": true,
  
  
  
  
"cost_price": 1.5,
  
  
  
  
"based_on": "Price",
  
  
  
  
"markup": null,
  
  
  
  
"sell_price": 5,
  
  
  
  
"sell_price_tax": 5.5,
  
  
  
  
"tax_rate": {
  
  
  
  
  
"id": 3,
  
  
  
  
  
"created_at": 1706745600,
  
  
  
  
  
"modified_at": 1706745600,
  
  
  
  
  
"active": true,
  
  
  
  
  
"code": "GST",
  
  
  
  
  
"rate": 10
  
  
  
  
},
  
  
  
  
"dispense_fee": 0.5,
  
  
  
  
"product_id": 1234,
  
  
  
  
"ownership_id": 1
  
  
  
}
  
  
}
  
],
  
"messages": [
  
]
}

Samples​


Product Supplier​


Fetch Product Suppliers​

GET
/v2/productsupplier

This will fetch a list of product suppliers based on the query parameters supplied.

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "read-productsupplier"Read product supplier resources

Parameters​

Query Parameters

product_id

The ID of the product to filter by.

Type
number
supplier_contact_id

The ID of the supplier contact to filter by.

Type
number

Responses​

A list of product suppliers.

application/json
JSON
{
  
"meta": {
  
  
"items_page": 0,
  
  
"items_page_total": 0,
  
  
"items_page_size": 0,
  
  
"items_total": 0,
  
  
"transaction_id": "string",
  
  
"timestamp": 0
  
},
  
"items": [
  
  
{
  
  
  
"productsupplier": {
  
  
  
  
"id": 0,
  
  
  
  
"created_at": "string",
  
  
  
  
"modified_at": 0,
  
  
  
  
"active": true,
  
  
  
  
"product_id": 0,
  
  
  
  
"supplier_code": "string",
  
  
  
  
"expected_price": 0,
  
  
  
  
"units_per_outer": 0,
  
  
  
  
"supplier_contact_id": 0,
  
  
  
  
"tax_rate_id": 0,
  
  
  
  
"list_price": 0,
  
  
  
  
"is_default": true,
  
  
  
  
"unit_of_measure": "string",
  
  
  
  
"last_update": 0,
  
  
  
  
"contract_price": 0
  
  
  
}
  
  
}
  
],
  
"messages": [
  
  
{
  
  
}
  
]
}

Samples​


Receive Invoice V2​


Fetches a list containing Receive Invoices (up to 10), and their associated Receive Invoice Items.​

GET
/v2/receiveinvoice

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "read-receiveinvoice"Read receive invoice resources

Parameters​

Query Parameters

id

The ID number used by the system to uniquely identify a ReceiveInvoice.

Type
number
active

If true, the ReceiveInvoice is active and usable in ezyVet.

Type
boolean
Default
true
created_at

The epoch time when the ReceiveInvoice was created.

Type
number
modified_at

The epoch time when the ReceiveInvoice was last modified.

Type
number
invoice_number

The value given by a Supplier to track the invoice on their end.

Type
string
date

The epoch time of the ReceiveInvoice transaction date.

Type
number
due_date

The due date of the ReceiveInvoice in epoch time.

Type
number
supplier_id

The ID of the Supplier who sent the ReceiveInvoice.

Type
number
ownership_id

The ID of the OwnershipSeparation to which this ReceiveInvoice belongs.

Type
number

Responses​

A list of Receive Invoices and their associated Receive Invoice Items.

application/json
JSON
{
  
"meta": {
  
  
"timestamp": 0,
  
  
"items_page": 0,
  
  
"items_page_total": 0,
  
  
"items_page_size": 0,
  
  
"items_total": 0
  
},
  
"items": [
  
  
{
  
  
  
"receiveinvoice": {
  
  
  
  
"id": 0,
  
  
  
  
"created_at": 0,
  
  
  
  
"modified_at": 0,
  
  
  
  
"active": true,
  
  
  
  
"invoice_number": "string",
  
  
  
  
"date": 0,
  
  
  
  
"due_date": 0,
  
  
  
  
"supplier_id": 0,
  
  
  
  
"freight": 0,
  
  
  
  
"freight_tax": 0,
  
  
  
  
"rounding": 0,
  
  
  
  
"comments": "",
  
  
  
  
"tax": 0,
  
  
  
  
"total": 0,
  
  
  
  
"ownership_id": 0,
  
  
  
  
"line_item": [
  
  
  
  
  
{
  
  
  
  
  
  
"id": 0,
  
  
  
  
  
  
"created_at": 0,
  
  
  
  
  
  
"modified_at": 0,
  
  
  
  
  
  
"active": true,
  
  
  
  
  
  
"quantity": 0,
  
  
  
  
  
  
"price": 0,
  
  
  
  
  
  
"tax": 0,
  
  
  
  
  
  
"total": 0,
  
  
  
  
  
  
"total_tax": 0,
  
  
  
  
  
  
"tax_rate": 0,
  
  
  
  
  
  
"tax_code": "string",
  
  
  
  
  
  
"product_id": 0,
  
  
  
  
  
  
"product_supplier_id": 0,
  
  
  
  
  
  
"supplier_code": "string",
  
  
  
  
  
  
"ownership_id": 0,
  
  
  
  
  
  
"batch": [
  
  
  
  
  
  
],
  
  
  
  
  
  
"purchase_order_item_id": 0
  
  
  
  
  
}
  
  
  
  
]
  
  
  
}
  
  
}
  
],
  
"messages": [
  
]
}

Samples​


Receive Invoice Item V2​


Fetches a list containing ReceiveInvoiceItems​

GET
/v2/receiveinvoiceitem

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "read-receiveinvoiceitem"Read receive invoice item resources

Parameters​

Query Parameters

id

The ID number used by the system to uniquely identify a ReceiveInvoiceItem.

Type
number
created_at

The epoch time when the ReceiveInvoiceItem was created.

Type
number
modified_at

The epoch time when the ReceiveInvoiceItem was last modified.

Type
number
active

If true, the ReceiveInvoiceItem is active and usable in ezyVet.

Type
boolean
Default
true
receive_invoice_id

The ID of the ReceiveInvoice the ReceiveInvoiceItem is linked to.

Type
string
quantity

The quantity of Product invoiced. Depending on the configuration set by the Supplier, this value may represent the quantity of Outers or the quantity of Units.

Type
number
price

The price of one selling unit. Depending on the configuration set by the Supplier, this value may represent the price of one Outer or the price of one Unit.

Type
number
tax

The tax content per selling unit. Depending on the configuration set by the Supplier, this value may represent the tax amount from one Outer or one Unit.

Type
number
Default
0
total

The total monetary amount of the ReceiveInvoiceItem excluding tax.

Type
number
Default
0
total_tax

The total tax content of the ReceiveInvoiceItem.

Type
number
tax_rate

The tax rate applied to the ReceiveInvoiceItem.

Type
number
tax_code

The tax code relating to the tax rate on the ReceiveInvoiceItem.

Type
string
product_id

The ID of the Product on the ReceiveInvoiceItem.

Type
number
product_supplier_id

The ID of the ProductSupplier on the ReceiveInvoiceItem.

Type
number
supplier_code

The code of the Product in the Supplier's records. (i.e. the code given to the product by the supplier)

Type
string
location_id

The ID of the LocationSeparation to which this ReceiveInvoiceItem belongs.

Type
number

Responses​

A list of ReceiveInvoiceItems

application/json
JSON
{
  
"meta": {
  
  
"timestamp": 0,
  
  
"items_page": 0,
  
  
"items_page_total": 0,
  
  
"items_page_size": 0,
  
  
"items_total": 0
  
},
  
"items": [
  
  
{
  
  
  
"receiveinvoiceitem": {
  
  
  
  
"id": 0,
  
  
  
  
"created_at": 0,
  
  
  
  
"modified_at": 0,
  
  
  
  
"active": true,
  
  
  
  
"receive_invoice_id": "string",
  
  
  
  
"quantity": 0,
  
  
  
  
"price": 0,
  
  
  
  
"tax": 0,
  
  
  
  
"total": 0,
  
  
  
  
"total_tax": 0,
  
  
  
  
"tax_rate": 0,
  
  
  
  
"tax_code": "string",
  
  
  
  
"product_id": 0,
  
  
  
  
"product_supplier_id": 0,
  
  
  
  
"supplier_code": "string",
  
  
  
  
"ownership_id": 0,
  
  
  
  
"batch": [
  
  
  
  
],
  
  
  
  
"purchase_order_item_id": 0
  
  
  
}
  
  
}
  
],
  
"messages": [
  
]
}

Samples​


Stock Adjustment​


Create a StockAdjustment​

POST
/v2/stockadjustment

Adjust stock levels for a product
It's recommended to use the inventory/v1/supplied endpoint.

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "write-stockadjustment"Create and update stock adjustment resources

Request Body​

application/json
JSON
{
  
"date": 0,
  
"comments": "",
  
"line_item": [
  
  
{
  
  
  
"id": 0,
  
  
  
"created_at": 0,
  
  
  
"modified_at": 0,
  
  
  
"active": true,
  
  
  
"stockadjustment_id": 0,
  
  
  
"product_id": 0,
  
  
  
"name": "string",
  
  
  
"code": "string",
  
  
  
"quantity": 0,
  
  
  
"price": 0,
  
  
  
"cost_price": 0,
  
  
  
"ledger_account": 0,
  
  
  
"status": "string",
  
  
  
"batch": [
  
  
  
  
{
  
  
  
  
  
"id": 0,
  
  
  
  
  
"created_at": 0,
  
  
  
  
  
"modified_at": 0,
  
  
  
  
  
"active": true,
  
  
  
  
  
"name": "string",
  
  
  
  
  
"type": "string",
  
  
  
  
  
"parent": 0,
  
  
  
  
  
"expiry": 0
  
  
  
  
}
  
  
  
],
  
  
  
"location_id": 0
  
  
}
  
],
  
"ownership_id": 0
}

Responses​

Successful response

application/json
JSON
{
  
"meta": {
  
  
"timestamp": 0
  
},
  
"items": [
  
  
{
  
  
  
"stockadjustment": {
  
  
  
  
"id": 0,
  
  
  
  
"created_at": 0,
  
  
  
  
"modified_at": 0,
  
  
  
  
"active": true,
  
  
  
  
"date": 0,
  
  
  
  
"amount": 0,
  
  
  
  
"comments": "",
  
  
  
  
"line_item": [
  
  
  
  
  
{
  
  
  
  
  
  
"id": 0,
  
  
  
  
  
  
"created_at": 0,
  
  
  
  
  
  
"modified_at": 0,
  
  
  
  
  
  
"active": true,
  
  
  
  
  
  
"stockadjustment_id": 0,
  
  
  
  
  
  
"product_id": 0,
  
  
  
  
  
  
"name": "string",
  
  
  
  
  
  
"code": "string",
  
  
  
  
  
  
"quantity": 0,
  
  
  
  
  
  
"price": 0,
  
  
  
  
  
  
"cost_price": 0,
  
  
  
  
  
  
"ledger_account": 0,
  
  
  
  
  
  
"status": "string",
  
  
  
  
  
  
"batch": [
  
  
  
  
  
  
  
{
  
  
  
  
  
  
  
  
"id": 0,
  
  
  
  
  
  
  
  
"created_at": 0,
  
  
  
  
  
  
  
  
"modified_at": 0,
  
  
  
  
  
  
  
  
"active": true,
  
  
  
  
  
  
  
  
"name": "string",
  
  
  
  
  
  
  
  
"type": "string",
  
  
  
  
  
  
  
  
"parent": 0,
  
  
  
  
  
  
  
  
"expiry": 0
  
  
  
  
  
  
  
}
  
  
  
  
  
  
],
  
  
  
  
  
  
"location_id": 0
  
  
  
  
  
}
  
  
  
  
],
  
  
  
  
"ownership_id": 0
  
  
  
}
  
  
}
  
],
  
"messages": [
  
  
{
  
  
}
  
]
}

Samples​


Stock Adjustment Item​


Creates a single StockAdjustmentItem​

POST
/v2/stockadjustmentitem

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "write-stockadjustmentitem"Create and update stock adjustment item resources

Request Body​

application/json
JSON
{
  
"stockadjustment_id": 0,
  
"product_id": 0,
  
"quantity": 0,
  
"price": 0,
  
"cost_price": 0,
  
"ledger_account": 0,
  
"batch": [
  
  
{
  
  
  
"id": 0,
  
  
  
"created_at": 0,
  
  
  
"modified_at": 0,
  
  
  
"active": true,
  
  
  
"name": "string",
  
  
  
"type": "string",
  
  
  
"parent": 0,
  
  
  
"expiry": 0
  
  
}
  
],
  
"location_id": 0
}

Responses​

Successful response

application/json
JSON
{
  
"meta": {
  
  
"timestamp": 0
  
},
  
"items": [
  
  
{
  
  
  
"id": 0,
  
  
  
"created_at": 0,
  
  
  
"modified_at": 0,
  
  
  
"active": true,
  
  
  
"stockadjustment_id": 0,
  
  
  
"product_id": 0,
  
  
  
"name": "string",
  
  
  
"code": "string",
  
  
  
"quantity": 0,
  
  
  
"price": 0,
  
  
  
"cost_price": 0,
  
  
  
"ledger_account": 0,
  
  
  
"status": "string",
  
  
  
"batch": [
  
  
  
  
{
  
  
  
  
  
"id": 0,
  
  
  
  
  
"created_at": 0,
  
  
  
  
  
"modified_at": 0,
  
  
  
  
  
"active": true,
  
  
  
  
  
"name": "string",
  
  
  
  
  
"type": "string",
  
  
  
  
  
"parent": 0,
  
  
  
  
  
"expiry": 0
  
  
  
  
}
  
  
  
],
  
  
  
"location_id": 0
  
  
}
  
],
  
"messages": [
  
  
"string"
  
]
}

Samples​


Stock Transaction​


Deprecated

Fetch stock transactions​

GET
/v2/stocktransaction

Fetches a list of StockTransaction records.

It's recommended to use the v2.1/stocktransaction endpoint, which uses token-based (keyset) pagination via page_size/next_token and performs reliably on large sites. This endpoint is scheduled for sunset on 12 April 2027.

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "read-stocktransaction"Read stock transaction resources

Parameters​

Query Parameters

id

The ID number used by the system to uniquely identify a StockTransaction.

Type
string
active

If true, the StockTransaction is active and usable in ezyVet.

Type
boolean
created_at

The epoch time when the StockTransaction was created.

Type
string
modified_at

The epoch time when the StockTransaction was last modified.

Type
string
limit

Limits the number of items returned.

Type
string
Default
10
page

Specifies the page number of the result.

Type
string
Default
1

Responses​

A list of StockTransaction records.

application/json
JSON
{
  
"meta": {
  
  
"items_page": 0,
  
  
"items_page_total": 0,
  
  
"items_page_size": 0,
  
  
"items_total": 0,
  
  
"transaction_id": "string",
  
  
"timestamp": 0
  
},
  
"items": [
  
  
{
  
  
  
"stocktransaction": {
  
  
  
  
"id": "string",
  
  
  
  
"created_at": "string",
  
  
  
  
"modified_at": "string",
  
  
  
  
"active": true,
  
  
  
  
"quantity": "string",
  
  
  
  
"alter_stock": true,
  
  
  
  
"separation_id": "string",
  
  
  
  
"for_id": "string",
  
  
  
  
"for_class": "string",
  
  
  
  
"product_id": "string",
  
  
  
  
"status": "string",
  
  
  
  
"date": 0
  
  
  
}
  
  
}
  
],
  
"messages": [
  
  
{
  
  
}
  
]
}

Samples​


Inventory Tracked Products​


Get inventory tracked products​

GET
/inventory/v1/products

Returns all inventory tracked products as well as details pertaining to the measurement systems of the product

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "inventory-management"Access inventory management resources

Responses​

Gets inventory tracked products

application/json
JSON
{
  
"data": [
  
  
{
  
  
  
"id": "product_CnDsVPsM4Aq81Px7AHPzn",
  
  
  
"name": "Diazepam",
  
  
  
"code": "DZP456",
  
  
  
"unitType": "mg",
  
  
  
"unitCount": 10,
  
  
  
"batchTracked": true
  
  
}
  
],
  
"meta": [
  
  
[
  
  
]
  
]
}

Samples​


Inventory Requirements​


Get inventory balance and requirements​

GET
/inventory/v1/requirements

Returns the current state of products at an inventory location

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "inventory-management"Access inventory management resources

Parameters​

Query Parameters

locationUID*

The UID of the location or separation (e.g. business unit, entity, department)

Type
string
Required
Format
"uid"

Responses​

Gets products with their inventory balance and requirements

application/json
JSON
{
  
"data": [
  
  
{
  
  
  
"productId": "product_CnDsVPsM4Aq81Px7AHPzn",
  
  
  
"product": "Diazepam",
  
  
  
"code": "DZP456",
  
  
  
"available": 2,
  
  
  
"minimum": 3,
  
  
  
"required": 5
  
  
}
  
],
  
"meta": [
  
  
[
  
  
]
  
]
}

Samples​


Supplied Inventory​


Supply products to a location​

POST
/inventory/v1/supplied

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "inventory-management"Access inventory management resources

Parameters​

Query Parameters

locationUID*

The UID of the location that the products are supplied to

Type
string
Required
Example"ownershipSeparation_9K8oZgeaLT0AEctz3KtwC"

Request Body​

application/json
JSON
[
  
{
  
  
"productId": "product_MZcxwWMf9lprsWC8MH2OF",
  
  
"supplied": 5,
  
  
"batch": {
  
  
  
"code": "777-3321",
  
  
  
"expireAt": "2024-01-23"
  
  
}
  
}
]

Responses​

Successful response

application/json
JSON
{
  
"data": [
  
  
{
  
  
  
"productId": "product_MZcxwWMf9lprsWC8MH2OF",
  
  
  
"supplied": 5,
  
  
  
"batch": {
  
  
  
  
"code": "777-3321",
  
  
  
  
"expireAt": "2024-01-23"
  
  
  
}
  
  
}
  
],
  
"meta": {
  
  
"timestamp": 1731883188,
  
  
"currentPage": 1,
  
  
"links": [
  
  
  
{
  
  
  
  
"url": ".../api/v1/inventory/...?page=1",
  
  
  
  
"label": "first"
  
  
  
}
  
  
],
  
  
"path": ".../api/v1/inventory/...",
  
  
"perPage": 10000
  
}
}

Samples​


Balances​


Get inventory balances​

GET
/inventory/v2/balances

Returns quantity-on-hand (QOH) for all active tracked products at a given location or organisational unit.
Unlike /v1/requirements, this endpoint does not require minimum stock configuration.
Results are ordered by product code ascending and use token-based pagination.

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "inventory-management"Access inventory management resources

Parameters​

Query Parameters

locationUID*

The UID of the location or organisational unit to query balances for.

Type
string
Required
Example"ownershipSeparation_9K8oZgeaLT0AEctz3KtwC"
productUID

Optional comma-separated list of product UIDs. Up to 100 values are accepted and each value must be 50 characters or fewer; longer values are rejected with 400 invalidParameter. Whitespace is trimmed and duplicates ignored. When both productUID and productCode are supplied, a product is included only if its UID matches a value in productUID and its code matches a value in productCode (the two filters are intersected, not unioned).

Type
string
Example"product_aBc123,product_dEf456"
productCode

Optional comma-separated list of product codes. Up to 100 values are accepted and each value must be 40 characters or fewer; longer values are rejected with 400 invalidParameter. Whitespace is trimmed and duplicates ignored. Matching is case- and accent-insensitive (e.g. Café, cafe, and CAFE all match the same products). See productUID for combined-filter behaviour.

Type
string
Example"PROD-001,PROD-002"
pageSize

Number of items returned per page. Maximum value is 2000.

Type
integer
Default
2000
Maximum
2000
Minimum
1
nextToken

Opaque pagination token returned from a previous response. If provided, locationUID, pageSize, productUID and productCode query parameters must match the values encoded in the token, otherwise a 400 error is returned.

Type
string
Example"eyJsYXN0Q29kZSI6IlBST0QtMDAzIiwibG9jYXRpb25VSUQiOiJsb2MtMTIzIiwicGFnZVNpemUiOjIwMDB9"

Responses​

Successful response containing inventory balances.

application/json
JSON
{
  
"data": [
  
  
{
  
  
  
"productUid": "product_abc123",
  
  
  
"product": "Amoxicillin 250mg",
  
  
  
"code": "AMOX-250",
  
  
  
"available": 42.5
  
  
}
  
],
  
"meta": {
  
  
"timestamp": "2026-03-10T12:00:00Z",
  
  
"path": "/v2/balances",
  
  
"perPage": 2000,
  
  
"nextToken": "eyJsYXN0Q29kZSI6Ik...",
  
  
"links": [
  
  
  
{
  
  
  
  
"label": "next",
  
  
  
  
"url": "/v2/balances?nextToken=eyJsYXN0Q29kZSI6Ik..."
  
  
  
}
  
  
]
  
}
}

Samples​


Purchase Order V4​


Creates one or more PurchaseOrders.​

POST
/v4/purchaseorder

Accepts an array of 1 to 100 purchase orders and creates them in a single atomic request. Each item is owned by the supplied ownershipId, addressed to the supplier identified by supplierId. Lines are optional - a draft PO with no lines is permitted and matches the existing UI behaviour.

Each PO is created with status Created.

If any item fails validation the whole batch is rejected - no purchase orders are persisted and the response lists every failing item by array index in the target JSON Pointer (e.g. /0/supplierId, /2/lines/0/productId).

Requests exceeding 100 items are rejected with 413 Content Too Large.

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "inventory-management"Access inventory management resources

Request Body​

application/json
JSON
[
  
{
  
  
"supplierId": "contact_AB3e7Z2i9FJu0j7hLExLp",
  
  
"ownershipId": "ownership_5Lh7q9XBxT4dfNYwVo2zP",
  
  
"date": "2026-05-15T09:30:00Z",
  
  
"clientId": "contact_2Lk8m4FRtY1eqMSwVo2zP",
  
  
"shipping": {
  
  
  
"shipType": "business",
  
  
  
"address": {
  
  
  
  
"street1": "123 Industrial Park Rd",
  
  
  
  
"street2": "Warehouse 4",
  
  
  
  
"suburb": "Penrose",
  
  
  
  
"city": "Auckland",
  
  
  
  
"region": "Auckland",
  
  
  
  
"state": "",
  
  
  
  
"postcode": "1061",
  
  
  
  
"countryCode": "NZ"
  
  
  
}
  
  
},
  
  
"purchaseOrderNumber": "EXT-PO-77882",
  
  
"notes": "Auto-generated by inventory replenishment system",
  
  
"freight": 5,
  
  
"freightTax": 0.5,
  
  
"freightTaxRate": 0.1,
  
  
"rounding": 0.02,
  
  
"lines": [
  
  
  
{
  
  
  
  
"productId": "product_ljBNFkNYUWi06cHcB9kOy",
  
  
  
  
"supplierCode": "BND-2M",
  
  
  
  
"quantity": 2,
  
  
  
  
"unitPriceExcludingTax": "100.0000",
  
  
  
  
"taxRate": "10.00",
  
  
  
  
"discount": "10.00",
  
  
  
  
"outers": 1,
  
  
  
  
"order": 0
  
  
  
}
  
  
]
  
}
]

Responses​

The PurchaseOrders were created. Returns the created objects as an
array, in the same order as the request. No envelope.

application/json
JSON
[
  
{
  
  
"id": "purchaseorder_AB3e7Z2i9FJu0j7hLExLp",
  
  
"supplierId": "contact_AB3e7Z2i9FJu0j7hLExLp",
  
  
"ownershipId": "ownership_5Lh7q9XBxT4dfNYwVo2zP",
  
  
"date": "2026-05-15T09:30:00Z",
  
  
"clientId": "contact_2Lk8m4FRtY1eqMSwVo2zP",
  
  
"shipping": {
  
  
  
"shipType": "business",
  
  
  
"address": {
  
  
  
  
"street1": "123 Industrial Park Rd",
  
  
  
  
"street2": "Warehouse 4",
  
  
  
  
"suburb": "Penrose",
  
  
  
  
"city": "Auckland",
  
  
  
  
"region": "Auckland",
  
  
  
  
"state": "",
  
  
  
  
"postcode": "1061",
  
  
  
  
"countryCode": "NZ"
  
  
  
}
  
  
},
  
  
"purchaseOrderNumber": "EXT-PO-77882",
  
  
"notes": "Auto-generated by inventory replenishment system",
  
  
"freight": 5,
  
  
"freightTax": 0.5,
  
  
"freightTaxRate": 0.1,
  
  
"status": "Created",
  
  
"subtotalExcludingTax": 205,
  
  
"tax": 20.5,
  
  
"rounding": 0.02,
  
  
"total": 225.52,
  
  
"lines": [
  
  
  
{
  
  
  
  
"id": "purchaseorderexpense_AB3e7Z2i9FJu0j7hLExLp",
  
  
  
  
"productId": "product_ljBNFkNYUWi06cHcB9kOy",
  
  
  
  
"supplierCode": "BND-2M",
  
  
  
  
"quantity": 2,
  
  
  
  
"unitPriceExcludingTax": "100.0000",
  
  
  
  
"taxPerUnit": "10.0000",
  
  
  
  
"discount": "10.00",
  
  
  
  
"outers": 1,
  
  
  
  
"unitsPerOuter": 2,
  
  
  
  
"lineTotalExcludingTax": 180,
  
  
  
  
"lineTotalTax": 18,
  
  
  
  
"order": 0
  
  
  
}
  
  
],
  
  
"createdAt": "2026-05-15T09:30:05Z",
  
  
"updatedAt": "2026-05-15T09:30:05Z"
  
}
]

Samples​


Product V4​

A REST API for reading and managing products in ezyVet.

Key Features

  • List products and fetch them by id or code (a single fetch is an id filter
    returning a one-element data[]).
  • Create and update products, individually or in bulk.
  • Each product exposes its details, inventory tracking, lifecycle status, and
    financial product group membership.

Routing

Reads live at GET /v4/product (list, or fetch by the id in-filter). Single-record writes
live at bare /v4/product (POST/PATCH, with the id carried in the request body for
updates); multi-record writes live under /v4/product/bulk (POST to create, PATCH to
update, each carrying a JSON array and applied atomically). There is no
/v4/product/{id} path — a single fetch is GET /v4/product?id={"in":["..."]}, and a
not-found id simply yields 200 with an empty data[].


List products, or fetch products by id/code, with token pagination.​

GET
/v4/product

Returns a list of products with a token for pagination if results exceed the page size. Uses token-based pagination (pageSize, nextToken, meta.nextToken).

Fetch a single product (or a known set) with the id filter: a single lookup is GET /v4/product?id={"in":["product_01HXYZSTANDARD"]}, which returns a one-element data[] (a not-found id yields 200 with an empty data[]).

Use updatedAt to restrict the list to products last modified within a window — see that parameter for the comparator grammar. Results are always ordered by internal id ascending; there is no sort parameter.

Pagination tokens embed the active list filters (status, functionalType, code, updatedAt, pageSize), so continuation requests must send nextToken alone. Sending any filter or pageSize alongside nextToken returns 400 RedundantParamsWithNextToken.

Query parameter names are case-sensitive and closed: any name other than those listed below is rejected with 400 UnsupportedQueryParam rather than ignored. The id filter always returns its whole matching set as a single page, so pageSize and nextToken do not apply to it. If no filters are supplied, all products are eligible for paging (subject to scope and site rules).

This endpoint never answers 404 or 422: it resolves no single resource, so an unmatched filter is an empty data[] rather than a not-found, and it applies no business rules. A rejected read is always a 400 (bad filter or pagination token).

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "product-management"Access product management resources
or
bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "read-product"Read product resources

Parameters​

Query Parameters

id

Filter by the product's unique identifier (uid). Two interchangeable shapes are accepted:

  • Single uid (exact match). Pass the uid directly:

    ?id=product_01HXYZSTANDARD

  • Multiple uids (in list). Pass a JSON object whose in key holds an array of uids. The value must be URL-encoded; only products whose uid appears in the list are returned:

    raw    ?id={"in":["product_01HXYZSTANDARD","product_01HXYZAMOXI"]}

The in list accepts 1 to 100 uids. More than 100 returns 400 TooManyFilterValues; a malformed object (empty list, non-string entries, or a JSON list rather than an object) returns 400 InvalidIdFilter; an operator other than in returns 400 UnsupportedFilterOperator.

Filtering by id (single uid or in list) always returns the whole matching set as a single page — pageSize and nextToken do not apply (the 100-uid cap guarantees the result fits in one response). A uid that matches nothing is simply absent from data[].

Type
string
Example{"in":["product_01HXYZSTANDARD","product_01HXYZAMOXI"]}
code

Filter by product code (exact match). Integrations typically key off the code/SKU rather than the uid.

Type
string
Example"CONS01"
status

Filter by lifecycle status.

Type
string
Valid values
"active""disabled""merged""replaced"
Example"active"
functionalType

Filter by functional type.

Type
string
Valid values
"single_product""bundle""package""container""service_fee""external"
Example"single_product"
updatedAt

Filter by when the product was last modified, as a URL-encoded JSON object of comparators keyed by eq, gt, lt, gte or lte. Values are strict RFC-3339 instants: YYYY-MM-DDTHH:MM:SSZ or YYYY-MM-DDTHH:MM:SS±HH:MM — seconds and the offset colon are both required, and epoch-seconds are not accepted.

Several comparators combine with AND, so a window is one parameter:

  • exact match — updatedAt={"eq":"2022-01-05T23:23:43Z"}
  • one week — updatedAt={"gte":"2024-05-17T00:00:00Z","lte":"2024-05-24T00:00:00Z"}

A malformed value is rejected with InvalidDateFilter; an unrecognised comparator key with UnsupportedDateComparator. Products whose updatedAt is null (never stamped) never match.

Type
string
Example{"gte":"2024-05-17T00:00:00Z","lte":"2024-05-24T00:00:00Z"}
pageSize

Number of products per page. Default is 200, maximum is 1000.

Type
integer
Example200
Default
200
Maximum
1000
nextToken

Opaque token from meta.nextToken of the previous response to fetch the next page. The token carries the filters and pageSize from the initial request, so send nextToken alone. Combining it with id, code, status, functionalType, updatedAt, or pageSize returns 400 RedundantParamsWithNextToken.

id is rejected alongside nextToken like every other filter, even though an id filter never produces a token: a request carrying both is asking for two different result sets at once, and silently honouring one of them would be a guess.

Type
string
Example"YWJjZGVmZ2hpams_bXlu"

Responses​

A page of products.

application/json
JSON
{
  
"meta": {
  
},
  
"data": [
  
  
{
  
  
  
"id": "product_01HXYZSTANDARD",
  
  
  
"legacyId": 4821,
  
  
  
"code": "CONS01",
  
  
  
"name": "Standard Consultation",
  
  
  
"functionalType": "single_product",
  
  
  
"clinicalType": "none",
  
  
  
"isTemplate": false,
  
  
  
"hasMarkup": false,
  
  
  
"isSellPriceDerivedFromContainerItems": false,
  
  
  
"isCostDerivedFromContainerItems": false,
  
  
  
"status": "active",
  
  
  
"inventoryTracking": "no",
  
  
  
"financialProductGroup": {
  
  
  
  
"id": "productgroup_01HXYZCONSULTS",
  
  
  
  
"name": "Consultations"
  
  
  
}
  
  
}
  
],
  
"errors": [
  
]
}

Samples​


Bundle Item V4​

This portion of the API exposes the contents of a bundle — the products that make up a
bundle product, together with the quantity rules applied to each line when the bundle is billed.
This version uses token pagination.

Scope

Only products whose functional type is bundle are in scope. Passing the UID of a container
or package — which store their contents in the same underlying table — returns 200 with an
empty data[], as does the UID of a product with no contents at all. Use
GET /v4/product to determine a product's functionalType.

Routing

Reads live at GET /v4/product/bundleitem, filtered by the bundleId of the parent bundle.
There is no /v4/product/bundleitem/{id} path: a bundle line has no identifier of its own,
so a line cannot be addressed directly. See Identity below.

Identity

A bundle line is not an independently addressable resource. The id of each item is the UID
of the contained product, and bundleId is the UID of the parent bundle product — so
neither id nor the (bundleId, id) pair is guaranteed unique within a response: the same
product may legitimately appear on more than one line of a bundle with different quantity rules.
Use rowOrder to distinguish and order repeated lines. Clients must not treat id as a primary
key for this resource.

Resolving products

Each line carries UIDs only — no product code or name. Resolve them in a single follow-up
call with the product in filter, e.g.
GET /v4/product?id={"in":["product_01HXYZVACC","product_01HXYZDENTAL"]} (up to 100 UIDs).

Response structure:

  • GET /v4/product/bundleitem (list): Returns {meta, data, errors}. meta is always present
    (empty object on the last page); data is an array of BundleItem; errors is always present
    and is [] on success.
  • All error responses use {errors: [{id, code}]} (see ErrorResponse).

Fetches the contents of a bundle - uses token pagination.​

GET
/v4/product/bundleitem

Returns one entry per line of the requested bundle. Only active lines of active bundles are returned; disabled lines are omitted and there is no status filter.

Query parameter names are case-sensitive and must match the parameters documented below exactly (for example bundleId, not bundleid). Any unsupported query parameter returns 400 Bad Request with error code UnsupportedQueryParam.

bundleId is required and single-valued. Omitting it returns 400 MissingRequiredFilter. It accepts one bare product UID; there is no in or other multi-value form, so a JSON value returns 400 InvalidBundleIdFilter. A UID that matches no bundle — including a valid container, package or single_product UID — is not an error: the response is 200 with an empty data[].

Ordering. Rows are returned in ascending internal-record order, which is not the bundle's display order. rowOrder is the display order and is deliberately not used as the pagination key, because it is rewritten whenever a bundle is reordered and so cannot give stable page boundaries. Sort on rowOrder client-side. In practice a bundle is far smaller than one page, so a client receives the whole bundle in a single response and sorts locally.

Continuation contract: nextToken must be sent alone. Sending it alongside pageSize or bundleId returns 400 RedundantParamsWithNextToken — the page size and the filter snapshot are carried inside the token. Presence of the key is what counts, so ?nextToken=…&pageSize= is rejected too: on a continuation an empty value is still the parameter being sent. (On a first-page request the same empty pageSize is the omitted case and defaults — see the pageSize parameter.)

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "product-management"Access product management resources
or
bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "read-product"Read product resources

Parameters​

Query Parameters

bundleId*

Required. The UID of the parent bundle product whose contents to return. Omitting it returns 400 MissingRequiredFilter — there is no unfiltered listing of every bundle line on a site.

Single-valued: exactly one bare product UID, e.g. bundleId=product_01HXYZWELLNESS. There is no in comparator or other multi-value form on this endpoint — read several bundles with one request each. An empty value, or a value that is not a valid UID (^[A-Za-z0-9]+_[A-Za-z0-9]+$) — which includes any JSON object or array — returns 400 InvalidBundleIdFilter.

Only products whose functional type is bundle match. A UID that is valid but is not a bundle — a container, package, single_product or service_fee — is not an error and yields 200 with an empty data[], as does a bundle with no contents. Because bundleId selects an open-ended set of lines rather than a bounded set of identities, it paginates normally and is carried in the nextToken snapshot.

Type
string
Required
Example"product_01HXYZWELLNESS"
pageSize

Sets the number of items to be returned in each page on the first request (no nextToken). When omitted or empty on the first page, defaults to 200. Must be an integer between 1 and 200; values outside the range return 400 Bad Request (InvalidPageSize). When nextToken is present, do not send pageSize; the effective page size is embedded in the token. Supplying pageSize with nextToken returns 400 (RedundantParamsWithNextToken).

Type
integer
Example200
Default
200
Maximum
200
nextToken

Opaque pagination cursor from meta.nextToken on the previous list response. Same format as meta.nextToken: Base64URL over UTF-8 JSON (no padding).

Do not send bundleId or pageSize alongside nextToken; both are reconstructed from the token payload. Mixing them returns 400 (RedundantParamsWithNextToken).

Example decoded payload (illustrative):

{
  "pageSize": 200,
  "lastBundleItemId": 10002,
  "bundleId": "product_01HXYZWELLNESS"
}
Type
string
Example"eyJwYWdlU2l6ZSI6MjAwLCJsYXN0QnVuZGxlSXRlbUlkIjoxMDAwMiwiYnVuZGxlSWQiOiJwcm9kdWN0XzAxSFhZWldFTExORVNTIn0"

Responses​

The contents of the requested bundle. An empty data[] means the bundleId matched no bundle with contents — it is not an error.

application/json
JSON
{
  
"meta": {
  
},
  
"data": [
  
  
{
  
  
  
"id": "product_01HXYZCONSULT",
  
  
  
"bundleId": "product_01HXYZWELLNESS",
  
  
  
"quantity": 1,
  
  
  
"minimumQuantity": 1,
  
  
  
"maximumQuantity": 1,
  
  
  
"isFixed": true,
  
  
  
"isMultiple": false,
  
  
  
"multiply": false,
  
  
  
"rowOrder": 1
  
  
},
  
  
{
  
  
  
"id": "product_01HXYZVACC",
  
  
  
"bundleId": "product_01HXYZWELLNESS",
  
  
  
"quantity": 2,
  
  
  
"minimumQuantity": 0,
  
  
  
"maximumQuantity": 4,
  
  
  
"isFixed": false,
  
  
  
"isMultiple": false,
  
  
  
"multiply": true,
  
  
  
"rowOrder": 2
  
  
}
  
],
  
"errors": [
  
]
}

Samples​


Product Pricing V4​

A REST API for managing product pricing in ezyVet.

Key Features

  • Support for creating new and managing existing product pricing

Pricing lines

Every active product has exactly one pricing line at every active ownership of type Database,
Business and Division. Inventory locations carry no pricing. A line is never missing and never
disabled; it is always one of two kinds:

  • Custom (hasCustomPricing: true): the ownership sets its own price for the product, shown in
    details.
  • Inherited (hasCustomPricing: false): the ownership has no price of its own and uses the price of
    its nearest ancestor with a custom line, walking up the ownership tree to the Database ownership.
    details shows that inherited price, so changing an ancestor's custom price changes every inherited
    line below it. A disabled ownership ends the walk: nothing at or above it is inherited. An inherited
    line with no custom ancestor before the top of the tree or a disabled ownership has no details.

The Database ownership is the top of the tree and holds the organisation's base price, which every
inherited line below it falls back to unless a disabled ownership sits between them. Once that base
price is set, the Database line always shows it in details, even when the line reports
hasCustomPricing: false.

To give an ownership its own price, PATCH its line with hasCustomPricing: true and details. To take
the price away again, PATCH it with hasCustomPricing: false; the line stays and goes back to
inheriting.


Lists pricing with token pagination.​

GET
/v4/productpricing

Returns every pricing line: one per (product, ownership) pair, for every active product at every active ownership of type Database, Business and Division (see Pricing lines above). A location or a disabled ownership has no lines, so filtering on one returns an empty page.

Each line is either custom (hasCustomPricing: true, the ownership's own price) or inherited (hasCustomPricing: false, the price of its nearest ancestor with a custom line). Either way details is the price that applies at that ownership; an inherited line with no custom ancestor has no details.

createdAt and updatedAt belong to the ownership's own custom price. On an inherited line they show when its former custom price was created and when it went back to inheriting, and are null if it never had one.

Use customOnly=true to list only the custom lines.

Query filters use product and ownership for IDs. Lines are ordered by product and then ownership. Send sort=ownership to order them by ownership and then product. Use updatedAt to restrict a customOnly=true list to lines last modified within a window — see that parameter for the comparator grammar. Uses token-based pagination (pageSize, nextToken, meta.nextToken). The cursor is the (product, ownership) pair of the last line on the page. Pagination tokens embed the active list filters (product, ownership, customOnly, updatedAt, sort, pageSize), so the next page is requested with nextToken alone; sending any of those query parameters alongside a token is rejected with RedundantParamsWithNextToken.

Query parameter names are case-sensitive and closed: any name other than those listed below is rejected with UnsupportedQueryParam rather than ignored.

Authorizations​

bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "pricing-management"Access product pricing management resources
or
bearerAuth
clientCredentials Flow
Token URL"https://api.ezyvet.com/v1/oauth/access_token"
Scopes:
  • "read-productpricing"Read product pricing resources

Parameters​

Query Parameters

customOnly

List only custom lines (hasCustomPricing: true), leaving out inherited ones. Only the literal string true is accepted (e.g. customOnly=true in the query string). When omitted, every line is listed, custom and inherited.

Type
string
Valid values
"true"
Example"true"
product

Filter to this product ID (same value as each row's productId field in the response body).

Type
string
Example"product_01HXYZSTANDARD"
ownership

Filter to this ownership ID (same value as each row's ownershipId field in the response body).

Type
string
Example"ownership_01HXYZBUSINESS"
updatedAt

Filter by when the pricing row was last modified, as a URL-encoded JSON object of comparators keyed by eq, gt, lt, gte or lte. Values are strict RFC-3339 instants: YYYY-MM-DDTHH:MM:SSZ or YYYY-MM-DDTHH:MM:SS±HH:MM — seconds and the offset colon are both required, and epoch-seconds are not accepted.

Several comparators combine with AND, so a window is one parameter:

  • exact match — updatedAt={"eq":"2022-01-05T23:23:43Z"}
  • one week — updatedAt={"gte":"2024-05-17T00:00:00Z","lte":"2024-05-24T00:00:00Z"}

This filter applies to custom lines only, so it needs customOnly=true; without it the request is rejected with UpdatedAtRequiresCustomOnly.

A malformed value is rejected with InvalidDateFilter; an unrecognised comparator key with UnsupportedDateComparator. Rows whose updatedAt is null (no stored modified time) never match.

Type
string
Example{"gte":"2024-05-17T00:00:00Z","lte":"2024-05-24T00:00:00Z"}
sort

Row order. product (the default) orders by product and then ownership; ownership orders by ownership and then product. Any other value is rejected with InvalidParameter.

Type
string
Valid values
"product""ownership"
Example"ownership"
Default
"product"
pageSize

Number of rows per page. Default and maximum match the Animal v4 list API unless documented otherwise by the implementation.

Type
number
Example200
Default
200
Maximum
2000
nextToken

Opaque token from meta.nextToken of the previous response to fetch the next page. The token carries the same filters as the initial request, so send it on its own: product, ownership, customOnly, updatedAt, sort and pageSize are rejected with RedundantParamsWithNextToken when sent alongside it, whether or not they agree with the token.

Type
string
Example"YWJjZGVmZ2hpams_bXlu"

Responses​

A page of pricing lines.

application/json
JSON
{
  
"meta": {
  
  
"nextToken": "YWJjZGVmZ2hpams_bXlu"
  
},
  
"data": [
  
  
{
  
  
  
"productId": "product_01HXYZSTANDARD",
  
  
  
"ownershipId": "ownership_01HXYZBUSINESS",
  
  
  
"hasCustomPricing": true,
  
  
  
"createdAt": "2024-05-17T13:00:00Z",
  
  
  
"updatedAt": "2024-05-24T09:30:00Z",
  
  
  
"details": {
  
  
  
  
"costPrice": 60,
  
  
  
  
"markupPercentage": 100,
  
  
  
  
"taxRateCode": "GST",
  
  
  
  
"pricingMethod": "Markup"
  
  
  
}
  
  
},
  
  
{
  
  
  
"productId": "product_01HXYZBUNDLE",
  
  
  
"ownershipId": "ownership_01HXYZBUSINESS",
  
  
  
"hasCustomPricing": true,
  
  
  
"createdAt": "2024-05-17T13:00:00Z",
  
  
  
"updatedAt": "2024-05-24T09:30:00Z",
  
  
  
"details": {
  
  
  
  
"sellPrice": 249,
  
  
  
  
"pricingMethod": "BundlePriceTaxExclusive"
  
  
  
}
  
  
}
  
],
  
"errors": [
  
]
}

Samples​


Powered by VitePress OpenAPI