Getting Started

The KSS API provides programmatic access to product catalog, inventory, customer, invoice, and pricing data. All requests are made over HTTPS and return JSON responses.

There are two environments, each backed by its own isolated database and requiring a separate API key.

Production
api.kssdata.com
Live data. Use production API keys only. Data is updated continuously
Test
api.test.kssdata.com
Safe for development and integration testing. Data is updated every Sunday morning
API keys are environment-scoped. A production key will be rejected by the test environment and vice versa. Never use production keys in development or CI pipelines.

All endpoints are versioned under /api/v1. A full request to the products endpoint looks like:

https
GET https://api.kssdata.com/api/{{version}}/products?States=CA&Statuses=1
x-api-key: your-api-key

Authentication

Every request must include your API key in the x-api-key request header. Requests without a valid key return 401 Unauthorized.

http header
x-api-key: your-api-key
Key Types

Employee — Full access to all endpoints and all data across any state or customer.

Customer — Access is scoped to the customer accounts associated with the key. Requests for data outside that scope are silently filtered or return 403.

Supplier — Access is scoped to the supplier accounts associated with the key. Some endpoints are unavailable to Supplier keys entirely, noted per endpoint below.

Rate Limiting

Rate limits are enforced per API key. Each key has a configurable maximum requests per hour. When the limit is reached, the API returns 429 Too Many Requests.

If you are building a sync process that requires high request volume, contact KSS to discuss your needs.

Use pagination and filtering. Fetching only the data you need — by state, supplier, or customer — is the most effective way to reduce request volume.

Pagination

All list endpoints support pagination via Page and PageSize query parameters. The default page size is 50. The maximum page size is 500.

Paginated responses wrap results in a Data array alongside Page and PageSize fields.

example request
GET /api/{{version}}/products?States=CA&Page=2&PageSize=100
json
{
  "Data": [ ... ],
  "Page": 2,
  "PageSize": 100
}

Errors

The API uses standard HTTP status codes. Error responses include a JSON body with an error field describing the issue.

400 Bad Request
Missing or invalid parameter.
401 Unauthorized
Missing or invalid API key.
403 Forbidden
Your key does not have access to this resource.
404 Not Found
The endpoint does not exist.
429 Too Many Requests
Rate limit exceeded.
500 Server Error
Unexpected server error. Contact KSS support.
error response
{
  "Error": "InvoiceIDs parameter is required"
}

Endpoints

Allocations
GET
/allocations
Paginated

Returns product allocations filtered by customer, supplier, and state.

Callout:
A single Allocation ID can effect multiple customers. The Unique key is [Allocation, ProductID, CustomerID]
Parameters
Name Type Required Description
CustomerIDs
query
number[] optional
Comma-separated list of customer IDs to filter by.
SupplierIDs
query
number[] optional
Comma-separated list of supplier IDs to filter by.
States
query
string[] optional
Comma-separated list of state abbreviations to filter by. Example: "CA,NJ".

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "AllocationID": 1001,
      "ProductID": 160,
      "CustomerID": 1,
      "Units": 24,
      "AllocationTypeID": 0,
      "StartDate": "2025-01-01",
      "EndDate": "2025-03-31",
      "TimeUpdated": "2025-01-15T10:00:00.000Z"
    },
    {
      "AllocationID": 1002,
      "ProductID": 161,
      "CustomerID": 1,
      "Units": 48,
      "AllocationTypeID": 0,
      "StartDate": "2025-01-01",
      "EndDate": "2025-03-31",
      "TimeUpdated": "2025-01-15T10:00:00.000Z"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
AR Aging
GET
/arAging
Not available to Supplier keys Paginated

Returns accounts receivable aging records for customers.

Callout:
AR Statements are recalculated once per day at the end of the day
Parameters
Name Type Required Description
CustomerIDs
query
number[] optional
Comma-separated list of customer IDs to filter by.
States
query
string[] optional
Comma-separated list of state abbreviations to filter by. Example: "CA,NJ".

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "CustomerID": 1,
      "OpenCredit": "-31.050000",
      "CurrentDue": "0.000000",
      "Due_1_30": "34635.280000",
      "Due_31_60": "0.000000",
      "Due_61_90": "0.000000",
      "Due_91": "0.000000",
      "CloseDate": "2026-01-25T07:00:00.000Z",
      "TotalBalanceOutstanding": "34604.230000",
      "StatementLink": "https://example.com?Key=123456",
      "CurrentInvoices": [],
      "Invoices_1_30": [
        {
          "InvoiceID": 12345,
          "InvoiceNum": "X-12345"
        },
        {
          "InvoiceID": 12346,
          "InvoiceNum": "X-12346"
        },
        {
          "InvoiceID": 12347,
          "InvoiceNum": "X-12347"
        }
      ],
      "Invoices_31_60": [],
      "Invoices_61_90": [],
      "Invoices_91": [],
      "StatementDate": "2026-01-04T07:00:00.000Z",
      "TimeUpdated": "2024-09-23T19:05:39.984Z",
      "CreditInvoices": [
        {
          "InvoiceID": 52221,
          "InvoiceNum": "X-52221"
        },
        {
          "InvoiceID": 52222,
          "InvoiceNum": "X-52222"
        },
        {
          "InvoiceID": 52223,
          "InvoiceNum": "X-52223"
        }
      ]
    }
  ],
  "Page": 1,
  "PageSize": 50
}
Pricing
GET
/customerPricing
Paginated

Returns per-customer product pricing including any applicable promotions and discounts for a given effective date.

