Operations
73 BUSY operations in 16 families; none changes your books. Each family below says what it covers, followed by the reference for each of its operations.
Conventions every operation shares
POST only, paging, register totals, several years, NDJSON, writes
- Every operation listed here is a POST, never changes your books, and requires
companyCodeand a four-digitfinancialYear. - Twenty-four writes (create and change accounts, products and contacts with their optional fields, add product and account dropdown values, create and change account and item groups, create sales orders, sales invoices, receipts, sales returns, purchases, purchase returns, payments, purchase orders, stock transfers and material issues and receipts in BUSY, and start a customer integration, through the Cloud Relay) use the same token, require an
Idempotency-Key, and are described in the canonical operation reference; a write whose answer is lost is504 WRITE_RESULT_UNKNOWN, never a success. - Paged operations take
page(from 1, default 1) andpageSize(usually 1–500, default 100); a few have their own bounds, stated in their reference. - Register summaries and totals cover the whole range, not only the page.
- Three operations read several years through
additionalFinancialYear; one refused year refuses the whole request. - The credit-line stage stream answers NDJSON: one complete envelope per line, ending with a
doneline.
73 operationsGrouped by family, in reference order
Masters
10Units, branches, categories, product groups, material centres, sale types, salesmen, voucher series, item parameters and optional-field definitions.
POST
Units of measure
/v1/busy/units/queryPagedPagedPOST
https://api.aizeny.com/v1/busy/units/queryPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- search none; page 1; pageSize 100
- Paging
- page 1–10000 (default 1), pageSize 1–200 (default 100); at most 1000 units per year
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), and optionally search (string), page and pageSize (numbers).
Units of measure: request members Member Type Required Notes companyCode string Required — financialYear string Required — search string — — page integer — a numeric string is also read pageSize integer — a numeric string is also read script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { unitId, name, alias, printName }
metadata: apiVersion, operation, requestId, elapsedMs, filters { companyCode, financialYear, search }, pagination { page, pageSize, returned, totalRows, hasMore, nextPage }
Notes
search (≤ 100 characters, trimmed) matches the unit id exactly or part of the name, alias or print name.
Request
curl -X POST \ https://api.aizeny.com/v1/busy/units/query \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","search":"kg","page":1,"pageSize":100}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Branches
/v1/branchesPOST
https://api.aizeny.com/v1/branchesNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated
Request body
companyCode (string) and financialYear (four-digit string).
Branches: request members Member Type Required Notes companyCode string Required — financialYear string Required — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { branch_id, branch_name }
metadata: apiVersion, operation, requestId, companyCode, financialYear, rowCount, elapsedMs, executedAt
Notes
Every row, no paging. Ordered by name (binary), then code.
Request
curl -X POST \ https://api.aizeny.com/v1/branches \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Categories
/v1/categoriesPOST
https://api.aizeny.com/v1/categoriesNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated
Request body
companyCode (string) and financialYear (four-digit string).
Categories: request members Member Type Required Notes companyCode string Required — financialYear string Required — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { category_id, category_name }
metadata: apiVersion, operation, requestId, companyCode, financialYear, rowCount, elapsedMs, executedAt
Notes
Every row, no paging. Ordered by name (binary), then code.
Request
curl -X POST \ https://api.aizeny.com/v1/categories \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Product groups
/v1/product-groupsPOST
https://api.aizeny.com/v1/product-groupsNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated
Request body
companyCode (string) and financialYear (four-digit string).
Product groups: request members Member Type Required Notes companyCode string Required — financialYear string Required — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { product_group_id, product_group_name }
metadata: apiVersion, operation, requestId, companyCode, financialYear, rowCount, elapsedMs, executedAt
Notes
Every row, no paging. Ordered by name (binary), then code.
Request
curl -X POST \ https://api.aizeny.com/v1/product-groups \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Material centres
/v1/material-centersPOST
https://api.aizeny.com/v1/material-centersNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated
Request body
companyCode (string) and financialYear (four-digit string).
Material centres: request members Member Type Required Notes companyCode string Required — financialYear string Required — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { mc_id, mc_name, mc_alias, mc_print_name }
metadata: apiVersion, operation, requestId, companyCode, financialYear, rowCount, elapsedMs, executedAt
Notes
Every row, no paging. Ordered by name (binary), then code.
Request
curl -X POST \ https://api.aizeny.com/v1/material-centers \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Sale types
/v1/sale-typesPOST
https://api.aizeny.com/v1/sale-typesNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated
Request body
companyCode (string) and financialYear (four-digit string).
Sale types: request members Member Type Required Notes companyCode string Required — financialYear string Required — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { sale_type_id, sale_type_name, sale_type_alias, sale_type_print_name }
metadata: apiVersion, operation, requestId, companyCode, financialYear, rowCount, elapsedMs, executedAt
Notes
Every row, no paging. Ordered by name (binary), then code.
Request
curl -X POST \ https://api.aizeny.com/v1/sale-types \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Salesmen
/v1/salesmenPOST
https://api.aizeny.com/v1/salesmenNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated
Request body
companyCode (string) and financialYear (four-digit string).
Salesmen: request members Member Type Required Notes companyCode string Required — financialYear string Required — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { salesman_id, salesman_name, salesman_alias, mobile_number, whatsapp_number, email }
metadata: apiVersion, operation, requestId, companyCode, financialYear, rowCount, elapsedMs, executedAt
Notes
Every row, no paging. Ordered by name (binary), then code.
Request
curl -X POST \ https://api.aizeny.com/v1/salesmen \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Voucher series
/v1/voucher-seriesPOST
https://api.aizeny.com/v1/voucher-seriesNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated
Request body
companyCode (string) and financialYear (four-digit string).
Voucher series: request members Member Type Required Notes companyCode string Required — financialYear string Required — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { voucher_series_id, voucher_series_name }
metadata: apiVersion, operation, requestId, companyCode, financialYear, rowCount, elapsedMs, executedAt
Notes
Every row, no paging. Ordered by name (binary), then code.
Request
curl -X POST \ https://api.aizeny.com/v1/voucher-series \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Item parameters
/v1/parametersPOST
https://api.aizeny.com/v1/parametersNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated
Request body
companyCode (string) and financialYear (four-digit string).
Item parameters: request members Member Type Required Notes companyCode string Required — financialYear string Required — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { id, name } (id = position in binary name order)
metadata: apiVersion, operation, requestId, companyCode, financialYear, rowCount, elapsedMs, executedAt
Notes
Every row, no paging. Ordered by name (binary), then code.
Request
curl -X POST \ https://api.aizeny.com/v1/parameters \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Optional-field definitions
/v1/optional-field-definitionsPOST
https://api.aizeny.com/v1/optional-field-definitionsNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — a few KiB
Request body
companyCode, financialYear.
Optional-field definitions: request members Member Type Required Notes companyCode string Required — financialYear string Required — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { accounts: [field], products: [field] } in slot order; field = { slot ("OF1"-"OF10", the key the master writes use), name, kind ("text" \| "dropdown" \| "number" \| "date" \| "yesNo" \| "other"), busyType, busySubDetail, decimalPlaces (or null), writable, notWritableReason (when not writable), values ([{ code, name }], dropdowns only) }
metadata: apiVersion, operation, requestId, companyCode, financialYear, accountFieldCount, productFieldCount, elapsedMs
Notes
The account and item (product) optional fields BUSY has defined for the company and financial year; definitions are BUSY settings of each year, so read them for the year you write. writable says whether the account and product writes accept a value for the field (accounts and products alike: text, dropdown, whole number, date and Yes/No, on Access companies and on SQL Server companies with a SQL login), notWritableReason says why not. A dropdown lists its existing values; a master write never creates one (POST /product-optional-field-value-create adds an item dropdown value, POST /account-optional-field-value-create an account dropdown value). Fields are never created through the API. Read only. Needs an AI Zeny version on the PC that offers optional fields; an earlier one answers 502 DEVICE_ERROR.
Request
curl -X POST \ https://api.aizeny.com/v1/optional-field-definitions \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
Products
4The product list, one page of products, product search and configured optional product fields.
POST
Products
/v1/productsPOST
https://api.aizeny.com/v1/productsNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- every switch false; materialCenterIds all centres; priceCategory none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — use /products-pagination (paged) or /products-search
Request body
companyCode (string), financialYear (four-digit string), and optionally materialCenterIds (array of numbers), includePendingSalesOrder, inStockOnly, parametersStock, optionalFields, erpCategories (booleans) and priceCategory (number).
Products: request members Member Type Required Notes companyCode string Required — financialYear string Required — materialCenterIds array of integers — — includePendingSalesOrder boolean — — inStockOnly boolean — — parametersStock boolean — — optionalFields boolean — — erpCategories boolean — — priceCategory integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of product rows (product_id, product_name, product_alias, product_print_name, prices, group, units, material centre, tax, stock, discounts, description lines, product_alias_1…15, audit fields; parameters / optional_fields / erp_categories only when their switch is true)
metadata: apiVersion, operation, requestId, companyCode, financialYear, rowCount, elapsedMs, executedAt, filters { materialCenterIds, includePendingSalesOrder, inStockOnly, parametersStock, optionalFields, erpCategories, priceCategory, priceCategoryLabel }
Notes
Every product, no paging: a large catalogue can exceed the relay size limit; use /products-pagination.
Request
curl -X POST \ https://api.aizeny.com/v1/products \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","inStockOnly":true}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Products, one page
/v1/products-paginationPagedPagedPOST
https://api.aizeny.com/v1/products-paginationPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- every switch false; materialCenterIds all centres; priceCategory none (page and pageSize have no default)
- Paging
- page and pageSize required, each ≥ 1, no maximum
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
the product members (companyCode (string), financialYear (four-digit string), and optionally materialCenterIds (array of numbers), includePendingSalesOrder, inStockOnly, parametersStock, optionalFields, erpCategories (booleans) and priceCategory (number).) and page and pageSize (numbers).
Products, one page: request members Member Type Required Notes companyCode string Required — financialYear string Required — materialCenterIds array of integers — — includePendingSalesOrder boolean — — inStockOnly boolean — — parametersStock boolean — — optionalFields boolean — — erpCategories boolean — — priceCategory integer — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of product rows (product_id, product_name, product_alias, product_print_name, prices, group, units, material centre, tax, stock, discounts, description lines, product_alias_1…15, audit fields; parameters / optional_fields / erp_categories only when their switch is true)
metadata: apiVersion, operation, requestId, companyCode, financialYear, rowCount, elapsedMs, executedAt, filters { materialCenterIds, includePendingSalesOrder, inStockOnly, parametersStock, optionalFields, erpCategories, priceCategory, priceCategoryLabel } plus page, pageSize, totalCount, totalPages, hasNextPage, hasPreviousPage
Request
curl -X POST \ https://api.aizeny.com/v1/products-pagination \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","page":1,"pageSize":100}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Product search
/v1/products-searchPOST
https://api.aizeny.com/v1/products-searchNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- every switch false; every search member none (none = every product)
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated
Request body
the product members (companyCode (string), financialYear (four-digit string), and optionally materialCenterIds (array of numbers), includePendingSalesOrder, inStockOnly, parametersStock, optionalFields, erpCategories (booleans) and priceCategory (number).) and optionally name, printName, alias, multipleAlias, groupName (strings) and groupId (number).
Product search: request members Member Type Required Notes companyCode string Required — financialYear string Required — materialCenterIds array of integers — — includePendingSalesOrder boolean — — inStockOnly boolean — — parametersStock boolean — — optionalFields boolean — — erpCategories boolean — — priceCategory integer — — name string — — printName string — — alias string — — multipleAlias string — — groupId integer — — groupName string — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of product rows (product_id, product_name, product_alias, product_print_name, prices, group, units, material centre, tax, stock, discounts, description lines, product_alias_1…15, audit fields; parameters / optional_fields / erp_categories only when their switch is true)
metadata: apiVersion, operation, requestId, companyCode, financialYear, rowCount, elapsedMs, executedAt, filters { materialCenterIds, includePendingSalesOrder, inStockOnly, parametersStock, optionalFields, erpCategories, priceCategory, priceCategoryLabel } plus filters.search { name, printName, alias, multipleAlias, groupId, groupName }
Notes
Text filters are trimmed, ANDed, and matched like SQLite LIKE (% and _ are wildcards, ASCII case folded).
Request
curl -X POST \ https://api.aizeny.com/v1/products-search \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","name":"bolt"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Configured optional product fields
/v1/products-of-configPOST
https://api.aizeny.com/v1/products-of-configNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated
Request body
companyCode (string) and financialYear (four-digit string).
Configured optional product fields: request members Member Type Required Notes companyCode string Required — financialYear string Required — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { field_no, of_column, field_name, field_type, decimal_places, maintain_master_database }
metadata: apiVersion, operation, requestId, companyCode, financialYear, rowCount, elapsedMs, executedAt
Request
curl -X POST \ https://api.aizeny.com/v1/products-of-config \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
Pricing and hierarchies
4Product and customer group hierarchies, price-category prices and latest date-wise prices.
POST
Product group hierarchy
/v1/product-groups-hierarchyPOST
https://api.aizeny.com/v1/product-groups-hierarchyNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- rootGroupId none (the whole hierarchy)
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — send rootGroupId for one subtree
Request body
companyCode (string), financialYear (four-digit string), and optionally rootGroupId (number).
Product group hierarchy: request members Member Type Required Notes companyCode string Required — financialYear string Required — rootGroupId integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { root_group_id, hierarchy: [ { group_id, group_name, parent_group_id, direct_product_count, children, descendant_group_ids, total_product_count } ] }
metadata: apiVersion, operation, requestId, companyCode, financialYear, groupCount, rootCount, rowCount, maxDepth, elapsedMs, executedAt
Errors
404 NOT_FOUND field rootGroupId; 422 BUSY_GROUP_HIERARCHY_INVALID (cycle, repeated code, more than 500 levels)
Request
curl -X POST \ https://api.aizeny.com/v1/product-groups-hierarchy \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Price-category prices
/v1/products-multiple-pricesPOST
https://api.aizeny.com/v1/products-multiple-pricesNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- priceCategories 1–10
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — request fewer priceCategories
Request body
companyCode (string), financialYear (four-digit string), and optionally priceCategories (array of numbers).
Price-category prices: request members Member Type Required Notes companyCode string Required — financialYear string Required — priceCategories array of integers — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { product_id, product_name, then per category a…z: {p}_product_sales_price, {p}_product_mrp, {p}_product_sales_discount }
metadata: apiVersion, operation, requestId, companyCode, financialYear, priceCategories, rowCount, elapsedMs, executedAt
Notes
priceCategories defaults to 1–10 (applied on the PC) and is answered in ascending order.
Request
curl -X POST \ https://api.aizeny.com/v1/products-multiple-prices \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","priceCategories":[1,2,3]}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Latest date-wise prices
/v1/products-multiple-prices-datewisePOST
https://api.aizeny.com/v1/products-multiple-prices-datewiseNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — no narrower form exists; use /execute-custom-sql with paging for very large catalogues
Request body
companyCode (string) and financialYear (four-digit string).
Latest date-wise prices: request members Member Type Required Notes companyCode string Required — financialYear string Required — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { product_id, product_name, latest_pricing_date, then per identifier a, b, …: {p}_price_identifier, {p}_product_sales_price, {p}_product_mrp, {p}_product_sales_discount }
metadata: apiVersion, operation, requestId, companyCode, financialYear, latestPricingDate, rowCount, elapsedMs, executedAt
Request
curl -X POST \ https://api.aizeny.com/v1/products-multiple-prices-datewise \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Customer group hierarchy
/v1/customer-groups-hierarchyPOST
https://api.aizeny.com/v1/customer-groups-hierarchyNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- rootGroupId none (the whole hierarchy)
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — send rootGroupId for one subtree
Request body
companyCode (string), financialYear (four-digit string), and optionally rootGroupId (number).
Customer group hierarchy: request members Member Type Required Notes companyCode string Required — financialYear string Required — rootGroupId integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { root_group_id, hierarchy: [ { group_id, group_name, parent_group_id, direct_customer_count, children, descendant_group_ids, total_customer_count } ] }
metadata: apiVersion, operation, requestId, companyCode, financialYear, groupCount, rootCount, rowCount, maxDepth, elapsedMs, executedAt
Request
curl -X POST \ https://api.aizeny.com/v1/customer-groups-hierarchy \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
Customers
4Customers, one customer, and whether a WhatsApp number or e-mail address belongs to a customer.
POST
Customers
/v1/customersPOST
https://api.aizeny.com/v1/customersNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- pendingSalesOrderOnly false
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — use /customer for one customer, or pendingSalesOrderOnly to narrow
Request body
companyCode (string), financialYear (four-digit string), and optionally pendingSalesOrderOnly (boolean).
Customers: request members Member Type Required Notes companyCode string Required — financialYear string Required — pendingSalesOrderOnly boolean — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { customer_id, customer_name, customer_alias, group_id, group_name, mobile_number, email_id, whatsapp_number, address_line_1…4, pin_code, country, state, gst_number, pan_number, station, opening_balance, balance, closing_balance, salesman_id, salesman_name, salesman_mobile_number, salesman_whatsapp_number, price_category }
metadata: apiVersion, operation, requestId, companyCode, financialYear, pendingSalesOrderOnly, rowCount, customerCount, elapsedMs, executedAt
Notes
Every customer row, no paging; a customer with several address or opening rows appears once per row.
Request
curl -X POST \ https://api.aizeny.com/v1/customers \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
One customer
/v1/customerPOST
https://api.aizeny.com/v1/customerNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated
Request body
companyCode (string), financialYear (four-digit string) and customerId (number).
One customer: request members Member Type Required Notes companyCode string Required — financialYear string Required — customerId integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: one-element array of { customer_id, customer_name, customer_alias, group_id, group_name, mobile_number, email_id, whatsapp_number, address_line_1…4, pin_code, country, state, gst_number, pan_number, station, opening_balance, balance, closing_balance, salesman_id, salesman_name, salesman_mobile_number, salesman_whatsapp_number, price_category }
metadata: apiVersion, operation, requestId, companyCode, financialYear, customerId, rowCount, elapsedMs, executedAt
Request
curl -X POST \ https://api.aizeny.com/v1/customer \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","customerId":1001}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Is this WhatsApp number a customer?
/v1/validate-whatsappPOST
https://api.aizeny.com/v1/validate-whatsappNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated
Request body
companyCode (string), financialYear (four-digit string) and whatsappNumber (string).
Is this WhatsApp number a customer?: request members Member Type Required Notes companyCode string Required — financialYear string Required — whatsappNumber string — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { isRegistered, matchedCustomers: [ { customer_id, customer_name, customer_alias, price_category, email_address, whatsapp_number } ] }
metadata: apiVersion, operation, requestId, companyCode, financialYear, matchCount, elapsedMs, executedAt (the submitted number is never echoed)
Request
curl -X POST \ https://api.aizeny.com/v1/validate-whatsapp \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","whatsappNumber":"+91 98765 43210"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Is this e-mail address a customer?
/v1/validate-emailPOST
https://api.aizeny.com/v1/validate-emailNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated
Request body
companyCode (string), financialYear (four-digit string) and emailAddress (string).
Is this e-mail address a customer?: request members Member Type Required Notes companyCode string Required — financialYear string Required — emailAddress string — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { isRegistered, matchedCustomers: [ … ] }
metadata: apiVersion, operation, requestId, companyCode, financialYear, matchCount, elapsedMs, executedAt (the submitted address is never echoed)
Request
curl -X POST \ https://api.aizeny.com/v1/validate-email \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","emailAddress":"accounts@example.com"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
Customer and supplier accounting
7Customer dashboard, pending bills, bill-wise statement, suppliers, supplier ledger and supplier pending bills.
POST
Customer dashboard
/v1/customer-dashboardPOST
https://api.aizeny.com/v1/customer-dashboardNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- calculationDate today (UTC, the PC clock)
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated
Request body
companyCode (string), financialYear (four-digit string) and customerId (number).
Customer dashboard: request members Member Type Required Notes companyCode string Required — financialYear string Required — customerId integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { customer_id, customer_name, customer_print_name, closing_balance, pending_balance, due_balance, credit_limit, total_sales_amount, total_receipts_amount, total_sale_returns_amount }
metadata: apiVersion, operation, requestId, companyCode, financialYear, customerId, calculationDate, rowCount, elapsedMs, executedAt
Notes
calculationDate is today (UTC) on the PC.
Request
curl -X POST \ https://api.aizeny.com/v1/customer-dashboard \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","customerId":1001}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Customers with pending bills
/v1/customers-pending-billsPOST
https://api.aizeny.com/v1/customers-pending-billsNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- calculationDate today (UTC, the PC clock)
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — use /customer-pending-bills for one customer
Request body
companyCode (string) and financialYear (four-digit string).
Customers with pending bills: request members Member Type Required Notes companyCode string Required — financialYear string Required — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { customer_id, customer_name, customer_alias, group_id, group_name, mobile_number, email_id, whatsapp_number, address_line_1…4, pin_code, country, state, gst_number, pan_number, station, opening_balance, balance, closing_balance, salesman_id, salesman_name, salesman_mobile_number, salesman_whatsapp_number, price_category, total_pending_amount, total_due_amount }
metadata: apiVersion, operation, requestId, companyCode, financialYear, calculationDate, rowCount, customerCount, elapsedMs, executedAt
Request
curl -X POST \ https://api.aizeny.com/v1/customers-pending-bills \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
One customer's pending bills
/v1/customer-pending-billsPOST
https://api.aizeny.com/v1/customer-pending-billsNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- isDue false; calculationDate today (UTC, the PC clock)
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — send isDue true for due bills only
Request body
companyCode (string), financialYear (four-digit string), customerId (number), and optionally isDue (boolean).
One customer's pending bills: request members Member Type Required Notes companyCode string Required — financialYear string Required — customerId integer — — isDue boolean — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { user_id, account_name, salesman_code, transaction_date, transaction_date_raw, transaction_type, reference_number, invoice_number, total_reference_amount, total_pending_amount, is_due, due_date, due_date_raw, days_until_due, days_overdue }
metadata: apiVersion, operation, requestId, companyCode, financialYear, customerId, isDue, calculationDate, rowCount, elapsedMs, executedAt
Request
curl -X POST \ https://api.aizeny.com/v1/customer-pending-bills \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","customerId":1001,"isDue":true}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Bill-wise statement
/v1/customer-bill-wise-statementPOST
https://api.aizeny.com/v1/customer-bill-wise-statementNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- calculationDate today (UTC, the PC clock)
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated
Request body
companyCode (string), financialYear (four-digit string) and customerId (number).
Bill-wise statement: request members Member Type Required Notes companyCode string Required — financialYear string Required — customerId integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { reference_number, transaction_type, transaction_date, transaction_date_raw, total_reference_amount, receivable_amount, payable_amount, due_date, due_date_raw, due_days, ref_code, voucher_code, voucher_type, voucher_series_code, signed_balance }
metadata: apiVersion, operation, requestId, companyCode, financialYear, customerId, calculationDate, rowCount, elapsedMs, executedAt
Request
curl -X POST \ https://api.aizeny.com/v1/customer-bill-wise-statement \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","customerId":1001}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Suppliers
/v1/suppliersPagedPagedPOST
https://api.aizeny.com/v1/suppliersPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- supplierId none; search none; includeContactDetails false; page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100)
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), and optionally supplierId (number), search (string), includeContactDetails (boolean), page and pageSize (numbers).
Suppliers: request members Member Type Required Notes companyCode string Required — financialYear string Required — supplierId integer — — search string — — includeContactDetails boolean — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { supplier_id, supplier_name, supplier_alias, supplier_print_name, supplier_group_id, supplier_group_name, purchase_voucher_count, purchase_return_voucher_count, purchase_order_count, has_purchase_vouchers, has_purchase_returns, has_purchase_orders, gst_number, mobile_number }
metadata: apiVersion, operation, requestId, companyCode, financialYear, supplierId, searchApplied, includeContactDetails, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Errors
422 BUSY_DATA_INCONSISTENT (includeContactDetails with several address rows)
Request
curl -X POST \ https://api.aizeny.com/v1/suppliers \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","page":1,"pageSize":100}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Supplier ledger
/v1/supplier-ledgerPagedPagedPOST
https://api.aizeny.com/v1/supplier-ledgerPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- fromDate 1 April and toDate 31 March of the year; page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100)
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), supplierId (number), and optionally fromDate and toDate (strings, YYYY-MM-DD), page and pageSize (numbers).
Supplier ledger: request members Member Type Required Notes companyCode string Required — financialYear string Required — supplierId integer — — fromDate string — — toDate string — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { rows: [ { ledger_row_id, voucher_code, voucher_type_id, voucher_number, voucher_date, line_number, supplier_name, supplier_id, financial_year_opening_balance, debit, credit, running_balance } ], summary: { financial_year_opening_balance, period_opening_balance, period_debit, period_credit, closing_balance } }
metadata: apiVersion, operation, requestId, companyCode, financialYear, supplierId, fromDate, toDate, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Notes
fromDate/toDate default to 1 April / 31 March of the year; the summary covers the whole period.
Request
curl -X POST \ https://api.aizeny.com/v1/supplier-ledger \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","supplierId":2001}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Supplier pending bills
/v1/supplier-pending-billsPagedPagedPOST
https://api.aizeny.com/v1/supplier-pending-billsPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- status open; includeCredits true; asOfDate today (UTC, the PC clock) clamped into the year; page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100)
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), and optionally supplierId (number), status (open, closed or all), includeCredits (boolean), asOfDate (string, YYYY-MM-DD), page and pageSize (numbers).
Supplier pending bills: request members Member Type Required Notes companyCode string Required — financialYear string Required — supplierId integer — — status string — — includeCredits boolean — — asOfDate string — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { supplier_id, supplier_name, bill_reference_code, reference_number, origin_voucher_code, origin_voucher_type_id, bill_date, due_date, original_amount, pending_amount, allocation_count, allocated_amount, status, days_overdue, is_unadjusted_credit, allocations: [ … ] }
metadata: apiVersion, operation, requestId, companyCode, financialYear, supplierId, status, includeCredits, asOfDate, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Notes
status defaults to open, includeCredits to true, asOfDate to today (UTC) clamped into the year — all on the PC.
Request
curl -X POST \ https://api.aizeny.com/v1/supplier-pending-bills \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","status":"open"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
Ledgers, analytics and summaries
9Customer and item ledgers, sales analyses, product analytics, day-end reports and account summaries.
POST
Customer ledger (one or more years)
/v1/customer-ledgerSeveral yearsSeveral yearsPOST
https://api.aizeny.com/v1/customer-ledgerNot pagedJSON answerSeveral years
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear + additionalFinancialYear (every year allowed on the PC)- Defaults
- additionalFinancialYear none; startDate and endDate unbounded
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — narrow startDate/endDate or request fewer years
Request body
companyCode (string), financialYear (four-digit string) and customerId (number), and optionally additionalFinancialYear (string of comma-separated four-digit years), startDate and endDate (strings, YYYY-MM-DD).
Customer ledger (one or more years): request members Member Type Required Notes companyCode string Required — financialYear string Required — additionalFinancialYear string — — customerId integer — — startDate string — — endDate string — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { user_id, opening_balance, user_id2, transaction_date_iso, formatted_date, voucher_type, voucher_no, account_name, debit, credit, voucher_code, on_account, financial_year }
metadata: apiVersion, operation, requestId, companyCode, financialYear, financialYears, customerId, startDate, endDate, rowCount, elapsedMs, executedAt
Notes
additionalFinancialYear is a comma-separated string of four-digit years; the primary year comes first and every year must be allowed, or the whole request is refused.
Request
curl -X POST \ https://api.aizeny.com/v1/customer-ledger \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","customerId":1001,"additionalFinancialYear":"2025"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Single item ledger
/v1/single-item-ledgerPagedPagedPOST
https://api.aizeny.com/v1/single-item-ledgerPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- fromDate/toDate the year's bounds (each side on its own); page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100); the summary covers the whole range
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string) and productId (number), and optionally fromDate and toDate (YYYY-MM-DD), page and pageSize (numbers).
Single item ledger: request members Member Type Required Notes companyCode string Required — financialYear string Required — productId integer — — fromDate string — — toDate string — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { product: { … }, summary: { opening, in, out, closing quantities and amounts, tran4 control totals }, ledger: [ { date, voucher_type, voucher_type_id, voucher_number, voucher_code, sr_no, party, material centre, particulars, quantity_in, amount_in, quantity_out, amount_out, balance_quantity, balance_amount } ] }
metadata: apiVersion, operation, requestId, companyCode, financialYear, productId, fromDate, toDate, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Notes
A missing fromDate/toDate is the year start/end (one date alone does not mean one day).
Request
curl -X POST \ https://api.aizeny.com/v1/single-item-ledger \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","productId":3001}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
One item's sales per customer
/v1/sales-analysis-single-itemPagedPagedPOST
https://api.aizeny.com/v1/sales-analysis-single-itemPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- fromDate/toDate the year's bounds (each side on its own); page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100); the summary covers the whole range
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string) and productId (number), and optionally fromDate and toDate (YYYY-MM-DD), page and pageSize (numbers).
One item's sales per customer: request members Member Type Required Notes companyCode string Required — financialYear string Required — productId integer — — fromDate string — — toDate string — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { item: { … }, rows: [ one per customer: sale, return and net quantities and amounts, average_price, voucher counts ], summary: { … totals } }
metadata: apiVersion, operation, requestId, companyCode, financialYear, productId, fromDate, toDate, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Request
curl -X POST \ https://api.aizeny.com/v1/sales-analysis-single-item \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","productId":3001}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
One customer's sales per product
/v1/sales-analysis-single-customerPagedPagedPOST
https://api.aizeny.com/v1/sales-analysis-single-customerPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- fromDate/toDate the year's bounds (each side on its own); page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100); the summary covers the whole range
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string) and customerId (number), and optionally fromDate and toDate (YYYY-MM-DD), page and pageSize (numbers).
One customer's sales per product: request members Member Type Required Notes companyCode string Required — financialYear string Required — customerId integer — — fromDate string — — toDate string — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { customer: { customer_id, customer_name, customer_alias }, rows: [ one per product: main and alternative unit quantities, amounts, average prices, voucher counts ], summary: { … totals } }
metadata: apiVersion, operation, requestId, companyCode, financialYear, customerId, fromDate, toDate, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Request
curl -X POST \ https://api.aizeny.com/v1/sales-analysis-single-customer \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","customerId":1001}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Customer's active and dropped products (one or more years)
/v1/customer-product-analyticsPagedSeveral yearsPagedSeveral yearsPOST
https://api.aizeny.com/v1/customer-product-analyticsPagedJSON answerSeveral years
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear + additionalFinancialYear (every year allowed on the PC)- Defaults
- additionalFinancialYear none; fromDate/toDate the primary year's bounds; page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100); the summary covers the whole range; active then dropped products are one paged sequence
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string) and customerId (number), and optionally additionalFinancialYear (string of comma-separated four-digit years), fromDate and toDate (YYYY-MM-DD), page and pageSize (numbers).
Customer's active and dropped products (one or more years): request members Member Type Required Notes companyCode string Required — financialYear string Required — additionalFinancialYear string — — customerId integer — — fromDate string — — toDate string — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { customer: { … }, summary: { … }, active_products: [ … ], dropped_products: [ … with rates, frequency and daily, weekly, monthly trends ] }
metadata: apiVersion, operation, requestId, companyCode, financialYear, financialYears, customerId, fromDate, toDate, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Notes
Every year the period touches must be requested; every requested year must be allowed on the PC or the whole request is refused.
Request
curl -X POST \ https://api.aizeny.com/v1/customer-product-analytics \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","customerId":1001,"additionalFinancialYear":"2025"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Day-end summary
/v1/day-end-report-summaryPOST
https://api.aizeny.com/v1/day-end-report-summaryNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- cashMasterCode 1 (the date form has no default)
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated
Request body
companyCode (string), financialYear (four-digit string), and either date or both startDate and endDate (YYYY-MM-DD), and optionally cashMasterCode (number).
Day-end summary: request members Member Type Required Notes companyCode string Required — financialYear string Required — date string — — startDate string — — endDate string — — cashMasterCode integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of exactly 10 rows { type, total_amount, cash_signed, party_signed, others_signed, total_amount_display, cash, party, others }
metadata: apiVersion, operation, requestId, companyCode, financialYear, reportType, startDate, endDate, cashMasterCode, rowCount, elapsedMs, executedAt
Notes
cashMasterCode defaults to 1 on the PC.
Request
curl -X POST \ https://api.aizeny.com/v1/day-end-report-summary \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","date":"2026-04-10"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Day-end detailed report
/v1/day-end-report-detailedPOST
https://api.aizeny.com/v1/day-end-report-detailedNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — request a shorter startDate–endDate range
Request body
companyCode (string), financialYear (four-digit string), and either date or both startDate and endDate (YYYY-MM-DD).
Day-end detailed report: request members Member Type Required Notes companyCode string Required — financialYear string Required — date string — — startDate string — — endDate string — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { type, date, date_raw, voucher_no, particulars, cash_signed, bank_signed, bank_od_signed, party_signed, others_signed, cash, bank, bank_od, party, others } (one complete answer, not paged)
metadata: apiVersion, operation, requestId, companyCode, financialYear, reportType, startDate, endDate, rowCount, elapsedMs, executedAt
Request
curl -X POST \ https://api.aizeny.com/v1/day-end-report-detailed \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","startDate":"2026-04-01","endDate":"2026-04-07"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Account monthly summary
/v1/account-monthly-summaryPagedPagedPOST
https://api.aizeny.com/v1/account-monthly-summaryPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- page 1; pageSize 100 (always the whole year)
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100); totals cover every account
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), and optionally page and pageSize (numbers).
Account monthly summary: request members Member Type Required Notes companyCode string Required — financialYear string Required — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { rows: [ { account_id, account_name, opening, April–March debit and credit, closing, signed values } ], totals: { … } }
metadata: apiVersion, operation, requestId, companyCode, financialYear, fromDate, toDate, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Notes
Always the whole financial year.
Request
curl -X POST \ https://api.aizeny.com/v1/account-monthly-summary \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Account consolidated summary
/v1/account-consolidated-summaryPagedPagedPOST
https://api.aizeny.com/v1/account-consolidated-summaryPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- fromDate/toDate the whole year (one date alone = that one day); page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100); the summary covers the whole range
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), and optionally fromDate and toDate (YYYY-MM-DD; one alone means that one day), page and pageSize (numbers).
Account consolidated summary: request members Member Type Required Notes companyCode string Required — financialYear string Required — fromDate string — — toDate string — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { rows: [ { account_id, account_name, parent_group_id, parent_group_name, opening_balance_dr, opening_balance_cr, debit_amount, credit_amount, closing_balance_dr, closing_balance_cr, note_text, opening_signed, closing_signed } ], totals: { … } }
metadata: apiVersion, operation, requestId, companyCode, financialYear, fromDate, toDate, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Request
curl -X POST \ https://api.aizeny.com/v1/account-consolidated-summary \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","fromDate":"2026-04-01","toDate":"2026-09-30"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
Registers, orders and invoices
18Sales, purchase, return, payment, receipt, journal and contra registers, pending orders, sale invoices and voucher PDFs (sales and purchase invoices and returns, receipts, payments).
POST
Purchase register, product lines
/v1/purchase-register-productsPagedPagedPOST
https://api.aizeny.com/v1/purchase-register-productsPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- fromDate/toDate the year's bounds; includeReturns true; includeCancelled false; page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100)
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), and optionally fromDate and toDate (YYYY-MM-DD), supplierId, productId, voucherId, materialCenterId (numbers), includeReturns and includeCancelled (booleans), page and pageSize (numbers).
Purchase register, product lines: request members Member Type Required Notes companyCode string Required — financialYear string Required — fromDate string — — toDate string — — supplierId integer — — productId integer — — voucherId integer — — materialCenterId integer — — includeReturns boolean — — includeCancelled boolean — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of purchase and purchase-return product lines with GST (voucher, supplier, purchase type, line_row_id, product, group, material centre, unit, quantity, prices, taxable_amount, gst_percent, gst_amount); every product line also carries line_description (BUSY's own description of that voucher line: positions 1..n up to the last non-empty one, an empty position as "", [] for none — Windows fc31888)
metadata: apiVersion, operation, requestId, companyCode, financialYear, fromDate, toDate, supplierId, productId, voucherId, materialCenterId, includeReturns, includeCancelled, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Request
curl -X POST \ https://api.aizeny.com/v1/purchase-register-products \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","fromDate":"2026-04-01","toDate":"2026-06-30"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Pending purchase orders
/v1/pending-purchase-ordersPagedPagedPOST
https://api.aizeny.com/v1/pending-purchase-ordersPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- no order-date filter; asOfDate today (UTC, the PC clock) clamped into the year; status open; includeCancelled false; page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100)
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), and optionally fromDate, toDate and asOfDate (YYYY-MM-DD), supplierId and productId (numbers), referenceNumber (string), status (open, closed, over_linked or all), includeCancelled (boolean), page and pageSize (numbers).
Pending purchase orders: request members Member Type Required Notes companyCode string Required — financialYear string Required — fromDate string — — toDate string — — asOfDate string — — supplierId integer — — productId integer — — referenceNumber string — — status string — — includeCancelled boolean — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of purchase-order lines with their exact reference-code lifecycle (ordered, linked, pending, over-linked quantities, status)
metadata: apiVersion, operation, requestId, companyCode, financialYear, fromDate, toDate, asOfDate, supplierId, productId, referenceNumberApplied, status, includeCancelled, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Notes
Without asOfDate the PC uses today (UTC) clamped into the year, and refuses a fromDate or toDate after it.
Request
curl -X POST \ https://api.aizeny.com/v1/pending-purchase-orders \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","status":"open"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Sales-return product lines
/v1/sales-return-productsPagedPagedPOST
https://api.aizeny.com/v1/sales-return-productsPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- fromDate/toDate the year's bounds; includeCancelled false; page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100)
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), and optionally fromDate and toDate (YYYY-MM-DD), customerId, productId, voucherId (numbers), includeCancelled (boolean), page and pageSize (numbers).
Sales-return product lines: request members Member Type Required Notes companyCode string Required — financialYear string Required — fromDate string — — toDate string — — customerId integer — — productId integer — — voucherId integer — — includeCancelled boolean — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of sales-return product lines with GST (voucher, customer, sale type, line_row_id, product, group, material centre, unit, return quantity, prices, taxable_amount, gst_percent, gst_amount); every product line also carries line_description (BUSY's own description of that voucher line: positions 1..n up to the last non-empty one, an empty position as "", [] for none — Windows fc31888)
metadata: apiVersion, operation, requestId, companyCode, financialYear, fromDate, toDate, customerId, productId, voucherId, includeCancelled, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Request
curl -X POST \ https://api.aizeny.com/v1/sales-return-products \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
One customer's sales register
/v1/customer-sales-registerPagedPagedPOST
https://api.aizeny.com/v1/customer-sales-registerPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- fromDate/toDate the year's bounds; includeReturns true; includeCancelled false; page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100)
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), customerId (number), and optionally fromDate and toDate (YYYY-MM-DD), includeReturns and includeCancelled (booleans), page and pageSize (numbers).
One customer's sales register: request members Member Type Required Notes companyCode string Required — financialYear string Required — customerId integer — — fromDate string — — toDate string — — includeReturns boolean — — includeCancelled boolean — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { rows: [ { voucher_code, voucher_type_id, transaction_type, voucher_date, voucher_number, customer_id, customer_name, sale_type_id, sale_type_name, material_center_id, material_center_name, total_amount, sale_amount, taxable_amount, gst_amount } ], summary: { voucher_count, sales_total, returns_total, net_total, net_gst_amount } }
metadata: apiVersion, operation, requestId, companyCode, financialYear, customerId, fromDate, toDate, includeReturns, includeCancelled, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Request
curl -X POST \ https://api.aizeny.com/v1/customer-sales-register \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","customerId":1001}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Sales register
/v1/sales-registerPagedPagedPOST
https://api.aizeny.com/v1/sales-registerPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- fromDate/toDate the whole year (one date alone = that one day); page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100); the summary covers the whole range
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), and optionally fromDate and toDate (YYYY-MM-DD; one alone means that one day), page and pageSize (numbers).
Sales register: request members Member Type Required Notes companyCode string Required — financialYear string Required — fromDate string — — toDate string — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { rows: [ { date, voucher_code, voucher_type_id, voucher_number, customer_id, customer_name, gst_number, mobile_number, sale_type_id, sale_type_name, total_amount, sale_amount, taxable_amount, igst_amount, cgst_amount, sgst_amount, other_amount, material_center_id, material_center_name, receipt_amount, status } ], summary: { total_amount_total, sale_amount_total, taxable_amount_total, igst_amount_total, cgst_amount_total, sgst_amount_total, other_amount_total, receipt_amount_total, total_tax_amount_total } }
metadata: apiVersion, operation, requestId, companyCode, financialYear, fromDate, toDate, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Errors
422 BUSY_DATA_INCONSISTENT (repeated voucher header, differing address rows)
Notes
Neither date = the whole year; one date alone = that one day. Cancelled vouchers stay in rows and summaries.
Request
curl -X POST \ https://api.aizeny.com/v1/sales-register \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","fromDate":"2026-04-01","toDate":"2026-04-30"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Purchase register
/v1/purchase-registerPagedPagedPOST
https://api.aizeny.com/v1/purchase-registerPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- fromDate/toDate the whole year (one date alone = that one day); page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100); the summary covers the whole range
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), and optionally fromDate and toDate (YYYY-MM-DD; one alone means that one day), page and pageSize (numbers).
Purchase register: request members Member Type Required Notes companyCode string Required — financialYear string Required — fromDate string — — toDate string — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { rows: [ { date, voucher_code, voucher_type_id, voucher_number, account_id, account_name, gst_number, mobile_number, purchase_type_id, purchase_type_name, total_amount, purchase_amount, taxable_amount, igst_amount, cgst_amount, sgst_amount, other_amount, material_center_id, material_center_name, payment_amount, status } ], summary: { total_amount_total, purchase_amount_total, taxable_amount_total, igst_amount_total, cgst_amount_total, sgst_amount_total, other_amount_total, payment_amount_total, total_tax_amount_total } }
metadata: apiVersion, operation, requestId, companyCode, financialYear, fromDate, toDate, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Errors
422 BUSY_DATA_INCONSISTENT (repeated voucher header, differing address rows)
Notes
Neither date = the whole year; one date alone = that one day. Cancelled vouchers stay in rows and summaries.
Request
curl -X POST \ https://api.aizeny.com/v1/purchase-register \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","fromDate":"2026-04-01","toDate":"2026-04-30"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Sales-return (credit note) register
/v1/sales-return-crnote-registerPagedPagedPOST
https://api.aizeny.com/v1/sales-return-crnote-registerPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- fromDate/toDate the whole year (one date alone = that one day); page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100); the summary covers the whole range
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), and optionally fromDate and toDate (YYYY-MM-DD; one alone means that one day), page and pageSize (numbers).
Sales-return (credit note) register: request members Member Type Required Notes companyCode string Required — financialYear string Required — fromDate string — — toDate string — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { rows: [ { date, voucher_code, voucher_type_id, voucher_number, customer_id, customer_name, gst_number, mobile_number, sale_type_id, sale_type_name, total_amount, sale_amount, taxable_amount, igst_amount, cgst_amount, sgst_amount, other_amount, material_center_id, material_center_name, receipt_amount, status } ], summary: { total_amount_total, sale_amount_total, taxable_amount_total, igst_amount_total, cgst_amount_total, sgst_amount_total, other_amount_total, receipt_amount_total, total_tax_amount_total } }
metadata: apiVersion, operation, requestId, companyCode, financialYear, fromDate, toDate, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Errors
422 BUSY_DATA_INCONSISTENT (repeated voucher header, differing address rows)
Notes
Neither date = the whole year; one date alone = that one day. Cancelled vouchers stay in rows and summaries.
Request
curl -X POST \ https://api.aizeny.com/v1/sales-return-crnote-register \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","fromDate":"2026-04-01","toDate":"2026-04-30"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Purchase-return (debit note) register
/v1/purchase-return-drnote-registerPagedPagedPOST
https://api.aizeny.com/v1/purchase-return-drnote-registerPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- fromDate/toDate the whole year (one date alone = that one day); page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100); the summary covers the whole range
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), and optionally fromDate and toDate (YYYY-MM-DD; one alone means that one day), page and pageSize (numbers).
Purchase-return (debit note) register: request members Member Type Required Notes companyCode string Required — financialYear string Required — fromDate string — — toDate string — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { rows: [ { date, voucher_code, voucher_type_id, voucher_number, account_id, account_name, gst_number, mobile_number, purchase_type_id, purchase_type_name, total_amount, purchase_amount, taxable_amount, igst_amount, cgst_amount, sgst_amount, other_amount, material_center_id, material_center_name, payment_amount, status } ], summary: { total_amount_total, purchase_amount_total, taxable_amount_total, igst_amount_total, cgst_amount_total, sgst_amount_total, other_amount_total, payment_amount_total, total_tax_amount_total } }
metadata: apiVersion, operation, requestId, companyCode, financialYear, fromDate, toDate, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Errors
422 BUSY_DATA_INCONSISTENT (repeated voucher header, differing address rows)
Notes
Neither date = the whole year; one date alone = that one day. Cancelled vouchers stay in rows and summaries.
Request
curl -X POST \ https://api.aizeny.com/v1/purchase-return-drnote-register \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","fromDate":"2026-04-01","toDate":"2026-04-30"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Payment register
/v1/payment-registerPagedPagedPOST
https://api.aizeny.com/v1/payment-registerPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- fromDate/toDate the whole year (one date alone = that one day); page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100); the summary covers the whole range
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), and optionally fromDate and toDate (YYYY-MM-DD; one alone means that one day), page and pageSize (numbers).
Payment register: request members Member Type Required Notes companyCode string Required — financialYear string Required — fromDate string — — toDate string — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { rows: [ { date, voucher_code, voucher_type_id, voucher_number, gst_nature_id, gst_nature, mode_id, mode_name, account_id, account_name, mobile_number, amount, taxable_amount, igst_amount, cgst_amount, sgst_amount, short_narration, instrument_type_id, instrument_type, instrument_number } ], summary: { amount_total, taxable_amount_total, igst_amount_total, cgst_amount_total, sgst_amount_total } }
metadata: apiVersion, operation, requestId, companyCode, financialYear, fromDate, toDate, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Errors
422 BUSY_DATA_INCONSISTENT (repeated voucher header, differing address rows)
Notes
Neither date = the whole year; one date alone = that one day. Cancelled vouchers stay in rows and summaries.
Request
curl -X POST \ https://api.aizeny.com/v1/payment-register \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","fromDate":"2026-04-01","toDate":"2026-04-30"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Receipt register
/v1/receipt-registerPagedPagedPOST
https://api.aizeny.com/v1/receipt-registerPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- fromDate/toDate the whole year (one date alone = that one day); page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100); the summary covers the whole range
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), and optionally fromDate and toDate (YYYY-MM-DD; one alone means that one day), page and pageSize (numbers).
Receipt register: request members Member Type Required Notes companyCode string Required — financialYear string Required — fromDate string — — toDate string — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { rows: [ { date, voucher_code, voucher_type_id, voucher_number, gst_nature_id, gst_nature, mode_id, mode_name, account_id, account_name, mobile_number, amount, short_narration, instrument_type_id, instrument_type, instrument_number } ], summary: { amount_total } }
metadata: apiVersion, operation, requestId, companyCode, financialYear, fromDate, toDate, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Errors
422 BUSY_DATA_INCONSISTENT (repeated voucher header, differing address rows)
Notes
Neither date = the whole year; one date alone = that one day. Cancelled vouchers stay in rows and summaries.
Request
curl -X POST \ https://api.aizeny.com/v1/receipt-register \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","fromDate":"2026-04-01","toDate":"2026-04-30"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Journal register
/v1/journal-registerPagedPagedPOST
https://api.aizeny.com/v1/journal-registerPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- fromDate/toDate the whole year (one date alone = that one day); page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100); the summary covers the whole range
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), and optionally fromDate and toDate (YYYY-MM-DD; one alone means that one day), page and pageSize (numbers).
Journal register: request members Member Type Required Notes companyCode string Required — financialYear string Required — fromDate string — — toDate string — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { rows: [ { date, voucher_code, voucher_type_id, voucher_number, line_srno, voucher_line_no, gst_nature_id, gst_nature, account_id, account_name, mobile_number, debit_amount, credit_amount, taxable_amount, igst_amount, cgst_amount, sgst_amount, short_narration, instrument_type_id, instrument_type, instrument_number } ], summary: { debit_total, credit_total, taxable_amount_total, igst_amount_total, cgst_amount_total, sgst_amount_total } }
metadata: apiVersion, operation, requestId, companyCode, financialYear, fromDate, toDate, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Errors
422 BUSY_DATA_INCONSISTENT (repeated voucher header, differing address rows)
Notes
Neither date = the whole year; one date alone = that one day. Cancelled vouchers stay in rows and summaries.
Request
curl -X POST \ https://api.aizeny.com/v1/journal-register \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","fromDate":"2026-04-01","toDate":"2026-04-30"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Contra register
/v1/contra-registerPagedPagedPOST
https://api.aizeny.com/v1/contra-registerPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- fromDate/toDate the whole year (one date alone = that one day); page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100); the summary covers the whole range
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), and optionally fromDate and toDate (YYYY-MM-DD; one alone means that one day), page and pageSize (numbers).
Contra register: request members Member Type Required Notes companyCode string Required — financialYear string Required — fromDate string — — toDate string — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { rows: [ { date, voucher_code, voucher_type_id, voucher_number, line_srno, voucher_line_no, account_id, account_name, mobile_number, debit_amount, credit_amount, short_narration, instrument_type_id, instrument_type, instrument_number } ], summary: { debit_total, credit_total } }
metadata: apiVersion, operation, requestId, companyCode, financialYear, fromDate, toDate, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Errors
422 BUSY_DATA_INCONSISTENT (repeated voucher header, differing address rows)
Notes
Neither date = the whole year; one date alone = that one day. Cancelled vouchers stay in rows and summaries.
Request
curl -X POST \ https://api.aizeny.com/v1/contra-register \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","fromDate":"2026-04-01","toDate":"2026-04-30"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Pending sales orders (item rows)
/v1/pending-sales-ordersPagedPagedPOST
https://api.aizeny.com/v1/pending-sales-ordersPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- referenceNumber none; statusField none; page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100)
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), customerId (number), and optionally referenceNumber (string), statusField (OF1 to OF10), page and pageSize (numbers).
Pending sales orders (item rows): request members Member Type Required Notes companyCode string Required — financialYear string Required — customerId integer — — referenceNumber string — — statusField string — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { sales_order_refcode, reference_no, order_date, due_date, customer_id, customer_name, product_id, product_name, unit_id, unit_name, status_id, status, total_qty, pending_qty, product_stock }
metadata: apiVersion, operation, requestId, companyCode, financialYear, customerId, referenceNumberApplied, statusField, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Errors
422 BUSY_DATA_INCONSISTENT (differing address, billing or other-information rows)
Request
curl -X POST \ https://api.aizeny.com/v1/pending-sales-orders \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","customerId":1001,"statusField":"OF1"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Pending sales orders per voucher
/v1/pending-sales-order-vouchersPagedPagedPOST
https://api.aizeny.com/v1/pending-sales-order-vouchersPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- statusField none; page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100)
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), customerId (number), and optionally statusField (OF1 to OF10), page and pageSize (numbers).
Pending sales orders per voucher: request members Member Type Required Notes companyCode string Required — financialYear string Required — customerId integer — — statusField string — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { sales_order_refcode, sales_order_vch_code, sales_order_number, order_date, due_date, customer_id, customer_name, material_center_id, material_center_name, status_id, status, total_ordered_qty, total_dispatched_qty, total_pending_qty }
metadata: apiVersion, operation, requestId, companyCode, financialYear, customerId, statusField, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Errors
422 BUSY_DATA_INCONSISTENT (differing address, billing or other-information rows)
Request
curl -X POST \ https://api.aizeny.com/v1/pending-sales-order-vouchers \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","customerId":1001}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Sale invoices
/v1/all-sale-invoicesPagedPagedPOST
https://api.aizeny.com/v1/all-sale-invoicesPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- page 1; pageSize 100 (startDate and endDate have no default)
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100)
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), startDate and endDate (YYYY-MM-DD), and optionally customerId, materialCenterId, materialCenterGroupId, page and pageSize (numbers).
Sale invoices: request members Member Type Required Notes companyCode string Required — financialYear string Required — startDate string — — endDate string — — customerId integer — — materialCenterId integer — — materialCenterGroupId integer — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of sale invoices (vch_code, date, invoice_no, material centre and group, sale type, customer, billing, salesman, total_amount and grand_total as two-decimal strings, bill reference and payment status, transport, e-way and e-invoice numbers, last action)
metadata: apiVersion, operation, requestId, companyCode, financialYear, startDate, endDate, customerId, materialCenterId, materialCenterGroupId, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Errors
422 BUSY_DATA_INCONSISTENT (differing address, billing or other-information rows)
Request
curl -X POST \ https://api.aizeny.com/v1/all-sale-invoices \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","startDate":"2026-04-01","endDate":"2026-04-30"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Product lines of one sale invoice
/v1/sale-invoice-productsPOST
https://api.aizeny.com/v1/sale-invoice-productsNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated
Request body
companyCode (string), financialYear (four-digit string) and voucherId (number).
Product lines of one sale invoice: request members Member Type Required Notes companyCode string Required — financialYear string Required — voucherId integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of every product line with GST (voucher, customer, material centre, sale type, product, group, HSN, MRP, quantity, unit, rates, taxable_value, GST/CGST/SGST/IGST percentages and amounts, total_amount); every product line also carries line_description (BUSY's own description of that voucher line: positions 1..n up to the last non-empty one, an empty position as "", [] for none — Windows fc31888)
metadata: apiVersion, operation, requestId, companyCode, financialYear, voucherId, rowCount, elapsedMs, executedAt
Request
curl -X POST \ https://api.aizeny.com/v1/sale-invoice-products \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","voucherId":50001}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Sale vouchers with their items
/v1/list-sale-vouchers-with-itemsPagedPagedPOST
https://api.aizeny.com/v1/list-sale-vouchers-with-itemsPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- fromDate/toDate the whole year (one date alone = that one day); page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100); the summary covers the whole range; pages count vouchers and never split one
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), and optionally fromDate and toDate (YYYY-MM-DD; one alone means that one day), page and pageSize (numbers).
Sale vouchers with their items: request members Member Type Required Notes companyCode string Required — financialYear string Required — fromDate string — — toDate string — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { vouchers: [ { voucher_code, voucher_number, date, …, total_quantity, total_amount, items: [ … ] } ], summary: { total_quantity, total_amount, item_row_count, voucher_count } }; every product line also carries line_description (BUSY's own description of that voucher line: positions 1..n up to the last non-empty one, an empty position as "", [] for none — Windows fc31888)
metadata: apiVersion, operation, requestId, companyCode, financialYear, fromDate, toDate, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Errors
422 BUSY_DATA_INCONSISTENT (differing address, billing or other-information rows)
Notes
Same body and date rule as the registers: one date alone means that one day.
Request
curl -X POST \ https://api.aizeny.com/v1/list-sale-vouchers-with-items \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","fromDate":"2026-04-01","toDate":"2026-04-07"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Voucher PDF
/v1/voucher-pdfPOST
https://api.aizeny.com/v1/voucher-pdfNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- formatName absent = BUSY's STANDARD print format for the voucher type; the company must have it (else 409 BUSY_PRINT_FORMAT_MISSING). The PC decides; the cloud names no format
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — the PC refuses a PDF above 1 MiB (1048576 bytes) with 422 RESULT_TOO_LARGE; try another formatName
Request body
companyCode (string), financialYear (four-digit string), voucherType ("salesInvoice", "salesReturn", "receipt", "purchaseInvoice", "purchaseReturn" or "payment"), exactly one of voucherId (number) or voucherNumber (string), and optionally formatName (string).
Voucher PDF: request members Member Type Required Notes companyCode string Required — financialYear string Required — voucherType string — — voucherId integer — — voucherNumber string — — formatName string — — Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { fileName (<Type>-<companyCode>-<financialYear>-<number>.pdf with <Type> SalesInvoice, SalesReturn, Receipt, PurchaseInvoice, PurchaseReturn or Payment; a name only), mimeType ("application/pdf"), byteLength (bytes of the PDF), sha256 (lower-case hex of the PDF), pages, contentBase64 (the whole PDF as standard base64, RFC 4648 section 4) }
metadata: apiVersion, operation, requestId, companyCode, financialYear, voucherType, lookup ("voucherId" \| "voucherNumber"), voucherId, voucherNumber, voucherDate (YYYY-MM-DD or null), formatSource ("busyDefault" \| "selected"), formatName (null for the default), elapsedMs, executedAt
Errors
400 INVALID_PARAMETER field voucherType (not one of the six), voucherId / voucherNumber (neither or both, out of range), formatName, script (no transform applies to a PDF); 404 NOT_FOUND field voucherId, voucherNumber or formatName (no voucher of that type; the formatName message lists the type's formats that exist); 409 BUSY_PRINT_FORMAT_MISSING field formatName (no formatName and no STANDARD format for the type in BUSY: set it up in BUSY or send formatName; not retryable); 422 BUSY_DATA_INCONSISTENT field voucherNumber (several vouchers of the type share the number: send voucherId) or voucherId; 422 RESULT_TOO_LARGE (PDF over 1 MiB), 422 BUSY_COM_PDF_BLANK (the PDF shows no text: check formatName); 409 BUSY_COM_SIGN_IN_UNSUPPORTED (the company signs in to SQL Server with Windows); 502 BUSY_COM_PDF_FAILED, BUSY_COM_HELPER_FAILED, BUSY_COM_PDF_MISSING, BUSY_COM_PDF_INVALID (retryable); 503 BUSY_COM_DEFAULT_PRINTER_MISSING, BUSY_COM_NOT_REGISTERED, BUSY_COM_INSTALLATION_INVALID, BUSY_COM_FOLDER_NOT_WRITABLE, BUSY_COM_RUNTIME_MISSING, BUSY_COM_HELPER_MISSING (fix the PC; not retryable), BUSY_UNAVAILABLE; 503 BUSY_CREDENTIAL_UNAVAILABLE, BUSY_COM_OPEN_FAILED, BUSY_COM_QUEUE_TIMEOUT (retryable); 504 BUSY_COM_TIMEOUT (retryable)
Notes
Prints one existing voucher to PDF with BUSY's own printing on the organization's PC and returns the file in the answer; the cloud neither makes, stores, changes nor logs the PDF. voucherType (exact case): salesInvoice (sale), salesReturn (sale return, printed as a credit note), receipt, purchaseInvoice (purchase), purchaseReturn (purchase return, printed as a debit note) or payment (printed as a payment advice). The voucher is looked up only among vouchers of that type: a sales return and a sales invoice may share a number, and another type's voucherId is 404. Name it by exactly one of voucherId (BUSY's voucher code, for example vch_code of /all-sale-invoices, 1–2147483647) or voucherNumber (as BUSY shows it, 1–50 characters after trimming, matched exactly including case). formatName: one of the company's BUSY print formats for that type, exactly as named (1–64 characters, no leading or trailing space); leave it out for the type's STANDARD format. Decode data.contentBase64 to get the file; data.byteLength and data.sha256 describe the decoded bytes. Two prints of one voucher may differ in bytes (BUSY writes a time into each PDF). The PC prints one PDF at a time, usually in 5–15 s; a request waiting behind others shares the 120 s relay budget and otherwise ends as a retryable timeout. Printing changes no accounting data, but BUSY's own print marks the voucher as printed (Tran1.DocPrinted), as printing from BUSY does; a retry prints again and sets the same flag. No script member: a PDF is never transformed.
Request
curl -X POST \ https://api.aizeny.com/v1/voucher-pdf \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","voucherType":"salesInvoice","voucherId":50001}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
Dashboards and credit-line stream
3Dashboard sales summary and trend, and the credit-line stage stream (NDJSON, one line per customer).
POST
Dashboard sales summary
/v1/dashboard-sales-summaryPOST
https://api.aizeny.com/v1/dashboard-sales-summaryNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated
Request body
companyCode (string) and financialYear (four-digit string).
Dashboard sales summary: request members Member Type Required Notes companyCode string Required — financialYear string Required — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { daily: [ … every day ], weekly: [ … W1–W53 ], monthly: [ … ], quarterly: [ … ], halfYearly: [ … ] } each with invoiceCount and totalSalesAmount
metadata: apiVersion, operation, requestId, companyCode, financialYear, startDate, endDate, dailyRowCount, weeklyRowCount, monthlyRowCount, quarterlyRowCount, halfYearlyRowCount, elapsedMs, executedAt
Request
curl -X POST \ https://api.aizeny.com/v1/dashboard-sales-summary \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Dashboard sales trend
/v1/dashboard-sales-trendPOST
https://api.aizeny.com/v1/dashboard-sales-trendNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- period daily (the period is computed from today in India, on the PC)
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated
Request body
companyCode (string), financialYear (four-digit string), and optionally period (daily, weekly, monthly or yearly).
Dashboard sales trend: request members Member Type Required Notes companyCode string Required — financialYear string Required — period string — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { period, startDate, endDate, total_sales_amount, total_sales_return_amount, total_receipt_amount }
metadata: apiVersion, operation, requestId, companyCode, financialYear, period, startDate, endDate, financialYearStartDate, financialYearEndDate, coverage, coveredStartDate, coveredEndDate, calculationDate, timeZone, elapsedMs, executedAt
Errors
422 PERIOD_OUTSIDE_FINANCIAL_YEAR field period (decided on the PC from its India date)
Notes
period defaults to daily; the period is computed from today in India on the PC.
Request
curl -X POST \ https://api.aizeny.com/v1/dashboard-sales-trend \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","period":"monthly"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Credit-line stage stream (NDJSON)
/v1/credit-line/line-stage-streamNDJSON streamNDJSON streamPOST
https://api.aizeny.com/v1/credit-line/line-stage-streamNot pagedNDJSON streamOne year
Answer:
application/x-ndjsonstream- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- billByBillMode standard; billByBillPdfConfig every member true; customerOptionalFields none; gracePeriodSource project; gracePeriodDays 0; gracePeriodOptionalField the first customerOptionalFields entry (optional_field only); creditLineType both; account block none; calculationDate today in India (the PC clock)
- Paging
- none
- Size
- NDJSON: at most 64 MiB and 5 minutes per stream (configurable), ended by a relay fatal_error line beyond
Request body
companyCode (string), financialYear (four-digit string), customerIds and/or groupIds (arrays of numbers), and optionally billByBillMode, billByBillPdfConfig (object of booleans), customerOptionalFields (array of OF1-OF10), gracePeriodSource, gracePeriodDays (number), gracePeriodOptionalField, creditLineType, accountBlockOverdueDays and accountBlockExceedAmount (numbers).
Credit-line stage stream (NDJSON): request members Member Type Required Notes companyCode string Required — financialYear string Required — customerIds array of integers — — groupIds array of integers — — billByBillMode string — — billByBillPdfConfig object — — customerOptionalFields array of strings — — gracePeriodSource string — — gracePeriodDays integer — — gracePeriodOptionalField string — — creditLineType string — — accountBlockOverdueDays integer — — accountBlockExceedAmount number — exact decimal Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: application/x-ndjson: one { success, data, metadata } envelope per line. Success lines carry data.type: meta { type, total, direct_customer_count, group_count }; per customer row { type, customer_id, result } and then progress { type, evaluated, failed, total, percent, by_stage }; finally done { type, summary: { total, evaluated, failed, by_stage, errors: [{ customer_id, code }] } }. A customer that cannot be evaluated is a success:false line with data null and metadata.eventType "row_error", metadata.customerId and metadata.error, and the stream continues; an unexpected failure after the stream started ends it with one success:false line with metadata.eventType "fatal_error"
metadata: every line: apiVersion, operation, requestId, sequence (0-based), emittedAt; meta adds companyCode, financialYear, calculationDate, timeZone, options; done adds elapsedMs
Errors
before the stream: 404 NOT_FOUND field groupIds, 422 BUSY_GROUP_HIERARCHY_INVALID, and every ordinary error as JSON; after it starts: row_error lines (the stream continues) or one final fatal_error line
Notes
The only streaming route. Pre-stream failures are ordinary JSON errors; the HTTP status is 200 once the first line is sent.
Request
curl -X POST \ https://api.aizeny.com/v1/credit-line/line-stage-stream \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","customerIds":[1001,1002],"billByBillMode":"standard"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
Inventory and ageing
3Inventory daybooks, receivables ageing and serial-number stock ageing.
POST
Inventory daybooks
/v1/inventory-daybooksPOST
https://api.aizeny.com/v1/inventory-daybooksNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — request a shorter fromDate–toDate range
Request body
companyCode (string), financialYear (four-digit string), fromDate and toDate (YYYY-MM-DD).
Inventory daybooks: request members Member Type Required Notes companyCode string Required — financialYear string Required — fromDate string — — toDate string — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of { date, voucher_type, voucher_number, particular, item, quantity, unit }
metadata: apiVersion, operation, requestId, companyCode, financialYear, fromDate, toDate, rowCount, elapsedMs, executedAt
Notes
Both dates are required and must lie in the year; the answer is complete, not paged.
Request
curl -X POST \ https://api.aizeny.com/v1/inventory-daybooks \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","fromDate":"2026-04-01","toDate":"2026-04-30"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Receivables ageing analysis
/v1/ageing-analysis-receivablesPOST
https://api.aizeny.com/v1/ageing-analysis-receivablesNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- statusDate endDate
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — narrow startDate–endDate
Request body
companyCode (string), financialYear (four-digit string), customerId (number) or accountName (string), startDate and endDate (YYYY-MM-DD), and optionally statusDate (YYYY-MM-DD).
Receivables ageing analysis: request members Member Type Required Notes companyCode string Required — financialYear string Required — customerId integer — — accountName string — — startDate string — — endDate string — — statusDate string — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of pending bills with age buckets { reference_number, transaction_type, dates, total_amount, pending_amount, age_0_30_days … age_151_plus_days, age_days, ref_code, voucher_code, voucher_type, voucher_series_code, signed_balance }
metadata: apiVersion, operation, requestId, companyCode, financialYear, customerId, selectedBy, startDate, endDate, statusDate, rowCount, elapsedMs, executedAt
Errors
404 NOT_FOUND field customerId or accountName; 422 BUSY_DATA_INCONSISTENT (ambiguous accountName, repeated records)
Notes
Exactly one of customerId or accountName. statusDate defaults to endDate on the PC.
Request
curl -X POST \ https://api.aizeny.com/v1/ageing-analysis-receivables \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","customerId":1001,"startDate":"2026-04-01","endDate":"2026-09-30"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Serial-number stock ageing
/v1/stock-aging-receivable-issuablePOST
https://api.aizeny.com/v1/stock-aging-receivable-issuableNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- asOnDate today in India (the PC clock); productId and materialCenterId none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — filter by productId or materialCenterId
Request body
companyCode (string), financialYear (four-digit string), and optionally asOnDate (YYYY-MM-DD), productId and materialCenterId (numbers).
Serial-number stock ageing: request members Member Type Required Notes companyCode string Required — financialYear string Required — asOnDate string — — productId integer — — materialCenterId integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { rows: [ per product and material centre: brands, location, prices, oldest serials and dates, quantity, ages ], summary: { … } }
metadata: apiVersion, operation, requestId, companyCode, financialYear, asOnDate, asOnDateSource, timeZone, productId, materialCenterId, rowCount, transactionCount, elapsedMs, executedAt
Errors
404 NOT_FOUND field productId or materialCenterId; 422 BUSY_DATA_INCONSISTENT
Notes
asOnDate defaults to today in India on the PC; if that day is outside the selected year the PC answers 400 asOnDate.
Request
curl -X POST \ https://api.aizeny.com/v1/stock-aging-receivable-issuable \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","asOnDate":"2026-09-30"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
Unbilled customers and profile
2Customers without a bill in a window, and one unbilled customer’s profile.
POST
Unbilled customers
/v1/unbilled-customersPOST
https://api.aizeny.com/v1/unbilled-customersNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- asOnDate today in India (the PC clock); no billing filter
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — send a billing filter
Request body
companyCode (string), financialYear (four-digit string), and optionally asOnDate (YYYY-MM-DD), billingMode (positive or negative) with billingRule (lastBill or anyBill) and billingWindow (7_days, 30_days, quarter, 6_months or custom), and customDays (number) only with custom.
Unbilled customers: request members Member Type Required Notes companyCode string Required — financialYear string Required — asOnDate string — — billingMode string — — billingRule string — — billingWindow string — — customDays integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: array of Sundry Debtors { customer_id, customer_name, groups, mobile_number, last/first bills and receipts (date, days, amount), closing_balance, closing_balance_type, closing_balance_display, closing_signed } (unpaged; amounts as two-decimal strings)
metadata: apiVersion, operation, requestId, companyCode, financialYear, asOnDate, asOnDateSource, timeZone, financialYearStart, billingMode, billingRule, billingWindow, customDays, windowStartDate, windowEndDate, rowCount, elapsedMs, executedAt
Notes
Without a filter: customers not billed on asOnDate. A filter is billingMode + billingRule + billingWindow (customDays only with custom).
Request
curl -X POST \ https://api.aizeny.com/v1/unbilled-customers \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","asOnDate":"2026-09-30","billingMode":"negative","billingRule":"lastBill","billingWindow":"30_days"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Unbilled customer profile (one or more years)
/v1/unbilled-customer-profileSeveral yearsSeveral yearsPOST
https://api.aizeny.com/v1/unbilled-customer-profileNot pagedJSON answerSeveral years
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear + additionalFinancialYear (every year allowed on the PC)- Defaults
- additionalFinancialYear none; no period; type standard; reference date toDate, else today in India (the PC clock)
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — narrow fromDate/toDate or request fewer years
Request body
companyCode (string), financialYear (four-digit string) and customerId (number), and optionally additionalFinancialYear (string of comma-separated four-digit years), fromDate and toDate together (YYYY-MM-DD) and type (standard or FIFO).
Unbilled customer profile (one or more years): request members Member Type Required Notes companyCode string Required — financialYear string Required — customerId integer — — additionalFinancialYear string — — fromDate string — — toDate string — — type string — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { profile: { … }, analytics: { … }, trends: { monthly_sales_amount, monthly_receipt_amount, monthly_bill_count, monthly_collection_count }, transactions: [ … ], pending_bills: [ … ], due_bills: [ … ] }
metadata: apiVersion, operation, requestId, companyCode, financialYear, financialYears, customerId, fromDate, toDate, referenceDate, referenceDateSource, timeZone, pendingBillsType, snapshotFinancialYear, rowCount, pendingBillCount, dueBillCount, elapsedMs, executedAt
Notes
Balances and bills come from the snapshot year: the latest requested year starting on or before the reference date (toDate, else today in India on the PC).
Request
curl -X POST \ https://api.aizeny.com/v1/unbilled-customer-profile \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","customerId":1001,"additionalFinancialYear":"2025","type":"standard"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
Customer discounts
1One customer’s discounts per product group.
POST
Customer product-group discounts
/v1/customer-product-group-discountsPagedPagedPOST
https://api.aizeny.com/v1/customer-product-group-discountsPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100)
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), customerId (number) or customerName (string), and optionally page and pageSize (numbers).
Customer product-group discounts: request members Member Type Required Notes companyCode string Required — financialYear string Required — customerId integer — — customerName string — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { rows: [ { discount_row_id, customer_id, customer_name, customer_alias, product_group_id, product_group_name, product_group_alias, effective_date, mrp, sale_price, sale_price_du, discount_percent, compound_discount_percent, d6_raw, d8_raw, d9_raw, c1_raw, c2_raw } ] }
metadata: apiVersion, operation, requestId, companyCode, financialYear, customerId, selectedBy, page, pageSize, totalRows, rowCount, hasMore, elapsedMs, executedAt
Errors
404 NOT_FOUND field customerId or customerName; 422 BUSY_DATA_INCONSISTENT (ambiguous customerName)
Notes
Exactly one of customerId or customerName (name, alias or alternate name).
Request
curl -X POST \ https://api.aizeny.com/v1/customer-product-group-discounts \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","customerId":1001}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
Custom SQL
1One page of your own read-only SELECT, validated on the PC.
POST
Execute one read-only SELECT
/v1/execute-custom-sqlPagedPagedPOST
https://api.aizeny.com/v1/execute-custom-sqlPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- parameters none; page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100), page × pageSize ≤ 100000; no total count
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), query (string: one read-only SELECT), and optionally parameters (object of scalar values), page and pageSize (numbers).
Execute one read-only SELECT: request members Member Type Required Notes companyCode string Required — financialYear string Required — query string — — parameters object of scalar values — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { columns: [ { name, type } ], rows: [ [ cell, … ] ] } (positional rows)
metadata: apiVersion, operation, requestId, companyCode, financialYear, provider, queryFingerprint, parameterCount, page, pageSize, returnedRowCount, columnCount, hasMore, elapsedMs, executedAt
Errors
400 CUSTOM_SQL_REJECTED field query (the PC's provider-specific read-only boundary); 400 INVALID_PARAMETER field parameters (a placeholder without a value, or a value without a placeholder — decided on the PC); 422 CUSTOM_SQL_FAILED; 422 RESULT_TOO_LARGE (256 columns, 32768 characters per value, 4000000 per page), 422 UNSUPPORTED_VALUE
Notes
Write SQL for the company's own database type (SQL Server or Access); values bind to @name placeholders and are never written into the text. Stable pages need ORDER BY.
Request
curl -X POST \ https://api.aizeny.com/v1/execute-custom-sql \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","query":"SELECT Code, Name FROM Master1 WHERE MasterType = @type ORDER BY Code","parameters":{"type":2},"page":1,"pageSize":100}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
Custom named reports
1A built-in report or one of the PC’s saved custom queries, by name.
POST
Run a named report from the local registry
/v1/execute-custom-queryPagedPagedPOST
https://api.aizeny.com/v1/execute-custom-queryPagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- parameters none (built-in: branchId none = every material centre; asOnDate today UTC on the PC; saved: undeclared optional values bind NULL on the PC); page 1; pageSize 100
- Paging
- page ≥ 1 (default 1), pageSize 1–500 (default 100); a saved query also page × pageSize ≤ 100000
- Size
- Each answer at most 2 MiB; a larger page is 502 RESPONSE_TOO_LARGE, never truncated — lower pageSize
Request body
companyCode (string), financialYear (four-digit string), queryName (string: a built-in report or a saved query), and optionally parameters (object), page and pageSize (numbers).
Run a named report from the local registry: request members Member Type Required Notes companyCode string Required — financialYear string Required — queryName string — — parameters object of scalar values — — page integer — — pageSize integer — — script string Optional the name of a response-transform variant on the PC (never a credential or a scope) Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { columns: [ { name, type } ], rows: [ [ cell, … ] ] }
metadata: apiVersion, operation, requestId, companyCode, financialYear, provider, queryName, page, pageSize, returnedRowCount, columnCount, hasMore, elapsedMs, executedAt, querySource (builtIn or saved)
Errors
404 NOT_FOUND field queryName (built-in: decided in the cloud; a well-formed saved name the PC does not hold: decided on the PC); 400 INVALID_PARAMETER field queryName (a saved name that breaks the name rule, decided in the cloud) or parameters; 409 SAVED_QUERY_PROVIDER_MISSING field queryName (no definition for the company database type); 409 SAVED_QUERY_INVALID field queryName; 422 CUSTOM_SQL_FAILED; 422 BUSY_DATA_INCONSISTENT; 422 RESULT_TOO_LARGE (256 columns, 32768 characters per value, 4000000 per page), 422 UNSUPPORTED_VALUE
Notes
Built-in reports: stock_aging_fifo (parameters branchId, asOnDate) and stock_status_with_mc_name and its aliases (parameter branchId). Any other name is a customer-saved query on the PC: trimmed, each whitespace run becomes -, then ^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$ (Top Debtors → Top-Debtors); parameters are scalar values checked against the saved declarations on the PC. Saved queries are created and managed only on the PC.
Request
curl -X POST \ https://api.aizeny.com/v1/execute-custom-query \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","queryName":"stock_status_with_mc_name","parameters":{"branchId":0}}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
Custom named scripts
1One of the PC’s named customer scripts, run on the PC for one company and year.
POST
Run a named customer script
/v1/execute-scriptPOST
https://api.aizeny.com/v1/execute-scriptNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- parameters {} when absent (the script reads them)
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — the script decides the size of its answer; return less
Request body
companyCode (string), financialYear (four-digit string), scriptName (string), and optionally parameters (object).
Run a named customer script: request members Member Type Required Notes companyCode string Required — financialYear string Required — scriptName string — — parameters object — any JSON values, numbers kept exactly Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: the script’s own answer: a JSON object or array (never a scalar)
metadata: apiVersion, operation, requestId, companyCode, financialYear, script { name, revision }, calls, httpRequests, elapsedMs, executedAt
Errors
404 SCRIPT_NOT_FOUND field scriptName; 409 SCRIPT_NOT_ASSIGNED / SCRIPT_DISABLED / SCRIPT_INVALID field scriptName; 422 SCRIPT_FAILED, SCRIPT_OUTPUT_INVALID, SCRIPT_OUTPUT_TOO_LARGE, SCRIPT_INPUT_TOO_LARGE, SCRIPT_LIMIT_EXCEEDED, SCRIPT_RECURSION; 403 SCRIPT_SCOPE_DENIED (a nested call named another company or year); 504 SCRIPT_TIMEOUT
Notes
The script runs on the PC with the signed company and year only; nested operations and saved queries it calls run there too, within the relay execution budget (120 s). scriptName: trimmed, each whitespace run becomes -, then ^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$. parameters: any JSON object, numbers kept exactly. Scripts are created, assigned and managed only on the PC. Not side-effect-free: a script may make outbound HTTP calls from the PC when its owner allows them. Not retry-safe: the relay sends each request to the PC once and never retries it; after a publish, RELAY_TIMEOUT, DEVICE_ERROR and every other failure carry no retryable flag, and a client that retries after a timeout may run the script, and its effects, twice. Send an Idempotency-Key to make such a retry refused (409) instead of run again.
Request
curl -X POST \ https://api.aizeny.com/v1/execute-script \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","scriptName":"Debtor-Summary","parameters":{"minAmount":1000}}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
Report PDFs
4One account’s Account Ledger, Bills Receivable, Bills Payable or Payment Reminder, printed to PDF by BUSY on the PC (relayed up to about 1.5 MB of PDF).
POST
Account Ledger PDF
/v1/account-ledger-pdfPOST
https://api.aizeny.com/v1/account-ledger-pdfNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- fromDate absent = 1 April of the year; toDate absent = 31 March of the year
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — the PC prints a report PDF of up to 8 MiB (else 422 RESULT_TOO_LARGE), but a relayed answer — base64 and envelope included — is limited to 2 MiB (2097152 bytes), so only PDFs up to about 1.5 MB arrive through the cloud; a larger one is 502 RESPONSE_TOO_LARGE, never truncated and never replaced by a download link. Narrow the period (ledger) or print it through the PC's Local API
Request body
companyCode (string), financialYear (four-digit string), account ({"code": number} or {"name": string}), and optionally fromDate and toDate (YYYY-MM-DD strings inside the financial year).
Account Ledger PDF: request members Member Type Required Notes companyCode string Required — financialYear string Required — account object — — fromDate string — — toDate string — — Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { fileName (AccountLedger-<companyCode>-<financialYear>-<account code>-<fromDate>-<toDate>.pdf; a name only, never the account's name), mimeType ("application/pdf"), byteLength (bytes of the PDF), sha256 (lower-case hex of the PDF), pages, contentBase64 (the whole PDF as standard base64, RFC 4648 section 4, no line breaks; decoded back and its SHA-256 compared on the PC before the answer) }
metadata: apiVersion, operation, requestId, companyCode, financialYear, report ("accountLedger"), busyReportId (19), account { code, name }, fromDate, toDate, elapsedMs, executedAt
Errors
400 INVALID_PARAMETER field fromDate / toDate (not a real YYYY-MM-DD, outside the selected financial year, or toDate before fromDate); 400 INVALID_PARAMETER field account / account.code / account.name, and the dates and options of the route (the message names the rule; a sent value is never repeated), script (no transform applies to a PDF); 400 BAD_REQUEST for an unknown member; 404 NOT_FOUND field account (no account master with that code or name: a group's or an item's code is not an account); 409 BUSY_REPORT_PROVIDER_UNSUPPORTED (an Access company), 409 BUSY_REPORT_ACCOUNT_CHANGED field account (BUSY's own lookup no longer gives the account just before printing; nothing printed), 409 BUSY_COM_SIGN_IN_UNSUPPORTED (the company signs in to SQL Server with Windows); 422 MASTER_REFERENCE_AMBIGUOUS field account (another account holds the name as its name or alias: BUSY's report finds its account by name or alias), 422 BUSY_DATA_INCONSISTENT field account (a duplicate code, or a stored name BUSY's report cannot be given safely), 422 RESULT_TOO_LARGE (the PDF is over 8 MiB on the PC), 422 BUSY_COM_PDF_BLANK; 502 RESPONSE_TOO_LARGE (the relayed answer would exceed 2 MiB: never truncated), 502 BUSY_COM_PDF_FAILED, BUSY_COM_HELPER_FAILED, BUSY_COM_PDF_MISSING, BUSY_COM_PDF_INVALID (retryable); 503 BUSY_COM_DEFAULT_PRINTER_MISSING, BUSY_COM_NOT_REGISTERED, BUSY_COM_INSTALLATION_INVALID, BUSY_COM_FOLDER_NOT_WRITABLE, BUSY_COM_RUNTIME_MISSING, BUSY_COM_HELPER_MISSING (fix the PC; not retryable), BUSY_UNAVAILABLE; 503 BUSY_CREDENTIAL_UNAVAILABLE, BUSY_COM_OPEN_FAILED, BUSY_COM_QUEUE_TIMEOUT (retryable); 504 BUSY_COM_TIMEOUT (retryable)
Notes
One account's Account Ledger (BUSY report 19) for fromDate to toDate inside the selected financial year: the opening balance at fromDate, every entry of the period with its running balance, the totals and the closing balance, narrations under their lines. Dates are checked before BUSY (BUSY itself validates none of them). BUSY's own report printing on the organization's PC prints the report and the answer returns the file; the cloud neither makes, stores, changes nor logs the PDF. Read only: AI Zeny writes nothing to BUSY, so a failed or timed-out call may be repeated (AI Zeny itself never repeats it). account: exactly one of { "code": n } (1-2147483647) or { "name": "…" } (1-60 characters, compared without case and surrounding spaces); an account master only, refused when another account holds its name as a name or alias. Layout, background mark and options are BUSY's own; there is no all-accounts, group or column option. SQL Server companies with a SQL login only. Decode data.contentBase64 to get the file; data.byteLength and data.sha256 describe the decoded bytes. The PC prints one BUSY job at a time (shared with voucher PDFs and writes), usually in a few seconds; a request waiting behind others shares the 120 s relay budget and otherwise ends as a retryable timeout. No script member: a PDF is never transformed. Needs an AI Zeny version on the PC that serves the report PDFs (later than release 0.0.12); an earlier one answers 502 DEVICE_ERROR (details.deviceErrorCode REPORT_UNSUPPORTED).
Request
curl -X POST \ https://api.aizeny.com/v1/account-ledger-pdf \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","account":{"code":7101},"fromDate":"2026-04-01","toDate":"2026-06-30"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Bills Receivable PDF
/v1/bills-receivable-pdfPOST
https://api.aizeny.com/v1/bills-receivable-pdfNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- asOfDate absent = today in India, or the year's last or first day when today is outside the year (decided on the PC); status absent = pending
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — the PC prints a report PDF of up to 8 MiB (else 422 RESULT_TOO_LARGE), but a relayed answer — base64 and envelope included — is limited to 2 MiB (2097152 bytes), so only PDFs up to about 1.5 MB arrive through the cloud; a larger one is 502 RESPONSE_TOO_LARGE, never truncated and never replaced by a download link. Narrow the period (ledger) or print it through the PC's Local API
Request body
companyCode (string), financialYear (four-digit string), account ({"code": number} or {"name": string}), and optionally asOfDate (YYYY-MM-DD string inside the financial year) and status ("pending", "overdue" or "all").
Bills Receivable PDF: request members Member Type Required Notes companyCode string Required — financialYear string Required — account object — — asOfDate string — — status string — — Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { fileName (BillsReceivable-<companyCode>-<financialYear>-<account code>-<asOfDate>-<status>.pdf; a name only, never the account's name), mimeType ("application/pdf"), byteLength (bytes of the PDF), sha256 (lower-case hex of the PDF), pages, contentBase64 (the whole PDF as standard base64, RFC 4648 section 4, no line breaks; decoded back and its SHA-256 compared on the PC before the answer) }
metadata: apiVersion, operation, requestId, companyCode, financialYear, report ("billsReceivable"), busyReportId (201), account { code, name }, asOfDate, status, elapsedMs, executedAt
Errors
400 INVALID_PARAMETER field asOfDate (not a real YYYY-MM-DD or outside the selected financial year), status (not pending, overdue or all, exact case); 422 REPORT_ACCOUNT_NOT_BILL_BY_BILL field account (BUSY does not keep the account bill by bill: use the Account Ledger PDF); 400 INVALID_PARAMETER field account / account.code / account.name, and the dates and options of the route (the message names the rule; a sent value is never repeated), script (no transform applies to a PDF); 400 BAD_REQUEST for an unknown member; 404 NOT_FOUND field account (no account master with that code or name: a group's or an item's code is not an account); 409 BUSY_REPORT_PROVIDER_UNSUPPORTED (an Access company), 409 BUSY_REPORT_ACCOUNT_CHANGED field account (BUSY's own lookup no longer gives the account just before printing; nothing printed), 409 BUSY_COM_SIGN_IN_UNSUPPORTED (the company signs in to SQL Server with Windows); 422 MASTER_REFERENCE_AMBIGUOUS field account (another account holds the name as its name or alias: BUSY's report finds its account by name or alias), 422 BUSY_DATA_INCONSISTENT field account (a duplicate code, or a stored name BUSY's report cannot be given safely), 422 RESULT_TOO_LARGE (the PDF is over 8 MiB on the PC), 422 BUSY_COM_PDF_BLANK; 502 RESPONSE_TOO_LARGE (the relayed answer would exceed 2 MiB: never truncated), 502 BUSY_COM_PDF_FAILED, BUSY_COM_HELPER_FAILED, BUSY_COM_PDF_MISSING, BUSY_COM_PDF_INVALID (retryable); 503 BUSY_COM_DEFAULT_PRINTER_MISSING, BUSY_COM_NOT_REGISTERED, BUSY_COM_INSTALLATION_INVALID, BUSY_COM_FOLDER_NOT_WRITABLE, BUSY_COM_RUNTIME_MISSING, BUSY_COM_HELPER_MISSING (fix the PC; not retryable), BUSY_UNAVAILABLE; 503 BUSY_CREDENTIAL_UNAVAILABLE, BUSY_COM_OPEN_FAILED, BUSY_COM_QUEUE_TIMEOUT (retryable); 504 BUSY_COM_TIMEOUT (retryable)
Notes
One account's Bills Receivable report (BUSY report 201, receivable side): its receivable bill references as on asOfDate — status pending = every bill still outstanding, overdue = outstanding and due on or before asOfDate, all = every bill reference, settled ones with pending 0. The account must be kept bill by bill in BUSY. Advances, other credit references and on-account entries are not in this report. BUSY's own report printing on the organization's PC prints the report and the answer returns the file; the cloud neither makes, stores, changes nor logs the PDF. Read only: AI Zeny writes nothing to BUSY, so a failed or timed-out call may be repeated (AI Zeny itself never repeats it). account: exactly one of { "code": n } (1-2147483647) or { "name": "…" } (1-60 characters, compared without case and surrounding spaces); an account master only, refused when another account holds its name as a name or alias. Layout, background mark and options are BUSY's own; there is no all-accounts, group or column option. SQL Server companies with a SQL login only. Decode data.contentBase64 to get the file; data.byteLength and data.sha256 describe the decoded bytes. The PC prints one BUSY job at a time (shared with voucher PDFs and writes), usually in a few seconds; a request waiting behind others shares the 120 s relay budget and otherwise ends as a retryable timeout. No script member: a PDF is never transformed. Needs an AI Zeny version on the PC that serves the report PDFs (later than release 0.0.12); an earlier one answers 502 DEVICE_ERROR (details.deviceErrorCode REPORT_UNSUPPORTED).
Request
curl -X POST \ https://api.aizeny.com/v1/bills-receivable-pdf \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","account":{"name":"Synthetic Traders"},"asOfDate":"2026-09-30","status":"overdue"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Payment Reminder PDF
/v1/payment-reminder-pdfPOST
https://api.aizeny.com/v1/payment-reminder-pdfNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- asOfDate absent = today in India, kept inside the year (decided on the PC); bills absent = pending; formatName absent = BUSY's STANDARD Payment Reminder format (else 409 BUSY_PRINT_FORMAT_MISSING); itemDetails absent = false; boldDueBills absent = true
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — the PC prints a report PDF of up to 8 MiB (else 422 RESULT_TOO_LARGE), but a relayed answer — base64 and envelope included — is limited to 2 MiB (2097152 bytes), so only PDFs up to about 1.5 MB arrive through the cloud; a larger one is 502 RESPONSE_TOO_LARGE, never truncated and never replaced by a download link. Narrow the period (ledger) or print it through the PC's Local API
Request body
companyCode (string), financialYear (four-digit string), account ({"code": number} or {"name": string}), and optionally asOfDate (YYYY-MM-DD string inside the financial year), bills ("pending" or "due"), formatName (string), itemDetails (boolean) and boldDueBills (boolean).
Payment Reminder PDF: request members Member Type Required Notes companyCode string Required — financialYear string Required — account object — — asOfDate string — — bills string — — formatName string — — itemDetails boolean — — boldDueBills boolean — — Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { fileName (PaymentReminder-<companyCode>-<financialYear>-<account code>-<asOfDate>-<bills>.pdf; a name only, never the account's name), mimeType ("application/pdf"), byteLength (bytes of the PDF), sha256 (lower-case hex of the PDF), pages, contentBase64 (the whole PDF as standard base64, RFC 4648 section 4, no line breaks; decoded back and its SHA-256 compared on the PC before the answer) }
metadata: apiVersion, operation, requestId, companyCode, financialYear, report ("paymentReminder"), busyReportId (150), account { code, name }, asOfDate, bills, formatSource ("default" \| "selected"), formatName, itemDetails, boldDueBills, elapsedMs, executedAt
Errors
400 INVALID_PARAMETER field asOfDate, bills (not pending or due, exact case), formatName (1-64 characters, no surrounding spaces or control characters); 404 NOT_FOUND field formatName (no Payment Reminder format of the company has exactly that name; the message lists the formats that exist); 409 BUSY_PRINT_FORMAT_MISSING field formatName (no formatName and no STANDARD Payment Reminder format in BUSY: one is never created); 422 REPORT_ACCOUNT_NOT_BILL_BY_BILL field account (BUSY does not keep the account bill by bill); 400 INVALID_PARAMETER field account / account.code / account.name, and the dates and options of the route (the message names the rule; a sent value is never repeated), script (no transform applies to a PDF); 400 BAD_REQUEST for an unknown member; 404 NOT_FOUND field account (no account master with that code or name: a group's or an item's code is not an account); 409 BUSY_REPORT_PROVIDER_UNSUPPORTED (an Access company), 409 BUSY_REPORT_ACCOUNT_CHANGED field account (BUSY's own lookup no longer gives the account just before printing; nothing printed), 409 BUSY_COM_SIGN_IN_UNSUPPORTED (the company signs in to SQL Server with Windows); 422 MASTER_REFERENCE_AMBIGUOUS field account (another account holds the name as its name or alias: BUSY's report finds its account by name or alias), 422 BUSY_DATA_INCONSISTENT field account (a duplicate code, or a stored name BUSY's report cannot be given safely), 422 RESULT_TOO_LARGE (the PDF is over 8 MiB on the PC), 422 BUSY_COM_PDF_BLANK; 502 RESPONSE_TOO_LARGE (the relayed answer would exceed 2 MiB: never truncated), 502 BUSY_COM_PDF_FAILED, BUSY_COM_HELPER_FAILED, BUSY_COM_PDF_MISSING, BUSY_COM_PDF_INVALID (retryable); 503 BUSY_COM_DEFAULT_PRINTER_MISSING, BUSY_COM_NOT_REGISTERED, BUSY_COM_INSTALLATION_INVALID, BUSY_COM_FOLDER_NOT_WRITABLE, BUSY_COM_RUNTIME_MISSING, BUSY_COM_HELPER_MISSING (fix the PC; not retryable), BUSY_UNAVAILABLE; 503 BUSY_CREDENTIAL_UNAVAILABLE, BUSY_COM_OPEN_FAILED, BUSY_COM_QUEUE_TIMEOUT (retryable); 504 BUSY_COM_TIMEOUT (retryable)
Notes
One customer account's Payment Reminder letter (BUSY report 150), in the tested single-account scope only: addressed to the account, it states the balance of its pending (or due) bills as on asOfDate and lists them. bills pending = every bill outstanding, due = outstanding and due on or before asOfDate. formatName: one of the company's Payment Reminder formats, exactly as named; itemDetails prints item lines under each invoice; boldDueBills prints due bills in bold. No group, all-accounts, selected-accounts, branch, series or optional-field filter. The 25-position form BUSY reads rests on the BUSY version installed when it was proven; a BUSY upgrade needs a re-check on the PC. BUSY's own report printing on the organization's PC prints the report and the answer returns the file; the cloud neither makes, stores, changes nor logs the PDF. Read only: AI Zeny writes nothing to BUSY, so a failed or timed-out call may be repeated (AI Zeny itself never repeats it). account: exactly one of { "code": n } (1-2147483647) or { "name": "…" } (1-60 characters, compared without case and surrounding spaces); an account master only, refused when another account holds its name as a name or alias. Layout, background mark and options are BUSY's own; there is no all-accounts, group or column option. SQL Server companies with a SQL login only. Decode data.contentBase64 to get the file; data.byteLength and data.sha256 describe the decoded bytes. The PC prints one BUSY job at a time (shared with voucher PDFs and writes), usually in a few seconds; a request waiting behind others shares the 120 s relay budget and otherwise ends as a retryable timeout. No script member: a PDF is never transformed. Needs an AI Zeny version on the PC that serves the report PDFs (later than release 0.0.12); an earlier one answers 502 DEVICE_ERROR (details.deviceErrorCode REPORT_UNSUPPORTED).
Request
curl -X POST \ https://api.aizeny.com/v1/payment-reminder-pdf \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","account":{"code":7101},"asOfDate":"2026-10-16","bills":"pending","itemDetails":false,"boldDueBills":true}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
POST
Bills Payable PDF
/v1/bills-payable-pdfPOST
https://api.aizeny.com/v1/bills-payable-pdfNot pagedJSON answerOne year
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear (one year)- Defaults
- asOfDate absent = today in India, or the year's last or first day when today is outside the year (decided on the PC); status absent = pending
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — the PC prints a report PDF of up to 8 MiB (else 422 RESULT_TOO_LARGE), but a relayed answer — base64 and envelope included — is limited to 2 MiB (2097152 bytes), so only PDFs up to about 1.5 MB arrive through the cloud; a larger one is 502 RESPONSE_TOO_LARGE, never truncated and never replaced by a download link. Narrow the period (ledger) or print it through the PC's Local API
Request body
companyCode (string), financialYear (four-digit string), account ({"code": number} or {"name": string}), and optionally asOfDate (YYYY-MM-DD string inside the financial year) and status ("pending", "overdue" or "all").
Bills Payable PDF: request members Member Type Required Notes companyCode string Required — financialYear string Required — account object — — asOfDate string — — status string — — Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { fileName (BillsPayable-<companyCode>-<financialYear>-<account code>-<asOfDate>-<status>.pdf; a name only, never the account's name), mimeType ("application/pdf"), byteLength (bytes of the PDF), sha256 (lower-case hex of the PDF), pages, contentBase64 (the whole PDF as standard base64, RFC 4648 section 4, no line breaks; decoded back and its SHA-256 compared on the PC before the answer) }
metadata: apiVersion, operation, requestId, companyCode, financialYear, report ("billsPayable"), busyReportId (201), account { code, name }, asOfDate, status, elapsedMs, executedAt
Errors
400 INVALID_PARAMETER field asOfDate (not a real YYYY-MM-DD or outside the selected financial year), status (not pending, overdue or all, exact case); 422 REPORT_ACCOUNT_NOT_BILL_BY_BILL field account (BUSY does not keep the account bill by bill: use the Account Ledger PDF); 400 INVALID_PARAMETER field account / account.code / account.name, and the dates and options of the route (the message names the rule; a sent value is never repeated), script (no transform applies to a PDF); 400 BAD_REQUEST for an unknown member; 404 NOT_FOUND field account (no account master with that code or name: a group's or an item's code is not an account); 409 BUSY_REPORT_PROVIDER_UNSUPPORTED (an Access company), 409 BUSY_REPORT_ACCOUNT_CHANGED field account (BUSY's own lookup no longer gives the account just before printing; nothing printed), 409 BUSY_COM_SIGN_IN_UNSUPPORTED (the company signs in to SQL Server with Windows); 422 MASTER_REFERENCE_AMBIGUOUS field account (another account holds the name as its name or alias: BUSY's report finds its account by name or alias), 422 BUSY_DATA_INCONSISTENT field account (a duplicate code, or a stored name BUSY's report cannot be given safely), 422 RESULT_TOO_LARGE (the PDF is over 8 MiB on the PC), 422 BUSY_COM_PDF_BLANK; 502 RESPONSE_TOO_LARGE (the relayed answer would exceed 2 MiB: never truncated), 502 BUSY_COM_PDF_FAILED, BUSY_COM_HELPER_FAILED, BUSY_COM_PDF_MISSING, BUSY_COM_PDF_INVALID (retryable); 503 BUSY_COM_DEFAULT_PRINTER_MISSING, BUSY_COM_NOT_REGISTERED, BUSY_COM_INSTALLATION_INVALID, BUSY_COM_FOLDER_NOT_WRITABLE, BUSY_COM_RUNTIME_MISSING, BUSY_COM_HELPER_MISSING (fix the PC; not retryable), BUSY_UNAVAILABLE; 503 BUSY_CREDENTIAL_UNAVAILABLE, BUSY_COM_OPEN_FAILED, BUSY_COM_QUEUE_TIMEOUT (retryable); 504 BUSY_COM_TIMEOUT (retryable)
Notes
One account's Bills Payable report (BUSY report 201, payable side): its payable bill references as on asOfDate, status pending, overdue or all as for the Bills Receivable PDF. Values as BUSY prints them (an over-settled reference shows a negative pending amount); the supplier's advances and other debit references are not in it and are never netted. The account must be kept bill by bill in BUSY. BUSY's own report printing on the organization's PC prints the report and the answer returns the file; the cloud neither makes, stores, changes nor logs the PDF. Read only: AI Zeny writes nothing to BUSY, so a failed or timed-out call may be repeated (AI Zeny itself never repeats it). account: exactly one of { "code": n } (1-2147483647) or { "name": "…" } (1-60 characters, compared without case and surrounding spaces); an account master only, refused when another account holds its name as a name or alias. Layout, background mark and options are BUSY's own; there is no all-accounts, group or column option. SQL Server companies with a SQL login only. Decode data.contentBase64 to get the file; data.byteLength and data.sha256 describe the decoded bytes. The PC prints one BUSY job at a time (shared with voucher PDFs and writes), usually in a few seconds; a request waiting behind others shares the 120 s relay budget and otherwise ends as a retryable timeout. No script member: a PDF is never transformed. Needs an AI Zeny version on the PC that serves the report PDFs (later than release 0.0.12); an earlier one answers 502 DEVICE_ERROR (details.deviceErrorCode REPORT_UNSUPPORTED).
Request
curl -X POST \ https://api.aizeny.com/v1/bills-payable-pdf \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","account":{"name":"Synthetic Supplies"},"asOfDate":"2026-10-16","status":"all"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.
Customer integrations
1The status of one customer-integration run started through the Cloud Relay: its state, each child write’s outcome and the script’s output.
POST
Integration run status
/v1/integration-run-statusSeveral yearsSeveral yearsPOST
https://api.aizeny.com/v1/integration-run-statusNot pagedJSON answerSeveral years
Answer:
application/json- Company and years
companyCode(1–32 of A–Z, 0–9,-,_, upper-cased); financialYear + additionalFinancialYear (every year allowed on the PC)- Defaults
- none
- Paging
- none
- Size
- Unpaged: an answer above 2 MiB is 502 RESPONSE_TOO_LARGE, never truncated — up to the relay's 2 MiB; a larger run record is 502 RESPONSE_TOO_LARGE, never truncated
Request body
companyCode, financialYear, runId.
Integration run status: request members Member Type Required Notes companyCode string Required — financialYear string Required — runId string — — additionalFinancialYear string — — Required and Optional are marked only where the shared conventions or this reference say so.
Response
data: { run { id, integrationId, companyCode, financialYear, reference (the runReference), revision, status ("accepted" \| "running" \| "awaiting" \| "succeeded" \| "partial" \| "failed" \| "interrupted" \| "cancelled" \| "needs_review"), active, createdUtc, updatedUtc, stateVersion, origin }, items [ { intentId, generation, operation, key (the original external key), contentHash, result { state, jobId, data, metadata, error { code, message, field, details, status } }, noWriteProven } ], output, failure } — the PC's record; a script's own success value is not the run's outcome
metadata: apiVersion, operation, requestId
Errors
400 INTEGRATION_INVALID (companyCode, financialYear and runId are required), 404 INTEGRATION_NOT_FOUND (no such run); 403 INTEGRATION_SCOPE_DENIED (the run belongs to another company or year, or its accepted read scope is wider than the years signed: send additionalFinancialYear with them); 409 INTEGRATION_REVIEW_REQUIRED (a terminal run or attempt has no protected proof: review it on the PC), 503 INTEGRATION_UNAVAILABLE
Notes
Reads one customer-integration run of the company and financial year (the PC must be online): its state, each child write's outcome (with its BUSY job id, the original external key and generation, and whether no write is proven) and the script's output or failure. A run id is not a voucher id or a queue job id. Unknown members are ignored, as on the PC. additionalFinancialYear (comma-separated four-digit years) signs the other years a run reads; the PC refuses a run whose accepted read scope is wider than the years signed. Read only.
Request
curl -X POST \ https://api.aizeny.com/v1/integration-run-status \ -H "Authorization: Bearer az_pat_…" \ -H "Content-Type: application/json" \ -d '{"companyCode":"COMP0001","financialYear":"2026","runId":"0123456789abcdef0123456789abcdef"}'Response
{ "success": true, "data": [ { "customer_id": 1001, "customer_name": "Synthetic Traders" } ], "metadata": { "apiVersion": "v1", "operation": "busy.customers.list", "requestId": "rq_…", "companyCode": "COMP0001", "financialYear": "2025", "rowCount": 1, "elapsedMs": 42, "executedAt": "2025-10-31T06:30:00.000Z" } }Synthetic values. The envelope is the same on every route.