HOW TO · 8 MIN READ
How to Integrate TallyPrime with Other Software
By the Seamwire team · Updated
THE SHORT ANSWER
TallyPrime exchanges data with other software through a built-in HTTP interface that accepts XML requests and, from Release 7.0 (December 2025), native JSON; through ODBC, mainly for reading TallyPrime data into tools such as Excel; through TDL, Tally's own language for customising TallyPrime and making it call other systems; and through file import and export. It is not a REST API in the usual sense: every request goes to one address on the machine running TallyPrime, which must be running with the company loaded. The right route depends on your TallyPrime release, where it runs, and which direction the data needs to move.
Does TallyPrime have an API?
Yes, though not the kind most developers expect. When its server setting is enabled, TallyPrime listens on a port on the computer where it runs (9000 by default) and accepts requests over HTTP. Requests are XML documents built around an envelope that says whether to import, export or execute something, and which data or report is wanted.
From TallyPrime Release 7.0, released on 19 December 2025, the same interface also accepts and returns JSON in TallyPrime's native structure, with headers that say whether the request is an import or an export and what it covers. Tally recommends its stricter JSONEx format for new integrations. Data in the native JSON structure needs no extra TDL to import; JSON in some other shape still needs TDL to map it. Earlier releases handled JSON only through TDL.
What it is not is a conventional REST API with one URL per resource: every request goes to the same address, and the request itself says what it is for.
Which integration method should we use?
Choose by direction and by how fresh the data must be. Most real integrations combine two of these.
- XML or JSON over HTTP (TallyPrime as server): another system sends masters or vouchers into TallyPrime, or asks for data and reports back. Suits CRMs, order systems and e-commerce sites that create invoices, orders or ledgers in TallyPrime.
- TDL calling out (TallyPrime as client): TDL code inside TallyPrime sends HTTP GET or POST requests to another system and reads XML or JSON replies. Suits pushing a voucher out the moment it is saved, or pulling rates or open orders into TallyPrime.
- ODBC: TallyPrime acts as an ODBC data source, so Excel, Power BI and other tools can query its data with SQL and refresh it on a schedule. Tally's ODBC documentation describes reading; for writing, use the HTTP interface. TallyPrime can also act as an ODBC client, with TDL pulling data from external databases.
- File import and export: XML, JSON or Excel files imported through TallyPrime's import feature, or reports exported. Suits batch jobs and one-off migrations, not live sync.
- DLLs called from TDL: for databases, cloud services or devices such as barcode scanners that TDL cannot reach on its own.
- Ready-made connectors and middleware from Tally partners and integration vendors: often the quickest route for common pairings. Check what it reads and writes, how it reaches your TallyPrime, and what it does when a request fails.
Can TallyPrime sync with a CRM in real time?
Near real time, yes, as long as TallyPrime is running and reachable. Tally describes TDL-driven HTTP integration as enabling near real-time exchange. The usual patterns are: the CRM sends a request to TallyPrime when a deal is won, creating the customer ledger and the sales voucher; TDL in TallyPrime posts a voucher or a receipt out to the CRM when it is saved; or a small service polls TallyPrime every few minutes for changes.
In practice, decide how fresh each item really needs to be. Customer balances and payment status in the CRM are often fine refreshed every few minutes or hourly; a stock check before confirming an order may need to be live. Anything that can wait should be queued and retried, so a closed TallyPrime delays the sync instead of losing data.
Does integration work if TallyPrime runs on a local PC, not a server?
Yes, with conditions. The HTTP and ODBC interfaces are served by the TallyPrime application itself, so the PC must be switched on, TallyPrime must be running, and at least one company must be loaded. If TallyPrime is closed overnight or the PC sleeps, the interface is simply not there.
A cloud system such as a hosted CRM cannot normally reach a port on an office PC directly, and the port should not be opened to the internet. The common pattern is a small agent or service on the same network as TallyPrime that talks to it locally and connects outwards to the cloud system, queuing anything it cannot deliver. Firms that run TallyPrime on a hosted machine, such as Tally's own TallyPrime on AWS, have specific sync settings for connecting local applications.
If more than one company is loaded, say which one each request is for. Tally's JSON documentation notes that without the company named, data goes to or comes from whichever company is active.
What is TDL, and do we need it?
TDL, the Tally Definition Language, is the language TallyPrime's own screens and reports are built in, and the way to customise and extend it: new fields, reports, validations, and actions such as calling an external system over HTTP. Code is written in TallyPrime Developer and loaded into TallyPrime as a file.
You need TDL when the change must happen inside TallyPrime: an extra field your CRM needs on every invoice, a check before a voucher is saved, a push to another system the moment something is entered, or JSON in a structure other than TallyPrime's native one. You may not need it when another system only reads data, or sends masters and vouchers in TallyPrime's native XML or JSON. External methods move data but cannot change TallyPrime's screens or reports.
Will an integration break when we upgrade TallyPrime?
It can, which is why every upgrade should be tested first on a copy of your data. Tally aims for backward compatibility, but its own notes on moving customisations from Tally.ERP 9 to TallyPrime list things that change (buttons, menus and some interfaces) and advise thorough testing of all customisations.
Releases also change behaviour that integrations depend on. Native JSON exists only from Release 7.0, so an integration built for it will not work on an older release. Release 7.0 also changed some currency symbols, and Tally notes that files using the legacy identifiers may fail to import. Keep a record of which TallyPrime release every site runs, and include integration tests in the upgrade plan.
What data should TallyPrime own, and what should the CRM own?
Give every piece of data one owner, and let the other systems read it. If two systems can both change the same record, they will eventually disagree.
- TallyPrime usually owns accounting: ledgers and their GST details, vouchers, outstanding balances, receipts, stock valuation and everything that feeds a GST return.
- The CRM usually owns the sales side: leads, contacts, opportunities, quotes and the sales pipeline.
- Customers need a clear handover: a common pattern is that the CRM creates the customer when a deal is won and sends it to TallyPrime as a ledger, after which billing details are changed in one place only.
- Items and prices: whichever system your team actually maintains them in, with the other kept read-only.
- Store each system's ID for a record in the other, rather than matching on names.
Where do TallyPrime syncs usually break?
Most failures come from a short list of common causes. None is exotic, and each can be designed out.
- TallyPrime is not running: the PC is off or asleep, or TallyPrime was closed, so requests fail until someone opens it. Queue and retry rather than dropping data.
- The company is not loaded, or the wrong one is active, so data lands in the wrong company or nowhere.
- Masters before vouchers: a voucher refers to ledgers and stock items by name, so it is rejected if the customer ledger or item does not exist yet. Create or check masters first.
- Duplicate ledgers: TallyPrime blocks two masters with exactly the same name, but “ABC Traders” and “ABC Traders Pvt Ltd” are different names, and a sync that matches on names creates a second ledger for the same customer.
- GST details: a missing GSTIN, registration type or state, or an incomplete company address, leaves transactions flagged as uncertain in GST reports.
- Re-sending the same data: importing the same vouchers twice creates duplicate transactions, so every voucher needs a unique reference the sync checks before sending.
- Release differences: an integration written for one TallyPrime release, or one TDL customisation, run against another.
- Silent failures: TallyPrime logs import errors, but nobody reads a log file. Every sync needs its own record of what was sent and an alert to a named person when something fails.
How should a TallyPrime integration be built?
Start with one flow, usually sales orders or invoices from the CRM into TallyPrime, and prove it on a copy of the company before going live. Decide the owner of each record, use unique references so nothing is sent twice, queue everything so a closed TallyPrime only delays the sync, and alert a person when a request fails. Then add the next flow.
Seamwire, a Bengaluru software studio, builds and monitors these connections. Whoever you work with, ask them which TallyPrime release they will test on, how they reach your TallyPrime, and what happens to a voucher when TallyPrime is closed.
SOURCES
- 1Tally Solutions, getting started with Tally integrations
- 2Tally Solutions, XML integration
- 3Tally Solutions, how to integrate with TallyPrime using JSON
- 4Tally Solutions, release notes for TallyPrime Release 7.0 (19 Dec 2025)
- 5Tally Solutions, pre-requisites for integrations
- 6Tally Solutions, integration methods and technologies
- 7Tally Solutions, ODBC integrations
- 8Tally Solutions, extract data to MS Excel using ODBC in TallyPrime
- 9Tally Solutions, sync TallyPrime with local applications (TallyPrime on AWS)
- 10Tally Solutions, working of Tally.ERP 9 customisations with TallyPrime
- 11Tally Solutions, import data FAQ