Parameters
Name Type Required Description
CustomerIDs
query
number[] required
Comma-separated list of customer IDs to fetch pricing for. Returns 403 if none are accessible.
EffectiveDate
query
date optional
ISO 8601 date string to evaluate promotion validity against. Defaults to the current date.

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "ProductID": 160,
      "CustomerID": 1,
      "FullPrice": "18.00",
      "UnitPrice": "15.50",
      "Discount": "2.50",
      "PromotionID": 42,
      "StartDate": "2025-01-01",
      "EndDate": "2025-03-31",
      "TimeUpdated": "2025-01-10T08:00:00.000Z"
    },
    {
      "ProductID": 161,
      "CustomerID": 1,
      "FullPrice": "18.00",
      "UnitPrice": "18.00",
      "Discount": "0.00",
      "PromotionID": null,
      "StartDate": null,
      "EndDate": null,
      "TimeUpdated": "2025-01-10T08:00:00.000Z"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
Customers
GET
/customers
Paginated

Returns a list of customers filtered by state, customer ID, and account status.

Parameters
Name Type Required Description
CustomerIDs
query
number[] optional
Comma-separated list of customer IDs to filter by.
States
query
string[] optional
Comma-separated list of state abbreviations to filter by. Example: "CA,NJ".
AccountStatuses
query
string[] optional
Comma-separated list of account statuses to filter by. Defaults to Active.
Active Active Inactive Inactive OutOfBus Out of Business
OnHold
query
string optional
Filter by on hold status. Pass "true" to return only customers on hold, "false" to exclude them. When omitted, on hold status is not filtered.
true On Hold false Not On Hold

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "CustomerID": 1,
      "CustomerName": "Kettles Secret Stash",
      "CustomerNameAlt": "Kettles",
      "ChainName": "Kettles Chain",
      "LicenseNum": "C10-0000001-LIC",
      "Address": "123 Main St, Los Angeles, CA 90001",
      "LocationID": 3,
      "OnHold": false,
      "SalesRepEmail": "jane.smith@example.com",
      "SalesRepName": "Jane Smith",
      "SalesRepPhone": "555-555-0100",
      "SalesRepUserID": 9240,
      "ProfilePictureURL": "https://cdn.e8.co/Kiva/S3UserAvatar/example.jpg",
      "CollectionAgentFullName": null,
      "CollectionAgentEmail": null,
      "State": "CA",
      "DeliveryDays": "1",
      "NextDeliveryDates": "2026-01-05;2026-01-12;2026-01-19;2026-01-26",
      "AccountStatus": "Active",
      "DeliveryDates": [
        "2026-01-05",
        "2026-01-12",
        "2026-01-19",
        "2026-01-26"
      ],
      "DeliveryMinimum": 500,
      "TimeUpdated": "2025-01-15T10:00:00.000Z"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
GET
/customers/:customerID

Returns a single customer by ID.

Parameters
Name Type Required Description
customerID
path
number required
The ID of the customer to retrieve.
Example Response
json
{
  "Data": [
    {
      "CustomerID": 1,
      "CustomerName": "Kettles Secret Stash",
      "CustomerNameAlt": "Kettles",
      "ChainName": "Kettles Chain",
      "LicenseNum": "C10-0000001-LIC",
      "Address": "123 Main St, Los Angeles, CA 90001",
      "LocationID": 3,
      "OnHold": false,
      "SalesRepEmail": "jane.smith@example.com",
      "SalesRepName": "Jane Smith",
      "SalesRepPhone": "555-555-0100",
      "SalesRepUserID": 9240,
      "ProfilePictureURL": "https://cdn.e8.co/Kiva/S3UserAvatar/example.jpg",
      "CollectionAgentFullName": null,
      "CollectionAgentEmail": null,
      "State": "CA",
      "DeliveryDays": "1",
      "NextDeliveryDates": "2026-01-05;2026-01-12;2026-01-19;2026-01-26",
      "AccountStatus": "Active",
      "DeliveryDates": [
        "2026-01-05",
        "2026-01-12",
        "2026-01-19",
        "2026-01-26"
      ],
      "DeliveryMinimum": 500,
      "TimeUpdated": "2025-01-15T10:00:00.000Z"
    }
  ]
}
GET
/deliveryDays
Paginated

Returns delivery day schedules for active customers.

Callout:
'DeliveryDays' is the day of the week the customer is delivered on. 1 = Monday, 7 = Sunday
Parameters
Name Type Required Description
CustomerIDs
query
number[] optional
Comma-separated list of customer IDs to filter by.
States
query
string[] optional
Comma-separated list of state abbreviations to filter by. Example: "CA,NJ".

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "CustomerID": 1,
      "DeliveryDays": "3",
      "DeliveryDates": [
        "2026-02-04",
        "2026-02-11",
        "2026-02-18",
        "2026-02-25"
      ]
    }
  ],
  "Page": 1,
  "PageSize": 50
}
Inventory
GET
/inventory
Not available to Customer keys Paginated

Returns warehouse inventory records filtered by supplier, product, location, and state. AvailableUnits = OnFloorInventory - PreSales - Allocations

