{
    "openapi": "3.1.0",
    "info": {
        "title": "GSTIN API",
        "version": "1.1.0",
        "summary": "Verify Indian GST registration numbers, one at a time or in bulk.",
        "description": "Live GSTIN verification against the Indian GST register, sourced through a GST\nSuvidha Provider network rather than by scraping the public portal.\n\n## Billing\n\nPay-as-you-go from a credit balance. **Only a lookup that returns a live\nregistration costs a credit.** A malformed GSTIN, a number with no registration\nbehind it, and a failure on our side are all free — on the single endpoint and\ninside a bulk job alike. In a bulk job, a GSTIN repeated across several rows is\nverified once and charged once.\n\nPricing is ₹0.50 per verification, falling to ₹0.40 once a credit purchase\ncrosses 2,500 credits.\n\n## Single vs bulk\n\nUse `GET /api/get-taxpayer-info/{gstin}` for one number. For a list, use the\nbulk endpoints rather than looping the single one: a bulk job accepts up to\n10000 GSTINs, is paced by our own queue, and needs no client-side batching or\nrate limiting. Bulk work is always asynchronous — submit, then poll.\n\n## Errors\n\n`401` invalid or missing API key · `402` insufficient credits ·\n`404` no such job on this account · `409` job already finished ·\n`422` nothing usable in the submission · `429` rate limited or too many\nrunning jobs · `502` the government data source was unreachable.",
        "termsOfService": "https://gstinapi.com/terms",
        "license": {
            "name": "Commercial — see terms of service",
            "url": "https://gstinapi.com/terms"
        },
        "contact": {
            "name": "GSTIN API support",
            "url": "https://gstinapi.com/contact",
            "email": "contact@gstinapi.com"
        },
        "x-documentation": "https://gstinapi.com/docs"
    },
    "servers": [
        {
            "url": "https://gstinapi.com",
            "description": "Production"
        }
    ],
    "security": [
        {
            "ApiKeyAuth": []
        }
    ],
    "tags": [
        {
            "name": "Verification",
            "description": "Verify a single GSTIN."
        },
        {
            "name": "Bulk",
            "description": "Verify a list of GSTINs as an asynchronous job."
        }
    ],
    "paths": {
        "/api/get-taxpayer-info/{gstin}": {
            "get": {
                "tags": [
                    "Verification"
                ],
                "operationId": "getTaxpayerInfo",
                "summary": "Verify one GSTIN",
                "description": "Returns the taxpayer record for a single GSTIN.\n\n**This endpoint answers `200` for a GSTIN that does not exist.** A number\nwith no registration behind it is a real answer rather than an error, and\nis reported inside the body as `taxpayer_data.status_code: 0` with an\nerror code in `taxpayer_data.error`. The same is true of a GSTIN that\nfails its checksum, which is rejected without contacting the government\nsource at all. Neither costs a credit — check `status_code`, not just the\nHTTP status.\n\nA `502` means our upstream source was unreachable. Nothing is charged;\nretry.",
                "parameters": [
                    {
                        "name": "gstin",
                        "in": "path",
                        "required": true,
                        "description": "The 15-character GSTIN. Case-insensitive; spaces and dashes are stripped before validation.",
                        "schema": {
                            "type": "string",
                            "example": "27AAACR5055K1Z7"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "The taxpayer record, or a structured \"no such registration\" answer. Charged only in the former case.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/TaxpayerEnvelope"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthorized"
                    },
                    "402": {
                        "$ref": "#/components/responses/PaymentRequired"
                    },
                    "502": {
                        "$ref": "#/components/responses/UpstreamUnavailable"
                    }
                }
            }
        },
        "/api/bulk/jobs": {
            "post": {
                "tags": [
                    "Bulk"
                ],
                "operationId": "createBulkJob",
                "summary": "Submit a list of GSTINs",
                "description": "Accepts up to 10000 GSTINs and returns immediately with a job ID; the\nlist is verified in the background at a rate this service controls, so no\nclient-side batching or rate limiting is needed.\n\nSupply either `gstins` as an array, or `text` as a blob to have the\nGSTINs pulled out of it — one per line, comma separated, or pasted\nstraight from a spreadsheet column.\n\nMalformed entries are settled at submission without ever reaching the\ngovernment source. Duplicates are verified once and charged once, but\nstill appear as separate rows in the results, in the order submitted.\n\nAn account may hold 3 unfinished jobs at once. Throttled to\n20 submissions per minute.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/BulkJobRequest"
                            },
                            "examples": {
                                "array": {
                                    "summary": "An array of GSTINs",
                                    "value": {
                                        "name": "Vendor master",
                                        "gstins": [
                                            "27AAACR5055K1Z7",
                                            "29AAACI1195H1ZI"
                                        ]
                                    }
                                },
                                "pasted": {
                                    "summary": "A pasted spreadsheet column",
                                    "value": {
                                        "text": "27AAACR5055K1Z7\n29AAACI1195H1ZI\n"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "202": {
                        "description": "Accepted and queued. Poll the job to follow it.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/BulkJobEnvelope"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthorized"
                    },
                    "402": {
                        "$ref": "#/components/responses/PaymentRequired"
                    },
                    "422": {
                        "description": "Nothing usable in the submission: `no_gstins` when no candidates were found, `too_many_gstins` when the list is over the per-job ceiling.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Either the submission throttle, or `too_many_active_jobs` when the account already holds the maximum number of unfinished jobs.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            },
            "get": {
                "tags": [
                    "Bulk"
                ],
                "operationId": "listBulkJobs",
                "summary": "List recent jobs",
                "description": "Jobs belonging to the account, newest first. Jobs are scoped to the account rather than the key, so a rotated key still reaches the jobs it started.",
                "parameters": [
                    {
                        "name": "per_page",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "default": 25,
                            "minimum": 1,
                            "maximum": 100
                        }
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "A page of jobs.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "success": {
                                            "type": "boolean"
                                        },
                                        "jobs": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/BulkJob"
                                            }
                                        },
                                        "pagination": {
                                            "$ref": "#/components/schemas/Pagination"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthorized"
                    }
                }
            }
        },
        "/api/bulk/jobs/{job_id}": {
            "get": {
                "tags": [
                    "Bulk"
                ],
                "operationId": "getBulkJob",
                "summary": "Check a job",
                "description": "The endpoint to poll. Every few seconds is fine — it reads one row and\nnever touches the government source.\n\nPoll until `status` is `completed`, `cancelled` or `failed`. A completed\njob carrying `stopped_reason: insufficient_credits` ran out of balance\npart way through: the rows it never reached are marked `skipped` in the\nresults and were not charged.",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/JobId"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "The job as it stands.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/BulkJobEnvelope"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthorized"
                    },
                    "404": {
                        "$ref": "#/components/responses/JobNotFound"
                    }
                }
            },
            "delete": {
                "tags": [
                    "Bulk"
                ],
                "operationId": "cancelBulkJob",
                "summary": "Cancel a running job",
                "description": "Rows already verified keep their results and remain charged. Nothing still pending is looked up or billed — those rows become `skipped`.",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/JobId"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Cancelled.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "success": {
                                            "type": "boolean"
                                        },
                                        "job": {
                                            "$ref": "#/components/schemas/BulkJob"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthorized"
                    },
                    "404": {
                        "$ref": "#/components/responses/JobNotFound"
                    },
                    "409": {
                        "description": "`already_finished` — the job had already completed, failed or been cancelled.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/bulk/jobs/{job_id}/results": {
            "get": {
                "tags": [
                    "Bulk"
                ],
                "operationId": "getBulkResults",
                "summary": "Collect the results",
                "description": "One entry per submitted row, in the order submitted, paginated.\n\nReadable while the job is still running — rows appear as they are\nverified — so a client that wants to start processing early can. Pass\n`format=csv` for a spreadsheet instead of JSON, or `outcome` to take only\ncertain rows.",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/JobId"
                    },
                    {
                        "name": "format",
                        "in": "query",
                        "description": "Pass `csv` to stream the results as a CSV download instead of JSON.",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "json",
                                "csv"
                            ]
                        }
                    },
                    {
                        "name": "outcome",
                        "in": "query",
                        "description": "Comma-separated outcomes to include, e.g. `ok` for verified rows only, or `not_found,invalid_format` to review the rest.",
                        "schema": {
                            "type": "string",
                            "example": "ok"
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "default": 100,
                            "minimum": 1,
                            "maximum": 1000
                        }
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "A page of results, or the whole job as CSV.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "success": {
                                            "type": "boolean"
                                        },
                                        "job": {
                                            "$ref": "#/components/schemas/BulkJob"
                                        },
                                        "results": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/BulkResultRow"
                                            }
                                        },
                                        "pagination": {
                                            "$ref": "#/components/schemas/Pagination"
                                        }
                                    }
                                }
                            },
                            "text/csv": {
                                "schema": {
                                    "type": "string",
                                    "format": "binary"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthorized"
                    },
                    "404": {
                        "$ref": "#/components/responses/JobNotFound"
                    }
                }
            }
        }
    },
    "components": {
        "securitySchemes": {
            "ApiKeyAuth": {
                "type": "apiKey",
                "in": "header",
                "name": "X-API-Key",
                "description": "Per-account key, created and rotated from the dashboard at https://gstinapi.com/settings/api-keys. New accounts receive 20 free credits on email verification."
            }
        },
        "parameters": {
            "JobId": {
                "name": "job_id",
                "in": "path",
                "required": true,
                "description": "The `job_id` returned when the job was submitted.",
                "schema": {
                    "type": "string",
                    "format": "uuid"
                }
            }
        },
        "schemas": {
            "BulkJobRequest": {
                "type": "object",
                "description": "Supply exactly one of `gstins` or `text`.",
                "properties": {
                    "gstins": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "maxLength": 64
                        },
                        "minItems": 1,
                        "maxItems": 10000,
                        "description": "The GSTINs to verify, in the order you want them back."
                    },
                    "text": {
                        "type": "string",
                        "description": "A blob to extract GSTINs from — one per line, comma separated, or pasted from a spreadsheet."
                    },
                    "name": {
                        "type": "string",
                        "maxLength": 255,
                        "description": "A label for the job, to recognise it in the list later."
                    }
                }
            },
            "BulkJobEnvelope": {
                "type": "object",
                "properties": {
                    "success": {
                        "type": "boolean"
                    },
                    "job": {
                        "$ref": "#/components/schemas/BulkJob"
                    },
                    "links": {
                        "type": "object",
                        "description": "Where to poll this job and collect its results.",
                        "properties": {
                            "self": {
                                "type": "string",
                                "format": "uri"
                            },
                            "results": {
                                "type": "string",
                                "format": "uri"
                            },
                            "csv": {
                                "type": "string",
                                "format": "uri"
                            }
                        }
                    }
                }
            },
            "BulkJob": {
                "type": "object",
                "description": "A submitted list and how far through it we are.",
                "properties": {
                    "job_id": {
                        "type": "string",
                        "format": "uuid"
                    },
                    "status": {
                        "type": "string",
                        "enum": [
                            "queued",
                            "processing",
                            "completed",
                            "cancelled",
                            "failed"
                        ],
                        "description": "Terminal states are `completed`, `cancelled` and `failed`. Stop polling on any of them."
                    },
                    "stopped_reason": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "insufficient_credits",
                            "cancelled",
                            null
                        ],
                        "description": "Why a job ended before reaching every row. Null on a job that ran to completion normally."
                    },
                    "name": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "source": {
                        "type": "string",
                        "enum": [
                            "api",
                            "dashboard"
                        ]
                    },
                    "progress": {
                        "type": "object",
                        "properties": {
                            "percent": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 100
                            },
                            "total_rows": {
                                "type": "integer",
                                "description": "Entries submitted, duplicates included."
                            },
                            "total_lookups": {
                                "type": "integer",
                                "description": "Distinct valid GSTINs — what actually reaches the government source, and the most this job can cost."
                            },
                            "completed_lookups": {
                                "type": "integer"
                            }
                        }
                    },
                    "results": {
                        "type": "object",
                        "description": "Outcome tallies, counted over distinct GSTINs rather than rows.",
                        "properties": {
                            "succeeded": {
                                "type": "integer"
                            },
                            "not_found": {
                                "type": "integer"
                            },
                            "invalid": {
                                "type": "integer"
                            },
                            "failed": {
                                "type": "integer"
                            },
                            "skipped": {
                                "type": "integer"
                            }
                        }
                    },
                    "credits_used": {
                        "type": "integer",
                        "description": "Credits charged so far. Equals `results.succeeded`."
                    },
                    "created_at": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "started_at": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "finished_at": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "BulkResultRow": {
                "type": "object",
                "description": "One submitted row and what became of it.",
                "properties": {
                    "row": {
                        "type": "integer",
                        "description": "Position in the submitted list, 1-based."
                    },
                    "input": {
                        "type": "string",
                        "description": "What was submitted for this row, verbatim."
                    },
                    "gstin": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "The normalised GSTIN, or null if the entry was not a usable one."
                    },
                    "outcome": {
                        "$ref": "#/components/schemas/Outcome"
                    },
                    "message": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Why this row is not `ok`. Null when it is."
                    },
                    "data": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/TaxpayerProfile"
                            },
                            {
                                "type": "null"
                            }
                        ],
                        "description": "The verified profile. Present only when `outcome` is `ok`."
                    }
                }
            },
            "Outcome": {
                "type": "string",
                "enum": [
                    "ok",
                    "not_found",
                    "invalid_format",
                    "upstream_error",
                    "skipped",
                    "pending"
                ],
                "description": "What happened to a row, and whether it cost anything:\n\n- `ok` — a live registration was found. **One credit.**\n- `not_found` — well-formed, but no registration exists. Free.\n- `invalid_format` — not a valid GSTIN; rejected on its checksum without contacting the government source. Free.\n- `upstream_error` — the government source could not answer. Free; resubmit the row.\n- `skipped` — the job was cancelled or ran out of credits before reaching this row. Free.\n- `pending` — not verified yet. Only seen while a job is still running."
            },
            "TaxpayerProfile": {
                "type": "object",
                "description": "A verified registration, normalised. This is the shape bulk results carry; the single endpoint returns the raw envelope instead.",
                "properties": {
                    "success": {
                        "type": "boolean"
                    },
                    "gstin": {
                        "type": "string"
                    },
                    "legal_name": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "trade_name": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Falls back to the legal name when the business reports no separate trade name."
                    },
                    "status": {
                        "type": "string",
                        "description": "Active, Cancelled, Suspended, Provisional, …"
                    },
                    "taxpayer_type": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "constitution": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "registration_date": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "cancellation_date": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "last_updated_at": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "active_years": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "nature_of_business": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "jurisdiction": {
                        "type": "object",
                        "properties": {
                            "centre": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "centre_code": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "state": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "state_code": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "principal_address": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "formatted": {
                                "type": "string"
                            },
                            "building": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "street": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "locality": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "district": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "state": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "pincode": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "nature": {
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "additional_address_count": {
                        "type": "integer"
                    },
                    "e_invoice": {
                        "type": "object",
                        "properties": {
                            "enabled": {
                                "type": "boolean"
                            },
                            "generating": {
                                "type": "boolean"
                            },
                            "turnover_slab": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "eligibility": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "filing_counts": {
                        "type": "object",
                        "description": "Count of filings held per return type.",
                        "additionalProperties": {
                            "type": "integer"
                        }
                    },
                    "derived": {
                        "type": "object",
                        "description": "Read from the GSTIN itself, not reported by the register.",
                        "properties": {
                            "state_code": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "state_name": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "pan": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "pan_holder_type": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "entity_code": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "registration_number_in_state": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            }
                        }
                    },
                    "source": {
                        "type": "object",
                        "properties": {
                            "fetched_at": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            },
                            "served_from_cache": {
                                "type": "boolean",
                                "description": "The register itself refreshes a few times a day, so recent lookups are served from cache. Cached rows are charged the same as fresh ones."
                            }
                        }
                    }
                }
            },
            "TaxpayerEnvelope": {
                "type": "object",
                "description": "The government data source payload, passed through verbatim. Check `taxpayer_data.status_code` — `1` is a live registration, `0` means no registration exists for this number and carries an error code instead.",
                "properties": {
                    "taxpayer_data": {
                        "type": "object",
                        "properties": {
                            "status_code": {
                                "type": "integer",
                                "enum": [
                                    0,
                                    1
                                ]
                            },
                            "gstin": {
                                "type": "string"
                            },
                            "name": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Legal name of the registered taxpayer."
                            },
                            "tradename": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "status": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "registrationDate": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "constitution": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "pradr": {
                                "type": [
                                    "object",
                                    "null"
                                ],
                                "description": "Principal place of business, as a structured object."
                            },
                            "adadr": {
                                "type": [
                                    "array",
                                    "null"
                                ],
                                "items": {
                                    "type": "object"
                                },
                                "description": "Additional places of business."
                            },
                            "einvoiceStatus": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "error": {
                                "type": [
                                    "object",
                                    "null"
                                ],
                                "description": "Present when `status_code` is 0.",
                                "properties": {
                                    "error_cd": {
                                        "type": "string"
                                    },
                                    "message": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    },
                    "filing_data": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        },
                        "description": "Recent GSTR filings with period, ARN and filed status."
                    },
                    "preference_data": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "nc_data": {
                        "type": "object",
                        "description": "E-invoicing and e-way bill activity."
                    }
                }
            },
            "Pagination": {
                "type": "object",
                "properties": {
                    "page": {
                        "type": "integer"
                    },
                    "per_page": {
                        "type": "integer"
                    },
                    "total": {
                        "type": "integer"
                    },
                    "last_page": {
                        "type": "integer"
                    },
                    "has_more": {
                        "type": "boolean"
                    }
                }
            },
            "Error": {
                "type": "object",
                "properties": {
                    "success": {
                        "type": "boolean",
                        "const": false
                    },
                    "reason": {
                        "type": "string",
                        "description": "A stable code to branch on. The message is for people and may be reworded.",
                        "enum": [
                            "no_gstins",
                            "too_many_gstins",
                            "too_many_active_jobs",
                            "insufficient_credits",
                            "already_finished"
                        ]
                    },
                    "message": {
                        "type": "string"
                    }
                },
                "required": [
                    "success",
                    "message"
                ]
            }
        },
        "responses": {
            "Unauthorized": {
                "description": "The API key was missing, unknown, or not active.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        },
                        "example": {
                            "success": false,
                            "message": "Invalid or missing API key"
                        }
                    }
                }
            },
            "PaymentRequired": {
                "description": "The account has no credits left. Nothing was verified and nothing was charged.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        },
                        "example": {
                            "success": false,
                            "message": "Insufficient credits"
                        }
                    }
                }
            },
            "JobNotFound": {
                "description": "No job with that ID on this account."
            },
            "UpstreamUnavailable": {
                "description": "The government data source could not be reached. Nothing was charged; retry.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        }
                    }
                }
            }
        }
    }
}