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.
  • Do not poll transactions in a tight loop — use webhooks.
  • 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.