Callout:
The NotAuthorized field signifies that all of this product is reserved for specific accounts. Refer to the Allocations endpoint for details
Parameters
Name Type Required Description
SupplierIDs
query
number[] optional
Comma-separated list of supplier IDs to filter by.
ProductIDs
query
number[] optional
Comma-separated list of product IDs to filter by.
LocationIDs
query
number[] optional
Comma-separated list of location IDs to filter by.
States
query
string[] optional
Comma-separated list of state abbreviations to filter by. Example: "CA,NJ".

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "LocationID": 1,
      "ProductID": 5001,
      "OnFloorInventory": "1239.00",
      "PreSales": "110.00",
      "Allocated": "0.00",
      "NotAuthorized": false,
      "AvailableUnits": 1129,
      "PurchaseTransID": 7537244,
      "DOI": "5.60",
      "AvgDailySales90d": "201.49",
      "TimeUpdated": "2026-02-24T17:06:10.610Z"
    },
    {
      "LocationID": 1,
      "ProductID": 5002,
      "OnFloorInventory": "1939.00",
      "PreSales": "180.00",
      "Allocated": "0.00",
      "NotAuthorized": false,
      "AvailableUnits": 1759,
      "PurchaseTransID": 7537282,
      "DOI": "3.77",
      "AvgDailySales90d": "466.83",
      "TimeUpdated": "2026-02-24T17:06:10.610Z"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
GET
/retailerInventory
Paginated

Returns retailer-level inventory records filtered by customer, supplier, product, and state.

Parameters
Name Type Required Description
CustomerIDs
query
number[] optional
Comma-separated list of customer IDs to filter by.
SupplierIDs
query
number[] optional
Comma-separated list of supplier IDs to filter by.
ProductIDs
query
number[] optional
Comma-separated list of product IDs to filter by.
States
query
string[] optional
Comma-separated list of state abbreviations to filter by. Example: "CA,NJ".

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "ID": 1690421,
      "ProductID": 160,
      "CustomerID": 1,
      "LastInventoryDate": "2025-05-20T06:00:00.000Z",
      "Inventory": "20.00",
      "DailySales": "0.03",
      "TimeUpdated": "2025-06-02T21:31:05.941Z"
    },
    {
      "ID": 1706440,
      "ProductID": 161,
      "CustomerID": 1,
      "LastInventoryDate": "1999-12-31T07:00:00.000Z",
      "Inventory": "0.00",
      "DailySales": "0.03",
      "TimeUpdated": "2025-06-17T15:46:14.397Z"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
Invoices
GET
/invoices
Paginated

Returns invoices filtered by customer, status, date range, and state.

Callout:
Defaults to returning only New (1) status invoices if the 'Statuses' parameter is not included
Parameters
Name Type Required Description
CustomerIDs
query
number[] optional
Comma-separated list of customer IDs to filter by.
InvoiceIDs
query
number[] optional
Comma-separated list of invoice IDs to filter by.
States
query
string[] optional
Comma-separated list of state abbreviations to filter by. Example: "CA,NJ".
Statuses
query
number[] optional
Comma-separated list of invoice status IDs. Defaults to New (1).
1 New 2 Locked for Routing 3 Loaded 4 Returned 5 Balanced 7 Verified
StartDate
query
date optional
ISO 8601 date string. Returns invoices on or after this date.
EndDate
query
date optional
ISO 8601 date string. Returns invoices on or before this date.

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "InvoiceID": 9001,
      "CustomerID": 1,
      "CustomerName": "Acme Beverages",
      "InvoiceNum": "INV-2025-0001",
      "OpenDebit": "0.320000",
      "OpenCredit": "0.000000",
      "PONum": null,
      "PODate": null,
      "TermID": 3,
      "PDFURL": "https://example.com/api?APIKeyID=123456",
      "Memo": "This is a memo",
      "Date": "2026-02-10T07:00:00.000Z",
      "DueDate": "2026-03-11T06:00:00.000Z",
      "Status": 1,
      "InvoiceTotal": "1536.000000",
      "SubmittedByUserID": 856,
      "SubmittedByUserName": "John Doe",
      "SubmittedByUserEmail": "john.doe@example.com",
      "BuiltByUserID": 856,
      "BuiltByUserName": "Jane Smith",
      "BuiltByUserEmail": "jane.smith@example.com",
      "InvoiceTimeCreated": "2026-01-27T13:40:00.000Z",
      "InvoiceLastUpdated": "2026-01-27T13:40:00.000Z",
      "TotalNumUnits": "72",
      "TotalCases": "6.00",
      "TotalFullPrice": "1680.000000",
      "TotalExtPrice": "1536.000000",
      "TotalDiscount": "144.000000",
      "OpenBalance": "1536.000000"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
GET
/invoices/:invoiceID

Returns a single invoice by ID.

Parameters
Name Type Required Description
invoiceID
path
number required
The ID of the invoice to retrieve.
Example Response
json
{
  "Data": [
    {
      "InvoiceID": 9001,
      "CustomerID": 1,
      "CustomerName": "Acme Beverages",
      "InvoiceNum": "INV-2025-0001",
      "OpenDebit": "0.320000",
      "OpenCredit": "0.000000",
      "PONum": null,
      "PODate": null,
      "TermID": 3,
      "PDFURL": "https://example.com/api?APIKeyID=123456",
      "Memo": "This is a memo",
      "Date": "2026-02-10T07:00:00.000Z",
      "DueDate": "2026-03-11T06:00:00.000Z",
      "Status": 1,
      "InvoiceTotal": "1536.000000",
      "SubmittedByUserID": 856,
      "SubmittedByUserName": "John Doe",
      "SubmittedByUserEmail": "john.doe@example.com",
      "BuiltByUserID": 856,
      "BuiltByUserName": "Jane Smith",
      "BuiltByUserEmail": "jane.smith@example.com",
      "InvoiceTimeCreated": "2026-01-27T13:40:00.000Z",
      "InvoiceLastUpdated": "2026-01-27T13:40:00.000Z",
      "TotalNumUnits": "72",
      "TotalCases": "6.00",
      "TotalFullPrice": "1680.000000",
      "TotalExtPrice": "1536.000000",
      "TotalDiscount": "144.000000",
      "OpenBalance": "1536.000000"
    }
  ]
}
GET
/invoiceTransactions
Paginated

Returns line item transactions for the specified invoices. InvoiceIDs is required.

Parameters
Name Type Required Description
InvoiceIDs
query
number[] required
Comma-separated list of invoice IDs to fetch transactions for. Returns 400 if not provided.
Statuses
query
number[] optional
Comma-separated list of invoice status IDs. If provided and does not include Verified (7), verified invoices are excluded from results.
1 New 2 Locked for Routing 3 Loaded 4 Returned 5 Balanced 7 Verified

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "InvoiceTransID": 20001,
      "InvoiceID": 9001,
      "CustomerID": 1,
      "ProductID": 171,
      "ProductName": "Terra Bites Milk Chocolate Blueberries",
      "Cases": "1.00",
      "NumUnits": 20,
      "Ordered": 20,
      "BackOrder": 0,
      "FullPrice": "11.000000",
      "Discount": "2.250000",
      "UnitPrice": "8.750000",
      "ExtPrice": "175.000000",
      "TimeUpdated": "2024-09-23T19:05:39.984Z",
      "SupplierID": 5,
      "PromotionID": 5571,
      "BatchCode": "BATCH-2025-01",
      "COA_URL": "https://cdn.example.com/coa/batch-2025-001.pdf"
    },
    {
      "InvoiceTransID": 20002,
      "InvoiceID": 9001,
      "ProductID": 736,
      "ProductName": "Camino Gummies Wild Cherry",
      "Cases": "1.00",
      "NumUnits": 20,
      "Ordered": 20,
      "BackOrder": 0,
      "FullPrice": "11.000000",
      "Discount": "0.000000",
      "UnitPrice": "11.000000",
      "ExtPrice": "220.000000",
      "TimeUpdated": "2024-09-23T19:05:39.984Z",
      "SupplierID": 5,
      "PromotionID": null,
      "BatchCode": "BATCH-2025-002",
      "COA_URL": null
    }
  ],
  "Page": 1,
  "PageSize": 50
}
GET
/invoiceTransactions/:invoiceID
Paginated

