Skip to content

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 companyCode and a four-digit financialYear.
  • 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 is 504 WRITE_RESULT_UNKNOWN, never a success.
  • Paged operations take page (from 1, default 1) and pageSize (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 done line.

73 operations

Masters

10

Units, branches, categories, product groups, material centres, sale types, salesmen, voucher series, item parameters and optional-field definitions.

  • Units of measure

    /v1/busy/units/queryPaged

    POSThttps://api.aizeny.com/v1/busy/units/query

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    searchstring——
    pageinteger—a numeric string is also read
    pageSizeinteger—a numeric string is also read
    scriptstringOptionalthe 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 }

    Errors

    422 RESULT_TOO_LARGE (more than 1000 units)

    See every error code

    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.

  • Branches

    /v1/branches

    POSThttps://api.aizeny.com/v1/branches

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • Categories

    /v1/categories

    POSThttps://api.aizeny.com/v1/categories

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • Product groups

    /v1/product-groups

    POSThttps://api.aizeny.com/v1/product-groups

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • Material centres

    /v1/material-centers

    POSThttps://api.aizeny.com/v1/material-centers

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • Sale types

    /v1/sale-types

    POSThttps://api.aizeny.com/v1/sale-types

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • Salesmen

    /v1/salesmen

    POSThttps://api.aizeny.com/v1/salesmen

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • Voucher series

    /v1/voucher-series

    POSThttps://api.aizeny.com/v1/voucher-series

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • Item parameters

    /v1/parameters

    POSThttps://api.aizeny.com/v1/parameters

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • Optional-field definitions

    /v1/optional-field-definitions

    POSThttps://api.aizeny.com/v1/optional-field-definitions

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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

4

The product list, one page of products, product search and configured optional product fields.

  • Products

    /v1/products

    POSThttps://api.aizeny.com/v1/products

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    materialCenterIdsarray of integers——
    includePendingSalesOrderboolean——
    inStockOnlyboolean——
    parametersStockboolean——
    optionalFieldsboolean——
    erpCategoriesboolean——
    priceCategoryinteger——
    scriptstringOptionalthe 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 }

    Errors

    the shared mapping only

    See every error code

    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.

  • Products, one page

    /v1/products-paginationPaged

    POSThttps://api.aizeny.com/v1/products-pagination

    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 (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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    materialCenterIdsarray of integers——
    includePendingSalesOrderboolean——
    inStockOnlyboolean——
    parametersStockboolean——
    optionalFieldsboolean——
    erpCategoriesboolean——
    priceCategoryinteger——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • Configured optional product fields

    /v1/products-of-config

    POSThttps://api.aizeny.com/v1/products-of-config

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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

4

Product and customer group hierarchies, price-category prices and latest date-wise prices.

  • Product group hierarchy

    /v1/product-groups-hierarchy

    POSThttps://api.aizeny.com/v1/product-groups-hierarchy

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    rootGroupIdinteger——
    scriptstringOptionalthe 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)

    See every error code

    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.

  • Price-category prices

    /v1/products-multiple-prices

    POSThttps://api.aizeny.com/v1/products-multiple-prices

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    priceCategoriesarray of integers——
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • Latest date-wise prices

    /v1/products-multiple-prices-datewise

    POSThttps://api.aizeny.com/v1/products-multiple-prices-datewise

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • Customer group hierarchy

    /v1/customer-groups-hierarchy

    POSThttps://api.aizeny.com/v1/customer-groups-hierarchy

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    rootGroupIdinteger——
    scriptstringOptionalthe 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

    Errors

    404 NOT_FOUND field rootGroupId; 422 BUSY_GROUP_HIERARCHY_INVALID

    See every error code

    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

4

