Skip to content

Journal Vouchers

Returns Tally Journal vouchers built from manual finance entries and fuel entries from outside suppliers. Each source record produces one journal voucher with a balanced two-ledger debit/credit pair.

Endpoint

MethodURL
GET/tally/journal

No query parameters. Returns every unrecorded journal voucher in one response, sorted by date ascending.

Filtering rules

There is no date range filter and no pagination.

Response schema

The response envelope is { status, data, message } (see Overview). The data field is an array of journal voucher objects:

FieldTypeDescription
voucheridstringStable unique ID for the voucher
vouchernumberstringDisplay number, format JN-<voucherid>
vouchertypenamestringAlways "Journal"
datestringISO 8601 timestamp, or ""
narrationstringShort description, or ""
ledgersLedger[]Always exactly two entries. See Ledger Object
_internalMetadatastringOpaque base64 blob. Pass back to POST /tally/record to mark this voucher as recorded

Ledger object

FieldTypeDescription
ledgernamestringThe ledger name, or ""
amountnumberThe voucher amount. Both ledgers carry the same value
isdrbooleantrue for debit, false for credit
costcentesCostCenter[]Cost centers attached to this ledger. Note the spelling, preserved from the Tally schema
billsBill[]Optional. Only present when a bill reference is attached

Cost center object

FieldTypeDescription
namestringCost center name
amountnumberCost center amount

Bill object

FieldTypeDescription
nanestringBill reference. Note the field is spelled nane, not name. Preserved verbatim from the Tally schema
amountnumberBill amount

Example response

json
{
  "status": "success",
  "data": [
    {
      "voucherid": "65f1a2b3c4d5e6f7a8b9c0d1",
      "vouchernumber": "JN-65f1a2b3c4d5e6f7a8b9c0d1",
      "vouchertypename": "Journal",
      "date": "2026-04-08T07:15:00.000Z",
      "narration": "Diesel top-up at Puma Mbezi for T 827 EEX",
      "ledgers": [
        {
          "ledgername": "Fuel & Lubricants",
          "amount": 184500,
          "isdr": true,
          "costcentes": [
            { "name": "T 827 EEX", "amount": 184500 }
          ]
        },
        {
          "ledgername": "Petty Cash",
          "amount": 184500,
          "isdr": false,
          "bills": [
            { "nane": "PC-RCPT-04812", "amount": 184500 }
          ],
          "costcentes": []
        }
      ],
      "_internalMetadata": "eyJ0Ijoiam91cm5hbCIsImlkIjoiNjVmMWEyYjNjNGQ1ZTZmN2E4YjljMGQxIn0="
    }
  ],
  "message": "Journal vouchers fetched successfully"
}

Example request

bash
curl -H "x-api-key: your-api-key-here" \
  https://api.example.com/tally/journal
js
const res = await fetch("https://api.example.com/tally/journal", {
  headers: {
    "x-api-key": process.env.TALLY_API_KEY,
  },
});
const { data: vouchers } = await res.json();

Common mistakes

Forgetting to record imported vouchers

The endpoint returns the same vouchers on every call until you mark them as recorded via POST /tally/record. Skip this step and you'll re-import the same vouchers on every run.

Treating isdr as a string

isdr is a JSON boolean (true or false), not the string "true" or "Y".

Expecting name instead of nane on ledger bills

The bill reference field inside ledgers[].bills[] is spelled nane, not name. This is preserved from the Tally import schema and is intentional.