Returns line item transactions for a single invoice by ID.

Parameters
Name Type Required Description
invoiceID
path
number required
The ID of the invoice to fetch transactions for.

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "InvoiceTransID": 20001,
      "InvoiceID": 9001,
      "CustomerID": 1,
      "ProductID": 171,
      "ProductName": "Terra Bites Milk Chocolate Blueberries",
      "Cases": "1.00",
      "NumUnits": 20,
      "Ordered": 20,
      "BackOrder": 0,
      "FullPrice": "11.000000",
      "Discount": "2.250000",
      "UnitPrice": "8.750000",
      "ExtPrice": "175.000000",
      "TimeUpdated": "2024-09-23T19:05:39.984Z",
      "SupplierID": 5,
      "PromotionID": 5571,
      "BatchCode": "BATCH-2025-01",
      "COA_URL": "https://cdn.example.com/coa/batch-2025-001.pdf"
    },
    {
      "InvoiceTransID": 20002,
      "InvoiceID": 9001,
      "ProductID": 736,
      "ProductName": "Camino Gummies Wild Cherry",
      "Cases": "1.00",
      "NumUnits": 20,
      "Ordered": 20,
      "BackOrder": 0,
      "FullPrice": "11.000000",
      "Discount": "0.000000",
      "UnitPrice": "11.000000",
      "ExtPrice": "220.000000",
      "TimeUpdated": "2024-09-23T19:05:39.984Z",
      "SupplierID": 5,
      "PromotionID": null,
      "BatchCode": "BATCH-2025-002",
      "COA_URL": null
    }
  ],
  "Page": 1,
  "PageSize": 50
}
GET
/invoiceCOAs
Paginated

Returns certificate of analysis records for the specified invoices. InvoiceIDs is required.

Parameters
Name Type Required Description
InvoiceIDs
query
number[] required
Comma-separated list of invoice IDs to fetch COAs for. Returns 400 if not provided.

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "InvoiceID": 9001,
      "ProductID": 160,
      "InvoiceTransID": 20001,
      "BatchCode": "BATCH-2025-001",
      "COA_URL": "https://cdn.example.com/coa/batch-2025-001.pdf",
      "TimeUpdated": "2025-01-10T14:00:00.000Z"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
GET
/invoiceCOAs/:invoiceID
Paginated

Returns certificate of analysis records for a single invoice by ID.

Parameters
Name Type Required Description
invoiceID
path
number required
The ID of the invoice to fetch COAs for.

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "InvoiceID": 9001,
      "ProductID": 160,
      "InvoiceTransID": 20001,
      "BatchCode": "BATCH-2025-001",
      "COA_URL": "https://cdn.example.com/coa/batch-2025-001.pdf",
      "TimeUpdated": "2025-01-10T14:00:00.000Z"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
Locations
GET
/locations
Paginated

Returns warehouse and distribution locations filtered by state and location ID.

Parameters
Name Type Required Description
LocationIDs
query
number[] optional
Comma-separated list of location IDs to filter by.
States
query
string[] optional
Comma-separated list of state abbreviations to filter by. Example: "CA,NJ".

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "LocationID": 1,
      "Location": "Alameda",
      "DBA": "Kiva Sales & Service",
      "Address": "2300 N Loop Rd",
      "Address2": null,
      "Address3": "N/A",
      "City": "Alameda",
      "State": "CA",
      "PostalCode": "94502",
      "TimeUpdated": "2024-09-23T19:05:39.984Z"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
GET
/locations/:locationID

Returns a single location by ID.

Parameters
Name Type Required Description
locationID
path
number required
The ID of the location to retrieve.
Example Response
json
{
  "Data": [
    {
      "LocationID": 1,
      "Location": "Alameda",
      "DBA": "Kiva Sales & Service",
      "Address": "2300 N Loop Rd",
      "Address2": null,
      "Address3": "N/A",
      "City": "Alameda",
      "State": "CA",
      "PostalCode": "94502",
      "TimeUpdated": "2024-09-23T19:05:39.984Z"
    }
  ]
}
Promotions
GET
/menuPromotions
Paginated

Returns menu promotions filtered by supplier, state, and active date range.

Parameters
Name Type Required Description
SupplierIDs
query
number[] optional
Comma-separated list of supplier IDs to filter by.
States
query
string[] optional
Comma-separated list of state abbreviations to filter by. Example: "CA,NJ".
StartDate
query
date optional
ISO 8601 date string. Returns promotions whose end date is on or after this value.
EndDate
query
date optional
ISO 8601 date string. Returns promotions whose start date is on or before this value.

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "MenuPromotionID": 7001,
      "SupplierID": 1,
      "SupplierName": "Kiva",
      "State": "CA",
      "Description": "Featured products for spring menus.",
      "StartDate": "2025-03-01",
      "EndDate": "2025-05-31",
      "TimeUpdated": "2025-02-15T10:00:00.000Z"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