Customers, one customer, and whether a WhatsApp number or e-mail address belongs to a customer.

  • Customers

    /v1/customers

    POSThttps://api.aizeny.com/v1/customers

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    pendingSalesOrderOnlyboolean——
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • One customer

    /v1/customer

    POSThttps://api.aizeny.com/v1/customer

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    customerIdinteger——
    scriptstringOptionalthe 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

    Errors

    404 NOT_FOUND field customerId; 422 BUSY_DATA_INCONSISTENT

    See every error code

    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.

  • Is this WhatsApp number a customer?

    /v1/validate-whatsapp

    POSThttps://api.aizeny.com/v1/validate-whatsapp

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    whatsappNumberstring——
    scriptstringOptionalthe 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)

    Errors

    the shared mapping only

    See every error code

    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.

  • Is this e-mail address a customer?

    /v1/validate-email

    POSThttps://api.aizeny.com/v1/validate-email

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    emailAddressstring——
    scriptstringOptionalthe 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)

    Errors

    the shared mapping only

    See every error code

    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

7

Customer dashboard, pending bills, bill-wise statement, suppliers, supplier ledger and supplier pending bills.

  • Customer dashboard

    /v1/customer-dashboard

    POSThttps://api.aizeny.com/v1/customer-dashboard

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    customerIdinteger——
    scriptstringOptionalthe 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

    Errors

    404 NOT_FOUND field customerId; 422 BUSY_DATA_INCONSISTENT

    See every error code

    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.

  • Customers with pending bills

    /v1/customers-pending-bills

    POSThttps://api.aizeny.com/v1/customers-pending-bills

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • One customer's pending bills

    /v1/customer-pending-bills

    POSThttps://api.aizeny.com/v1/customer-pending-bills

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    customerIdinteger——
    isDueboolean——
    scriptstringOptionalthe 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

    Errors

    422 BUSY_DATA_INCONSISTENT

    See every error code

    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.

  • Bill-wise statement

    /v1/customer-bill-wise-statement

    POSThttps://api.aizeny.com/v1/customer-bill-wise-statement

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    customerIdinteger——
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • Suppliers

    /v1/suppliersPaged

    POSThttps://api.aizeny.com/v1/suppliers

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    supplierIdinteger——
    searchstring——
    includeContactDetailsboolean——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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)

    See every error code

    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.

  • Supplier ledger

    /v1/supplier-ledgerPaged

    POSThttps://api.aizeny.com/v1/supplier-ledger

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    supplierIdinteger——
    fromDatestring——
    toDatestring——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • Supplier pending bills

    /v1/supplier-pending-billsPaged

    POSThttps://api.aizeny.com/v1/supplier-pending-bills

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    supplierIdinteger——
    statusstring——
    includeCreditsboolean——
    asOfDatestring——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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

9

Customer and item ledgers, sales analyses, product analytics, day-end reports and account summaries.

  • Customer ledger (one or more years)

    /v1/customer-ledgerSeveral years

    POSThttps://api.aizeny.com/v1/customer-ledger

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    additionalFinancialYearstring——
    customerIdinteger——
    startDatestring——
    endDatestring——
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • Single item ledger

    /v1/single-item-ledgerPaged

    POSThttps://api.aizeny.com/v1/single-item-ledger

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    productIdinteger——
    fromDatestring——
    toDatestring——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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

    Errors

    404 NOT_FOUND field productId

    See every error code

    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.

  • One item's sales per customer

    /v1/sales-analysis-single-itemPaged

    POSThttps://api.aizeny.com/v1/sales-analysis-single-item

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    productIdinteger——
    fromDatestring——
    toDatestring——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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

    Errors

    404 NOT_FOUND field productId

    See every error code

    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.

  • One customer's sales per product

    /v1/sales-analysis-single-customerPaged

    POSThttps://api.aizeny.com/v1/sales-analysis-single-customer

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    customerIdinteger——
    fromDatestring——
    toDatestring——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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

    Errors

    404 NOT_FOUND field customerId

    See every error code

    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.

  • Customer's active and dropped products (one or more years)

    /v1/customer-product-analyticsPagedSeveral years

    POSThttps://api.aizeny.com/v1/customer-product-analytics

    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; 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    additionalFinancialYearstring——
    customerIdinteger——
    fromDatestring——
    toDatestring——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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

    Errors

    404 NOT_FOUND field customerId

    See every error code

    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.

  • Day-end summary

    /v1/day-end-report-summary

    POSThttps://api.aizeny.com/v1/day-end-report-summary

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    datestring——
    startDatestring——
    endDatestring——
    cashMasterCodeinteger——
    scriptstringOptionalthe 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

    Errors

    422 BUSY_DATA_INCONSISTENT (a repeated master code)

    See every error code

    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.

  • Day-end detailed report

    /v1/day-end-report-detailed

    POSThttps://api.aizeny.com/v1/day-end-report-detailed

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    datestring——
    startDatestring——
    endDatestring——
    scriptstringOptionalthe 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

    Errors

    422 BUSY_DATA_INCONSISTENT (a repeated master code)

    See every error code

    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.

  • Account monthly summary

    /v1/account-monthly-summaryPaged

    POSThttps://api.aizeny.com/v1/account-monthly-summary

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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

    Errors

    422 BUSY_DATA_INCONSISTENT (a repeated master code)

    See every error code

    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.

  • Account consolidated summary

    /v1/account-consolidated-summaryPaged

    POSThttps://api.aizeny.com/v1/account-consolidated-summary

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    fromDatestring——
    toDatestring——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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

    Errors

    422 BUSY_DATA_INCONSISTENT (a repeated master code)

    See every error code

    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

