Skip to content

Voucher kinds and types ​

The two fields ​

FieldOwned byStableUse for
voucher_kindBizmitraYesFiltering, branching, business logic
voucher_typeThe customer's Tally companyNoDisplay, and matching an exact configured type

Tally lets users create and rename voucher types. Your customers will have done so. Any logic that switches on voucher_type works against your test company and fails on a real one.

Branch on voucher_kind.

Writing vouchers ​

Each kind has its own endpoint:

EndpointCreates
POST /api/v1/invoicesSales invoice
POST /api/v1/ordersSales order
POST /api/v1/credit-notesCredit note
POST /api/v1/debit-notesDebit note
POST /api/v1/purchasesPurchase
POST /api/v1/receiptsReceipt
POST /api/v1/paymentsPayment
POST /api/v1/contrasContra
POST /api/v1/journalsJournal

All of them are asynchronous. All return a transaction_id you must check. See Jobs and transactions.

The document shape is common across kinds — see Data model. What differs is which parts are meaningful:

Kindinventory_entriesledger_entriesNotes
Invoice, purchaseOptionalAlwaysGoods invoices carry both; a service invoice or expense bill carries only ledger entries — see an invoice with no stock items
Credit / debit noteUsuallyAlwaysShould reference the original document
Receipt, paymentNoAlwaysMoney movement. Add bill_allocations to the party line to say which invoices it settles — see below
ContraNoAlwaysBetween the business's own accounts
JournalNoAlwaysAdjustments; must balance
Sales orderUsuallyRarelyAn order is not yet a financial posting

Settling invoices from a receipt or payment ​

A receipt that only moves money leaves Tally guessing which invoices it paid, and Tally does not guess — it parks the amount as unallocated, and the customer's Bills Outstanding report keeps showing the invoices open. Nothing errors; the ledger balance is correct.

Name the bills on the party line:

json
{
  "ledger_name": "Acme Pvt Ltd", "amount": 10000, "is_debit": false, "is_party": true,
  "bill_allocations": [
    { "name": "Bm/26-27/1", "bill_type": "Agst Ref", "amount": 5000 },
    { "name": "Bm/26-27/2", "bill_type": "Agst Ref", "amount": 5000 }
  ]
}

One receipt can clear several invoices, which is why this is a list rather than a field. bill_type is Agst Ref when settling an existing bill, New Ref when opening one, Advance for money taken before the bill exists, and On Account for a deliberately unallocated amount (the only type that carries no name). It defaults to Agst Ref when you supply a name.

An Agst Ref name must match a bill genuinely outstanding for that party. It is not free text — Tally rejects the voucher if it cannot find the bill. Full field rules in Data model.

Pulled vouchers carry the same field, on every kind: an invoice that opened a bill reports New Ref, a receipt that cleared one reports Agst Ref. So a pulled voucher can be pushed back unchanged.

Reading vouchers ​

Vouchers created in Tally arrive through the pulled-voucher queue:

http
GET /api/v1/pulled-vouchers?company_id={company_id}

Filter with either field:

ParameterPurpose
voucher_kindNormalized kind — sales, purchase, receipt, …
voucher_typeExact Tally type name
statusConsumption status
start_date, end_dateInclusive voucher-date window
limit, offsetPagination

Use voucher_kind unless you have a specific reason not to.

The invoices response key

List responses return results under invoices, and detail responses under invoice, whatever the voucher kind. A purchase arrives under invoices too. Historical wire names, retained for compatibility — read them as "vouchers".

Dates ​

Pulled vouchers carry voucher_date in Tally's compact form:

json
"voucher_date": "20260601"

That is YYYYMMDD — 1 June 2026. Payloads you submit use ISO dates ("date": "2026-06-01"). Convert deliberately at your boundary rather than passing strings through and hoping.

Filter parameters start_date and end_date are inclusive on both ends.

Voucher numbers ​

voucher_number comes from Tally, and Tally's numbering is configured per voucher type per company. Some are automatic, some manual, some restart annually.

Do not assume voucher numbers are unique across a company, sequential, or gap-free. They are none of those things in general. Use transaction_id and tally_voucher_guid as identifiers; treat the number as a human-facing label.

Discovering what a company actually uses ​

Before building against a customer's data, look at what is there. Pull a page of recent vouchers and inspect the distinct voucher_type values against their voucher_kind.

You will find things like:

voucher_type in the wildvoucher_kind
Salessales
GST Sales Invoicesales
Retail Billsales
Tax Invoice - Branchsales

Four names, one kind. This is normal, and it is the entire reason voucher_kind exists.

Documentation content is all rights reserved; code samples are MIT licensed. Use of the Bizmitra API, Connector App, and hosted services is governed separately by Bizmitra’s commercial terms.