GST Taxpayer Lookup | GSTIN Verification, Nature of Business
Pricing
from $3.00 / 1,000 gstin verifieds
GST Taxpayer Lookup | GSTIN Verification, Nature of Business
Verify Indian GSTINs against the official GST portal: legal name, trade name, status, constitution, registration date, jurisdiction, and Nature of Business Activities. Solves the portal CAPTCHA with a vision model, no manual step. No result, no charge.
Pricing
from $3.00 / 1,000 gstin verifieds
Rating
0.0
(0)
Developer
The Mine Works
Maintained by CommunityActor stats
0
Bookmarked
11
Total users
4
Monthly active users
3 days ago
Last modified
Categories
Share
From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors. This actor ranks #2 for "gstin verification" in Apify Store search.
Paste a list of Indian GSTINs and get each one verified against the official GST portal (services.gst.gov.in): legal name, trade name, status, constitution, registration and cancellation dates, address, jurisdiction, the HSN and SAC codes the business declared, and a one-sentence line of business written from those codes. The portal puts a CAPTCHA in front of every search; the actor reads it with a vision model, so a long supplier list needs nobody typing codes.
Why choose this actor?
- It tells you what a supplier actually deals in. Most GSTIN checks stop at "Wholesale Business". In a recorded run on 2 October 2026, 3 real GSTINs were verified in 12 seconds, and one of them came back with five declared HSN codes and this line: "wholesales and retails gold jewellery set with pearls or precious stones, alongside unmounted diamonds and synthetic or laboratory-grown precious stones for export." No GSP account, no API key, no manual CAPTCHA.
- No result, no charge. A malformed GSTIN is rejected before any request is made. A lookup that fails after every CAPTCHA attempt, or because the portal is down, returns a row with
found: falseand the reason, and is not billed. Retries cost time, never money. - Repeat checks inside your window are free. Every verified GSTIN is cached in your own Apify account. Look it up again within
cacheMaxAgeDays(7 by default, up to 90) and it comes back in about a second, markedfromCache: true, without touching the portal and without a charge.
Part of The Mine Works Company and business data family: Company Domain Finder, World Bank Trade Scraper, Company KYB Resolver, SEC EDGAR Filings Scraper, EU VAT Checker (VIES), Bundesanzeiger Scraper.
Try it in one minute
Paste this into the JSON tab of the input page and press Start. It verifies two GSTINs, usually in well under a minute.
{"gstins": ["27ABQFM7569K1Z9", "24AAWFA8982B1Z3"]}
The only input you must give is gstins: one or more 15-character GSTINs, one per line, for example straight from the GSTIN column of a purchase register. Spaces and lower case are cleaned up, and a GSTIN listed twice is looked up once. The portal searches by GSTIN only, so a company name or a PAN on its own will not work.
Apify's free plan includes $5 of credit every month, which covers about 1,200 GSTIN checks at this actor's Free plan price ($0.004 a verified GSTIN plus the $0.005 start fee, in runs of 100 at 512 MB of memory). Cache hits and failed lookups do not use any of that credit.
Copy to your AI assistant
Paste this block into ChatGPT, Claude, Cursor or any assistant that can write code, and it can run the actor for you.
themineworks/gst-taxpayer-lookup on Apify. Verifies Indian GSTINs on the official GST portal and returns one record per GSTIN with legal name, trade name, status, constitution, taxpayer type, registration and cancellation dates, principal address, centre and state jurisdiction, nature of business, declared HSN goods and SAC services codes, and a one-sentence line of business. Call ApifyClient("TOKEN").actor("themineworks/gst-taxpayer-lookup").call(run_input={...}, memory_mbytes=512), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: gstins (string[], 15-character GSTINs). Optional: concurrency (1 to 10, default 5), maxAttempts (CAPTCHA attempts per GSTIN, 1 to 8, default 6), describeBusiness (default true), cacheMaxAgeDays (0 to 90, default 7; cached results are free, 0 always fetches fresh). Records with found false were not verified and are not billed; the row with _type "summary" is a run report. Full spec: GET https://api.apify.com/v2/acts/themineworks~gst-taxpayer-lookup/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations
Key features
- 22 fields per verified GSTIN, including
status,cancellationDate,constitutionOfBusiness,taxpayerType,centreJurisdiction,stateJurisdiction,aadhaarVerified,eInvoiceStatus, and the declaredgoodsHsnandservicesSaclists with their official descriptions. - A line of business you can read.
lineOfBusinessis one plain sentence written only from the codes and flags the portal returned for that GSTIN, never from the company name. When a business declared no goods or services, it says exactly that instead of guessing. - Unattended CAPTCHA. Each attempt opens a fresh portal session, reads the numeric CAPTCHA with Google's Gemini vision model and submits it. A wrong read is retried with a new session, up to
maxAttempts(6 by default, 8 at most), andattemptson each record shows how many it took. - Up to 10 lookups at once. Most of a lookup is spent waiting on the CAPTCHA model, so
concurrency(5 by default) shortens a long list a lot. - A cache in your own account. Verified records are stored in a key-value store named
gst-taxpayer-cachein your Apify account and reused forcacheMaxAgeDays. Nothing is shared between accounts. - Clean input handling. Malformed GSTINs, duplicates and lower-case entries are dealt with before any request, and none of them is billed.
How to use it
Basic: verify one GSTIN
{"gstins": ["24AAWFA8982B1Z3"]}
You get one record with the registered details, the declared HSN and SAC codes and a line of business.
A whole purchase register at once
{"gstins": ["27ABQFM7569K1Z9", "24AAWFA8982B1Z3", "23AHBPS6324B1ZT"],"concurrency": 10,"maxAttempts": 8}
Paste the GSTIN column as it is. Higher concurrency finishes a long list sooner, and a higher maxAttempts gives stubborn lookups more chances at no extra cost. In our 2 October test, these three GSTINs were verified in 11.6 seconds; one needed a second CAPTCHA attempt.
Vendor onboarding check
{"gstins": ["27ABQFM7569K1Z9"],"cacheMaxAgeDays": 0}
Look at status (anything other than Active needs a second look), cancellationDate, constitutionOfBusiness and registrationDate. A cancelled registration still returns its full record with the date filled in, so you can tell a lapsed vendor from a number that does not exist. cacheMaxAgeDays: 0 forces a fresh portal check, which is what you want before releasing a large payment.
Monthly re-verification that only bills new suppliers
{"gstins": ["27ABQFM7569K1Z9", "24AAWFA8982B1Z3"],"cacheMaxAgeDays": 35}
Save this as a task and schedule it monthly (for example 0 9 1 * *). With a window longer than the gap between runs, every GSTIN verified last month is served from your cache for free and only suppliers added since then are looked up and charged. The trade-off is that a cached record is last month's snapshot; use a shorter window, or 0, when the current status matters more than the cost.
Classifying suppliers whose names say nothing
{"gstins": ["24AAWFA8982B1Z3"],"describeBusiness": true}
A trading name rarely tells you what a supplier sells. The declared codes do: this one came back with diamond HSN codes (cut, unworked and unsorted) and testing and manufacturing services, summed up as "manufactures, tests, and sells diamonds, precious stones, and jewelry, while also providing professional technical and business services." Group your suppliers on goodsHsn codes or on lineOfBusiness for spend analysis.
Facts only, no model summary
{"gstins": ["27ABQFM7569K1Z9", "24AAWFA8982B1Z3"],"describeBusiness": false}
Turn describeBusiness off if you want only the portal's own fields, or if your policy does not allow supplier details to be sent to an AI model. lineOfBusiness is then null; the HSN and SAC lists are still returned.
Input parameters
| Parameter | Type | Default | What it does |
|---|---|---|---|
gstins | array of strings | required (form prefill: two sample GSTINs) | GSTINs to verify, standard 15-character format such as 27ABQFM7569K1Z9. Trimmed, upper-cased and deduplicated. Entries that do not match the GSTIN pattern are returned as found: false and never cost anything. |
maxAttempts | integer (1 to 8) | 6 | CAPTCHA attempts per GSTIN. Each attempt is a fresh portal session and a fresh CAPTCHA. Only a verified result is billed, so more attempts cost time, not money. |
concurrency | integer (1 to 10) | 5 | How many GSTINs are looked up at the same time. |
describeBusiness | boolean | true | Adds lineOfBusiness, one sentence written by a language model strictly from the codes and flags this lookup returned. |
cacheMaxAgeDays | integer (0 to 90) | 7 | Reuse a result verified within this many days instead of fetching and charging again. 0 always fetches fresh. |
There is no proxy setting: the actor calls the GST portal directly from Apify's servers. Runs have a 3,600 second timeout by default. A single lookup took between about 5 and 35 seconds in our tests, depending on CAPTCHA retries and model response time, so for very long lists raise concurrency or split the list across runs.
Set the memory to 512 MB. The actor never needs more than 256 to 512 MB, but the Apify start fee is charged per GB of memory a run is given. If your run options show a larger figure (the actor's Console default is 4 GB), lower it to 512 MB in Run options, or pass memory_mbytes=512 (Python) or memory: 512 (JavaScript) when you call it from code.
What data do you get?
One record per GSTIN you submitted.
Identity: gstin, legalName, tradeName (the portal shows NA or repeats the legal name when there is no separate trade name), constitutionOfBusiness (such as Partnership, Limited Liability Partnership or Proprietorship), taxpayerType (such as Regular).
Registration: status, registrationDate and cancellationDate (both as the portal writes them, DD/MM/YYYY; cancellationDate is null for an active registration), aadhaarVerified and eInvoiceStatus (Yes or No flags from the portal).
Location and jurisdiction: principalAddress (one line), centreJurisdiction and stateJurisdiction (the CBIC and state tax offices, as the portal lists them).
What the business does: natureOfBusinessActivities (the portal's self-declared list, such as Wholesale Business, Retail Business, Export, Factory / Manufacturing), natureOfCoreBusiness (the portal's short code, such as MFT or TRD:TRR, passed through as is), goodsHsn (each declared HSN code with its official description), servicesSac (each declared SAC code with its description) and lineOfBusiness.
About the lookup: found (true when verified), attempts (CAPTCHA attempts used), error (null on success, otherwise the reason), fromCache (true when served from your cache), and cachedAt on cache hits.
A GSTIN that could not be verified returns the same record shape with found: false, empty fields and error set; a malformed entry returns only gstin, found, fromCache and error. Neither is billed. Each run ends with one _type: "summary" row: gstins_requested, verified, served_from_cache, failed, concurrency, described, cache_max_age_days and scraped_at.
Stable fields for automations
These 14 fields were present in every verified record we sampled (six verified records across four local runs on 2 October 2026, including a cache hit):
| Field | What it holds |
|---|---|
gstin | The GSTIN, upper case |
found | true for a verified record |
legalName | Legal name as registered |
tradeName | Trade name as registered |
status | Registration status, such as Active |
constitutionOfBusiness | Legal form of the business |
taxpayerType | Taxpayer type, such as Regular |
registrationDate | Registration date, DD/MM/YYYY |
principalAddress | Principal place of business, one line |
natureOfBusinessActivities | Array of the declared activity types |
goodsHsn | Array of { code, description } for declared goods (may be empty) |
servicesSac | Array of { code, description } for declared services (may be empty) |
attempts | CAPTCHA attempts the lookup took |
fromCache | true when the record came from your cache and was not billed |
We will not rename these fields. New fields may be added over time; existing ones keep their names.
Output examples
Real records from our own runs on 2 October 2026, with long HSN descriptions trimmed.
A limited liability partnership with five declared HSN codes (it took two CAPTCHA attempts):
{"gstin": "27ABQFM7569K1Z9","found": true,"legalName": "MIDAMAS JEWELS LLP","tradeName": "MIDAMAS JEWELS LLP","status": "Active","constitutionOfBusiness": "Limited Liability Partnership","taxpayerType": "Regular","registrationDate": "20/09/2021","cancellationDate": null,"principalAddress": "2nd Floor, 204, Brahans Business Park, Mahakali Caves Road, Andheri East, Near Paper Box Fcatory, Mumbai, Mumbai Suburban, Maharashtra, 400093","natureOfBusinessActivities": ["Export", "Recipient of Goods or Services", "Wholesale Business", "Retail Business"],"natureOfCoreBusiness": "MFT","centreJurisdiction": "State - CBIC,Zone - MUMBAI,Commissionerate - MUMBAI-EAST,Division - DIVISION X,Range - RANGE-III","stateJurisdiction": "State - Maharashtra,Zone - MUMBAI_NORTH,Division - SAKINAKA,Charge - CHAKALA_704 (Jurisdictional Office)","aadhaarVerified": "Yes","eInvoiceStatus": "Yes","goodsHsn": [{ "code": "71131940", "description": "ARTICLES OF JEWELLERY AND PARTS THEREOF, OF PRECIOUS METAL … OF GOLD, SET WITH OTHER PRECIOUS AND SEMI- PRECIOUS STONES" },{ "code": "71049010", "description": "SYNTHETIC OR RECONSTRUCTED PRECIOUS OR SEMI-PRECIOUS STONES … LABORATORY GROWN OR MANMADE OR CULTURED OR SYNTHETIC DIAMONDS" },{ "code": "71023910", "description": "DIAMOND, CUT OR OTHERWISE WORKED BUT NOT MOUNTED OR SET" }],"servicesSac": [],"attempts": 2,"error": null,"lineOfBusiness": "This business wholesales and retails gold jewellery set with pearls or precious stones, alongside unmounted diamonds and synthetic or laboratory-grown precious stones for export.","fromCache": false}
The jurisdiction strings are copied from the portal exactly, including its own hyphens.
A partnership with declared goods and services, served from the cache on a repeat run (trimmed to the fields that matter here; the full record is the same shape as above):
{"gstin": "24AAWFA8982B1Z3","found": true,"legalName": "A P GEMS","tradeName": "A P GEMS","status": "Active","constitutionOfBusiness": "Partnership","registrationDate": "01/07/2017","natureOfBusinessActivities": ["Retail Business", "Office / Sale Office", "Works Contract", "Factory / Manufacturing"],"goodsHsn": [{ "code": "71023910", "description": "DIAMOND, CUT OR OTHERWISE WORKED BUT NOT MOUNTED OR SET" },{ "code": "71021000", "description": "UNSORTED" }],"servicesSac": [{ "code": "9988", "description": "Manufacturing services on physical inputs (goods) owned by others" },{ "code": "998346", "description": "Technical testing and analysis services" }],"attempts": 2,"error": null,"lineOfBusiness": "This business manufactures, tests, and sells diamonds, precious stones, and jewelry, while also providing professional technical and business services.","fromCache": true,"cachedAt": "2026-10-02T08:05:20.869Z"}
A malformed entry, rejected before any request and not billed:
{"gstin": "NOTAGSTIN123","found": false,"fromCache": false,"error": "malformed GSTIN (does not match the standard 15-character pattern)"}
The summary row that ended the three-GSTIN run (the lower-case duplicate of the first GSTIN was merged before counting, the malformed entry counts as failed):
{"_type": "summary","gstins_requested": 4,"verified": 3,"served_from_cache": 0,"failed": 1,"concurrency": 5,"described": true,"cache_max_age_days": 0,"scraped_at": "2026-10-02T08:02:07.879Z"}
In the same run, a proprietorship came back verified with empty goodsHsn and servicesSac, and its lineOfBusiness read "Registration declares no goods or services; activity not determinable from GST data." That is the honest answer when a business declared nothing at registration.
Pricing
Pay per event: you pay for each GSTIN verified, plus a small start fee per run.
| Event | Free | Bronze | Silver | Gold and above |
|---|---|---|---|---|
gstin-verified, per GSTIN | $0.004 | $0.0036 | $0.0032 | $0.003 |
gstin-verified, per 1,000 GSTINs | $4.00 | $3.60 | $3.20 | $3.00 |
apify-actor-start, per run | $0.005 per GB of run memory, minimum one event | same | same | same |
The start fee, exactly. Apify's apify-actor-start event is charged once when a run starts, at $0.005 for each GB of memory the run is given, with a minimum of one event. At 512 MB (or 256 MB) a run pays one event, $0.005. The actor's Console default is 4 GB, which would make the start fee $0.02, so set the memory to 512 MB as described above.
Worked examples on the Gold tier, at 512 MB: 100 verified GSTINs cost $0.30 plus $0.005. 1,000 cost $3.00 plus $0.005. On the Free tier, 100 cost $0.40 plus $0.005.
Never charged: malformed GSTINs, duplicates within a run, lookups that fail after every CAPTCHA attempt, portal errors and timeouts, CAPTCHA retries, cache hits inside cacheMaxAgeDays, the lineOfBusiness sentence (included in the price) and the summary row. A run where nothing is verified pays only the start fee.
There is no scheduled price change for this actor; these prices have applied since 14 September 2026. The Pricing tab on this page always shows the rate for your own plan; if it and this table ever differ, the Pricing tab is right.
FAQ
What is a GSTIN, and where does the data come from? A GSTIN is the 15-character Goods and Services Tax identification number every GST-registered business in India has. The actor uses the public "Search Taxpayer" service on the official GST portal, services.gst.gov.in, the same search anyone can do in a browser after typing a CAPTCHA.
Do I need an API key, a GSP account or a portal login? No. You need only an Apify account. The actor does not use a GST Suvidha Provider, does not log in to the portal and needs no key of yours. The CAPTCHA model runs on our own key and is included in the price.
How many GSTINs can I check in one run?
There is no fixed cap on the list. Lookups run concurrency at a time (up to 10), each taking roughly 5 to 35 seconds depending on CAPTCHA retries, within a default run timeout of 3,600 seconds. For a very long register, raise concurrency or split it across a few runs.
How fresh is the data?
A fresh lookup is read from the portal at the moment of the run. A cached record is the snapshot from when it was first verified, and it says so with fromCache: true and cachedAt. Set cacheMaxAgeDays to 0 for a live check.
Why do some lookups take more than one attempt?
The portal answers a wrongly read CAPTCHA with a generic session error rather than saying the CAPTCHA was wrong, so the only recovery is a new session and a new CAPTCHA. attempts on every record shows how many it took. Only a verified result is billed.
Why do some businesses have no HSN or SAC codes?
Declaring goods and services at registration is not always enforced, and some businesses never did. Those records come back verified with empty goodsHsn and servicesSac, and lineOfBusiness says the activity cannot be determined from GST data.
Does a cancelled GSTIN still return data?
Yes. The record comes back with its status and cancellationDate, which helps when reconciling old invoices against a supplier who has since deregistered.
Can I search by company name or PAN? No. The portal's public search is keyed by GSTIN, so the actor is too.
Where does the line of business come from, and is anything sent to an AI model?
Two things go to Google's Gemini model: the CAPTCHA image, to read its digits, and, when describeBusiness is on, the facts this lookup returned (legal and trade name, constitution, nature of business and up to 8 HSN and 5 SAC descriptions), to write one sentence. The model is told to use only those facts and never outside knowledge about a company. Turn describeBusiness off and only the CAPTCHA image goes to the model.
How does the cache work?
Every verified record is written to a key-value store named gst-taxpayer-cache in your own Apify account, keyed by GSTIN, only after the lookup was billed. A later run within cacheMaxAgeDays returns it without contacting the portal and without a charge. You can open or delete that store under Storage in Apify Console. Nothing is shared between accounts.
Can I run it on a schedule?
Yes. Save your input as a task, then in Apify Console open Schedules, create a schedule (for example monthly, 0 9 1 * *) and pick the task. Pair it with a cacheMaxAgeDays longer than the schedule interval if you only want to pay for new GSTINs, or a short one if you want every status rechecked.
How do I export the data?
From the run's Storage tab as JSON, CSV, Excel, XML or HTML, or through the Apify API. goodsHsn and servicesSac are lists, so JSON keeps them intact; in CSV they are flattened into numbered columns. Remove the row with _type: "summary" if you want taxpayer records only.
Can I use it from Claude, ChatGPT or another AI assistant?
- Connector URL:
https://mcp.apify.com/?tools=themineworks/gst-taxpayer-lookup. - Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code:
claude mcp add -t http gst-taxpayer-lookup "https://mcp.apify.com/?tools=themineworks/gst-taxpayer-lookup".
Is it legal to use GST portal data this way? The actor reads only the public taxpayer search the government publishes for anyone to verify a GSTIN, and it does not log in. A record is a point-in-time snapshot of what the portal shows, not a tax opinion or a compliance clearance, and the line of business reads the declared codes, which may differ from what a supplier actually invoices. A proprietorship's legal name is a person's name, so treat those records as personal data. You are responsible for how you use the data, including India's DPDP Act and, where they apply, GDPR and CCPA. This is general information, not legal advice.
Integrations
- Google Sheets: export a run straight to a sheet next to your purchase register, or use Apify's Google Sheets integration to add each run's results.
- Make, Zapier and n8n: use the Apify app or node to verify a GSTIN when a new vendor is added to your ERP or form, then route the result.
- Webhooks: have Apify call your URL when a run succeeds, then fetch the dataset.
- API and client libraries: start runs and read datasets from Python, JavaScript or any HTTP client. See the "Copy to your AI assistant" block above for the exact call.
- MCP clients: Claude, ChatGPT, Cursor, VS Code and other MCP clients can call the actor through
https://mcp.apify.com.
More from The Mine Works
Company and business data
- Company Domain Finder
- World Bank Trade Scraper
- Company KYB Resolver
- SEC EDGAR Filings Scraper
- EU VAT Checker (VIES)
- Bundesanzeiger Scraper
- Tech Stack Detector
- Domain to LinkedIn URL Resolver
- US Import Records
- Y Combinator Scraper
- USAspending Scraper
- Norway Company Register
Social media and video
Leads and business directories
Marketing, SEO and reviews
Real estate
Science, health and government data
Jobs and hiring
E-commerce and marketplaces
Food and local services
Developer and AI tools
More tools
- Tennis Match & Player Data Scraper
- Google Hotels Prices Scraper
- LandWatch Scraper
- Taobao Products Scraper 淘宝 天猫
Support
Found a bug or need a field we do not return yet? Open an issue on the Issues tab of this page and we will reply there. To ask for a new registry or data source, email dmineworks@gmail.com. A guide and FAQ for this actor also live at themineworks.com.
GST Taxpayer Lookup verifies Indian GSTINs on the official portal without manual CAPTCHAs and tells you what each supplier deals in, billed only for GSTINs it actually verifies.

