# GST Verification India - GSTIN Lookup & Business Details (`thirdwatch/gst-verification-scraper`) Actor

Verify Indian GST numbers (GSTIN) and get business details. Returns legal name, trade name, registration status, taxpayer type, constitution, state jurisdiction, and more. Bulk GSTIN verification supported.

- **URL**: https://apify.com/thirdwatch/gst-verification-scraper.md
- **Developed by:** [Thirdwatch](https://apify.com/thirdwatch) (community)
- **Categories:** Other
- **Stats:** 23 total users, 8 monthly users, 74.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## GST Verification India — GSTIN Lookup & Bulk Validation

> **Thirdwatch portfolio:** 5K users across 88 public Actors, 2M+ records delivered, and >99% run success. [Explore all Thirdwatch Actors](https://apify.com/thirdwatch).

Validate Indian GSTIN format and checksum, then retrieve public registration metadata including legal name, trade name, status, taxpayer type, constitution, jurisdiction, and registration date.

The Actor is built for vendor onboarding, KYB, accounts-payable controls, supplier-master cleanup, and recurring registration-status monitoring. It runs over HTTP at 256 MB—no browser, captcha solver, login, or user API key. Direct requests are used first; a low-cost rotating datacenter request is used only when the public source persistently rejects the Actor's normal IP.

### Why use this Actor

- **Real checksum validation** — catches well-shaped GSTIN typos that a regular expression misses.
- **One useful outcome per input** — invalid format and checksum values become explicit validation rows instead of disappearing.
- **Bulk-ready** — up to 10,000 unique inputs, with bounded concurrency and a conservative global three-request-per-second limit.
- **Deadline-safe** — exits before the Apify timeout and records any unprocessed inputs for a follow-up run.
- **Honest source states** — distinguishes `verified`, `not_indexed`, `invalid_format`, and `invalid_checksum`.
- **No billing for transport failures** — upstream HTTP failures go to the `ERRORS` key-value-store record, not the paid dataset.
- **No duplicate billing** — whitespace/hyphen variants and repeated GSTINs are normalized and deduplicated across the run.

### Data source and freshness

Detailed registration metadata comes from Razorpay's public, server-rendered GST number index. This is a public business index that mirrors registration metadata; it is not a direct authenticated GSTN/GSP feed.

When the index has no detailed record for a checksum-valid GSTIN, the Actor returns `verification_status: "not_indexed"` and derives the PAN, state, state code, and entity number from the GSTIN itself. Treat `not_indexed` as “not present in this public index,” not as proof that the registration does not exist.

For regulated decisions requiring authoritative real-time confirmation, cross-check `verified` and `not_indexed` outcomes with the official GST portal or a licensed GSP.

### Input

```json
{
  "queries": [
    "27AADCB2230M1ZT",
    "27AAACT2727Q1ZW"
  ],
  "maxResults": 100,
  "concurrency": 8
}
```

| Field | Required | Default | Description |
| --- | --- | ---: | --- |
| `queries` | Yes | — | GSTIN strings. Spaces and hyphens are removed; duplicates are ignored. |
| `maxResults` | No | 100 | Maximum unique inputs to process, up to 10,000. The run log reports how many additional unique inputs were capped. |
| `concurrency` | No | 8 | Parallel workers, 1–16. All workers share a three-request-per-second cap. |

The advanced concurrency setting controls overlap, not request rate. Raising it can hide network latency but cannot exceed the global upstream-friendly rate limit.

### Output

```json
{
  "gstin": "27AADCB2230M1ZT",
  "business_name": "BILT GRAPHIC PAPER PRODUCTS LIMITED",
  "trade_name": null,
  "status": "Active",
  "registration_date": "June 30, 2017",
  "registration_date_iso": "2017-06-30",
  "taxpayer_type": "Regular",
  "constitution": "Public Limited Company",
  "state": "Maharashtra",
  "state_jurisdiction": "CHANDRAPUR_501",
  "central_jurisdiction": null,
  "address": null,
  "pan": "AADCB2230M",
  "state_code": "27",
  "entity_number": "1",
  "valid_format": true,
  "checksum_valid": true,
  "verification_status": "verified",
  "data_source": "razorpay",
  "source_url": "https://razorpay.com/gst-number-search/27AADCB2230M1ZT/",
  "source_http_status": 200,
  "attempts": 1,
  "verified_at": "2026-07-16T16:30:00+00:00",
  "query": "27AADCB2230M1ZT"
}
```

#### Verification statuses

| Status | Meaning | Recommended action |
| --- | --- | --- |
| `verified` | A detailed record was found in the public index. | Use the returned snapshot; cross-check for high-risk decisions. |
| `not_indexed` | Format and checksum are valid, but no detailed indexed record was returned. | Check the official portal/GSP before treating it as unregistered. |
| `invalid_format` | The input is not a 15-character GSTIN. | Correct the source data. |
| `invalid_checksum` | The shape is valid but the check digit is wrong. | Treat as a probable typo or fabricated identifier. |

### Error handling

Transient 403, 408, 425, 429, and 5xx responses use bounded exponential backoff and honor `Retry-After`. Persistent 403s receive one browser-shaped TLS retry and, only if necessary, one rotating datacenter-IP retry. A persistent upstream failure is not written to the paid dataset. Instead, inspect the Actor output property **Unbilled Source Errors** or the default key-value store record named `ERRORS`:

```json
{
  "count": 1,
  "unprocessedInputs": 0,
  "items": [
    {
      "gstin": "27AADCB2230M1ZT",
      "attempts": 4,
      "http_status": 503,
      "error": "Transient HTTP 503"
    }
  ]
}
```

### Pricing

Pay per dataset result. Source transport failures are not dataset results and are not billed.

| Apify tier | Price per validation | Price per 1,000 |
| --- | ---: | ---: |
| FREE | $0.0020 | $2.00 |
| BRONZE | $0.0018 | $1.80 |
| SILVER | $0.0016 | $1.60 |
| GOLD | $0.0012 | $1.20 |

`verified`, `not_indexed`, `invalid_format`, and `invalid_checksum` rows are completed validation outcomes and count as results. Repeated normalized GSTINs are emitted only once.

For backward compatibility, `registration_date` retains the source's display string and `data_source` retains the value `razorpay`. New integrations should use `registration_date_iso` for comparisons and `verification_status` for the explicit outcome.

### Recurring vendor-monitoring workflow

1. Export the active vendor GSTIN list from the ERP or AP system.
2. Run the Actor monthly with the full list.
3. Upsert rows by `gstin`, retaining the prior snapshot.
4. Alert on `status` changes such as Active → Suspended or Cancelled.
5. Route `not_indexed` and input-validation failures to a manual/GSP verification queue.

Status data changes infrequently, so monthly full-list verification plus on-demand checks for newly onboarded vendors is usually more useful and cheaper than daily polling.

### Limitations

- This Actor returns registration metadata available in the public index. It does not return GSTR filing history, e-invoice eligibility, turnover, authorized signatories, goods/services classifications, or cancellation history.
- Public-index metadata can lag the official GST portal.
- Address, trade name, and central jurisdiction are absent for some records.
- `not_indexed` does not mean “invalid” or “cancelled.”

Pairs well with [IndiaMart Supplier Scraper](https://apify.com/thirdwatch/indiamart-supplier-scraper?fpr=9m2cd6) for supplier discovery and [MCA India Scraper](https://apify.com/thirdwatch/mca-india-scraper?fpr=9m2cd6) for company-registry cross-checks.

More workflow recipes are available at [thirdwatch.dev](https://thirdwatch.dev).

Last verified: 2026-07

# Actor input Schema

## `queries` (type: `array`):

List of 15-character GSTIN values to validate and look up. Example: '27AADCB2230M1ZT'.

## `maxResults` (type: `integer`):

Maximum number of results to return. Mainly useful to limit output when providing many GSTINs.

## `concurrency` (type: `integer`):

Parallel workers. Requests are globally capped at 3 per second; the default is tuned for reliable bulk verification.

## Actor input object example

```json
{
  "queries": [
    "27AADCB2230M1ZT"
  ],
  "maxResults": 5,
  "concurrency": 8
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `errors` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "27AADCB2230M1ZT"
    ],
    "maxResults": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("thirdwatch/gst-verification-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "queries": ["27AADCB2230M1ZT"],
    "maxResults": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("thirdwatch/gst-verification-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "27AADCB2230M1ZT"
  ],
  "maxResults": 5
}' |
apify call thirdwatch/gst-verification-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=thirdwatch/gst-verification-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/JxYaQ8NuCetreBx9T/builds/qph34Ya80Ba0D7d0M/openapi.json