GET
/promotionsProducts
Paginated

Returns promotion records with their associated products filtered by supplier and state.

Parameters
Name Type Required Description
SupplierIDs
query
number[] optional
Comma-separated list of supplier IDs to filter by.
States
query
string[] optional
Comma-separated list of state abbreviations to filter by. Example: "CA,NJ".

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "PromotionID": 42,
      "PromotionTypeID": 4,
      "States": [
        "CA"
      ],
      "PromotionName": "Spring Chocolate Deal",
      "ProductOverrideType": "none",
      "UnitPrice": 15.5,
      "StartDate": "2025-01-01",
      "EndDate": "2025-03-31",
      "AllProducts": false,
      "ProductIDs": [
        160,
        161,
        162
      ],
      "TimeUpdated": "2024-12-20T10:00:00.000Z"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
Products
GET
/productCategories
Paginated

Returns all product categories ordered by sequence.

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "ProductCategoryID": 1,
      "CategoryName": "Chocolate",
      "Sequence": 1,
      "TimeUpdated": "2025-01-01T00:00:00.000Z"
    },
    {
      "ProductCategoryID": 2,
      "CategoryName": "Gummies",
      "Sequence": 2,
      "TimeUpdated": "2025-01-01T00:00:00.000Z"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
GET
/products
Paginated

Returns products filtered by supplier, state, product ID, and status.

Parameters
Name Type Required Description
SupplierIDs
query
number[] optional
Comma-separated list of supplier IDs to filter by.
ProductIDs
query
number[] optional
Comma-separated list of product IDs to filter by. When provided, status filtering is skipped.
States
query
string[] optional
Comma-separated list of state abbreviations to filter by. Example: "CA,NJ".
Statuses
query
number[] optional
Comma-separated list of product status IDs. Defaults to Active (1). Ignored when ProductIDs is provided.
0 Discontinued 1 Active 2 Pre-order 3 Manufacture 4 Unavailable 5 Close Out

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "ProductID": 160,
      "Supplier": "Kiva",
      "SupplierID": 5,
      "ProductName": "Bar Dark Chocolate",
      "BrandFamily": "Kiva Bars",
      "ProductTypeName": "Edible - Chocolate",
      "UnitNetWeight": "50g",
      "WholesaleUnitsPerCase": 20,
      "Description": "Our classic Dark Chocolate bar is uniquely complex with flavors of black coffee and dark cherry. Using a 57% sustainably sourced dark chocolate infused with pure, clean cold water hash, this bar is sure to delight any true chocolate lover.Kiva chocolates are crafted from sustainably sourced, premium cacao infused with pure, hand-crafted cold water hash. Since 2010, Kiva's mission has been to change how the world views and uses cannabis. By applying art and science to ensure a delicious, consistent experience every time, we continue to deliver on that mission today.",
      "Ingredients": "Semisweet Chocolate (Unsweetened Chocolate, Sugar, Cocoa Butter, Sunflower Lecithin, Vanilla), Cannabis Extract.",
      "ThumbnailImageURL": "https://cdn.e8.co/Kiva/S3Images/256a66c67e050f86201a863c2103a71d.png",
      "FullSizeImageURL": "https://cdn.e8.co/Kiva/S3Images/67d10e54dd3c94a702b78a722bdd1aa8.png",
      "Potency": "100mg THC",
      "PotencyTHC": null,
      "Blend": "Hybrid",
      "KSSMenuCategory": "Edibles/Ingestibles",
      "KSSLiveCategoryID": 1,
      "StatusID": 1,
      "TimeUpdated": "2026-02-12T19:51:57.510Z",
      "State": "CA",
      "IsSample": false,
      "ProductGroupID": 3,
      "BrandStyle": "Kiva Bar",
      "PackageID": 15,
      "PackageName": "20 Kiva Bar",
      "ProductTypeID": 57,
      "StrainName": null,
      "StrainID": null,
      "Flavor": "dark",
      "BrandID": 2624,
      "BrandName": "Kiva Bars Base"
    },
    {
      "ProductID": 161,
      "Supplier": "Kiva",
      "SupplierID": 5,
      "ProductName": "Bar Milk Chocolate",
      "BrandFamily": "Kiva Bars",
      "ProductTypeName": "Edible - Chocolate",
      "UnitNetWeight": "50g",
      "WholesaleUnitsPerCase": 20,
      "Description": "Meticulously crafted from the purest ingredients, Kiva's classic milk chocolate bar has hints of brown butter and a silky, creamy finish. Like all Kiva chocolates, this bar is crafted from sustainably sourced, premium cacao infused with handmade, cold water cannabis hash. Ideal for those with a love for chocolate and a refined palate.Kiva chocolates are crafted from sustainably sourced, premium cacao infused with pure, hand-crafted cold water hash. Since 2010, Kiva's mission has been to change how the world views and uses cannabis. By applying art and science to ensure a delicious, consistent experience every time, we continue to deliver on that mission today.",
      "Ingredients": "Milk Chocolate (Sugar, Cocoa Butter, Milk, Unsweetened Chocolate, Sunflower Lecithin, Vanilla), Cannabis Extract.",
      "ThumbnailImageURL": "https://cdn.e8.co/Kiva/S3Images/79ad65dc9c579f53b2de75ea8b183194.png",
      "FullSizeImageURL": "https://cdn.e8.co/Kiva/S3Images/9ab227940b12546b120ed1a5386f759c.png",
      "Potency": "100mg THC",
      "PotencyTHC": null,
      "Blend": "Hybrid",
      "KSSMenuCategory": "Edibles/Ingestibles",
      "KSSLiveCategoryID": 1,
      "StatusID": 1,
      "TimeUpdated": "2026-02-12T19:51:57.510Z",
      "State": "CA",
      "IsSample": false,
      "ProductGroupID": 3,
      "BrandStyle": "Kiva Bar",
      "PackageID": 15,
      "PackageName": "20 Kiva Bar",
      "ProductTypeID": 57,
      "StrainName": null,
      "StrainID": null,
      "Flavor": "milk",
      "BrandID": 2624,
      "BrandName": "Kiva Bars Base"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
GET
/products/:productID

Returns a single product by ID.

Parameters
Name Type Required Description
productID
path
number required
The ID of the product to retrieve.
Example Response
json
{
  "Data": [
    {
      "ProductID": 160,
      "Supplier": "Kiva",
      "SupplierID": 5,
      "ProductName": "Bar Dark Chocolate",
      "BrandFamily": "Kiva Bars",
      "ProductTypeName": "Edible - Chocolate",
      "UnitNetWeight": "50g",
      "WholesaleUnitsPerCase": 20,
      "Description": "Our classic Dark Chocolate bar is uniquely complex with flavors of black coffee and dark cherry. Using a 57% sustainably sourced dark chocolate infused with pure, clean cold water hash, this bar is sure to delight any true chocolate lover.Kiva chocolates are crafted from sustainably sourced, premium cacao infused with pure, hand-crafted cold water hash. Since 2010, Kiva's mission has been to change how the world views and uses cannabis. By applying art and science to ensure a delicious, consistent experience every time, we continue to deliver on that mission today.",
      "Ingredients": "Semisweet Chocolate (Unsweetened Chocolate, Sugar, Cocoa Butter, Sunflower Lecithin, Vanilla), Cannabis Extract.",
      "ThumbnailImageURL": "https://cdn.e8.co/Kiva/S3Images/256a66c67e050f86201a863c2103a71d.png",
      "FullSizeImageURL": "https://cdn.e8.co/Kiva/S3Images/67d10e54dd3c94a702b78a722bdd1aa8.png",
      "Potency": "100mg THC",
      "PotencyTHC": null,
      "Blend": "Hybrid",
      "KSSMenuCategory": "Edibles/Ingestibles",
      "KSSLiveCategoryID": 1,
      "StatusID": 1,
      "TimeUpdated": "2026-02-12T19:51:57.510Z",
      "State": "CA",
      "IsSample": false,
      "ProductGroupID": 3,
      "BrandStyle": "Kiva Bar",
      "PackageID": 15,
      "PackageName": "20 Kiva Bar",
      "ProductTypeID": 57,
      "StrainName": null,
      "StrainID": null,
      "Flavor": "dark",
      "BrandID": 2624,
      "BrandName": "Kiva Bars Base"
    }
  ]
}
States
GET
/states
Paginated

Returns the active states available to your API key.

Parameters
Name Type Required Description
States
query
string[] optional
Comma-separated list of state abbreviations to filter by. Example: "CA,NJ".

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "StateAbbreviation": "CA",
      "StateName": "California",
      "OrderCutOffTime": "2:30 PM",
      "TimeZone": "America/Los_Angeles",
      "OrderCutOffDaysInAdvance": "1",
      "TimeUpdated": "2025-12-30T18:28:17.710Z"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
Suppliers
GET
/suppliers
Paginated

Returns suppliers filtered by state, supplier ID, and status.

Parameters
Name Type Required Description
SupplierIDs
query
number[] optional
Comma-separated list of supplier IDs to filter by.
States
query
string[] optional
Comma-separated list of state abbreviations to filter by. Example: "CA,NJ".
Active
query
boolean[] optional
True or False flag for supplier status. Defaults to Active only for Customer and Supplier keys

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "SupplierID": 1,
      "Supplier": "Kiva",
      "State": "CA",
      "Active": true,
      "Description": "Premium cannabis edibles and infused products.",
      "BrandAssetsURL": "https://cdn.example.com/kiva/brand-assets.zip",
      "SupplierWebsiteURL": "https://www.kivaconfections.com",
      "TimeUpdated": "2025-01-01T00:00:00.000Z"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
GET
/suppliers/:supplierID

Returns a single supplier by ID.

Parameters
Name Type Required Description
supplierID
path
number required
The ID of the supplier to retrieve.
Example Response
json
{
  "Data": [
    {
      "SupplierID": 1,
      "Supplier": "Kiva",
      "State": "CA",
      "Active": true,
      "Description": "Premium cannabis edibles and infused products.",
      "BrandAssetsURL": "https://cdn.example.com/kiva/brand-assets.zip",
      "SupplierWebsiteURL": "https://www.kivaconfections.com",
      "TimeUpdated": "2025-01-01T00:00:00.000Z"
    }
  ]
}
Users
GET
/users
Paginated

Returns users filtered by state, role, customer ID, and supplier ID. Supplier API keys return their own Supplier users and active Customer users. Customer API keys only return their own Customer users.

Parameters
Name Type Required Description
UserIDs
query
number[] optional
Comma-separated list of user IDs to filter by.
States
query
string[] optional
Comma-separated list of state abbreviations to filter by. Example: "CA,NJ".
CustomerIDs
query
number[] optional
Comma-separated list of customer IDs to filter by.
SupplierIDs
query
number[] optional
Comma-separated list of supplier IDs to filter by.
Roles
query
string[] optional
Comma-separated list of roles to filter by.
Customer Customer Supplier Supplier Admin Admin DistributorRep Distributor Rep
States
query
string[] optional
Comma-separated list of state abbreviations to filter by. Example: "CA,NJ".
Active
query
boolean[] optional
True or False flag for user status. Defaults to Active = true only for Customer and Supplier keys

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "UserID": 501,
      "SiteUserID": 1001,
      "UserActive": true,
      "KSSLiveAccess": true,
      "Email": "buyer@example.com",
      "States": [
        "CA"
      ],
      "Role": "Customer",
      "CustomerIDs": [
        1
      ],
      "SupplierIDs": null,
      "LocationIDs": [
        3
      ],
      "PowerUser": false
    }
  ],
  "Page": 1,
  "PageSize": 50
}
GET
/users/:userID

