Storing GSTIN Data: What the DPDP Act Means for Your App
Is a GSTIN personal data? What to store, how long to keep it, and where verification pipelines leak - an engineering guide to handling GST data in India.
Wiring up a GSTIN verification call takes an afternoon. The question that arrives a week later, usually from legal or from a customer's security review, takes longer: what exactly are we storing, on what basis, for how long, and who else can see it? India's Digital Personal Data Protection Act 2023 gives that conversation a legal frame, and a vendor master full of GSTINs sits in an interesting spot inside it. This post is the engineering answer, written for the person who owns the table.
The question every integration eventually hits
A GSTIN verification response is small and, at first glance, unremarkable: legal name, trade name, registration status, constitution of business, date of registration, state and centre jurisdiction, place of business, and often filing history. Nothing in it feels sensitive in the way a bank account or an Aadhaar number does.
Two things change that. First, some of those records describe individuals rather than companies. Second, the moment you store the response you have created a dataset — one that grows, gets copied into a warehouse, feeds a dashboard, and eventually ends up in scope for a security questionnaire or a breach. The right time to decide how to handle it is when the table is created, not when the questionnaire arrives.
Is a GSTIN personal data?
The DPDP Act protects personal data, meaning data about an identifiable individual. Whether a GSTIN qualifies depends entirely on the constitution of the taxpayer, and the structure of the number itself makes this legible: characters 3 to 12 are the PAN of the registered person.
| Constitution | What the embedded PAN belongs to | Practical treatment |
|---|---|---|
| Private or public limited company | The company — a legal person | Entity data. Not personal data on its own. |
| LLP or partnership firm | The firm | Entity data, though partner names may appear elsewhere in your file. |
| Proprietorship | The proprietor — a natural person | Treat as personal data. Name and place of business identify an individual. |
| HUF, trust, society, government body | The entity | Entity data, with the same caveat about individuals named alongside. |
Since a realistic vendor master contains all of these mixed together, and since nobody wants a conditional data-protection policy that branches on constitution of business, the workable engineering position is simple: treat the vendor table as containing personal data and apply one standard to all of it. It is cheaper than classification, and it is the answer that survives a customer security review.
Why you are allowed to hold it
The instinct on hearing "data protection" is to reach for a consent banner. That is the wrong shape here. You are not collecting data from an individual for your own marketing; you are checking a public business register to satisfy statutory conditions of your own — that a supplier is registered, that input tax credit is available, that an invoice is genuine, that you are not paying a fraudulent counterparty.
The DPDP Act accommodates this through processing that supports specified legitimate uses and legal obligations, and the GST law independently obliges you to hold supplier documentation and to satisfy the conditions for input tax credit. Asking a supplier's permission to check whether their GSTIN is valid would be an odd request, and refusing to check would not make you compliant with anything.
What this does not do is exempt you from the rest of the discipline. Purpose, minimisation, retention, accuracy and security still apply. In practice, write down the purpose once — "verifying the GST registration status of counterparties for tax compliance, onboarding and fraud prevention" — and then check every downstream use against it. Feeding your verification store into a sales prospecting tool is a new purpose, and that is where teams get into trouble.
What to store, and what to leave behind
Minimisation is easier to apply here than in most systems, because the audit purpose tells you exactly what earns its place: the fields that establish who the counterparty was and what their status was on a given date.
| Field | Keep? | Why |
|---|---|---|
| GSTIN, legal name, trade name | Yes | Identifies the counterparty and proves the name on the invoice matched the register |
| Registration status and status date | Yes | The core fact you are evidencing |
| Constitution, registration date, taxpayer type | Yes | Small, stable, and useful when a notice asks who the supplier was |
| State and centre jurisdiction | Yes | Needed if a dispute has to be taken up with the right office |
| Filing history | Yes, where you rely on it | Evidence for supplier-default rules such as Rule 37A |
| Retrieval timestamp and source | Always | Without it the record proves nothing about any particular date |
| Raw response body, verbatim | Prefer yes | Cheap, and the strongest form of the evidence — but see security below |
| Lookups that never became a relationship | No | Exploratory searches serve no ongoing purpose; expire them |
One anti-pattern worth naming, because it is extremely common: reducing the response to a boolean.
A gst_verified column satisfies the form on the screen and is worthless as evidence,
because it does not say what was verified, when, or against what. Keep the snapshot; the storage cost
is a rounding error next to the credit it protects. We make the same argument from the tax side in
what happens when a supplier's registration
is cancelled retrospectively.
How long to keep it
Two clocks run at once, and the resolution is to let the purpose decide per record rather than setting one global TTL.
Records tied to a transaction or an active relationship should live as long as the tax record they support. Proceedings can be opened years after the event, and a verification snapshot whose entire value is proving what was true in 2026 is useless if it was purged in 2028. Align this with your GST record-retention policy rather than inventing a separate one.
Everything else should expire. Speculative lookups, prospects who never became vendors, duplicate checks during a bulk run, and cached responses used only to save an API call — none of these support a transaction, so none of them needs to outlive its cache window. A short TTL on the cache layer and a longer, purpose-bound retention on the audit table is the clean separation. The caching mechanics are covered in cutting your verification API bill.
Freshness deserves a word here too, because accuracy is a data-protection principle and not only a product concern. A status that was accurate when retrieved becomes misleading if the interface presents it as current. Show the retrieval date next to the status in any UI, and re-verify on a schedule rather than trusting a two-year-old snapshot — the pattern is in automated vendor GSTIN monitoring.
Securing the pipeline, not just the database
The database is usually the best-protected part of the system. The leaks happen at the edges, where data is copied for convenience and nobody thinks of it as a data store.
- Request and response logs. The default in most HTTP clients is to log the full exchange on error. That puts vendor names, addresses and your API key into a log aggregator with a different retention policy and a wider access list than your database.
- Error trackers. A failed parse commonly attaches the whole response body to the exception. Scrub payloads before they leave the process.
- Analytics and product telemetry. A GSTIN in a page URL or an event property ends up in a third-party analytics store you have not assessed.
- Support tooling. Screenshots and pasted payloads in tickets are a real, routine copy of the data outside your controls.
- Exports. The CSV a colleague pulled for a reconciliation is now on a laptop. Log exports, and prefer scoped views over full dumps.
On the credential side, the API key is the thing that turns a minor bug into a data-exposure incident. Keep it server-side — never in a browser bundle, a mobile app or a spreadsheet formula that ships to users — hold it in a secret manager rather than in source, scope it to a service, rotate it on a schedule and on any suspicion, and mask it in every log line. If you support multiple environments, issue separate keys so that revoking one does not take production down.
# Log the shape, never the payload.
logger.info(
"gstin_verified",
extra={
"gstin_suffix": gstin[-4:], # enough to trace, not to identify
"status_code": response.status_code,
"latency_ms": elapsed_ms,
"cache_hit": cached,
},
)
Then the ordinary controls: encryption in transit and at rest, least-privilege access to the verification tables, an access log for who read what, and backups covered by the same retention rules as the primary store — a deletion that leaves the record in nightly backups for a year is not a deletion in any sense that matters.
Your API vendor is a processor
When you call a verification API you are sending a GSTIN, and sometimes a name, to a third party. That makes them a processor acting on your instructions, and it makes their practices part of your posture. The questions worth asking before you integrate, and worth having answered in the contract:
- What do they retain from your requests, and for how long?
- Where is it stored, and is data kept in India?
- Who are their sub-processors — including the GSP upstream of them?
- What are their breach notification commitments, and on what timeline?
- Can you delete your data on termination, and get confirmation?
- Do they use your queries for anything beyond serving them — analytics, model training, resale?
The last one is the one people forget to ask and the one most worth asking. A supplier list is competitively sensitive information about your business, quite apart from any personal data it contains. On where the data originates in the first place, see where GST API data actually comes from and the GSP and ASP layers behind every provider.
The one thing not to build
Sooner or later someone proposes it: you have all this GSTIN data, why not publish a searchable directory — one page per GSTIN, with names and addresses, and let search traffic find it.
Do not. Verifying counterparties for your own compliance and republishing a register at scale are different activities with different exposure. A directory would necessarily publish the names and addresses of proprietors — identifiable individuals — for a purpose that has nothing to do with why the data was collected, and the operators who do this carry a standing takedown burden as a result. It is also, quite separately, the textbook thin-content-at-scale pattern that search engines devalue, so the traffic case is weaker than it looks.
The useful version of that idea is a tool that verifies a number the user already has, which is what our GST number search does: it answers a question about a specific GSTIN rather than publishing an index of everyone.
An implementation checklist
- Write down the purpose for holding GSTIN data, in one sentence, before the first migration.
- Treat the vendor table as containing personal data; do not branch policy on constitution of business.
- Store the full response plus a retrieval timestamp and source, not a boolean.
- Split storage: short-TTL cache for cost, purpose-bound audit table for evidence.
- Tie audit retention to your GST record-retention policy; expire everything else.
- Scrub payloads from logs, error trackers and analytics; log shape, not content.
- Keep API keys server-side, in a secret manager, scoped and rotated.
- Get processor answers in writing — retention, location, sub-processors, deletion, secondary use.
- Cover backups and exports by the same retention and access rules as the primary store.
- Show the retrieval date wherever a status is displayed, and re-verify on a schedule.
If you are still at the integration stage, the mechanics of the call itself are in how to verify a GST number using an API, the operational limits in rate limits and webhooks, and the failure modes in the error codes guide.
Frequently asked questions
Frequently asked questions
A note on accuracy. GST rules change often. This article reflects our understanding as of 9 September 2026 and is general information, not tax or legal advice. For the authoritative position, check gst.gov.in and cbic-gst.gov.in, or speak to a qualified tax professional about your specific situation.
Check a GSTIN right now, free
Five lookups a day, no account required. Status, filing history, e-invoicing and jurisdiction.
Free GST search toolBuild it into your product
One REST call, JSON back. Get an API key and 20 free verification credits in under a minute.
Start freeMore on developer integration guides
Browse every guide in the GST API blog.