Reconcile GSTR-2A Job
curl --request POST \
--url https://test-api.sandbox.co.in/gst/analytics/gstr-2a-reconciliation \
--header 'Content-Type: application/json' \
--header 'authorization: <authorization>' \
--header 'x-api-key: <x-api-key>' \
--data '
{
"@entity": "in.co.sandbox.gst.analytics.gstr-2a_reconciliation.request",
"gstin": "24ABKCS2033B1ZV",
"year": 2026,
"month": 3,
"reconciliation_criteria": "strict"
}
'import requests
url = "https://test-api.sandbox.co.in/gst/analytics/gstr-2a-reconciliation"
payload = {
"@entity": "in.co.sandbox.gst.analytics.gstr-2a_reconciliation.request",
"gstin": "24ABKCS2033B1ZV",
"year": 2026,
"month": 3,
"reconciliation_criteria": "strict"
}
headers = {
"authorization": "<authorization>",
"x-api-key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
authorization: '<authorization>',
'x-api-key': '<x-api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
'@entity': 'in.co.sandbox.gst.analytics.gstr-2a_reconciliation.request',
gstin: '24ABKCS2033B1ZV',
year: 2026,
month: 3,
reconciliation_criteria: 'strict'
})
};
fetch('https://test-api.sandbox.co.in/gst/analytics/gstr-2a-reconciliation', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://test-api.sandbox.co.in/gst/analytics/gstr-2a-reconciliation",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'@entity' => 'in.co.sandbox.gst.analytics.gstr-2a_reconciliation.request',
'gstin' => '24ABKCS2033B1ZV',
'year' => 2026,
'month' => 3,
'reconciliation_criteria' => 'strict'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"authorization: <authorization>",
"x-api-key: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://test-api.sandbox.co.in/gst/analytics/gstr-2a-reconciliation"
payload := strings.NewReader("{\n \"@entity\": \"in.co.sandbox.gst.analytics.gstr-2a_reconciliation.request\",\n \"gstin\": \"24ABKCS2033B1ZV\",\n \"year\": 2026,\n \"month\": 3,\n \"reconciliation_criteria\": \"strict\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("authorization", "<authorization>")
req.Header.Add("x-api-key", "<x-api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://test-api.sandbox.co.in/gst/analytics/gstr-2a-reconciliation")
.header("authorization", "<authorization>")
.header("x-api-key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"@entity\": \"in.co.sandbox.gst.analytics.gstr-2a_reconciliation.request\",\n \"gstin\": \"24ABKCS2033B1ZV\",\n \"year\": 2026,\n \"month\": 3,\n \"reconciliation_criteria\": \"strict\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://test-api.sandbox.co.in/gst/analytics/gstr-2a-reconciliation")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["authorization"] = '<authorization>'
request["x-api-key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"@entity\": \"in.co.sandbox.gst.analytics.gstr-2a_reconciliation.request\",\n \"gstin\": \"24ABKCS2033B1ZV\",\n \"year\": 2026,\n \"month\": 3,\n \"reconciliation_criteria\": \"strict\"\n}"
response = http.request(request)
puts response.read_body{
"code": 200,
"timestamp": 1777273620309,
"data": {
"created_at": 1777273620951,
"@entity": "in.co.sandbox.gst.analytics.gstr-2a_reconciliation.job",
"job_id": "f42e3d84-409a-4351-a9d7-9697750e7f98",
"gstin": "24ABKCS2033B1ZV",
"year": 2026,
"month": 3,
"reconciliation_criteria": "strict",
"purchase_ledger_url": "https://in-co-sandbox-gst-test-storage.s3.ap-south-1.amazonaws.com/gstr-2a-reconciliation/purchase-ledger.json",
"gstr_2a_url": "https://in-co-sandbox-gst-test-storage.s3.ap-south-1.amazonaws.com/gstr-2a-reconciliation/gstr-2a.json",
"status": "created"
},
"transaction_id": "f42e3d84-409a-4351-a9d7-9697750e7f98"
}Submit Job
Create GSTR-2A reconciliation job and get two signed URLs to upload GSTR-2A and purchase ledger.
POST
/
gst
/
analytics
/
gstr-2a-reconciliation
Reconcile GSTR-2A Job
curl --request POST \
--url https://test-api.sandbox.co.in/gst/analytics/gstr-2a-reconciliation \
--header 'Content-Type: application/json' \
--header 'authorization: <authorization>' \
--header 'x-api-key: <x-api-key>' \
--data '
{
"@entity": "in.co.sandbox.gst.analytics.gstr-2a_reconciliation.request",
"gstin": "24ABKCS2033B1ZV",
"year": 2026,
"month": 3,
"reconciliation_criteria": "strict"
}
'import requests
url = "https://test-api.sandbox.co.in/gst/analytics/gstr-2a-reconciliation"
payload = {
"@entity": "in.co.sandbox.gst.analytics.gstr-2a_reconciliation.request",
"gstin": "24ABKCS2033B1ZV",
"year": 2026,
"month": 3,
"reconciliation_criteria": "strict"
}
headers = {
"authorization": "<authorization>",
"x-api-key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
authorization: '<authorization>',
'x-api-key': '<x-api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
'@entity': 'in.co.sandbox.gst.analytics.gstr-2a_reconciliation.request',
gstin: '24ABKCS2033B1ZV',
year: 2026,
month: 3,
reconciliation_criteria: 'strict'
})
};
fetch('https://test-api.sandbox.co.in/gst/analytics/gstr-2a-reconciliation', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://test-api.sandbox.co.in/gst/analytics/gstr-2a-reconciliation",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'@entity' => 'in.co.sandbox.gst.analytics.gstr-2a_reconciliation.request',
'gstin' => '24ABKCS2033B1ZV',
'year' => 2026,
'month' => 3,
'reconciliation_criteria' => 'strict'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"authorization: <authorization>",
"x-api-key: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://test-api.sandbox.co.in/gst/analytics/gstr-2a-reconciliation"
payload := strings.NewReader("{\n \"@entity\": \"in.co.sandbox.gst.analytics.gstr-2a_reconciliation.request\",\n \"gstin\": \"24ABKCS2033B1ZV\",\n \"year\": 2026,\n \"month\": 3,\n \"reconciliation_criteria\": \"strict\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("authorization", "<authorization>")
req.Header.Add("x-api-key", "<x-api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://test-api.sandbox.co.in/gst/analytics/gstr-2a-reconciliation")
.header("authorization", "<authorization>")
.header("x-api-key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"@entity\": \"in.co.sandbox.gst.analytics.gstr-2a_reconciliation.request\",\n \"gstin\": \"24ABKCS2033B1ZV\",\n \"year\": 2026,\n \"month\": 3,\n \"reconciliation_criteria\": \"strict\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://test-api.sandbox.co.in/gst/analytics/gstr-2a-reconciliation")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["authorization"] = '<authorization>'
request["x-api-key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"@entity\": \"in.co.sandbox.gst.analytics.gstr-2a_reconciliation.request\",\n \"gstin\": \"24ABKCS2033B1ZV\",\n \"year\": 2026,\n \"month\": 3,\n \"reconciliation_criteria\": \"strict\"\n}"
response = http.request(request)
puts response.read_body{
"code": 200,
"timestamp": 1777273620309,
"data": {
"created_at": 1777273620951,
"@entity": "in.co.sandbox.gst.analytics.gstr-2a_reconciliation.job",
"job_id": "f42e3d84-409a-4351-a9d7-9697750e7f98",
"gstin": "24ABKCS2033B1ZV",
"year": 2026,
"month": 3,
"reconciliation_criteria": "strict",
"purchase_ledger_url": "https://in-co-sandbox-gst-test-storage.s3.ap-south-1.amazonaws.com/gstr-2a-reconciliation/purchase-ledger.json",
"gstr_2a_url": "https://in-co-sandbox-gst-test-storage.s3.ap-south-1.amazonaws.com/gstr-2a-reconciliation/gstr-2a.json",
"status": "created"
},
"transaction_id": "f42e3d84-409a-4351-a9d7-9697750e7f98"
}This endpoint is part of a job-based async workflow. See the job-based API workflow guide for job creation, payload upload, and status polling.
Upload file schemas
Use these schemas to validate both files before you upload them to the signed URLs returned by this endpoint.View GSTR-2A upload schema
View purchase ledger schema
The GSTR upload schema file lists the available schema versions with their
valid_from dates.Headers
JWT access token
API key for identification
API version
Body
application/json
Entity name
Allowed value:
"in.co.sandbox.gst.analytics.gstr-2a_reconciliation.request"GSTIN of the taxpayer
Pattern:
^([0-9]{2}[0-9A-Z]{13})$Year e.g. 2020
Month e.g. 10
Preference for the reconciliation strictness. Possible values: strict, moderate, flexible
Available options:
strict, moderate, flexible Was this page helpful?
āI