Returns a single user by ID.

Parameters
Name Type Required Description
userID
path
number required
The ID of the user to retrieve.
Example Response
json
{
  "Data": [
    {
      "UserID": 501,
      "SiteUserID": 1001,
      "UserActive": true,
      "KSSLiveAccess": true,
      "Email": "buyer@example.com",
      "States": [
        "CA"
      ],
      "Role": "Customer",
      "CustomerIDs": [
        1
      ],
      "SupplierIDs": null,
      "LocationIDs": [
        3
      ],
      "PowerUser": false
    }
  ]
}
Payments
GET
/payments
Not available to Supplier keys Paginated

Returns payments for an AR account, including payment type and available balance (total minus confirmed applications and pending requests).

Parameters
Name Type Required Description
ARAccountIDs
query
number[] optional
Comma-separated list of AR account IDs to filter by. Customer keys are automatically scoped to their authorized accounts.
PaymentTypeIDs
query
number[] optional
Comma-separated list of payment type IDs to filter by.

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "PaymentID": 1,
      "PaymentInvoiceID": 90001,
      "PaymentInvoiceNum": "INV-PAY-0001",
      "ARAccountID": 123,
      "PaymentTypeID": 3,
      "PaymentTypeName": "ACH",
      "Amount": "5000.00",
      "SupplierID": null,
      "LoadSheetStatusID": 7,
      "PostDate": "2025-03-01T00:00:00.000Z",
      "TimeCreated": "2025-03-01T08:00:00.000Z",
      "TimeUpdated": "2025-03-01T08:00:00.000Z",
      "AvailableBalance": "3500.00"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