18

Sales, purchase, return, payment, receipt, journal and contra registers, pending orders, sale invoices and voucher PDFs (sales and purchase invoices and returns, receipts, payments).

  • Purchase register, product lines

    /v1/purchase-register-productsPaged

    POSThttps://api.aizeny.com/v1/purchase-register-products

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    fromDatestring——
    toDatestring——
    supplierIdinteger——
    productIdinteger——
    voucherIdinteger——
    materialCenterIdinteger——
    includeReturnsboolean——
    includeCancelledboolean——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • Pending purchase orders

    /v1/pending-purchase-ordersPaged

    POSThttps://api.aizeny.com/v1/pending-purchase-orders

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    fromDatestring——
    toDatestring——
    asOfDatestring——
    supplierIdinteger——
    productIdinteger——
    referenceNumberstring——
    statusstring——
    includeCancelledboolean——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • Sales-return product lines

    /v1/sales-return-productsPaged

    POSThttps://api.aizeny.com/v1/sales-return-products

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    fromDatestring——
    toDatestring——
    customerIdinteger——
    productIdinteger——
    voucherIdinteger——
    includeCancelledboolean——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • One customer's sales register

    /v1/customer-sales-registerPaged

    POSThttps://api.aizeny.com/v1/customer-sales-register

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    customerIdinteger——
    fromDatestring——
    toDatestring——
    includeReturnsboolean——
    includeCancelledboolean——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • Sales register

    /v1/sales-registerPaged

    POSThttps://api.aizeny.com/v1/sales-register

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    fromDatestring——
    toDatestring——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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)

    See every error code

    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.

  • Purchase register

    /v1/purchase-registerPaged

    POSThttps://api.aizeny.com/v1/purchase-register

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    fromDatestring——
    toDatestring——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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)

    See every error code

    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.

  • Sales-return (credit note) register

    /v1/sales-return-crnote-registerPaged

    POSThttps://api.aizeny.com/v1/sales-return-crnote-register

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    fromDatestring——
    toDatestring——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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)

    See every error code

    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.

  • Purchase-return (debit note) register

    /v1/purchase-return-drnote-registerPaged

    POSThttps://api.aizeny.com/v1/purchase-return-drnote-register

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    fromDatestring——
    toDatestring——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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)

    See every error code

    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.

  • Payment register

    /v1/payment-registerPaged

    POSThttps://api.aizeny.com/v1/payment-register

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    fromDatestring——
    toDatestring——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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)

    See every error code

    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.

  • Receipt register

    /v1/receipt-registerPaged

    POSThttps://api.aizeny.com/v1/receipt-register

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    fromDatestring——
    toDatestring——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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)

    See every error code

    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.

  • Journal register

    /v1/journal-registerPaged

    POSThttps://api.aizeny.com/v1/journal-register

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    fromDatestring——
    toDatestring——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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)

    See every error code

    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.

  • Contra register

    /v1/contra-registerPaged

    POSThttps://api.aizeny.com/v1/contra-register

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    fromDatestring——
    toDatestring——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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)

    See every error code

    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.

  • Pending sales orders (item rows)

    /v1/pending-sales-ordersPaged

    POSThttps://api.aizeny.com/v1/pending-sales-orders

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    customerIdinteger——
    referenceNumberstring——
    statusFieldstring——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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)

    See every error code

    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.

  • Pending sales orders per voucher

    /v1/pending-sales-order-vouchersPaged

    POSThttps://api.aizeny.com/v1/pending-sales-order-vouchers

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    customerIdinteger——
    statusFieldstring——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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)

    See every error code

    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.

  • Sale invoices

    /v1/all-sale-invoicesPaged

    POSThttps://api.aizeny.com/v1/all-sale-invoices

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    startDatestring——
    endDatestring——
    customerIdinteger——
    materialCenterIdinteger——
    materialCenterGroupIdinteger——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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)

    See every error code

    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.

  • Product lines of one sale invoice

    /v1/sale-invoice-products

    POSThttps://api.aizeny.com/v1/sale-invoice-products

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    voucherIdinteger——
    scriptstringOptionalthe 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

    Errors

    404 NOT_FOUND field voucherId; 422 BUSY_DATA_INCONSISTENT

    See every error code

    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.

  • Sale vouchers with their items

    /v1/list-sale-vouchers-with-itemsPaged

    POSThttps://api.aizeny.com/v1/list-sale-vouchers-with-items

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    fromDatestring——
    toDatestring——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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)

    See every error code

    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.

  • Voucher PDF

    /v1/voucher-pdf

    POSThttps://api.aizeny.com/v1/voucher-pdf

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    voucherTypestring——
    voucherIdinteger——
    voucherNumberstring——
    formatNamestring——

    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)

    See every error code

    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

