Skip to content

Conventions ​

Behaviour that holds across the API. Reading this once is faster than rediscovering each item endpoint by endpoint.

Response envelope ​

Responses carry a success flag alongside their payload:

json
{
  "success": true,
  "count": 1,
  "total": 1,
  "limit": 50,
  "offset": 0,
  "invoices": [ "..." ]
}

success: true on a write means accepted, not completed. See Jobs and transactions.

Pagination ​

List endpoints paginate. Respect it.

FieldMeaning
countItems in this response
totalItems matching the query overall
limitPage size
offsetStarting position

Never assume one response contains everything. A company with three years of history has tens of thousands of vouchers, and the first page is not a representative sample.

js
async function all(params) {
  const out = []
  let offset = 0
  const limit = 100

  for (;;) {
    const page = await get('/api/v1/pulled-vouchers', { ...params, limit, offset })
    out.push(...page.invoices)
    offset += limit
    if (offset >= page.total) break
  }
  return out
}

For large ranges, prefer narrowing by date over paging through everything.

Dates ​

Two formats, in different places. Convert deliberately at your boundary.

ContextFormatExample
Payloads you submitISO YYYY-MM-DD"2026-06-01"
voucher_date from TallyCompact YYYYMMDD"20260601"
Filter parametersISO, inclusive both endsstart_date, end_date

Identifiers ​

IdentifierSourceMeaning
company_idBizmitraDeveloper Company ID. Integer. Not a Tally GUID.
transaction_idBizmitraCorrelates one operation. Your primary key for it.
tally_voucher_guidTallyThe voucher itself. Needed to update it later.
tally_master_idTallyTally's master ID
tally_alter_idTallyIncrements when the voucher is edited in Tally

Store transaction_id and tally_voucher_guid against your own records.

Ignore unknown fields ​

Bizmitra adds fields within v1. Your parser must tolerate them.

This is a real compatibility requirement, not a style preference. A strict schema that rejects unknown properties will break on a routine additive release, and it will look like an outage. Configure your client to ignore extras.

Names are exact ​

Ledger, stock item, godown, unit, and voucher-type names must match the target company exactly — including case and whitespace. Bizmitra does not fuzzy-match, because guessing which ledger you meant is not a safe thing to do with someone's accounts.

voucher_kind over voucher_type ​

Branch on voucher_kind. It is Bizmitra's normalized category. voucher_type is whatever the customer named it in Tally and varies between companies. See Voucher kinds and types.

Historical wire names ​

Pulled-voucher responses use invoices (list) and invoice (detail) regardless of kind. A purchase voucher arrives under invoices. Retained for compatibility; read them as "vouchers".

Rate limiting ​

Be a reasonable client:

  • Back off exponentially on retry, with jitter.
  • Poll transactions at a sensible interval with backoff until they reach a terminal state. Transaction completion/failure webhooks are not currently available.
  • Batch date-ranged reads rather than requesting voucher-by-voucher.
  • Remember the far end is one desktop machine, not a datacentre. There is a real limit to how fast a single Connector can work through a queue.

Idempotency ​

Assume any request may be delivered more than once. Design writes so that a duplicate submission does not produce a duplicate voucher. Covered in Jobs and transactions.

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.