Early accessWe're onboarding teams in batches. The sandbox and docs are open to everyone. Request access →

Skip to content
APIserver.in
Docs menu

Docs

Quickstart

From zero to a verified GSTIN in three steps. No sales call, no minimum.

  1. Get a test key

    Sign up with your email. The dashboard opens with a test key (as_test_…) and ₹100 of demo credit — no card, no company form.

    Test keys run against fictional sandbox data and are never billed. Signed in? Every snippet in these docs already uses your key.
  2. Make your first call

    Verify a GSTIN. Swap in any language — your choice is remembered across the site.

    curl https://api.apiserver.in/v1/gst/verify \
      -H "Authorization: Bearer as_test_YOUR_KEY" \
      -H "Content-Type: application/json" \
      -d '{"gstin":"29AAJCK4821M1Z1"}'
    const res = await fetch("https://api.apiserver.in/v1/gst/verify", {
      method: "POST",
      headers: {
        Authorization: `Bearer ${process.env.APISERVER_KEY ?? "as_test_YOUR_KEY"}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        "gstin": "29AAJCK4821M1Z1"
      }),
    });
    
    const { success, data, meta, error } = await res.json();
    console.log(meta.charged, meta.amount_inr); // failed calls are never charged
    import os, requests
    
    res = requests.post(
        "https://api.apiserver.in/v1/gst/verify",
        headers={
            "Authorization": f"Bearer {os.getenv('APISERVER_KEY', 'as_test_YOUR_KEY')}",
        },
        json={
            "gstin": "29AAJCK4821M1Z1",
        },
        timeout=10,
    )
    body = res.json()
    print(body["meta"]["charged"], body["meta"]["amount_inr"])
    <?php
    $ch = curl_init('https://api.apiserver.in/v1/gst/verify');
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => [
            'Authorization: Bearer ' . (getenv('APISERVER_KEY') ?: 'as_test_YOUR_KEY'),
            'Content-Type: application/json',
        ],
        CURLOPT_POSTFIELDS => json_encode([
            'gstin' => '29AAJCK4821M1Z1',
        ]),
    ]);
    $body = json_decode(curl_exec($ch), true);
    echo $body['meta']['charged'] ? 'charged' : 'not charged';

    Production base URL is https://api.apiserver.in. In this prototype the same API runs at /api/v1/… on this site — the playground uses it.

  3. Read the response

    Every endpoint returns the same envelope. data holds the normalized result; meta tells you what it cost and how fresh it is.

    200 OK
    {
      "success": true,
      "request_id": "as_req_01J9X2K7R8M4V6T2Q9W3E5Y1ZB",
      "api": "gst.verify",
      "version": "2026-10-01",
      "data": {
        "gstin": "29AAJCK4821M1Z1",
        "legal_name": "KAVERI TEXTILES PRIVATE LIMITED",
        "trade_name": "Kaveri Textiles",
        "status": "Active",
        "registration_date": "2017-07-01",
        "cancellation_date": null,
        "taxpayer_type": "Regular",
        "constitution": "Private Limited Company",
        "state": "Karnataka",
        "state_code": "29",
        "pan": "AAJCK4821M",
        "principal_place": {
          "line1": "No. 14, 3rd Cross, Phase II",
          "locality": "Peenya Industrial Area",
          "city": "Bengaluru",
          "district": "Bengaluru Urban",
          "state": "Karnataka",
          "pincode": "560058"
        },
        "nature_of_business": [
          "Manufacturing",
          "Wholesale Business"
        ],
        "einvoice_enabled": true
      },
      "meta": {
        "charged": true,
        "amount_inr": 0.75,
        "latency_ms": 284,
        "source_status": "live",
        "attempts": 1,
        "data_as_of": "2026-10-03T09:12:00+05:30",
        "mode": "live"
      }
    }

    meta.charged is true only for successful calls. Failures, timeouts and not-found are always false with amount_inr: 0.

Next steps