3

Dashboard sales summary and trend, and the credit-line stage stream (NDJSON, one line per customer).

  • Dashboard sales summary

    /v1/dashboard-sales-summary

    POSThttps://api.aizeny.com/v1/dashboard-sales-summary

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    scriptstringOptionalthe 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

    Errors

    the shared mapping only

    See every error code

    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.

  • Dashboard sales trend

    /v1/dashboard-sales-trend

    POSThttps://api.aizeny.com/v1/dashboard-sales-trend

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    periodstring——
    scriptstringOptionalthe 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)

    See every error code

    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.

  • Credit-line stage stream (NDJSON)

    /v1/credit-line/line-stage-streamNDJSON stream

    POSThttps://api.aizeny.com/v1/credit-line/line-stage-stream

    Not pagedNDJSON streamOne year

    Answer: application/x-ndjson stream

    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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    customerIdsarray of integers——
    groupIdsarray of integers——
    billByBillModestring——
    billByBillPdfConfigobject——
    customerOptionalFieldsarray of strings——
    gracePeriodSourcestring——
    gracePeriodDaysinteger——
    gracePeriodOptionalFieldstring——
    creditLineTypestring——
    accountBlockOverdueDaysinteger——
    accountBlockExceedAmountnumber—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

    See every error code

    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

3

Inventory daybooks, receivables ageing and serial-number stock ageing.

  • Inventory daybooks

    /v1/inventory-daybooks

    POSThttps://api.aizeny.com/v1/inventory-daybooks

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    fromDatestring——
    toDatestring——
    scriptstringOptionalthe 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

    Errors

    422 BUSY_DATA_INCONSISTENT (a repeated voucher header or master code)

    See every error code

    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.

  • Receivables ageing analysis

    /v1/ageing-analysis-receivables

    POSThttps://api.aizeny.com/v1/ageing-analysis-receivables

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    customerIdinteger——
    accountNamestring——
    startDatestring——
    endDatestring——
    statusDatestring——
    scriptstringOptionalthe 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)

    See every error code

    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.

  • Serial-number stock ageing

    /v1/stock-aging-receivable-issuable

    POSThttps://api.aizeny.com/v1/stock-aging-receivable-issuable

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    asOnDatestring——
    productIdinteger——
    materialCenterIdinteger——
    scriptstringOptionalthe 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

    See every error code

    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

