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
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
trueformat
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": [ { } ]
{
}
GET
/v1/barcode
Samples
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
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_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
10page
Specifies the page number of the result.
Type
string
Default
1Responses
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": [ { } ]
{
}
GET
/v1/product
Samples
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
10page
Specifies the page number of the result.
Type
string
Default
1Responses
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": [ ]
{
}
GET
/v1/productgroup
Samples
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
Requirednumber
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": [ ]
{
}
GET
/v1/purchaseorder
Samples
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": [ ]
{
}
GET
/v1/purchaseorderitem
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" ]
{
}
GET
/v1/receiveinvoice
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" ]
{
}
GET
/v1/receiveinvoiceitem
Samples
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
truename
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": [ { } ]
{
}
GET
/v2/batch
Samples
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
Requiredstring
Path Parameters
product_id*
The ID number used by the system to uniquely identify a Product.
Type
Requirednumber
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": [ ]
{
}
GET
/v2/product/{product_id}
Samples
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
productIdandownershipId. - 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 }
{
}
PATCH
/v2.1/product/servicefee/bulk
Samples
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" ]
{
}
GET
/v2/productminimumstock
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": [ ]
{
}
GET
/v2/productpricing
Samples
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": [ { } ]
{
}
GET
/v2/productsupplier
Samples
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
truecreated_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": [ ]
{
}
GET
/v2/receiveinvoice
Samples
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
truereceive_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
0total
The total monetary amount of the ReceiveInvoiceItem excluding tax.
Type
number
Default
0total_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": [ ]
{
}
GET
/v2/receiveinvoiceitem
Samples
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": [ { } ]
{
}
POST
/v2/stockadjustment
Samples
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" ]
{
}
POST
/v2/stockadjustmentitem
Samples
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
10page
Specifies the page number of the result.
Type
string
Default
1Responses
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": [ { } ]
{
}
GET
/v2/stocktransaction
Samples
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": [ [ ] ]
{
}
GET
/inventory/v1/products
Samples
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
Requiredstring
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": [ [ ] ]
{
}
GET
/inventory/v1/requirements
Samples
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
Requiredstring
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 }
{
}
POST
/inventory/v1/supplied
Samples
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
Requiredstring
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
2000Maximum
2000Minimum
1nextToken
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..." } ] }
{
}
GET
/inventory/v2/balances
Samples
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" }
[
]
POST
/v4/purchaseorder
Samples
Product V4
A REST API for reading and managing products in ezyVet.
Key Features
- List products and fetch them by
idorcode(a single fetch is anidfilter
returning a one-elementdata[]). - 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 (
inlist). Pass a JSON object whoseinkey 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
Example
200Default
200Maximum
1000nextToken
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": [ ]
{
}
GET
/v4/product
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}.metais always present
(empty object on the last page);datais an array of BundleItem;errorsis always present
and is[]on success. - All error responses use
{errors: [{id, code}]}(seeErrorResponse).
Operations
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
Requiredstring
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
Example
200Default
200Maximum
200nextToken
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": [ ]
{
}
GET
/v4/product/bundleitem
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 theDatabaseownership.
detailsshows 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 nodetails.
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
Example
200Default
200Maximum
2000nextToken
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": [ ]
{
}
GET
/v4/productpricing