Appearance
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
| Method | URL |
|---|---|
GET | /tally/journal |
No query parameters. Returns every unrecorded journal voucher in one response, sorted by date ascending.
Filtering rules
- Already-recorded vouchers (those marked via
POST /tally/record) are excluded.
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:
| Field | Type | Description |
|---|---|---|
voucherid | string | Stable unique ID for the voucher |
vouchernumber | string | Display number, format JN-<voucherid> |
vouchertypename | string | Always "Journal" |
date | string | ISO 8601 timestamp, or "" |
narration | string | Short description, or "" |
ledgers | Ledger[] | Always exactly two entries. See Ledger Object |
_internalMetadata | string | Opaque base64 blob. Pass back to POST /tally/record to mark this voucher as recorded |
Ledger object
| Field | Type | Description |
|---|---|---|
ledgername | string | The ledger name, or "" |
amount | number | The voucher amount. Both ledgers carry the same value |
isdr | boolean | true for debit, false for credit |
costcentes | CostCenter[] | Cost centers attached to this ledger. Note the spelling, preserved from the Tally schema |
bills | Bill[] | Optional. Only present when a bill reference is attached |
Cost center object
| Field | Type | Description |
|---|---|---|
name | string | Cost center name |
amount | number | Cost center amount |
Bill object
| Field | Type | Description |
|---|---|---|
nane | string | Bill reference. Note the field is spelled nane, not name. Preserved verbatim from the Tally schema |
amount | number | Bill 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/journaljs
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.