GET
/payments/openInvoices
Not available to Supplier keys Paginated

Returns invoices with a non-zero open balance for an AR account. Used to identify invoices eligible for payment allocation.

Parameters
Name Type Required Description
ARAccountIDs
query
number[] optional
Comma-separated list of AR account IDs to filter by. Customer keys are automatically scoped to their authorized accounts.

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "InvoiceID": 8001,
      "InvoiceNum": "INV-2025-0042",
      "CustomerID": 1,
      "ARAccountID": 123,
      "InvoiceTotal": "1200.00",
      "OpenDebit": "1200.00",
      "OpenCredit": "0.00",
      "OpenBalance": "1200.00",
      "CreditTermID": 5,
      "TermID": 5,
      "DueDate": "2025-04-01T00:00:00.000Z",
      "Date": "2025-03-01T00:00:00.000Z",
      "PONum": "PO-2025-001"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
GET
/payments/applications
Not available to Supplier keys Paginated

Returns confirmed payment applications (allocations already applied in Encompass).

Parameters
Name Type Required Description
ARAccountIDs
query
number[] optional
Comma-separated list of AR account IDs to filter by.
PaymentInvoiceNums
query
string[] optional
Comma-separated list of payment invoice numbers to filter by.
TargetInvoiceNums
query
string[] optional
Comma-separated list of target invoice numbers to filter by.

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "PaymentApplicationID": 5001,
      "PaymentInvoiceID": 90001,
      "PaymentInvoiceNum": "INV-PAY-0001",
      "TargetInvoiceID": 8001,
      "TargetInvoiceNum": "INV-2025-0042",
      "ARAccountID": 123,
      "Amount": "1200.00",
      "AppliedBy": "jsmith",
      "TimeApplied": "2025-03-10T14:00:00.000Z",
      "TimeCreated": "2025-03-10T14:00:00.000Z",
      "TimeUpdated": "2025-03-10T14:00:00.000Z"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
GET
/payments/applications/requested
Not available to Supplier keys Paginated

Returns customer-initiated payment allocation requests and their current status.

Parameters
Name Type Required Description
ARAccountIDs
query
number[] optional
Comma-separated list of AR account IDs to filter by.
Statuses
query
string[] optional
Comma-separated list of statuses to filter by.
Pending Pending — queued for export to Encompass Exported Exported — sent to Encompass, awaiting confirmation Confirmed Confirmed — matched to a PaymentApplication Rejected Rejected — not confirmed within the timeout window

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "RequestID": 1,
      "PaymentInvoiceNum": "INV-PAY-0001",
      "TargetInvoiceNum": "INV-2025-0042",
      "ARAccountID": 123,
      "Amount": "1200.00",
      "Status": "Confirmed",
      "RequestedByUserID": 501,
      "TimeRequested": "2025-03-08T09:00:00.000Z",
      "TimeExported": "2025-03-08T09:05:00.000Z",
      "TimeConfirmed": "2025-03-10T14:00:00.000Z",
      "MatchedPaymentApplicationID": 5001,
      "TimeUpdated": "2025-03-10T14:00:00.000Z"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
POST
/payments/applications/requested
Not available to Supplier keys

Creates a payment allocation request. Validates the payment has sufficient available balance and the target invoice belongs to the same AR account. The request is queued as Pending and exported to Encompass on the next export run.

Parameters
Name Type Required Description
PaymentInvoiceNum
query
string required
The invoice number of the payment to allocate from.
TargetInvoiceNum
query
string required
The invoice number to allocate the payment toward.
ARAccountID
query
number required
The AR account ID both invoices belong to.
Amount
query
number required
The dollar amount to allocate. Must be positive and not exceed the available balance.
Example Response
json
{
  "Data": {
    "RequestID": 2,
    "PaymentInvoiceNum": "INV-PAY-0001",
    "TargetInvoiceNum": "INV-2025-0042",
    "ARAccountID": 123,
    "Amount": "500.00",
    "Status": "Pending",
    "RequestedByUserID": 501,
    "TimeRequested": "2025-03-19T10:00:00.000Z",
    "TimeExported": null,
    "TimeConfirmed": null,
    "MatchedPaymentApplicationID": null,
    "TimeUpdated": "2025-03-19T10:00:00.000Z"
  }
}
Purchases
GET
/purchases
Not available to Customer keys Paginated

Returns purchase orders filtered by purchase ID, vendor, location, status, and date range. Not accessible to Customer API keys.