2

Customers without a bill in a window, and one unbilled customer’s profile.

  • Unbilled customers

    /v1/unbilled-customers

    POSThttps://api.aizeny.com/v1/unbilled-customers

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    asOnDatestring——
    billingModestring——
    billingRulestring——
    billingWindowstring——
    customDaysinteger——
    scriptstringOptionalthe 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

    Errors

    422 BUSY_DATA_INCONSISTENT

    See every error code

    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.

  • Unbilled customer profile (one or more years)

    /v1/unbilled-customer-profileSeveral years

    POSThttps://api.aizeny.com/v1/unbilled-customer-profile

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    customerIdinteger——
    additionalFinancialYearstring——
    fromDatestring——
    toDatestring——
    typestring——
    scriptstringOptionalthe 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

    Errors

    404 NOT_FOUND field customerId; 422 BUSY_DATA_INCONSISTENT

    See every error code

    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

1

One customer’s discounts per product group.

  • Customer product-group discounts

    /v1/customer-product-group-discountsPaged

    POSThttps://api.aizeny.com/v1/customer-product-group-discounts

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    customerIdinteger——
    customerNamestring——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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)

    See every error code

    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

1

One page of your own read-only SELECT, validated on the PC.

  • Execute one read-only SELECT

    /v1/execute-custom-sqlPaged

    POSThttps://api.aizeny.com/v1/execute-custom-sql

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    querystring——
    parametersobject of scalar values——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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

    See every error code

    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

1

A built-in report or one of the PC’s saved custom queries, by name.

  • Run a named report from the local registry

    /v1/execute-custom-queryPaged

    POSThttps://api.aizeny.com/v1/execute-custom-query

    PagedJSON 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    queryNamestring——
    parametersobject of scalar values——
    pageinteger——
    pageSizeinteger——
    scriptstringOptionalthe 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

    See every error code

    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

1

One of the PC’s named customer scripts, run on the PC for one company and year.

  • Run a named customer script

    /v1/execute-script

    POSThttps://api.aizeny.com/v1/execute-script

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    scriptNamestring——
    parametersobject—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

    See every error code

    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

4

One 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).

  • Account Ledger PDF

    /v1/account-ledger-pdf

    POSThttps://api.aizeny.com/v1/account-ledger-pdf

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    accountobject——
    fromDatestring——
    toDatestring——

    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)

    See every error code

    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.

  • Bills Receivable PDF

    /v1/bills-receivable-pdf

    POSThttps://api.aizeny.com/v1/bills-receivable-pdf

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    accountobject——
    asOfDatestring——
    statusstring——

    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)

    See every error code

    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.

  • Payment Reminder PDF

    /v1/payment-reminder-pdf

    POSThttps://api.aizeny.com/v1/payment-reminder-pdf

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    accountobject——
    asOfDatestring——
    billsstring——
    formatNamestring——
    itemDetailsboolean——
    boldDueBillsboolean——

    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)

    See every error code

    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.

  • Bills Payable PDF

    /v1/bills-payable-pdf

    POSThttps://api.aizeny.com/v1/bills-payable-pdf

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    accountobject——
    asOfDatestring——
    statusstring——

    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)

    See every error code

    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

1

The status of one customer-integration run started through the Cloud Relay: its state, each child write’s outcome and the script’s output.

  • Integration run status

    /v1/integration-run-statusSeveral years

    POSThttps://api.aizeny.com/v1/integration-run-status

    Not 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
    MemberTypeRequiredNotes
    companyCodestringRequired—
    financialYearstringRequired—
    runIdstring——
    additionalFinancialYearstring——

    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

    See every error code

    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.