Parameters
Name Type Required Description
PurchaseIDs
query
number[] optional
Comma-separated list of purchase IDs to filter by.
VendorIDs
query
number[] optional
Comma-separated list of vendor IDs to filter by.
LocationIDs
query
number[] optional
Comma-separated list of destination location IDs to filter by.
Statuses
query
string[] optional
Comma-separated list of purchase statuses to filter by. Defaults to all statuses.
New New Accepted Accepted Received Received Confirmed Confirmed Verified Verified
StartDate
query
date optional
ISO 8601 date string. Returns purchases with a PostDate on or after this date.
EndDate
query
date optional
ISO 8601 date string. Returns purchases with a PostDate on or before this date.

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "PurchaseID": 10001,
      "ReceiveDate": "2025-03-01T00:00:00.000Z",
      "ShipmentNum": "SHP-2025-001",
      "ShipmentID": 5001,
      "ToLocationID": 3,
      "ToLocationName": "Main Warehouse",
      "VendorName": "Acme Distributing",
      "VendorID": 42,
      "PostDate": "2025-03-01T00:00:00.000Z",
      "Status": "Received",
      "PONum": "PO-2025-0123",
      "Freight": "150.00",
      "Tax": "0.00",
      "OtherCost": "0.00",
      "Total": "4500.00",
      "TotalCases": "30",
      "PublicPDFLink": null,
      "Memo": null,
      "InvoiceDate": "2025-03-01T00:00:00.000Z",
      "DueDate": "2025-04-01T00:00:00.000Z",
      "Terms": "Net 30",
      "TermID": 5,
      "LastEditTime": "2025-03-02T10:00:00.000Z",
      "LastCalcTime": "2025-03-02T10:00:00.000Z",
      "TimeUpdated": "2025-03-02T10:00:00.000Z"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
GET
/purchases/:purchaseID
Not available to Customer keys

Returns a single purchase order by ID.

Parameters
Name Type Required Description
purchaseID
path
number required
The ID of the purchase to retrieve.
Example Response
json
{
  "Data": [
    {
      "PurchaseID": 10001,
      "ReceiveDate": "2025-03-01T00:00:00.000Z",
      "ShipmentNum": "SHP-2025-001",
      "ShipmentID": 5001,
      "ToLocationID": 3,
      "ToLocationName": "Main Warehouse",
      "VendorName": "Acme Distributing",
      "VendorID": 42,
      "PostDate": "2025-03-01T00:00:00.000Z",
      "Status": "Received",
      "PONum": "PO-2025-0123",
      "Freight": "150.00",
      "Tax": "0.00",
      "OtherCost": "0.00",
      "Total": "4500.00",
      "TotalCases": "30",
      "PublicPDFLink": null,
      "Memo": null,
      "InvoiceDate": "2025-03-01T00:00:00.000Z",
      "DueDate": "2025-04-01T00:00:00.000Z",
      "Terms": "Net 30",
      "TermID": 5,
      "LastEditTime": "2025-03-02T10:00:00.000Z",
      "LastCalcTime": "2025-03-02T10:00:00.000Z",
      "TimeUpdated": "2025-03-02T10:00:00.000Z"
    }
  ]
}
Purchase Transactions
GET
/purchaseTrans
Not available to Customer keys Paginated

Returns purchase order line items for one or more purchases. PurchaseIDs is required. Not accessible to Customer API keys.

Parameters
Name Type Required Description
PurchaseIDs
query
number[] required
Comma-separated list of purchase IDs to retrieve line items for.

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "PurchaseTransID": 99001,
      "PurchaseID": 10001,
      "ProductID": 5001,
      "Ordered": "10",
      "NumUnits": "120",
      "FOB": "12.50",
      "DepositCost": "0.00",
      "ExtPrice": "1500.00",
      "ExpirationDate": "2026-01-01T00:00:00.000Z",
      "CodeDate": "2025-01-15T00:00:00.000Z",
      "BatchCode": "BCH-001",
      "LaidInCost": "13.00",
      "PalletTag": null,
      "Cases": "10",
      "Weight": "120.00",
      "TimeUpdated": "2025-03-02T10:00:00.000Z"
    }
  ],
  "Page": 1,
  "PageSize": 50
}
Sales Reps
GET
/salesReps
Paginated

Returns sales reps grouped by user, including both Territory Managers and Supplier Reps. Each result includes the rep's name, email, type, and arrays of associated customers and suppliers. Only returns active users, active customers, and active suppliers. Supplier API keys see TMs and Supplier Reps scoped to their authorized suppliers. Customer API keys only see reps assigned to their own customers.

Parameters
Name Type Required Description
SupplierIDs
query
number[] optional
Comma-separated list of supplier IDs to filter by. Supplier keys are automatically scoped to their authorized suppliers.
CustomerIDs
query
number[] optional
Comma-separated list of customer IDs to filter by. Customer keys are automatically scoped to their authorized customers.

Supports Page and PageSize query parameters. Default page size: 50.

Example Response
json
{
  "Data": [
    {
      "UserID": 42,
      "Name": "Jane Smith",
      "Email": "jane.smith@example.com",
      "Type": "Territory Manager",
      "Suppliers": [
        {
          "SupplierID": 10,
          "Supplier": "Kiva Confections"
        }
      ],
      "Customers": [
        {
          "CustomerID": 100,
          "CustomerName": "Acme Dispensary"
        },
        {
          "CustomerID": 101,
          "CustomerName": "Green Leaf Co"
        }
      ]
    },
    {
      "UserID": 501,
      "Name": "Bob Jones",
      "Email": "bob.jones@supplier.com",
      "Type": "Supplier Rep",
      "Suppliers": [
        {
          "SupplierID": 10,
          "Supplier": "Kiva Confections"
        },
        {
          "SupplierID": 11,
          "Supplier": "Kiva Brand 2"
        }
      ],
      "Customers": [
        {
          "CustomerID": 100,
          "CustomerName": "Acme Dispensary"
        }
      ]
    }
  ],
  "Page": 1,
  "PageSize": 50
}