Skip to main content
AVnesterDevelopers
← All tools

estimate_stamp_duty_and_registration

Stamp duty + registration for a property purchase in any of India's 28 states and 8 union territories, priced for the buyer, the place, the property type and a first sale, with every surcharge itemised and every unchecked rule flagged.

Endpoint POST https://api.avnester.com/public/v1/estimate_stamp_duty_and_registration

Parameters

The most-used parameters. Full schema in the OpenAPI document.

propertyValuenumberrequired
Sale consideration in INR.
statestringrequired
Indian state — ISO code ("MH"), URL slug ("maharashtra") or display name ("Maharashtra"); any of the 28 states and 8 union territories. Required: a missing state is a 400, never a default.
citystringoptional
City or town, e.g. "Pune". It decides the rate where the state prices by location (MH, KA, WB, MP, HR) — Pune 7%, Mumbai 6% — and the GST metro carpet cap. Without it the response says what it assumed. An area of a corporation ("Vashi", Navi Mumbai's) prices as the corporation and comes back as location.place.area — send the place as the buyer names it, not the wider city it is listed under.
localBodystringoptional
municipal_corporation | municipal_council | gram_panchayat. Where the property is, in a state that prices by it (MH, KA, WB, MP, HR): gram_panchayat (village), municipal_council (town) or municipal_corporation (city); overrides city. Omit when unknown (a corporation is priced, and said).
buyerGenderstringoptional
male | female | joint. "female" (a woman), "joint" (a man and a woman together) or "male" (default; two women: female). Changes the price only where a state gives women a concession. Overrides the legacy isWomanBuyer.
propertyTypestringoptional
residential | commercial | plot | agricultural. residential (default), plot (bare land; a residential-only concession does not reach it), commercial or agricultural. Agricultural land is priced at the conveyance rate.
firstSalebooleanoptional
True for the FIRST sale of a flat, from the builder (not the buyer's first home); false for a resale. Changes the duty only where a state has a first-sale rate (KA). Omit when unknown: a resale is priced, and said where it matters. Absent: constructionStatus under_construction means a first sale, resale means not, and ready_to_move decides nothing (a ready unit may be a resale).
constructionStatusstringoptional
under_construction | ready_to_move | resale. Adds itemised GST (gst, totalWithGst): 1% (affordable) or 5% under construction, 0% ready or resale. Also decides firstSale when it is absent. Omit and no GST is computed.
carpetAreaSqftnumberoptional
Carpet area in sq ft. With the value, decides the 1% affordable-housing GST rate: up to ₹45 lakh and 646 sq ft carpet in a GST metro city (read from city), 969 sq ft elsewhere.
isUrbanbooleanoptional
Urban (default) or rural — used for the location only when city and localBody are absent.
isWomanBuyerbooleanoptional
Backward-compat shim — prefer buyerGender. true → buyerGender="female".

Worked examples

# a woman buying a ₹65L home in Tamil Nadu — its women's concession is on registration and stops at ₹10 lakh (G.O. Ms. No. 77), so she pays the standard fee and the answer says why
curl -X POST https://api.avnester.com/public/v1/estimate_stamp_duty_and_registration \
  -H 'Content-Type: application/json' \
  -d '{
       "propertyValue": 6500000,
       "state": "TN",
       "buyerGender": "female"
     }'
Response
{
  "propertyValue": 6500000,
  "state": "TN",
  "supported": true,
  "stateCode": "TN",
  "stateName": "Tamil Nadu",
  "stampDuty": 455000,
  "stampDutyBase": 455000,
  "surcharges": [],
  "registrationFee": 130000,
  "registrationCapApplied": false,
  "total": 585000,
  "rateBasis": "Tamil Nadu: 7% stamp + 2% registration.",
  "rateVerification": {
    "status": "verified",
    "lastVerifiedAt": "2026-09-28T00:00:00Z",
    "sourceUrl": "https://archive.org/details/in.gazette.tamilnadu.2023-03-30.Extraordinary_109_Part-II_Section-2",
    "unverifiedComponents": []
  },
  "assumptions": [
    {
      "code": "CONCESSION_NOT_APPLICABLE",
      "message": "Tamil Nadu's registration concession for women (1% instead of 2%) covers a property up to ₹10 lakh only, so this is the standard registration fee."
    }
  ],
  "rateEffectiveDate": "2025-04-01",
  "attribution": "AVnester",
  "disclaimer": "..."
}

Run this example in the playground

# stamp duty for a ₹1Cr flat in Mumbai (man) — the metro surcharge applies, s.149A does not
curl -X POST https://api.avnester.com/public/v1/estimate_stamp_duty_and_registration \
  -H 'Content-Type: application/json' \
  -d '{
       "propertyValue": 10000000,
       "state": "maharashtra",
       "city": "Mumbai",
       "buyerGender": "male"
     }'
Response
{
  "propertyValue": 10000000,
  "state": "maharashtra",
  "supported": true,
  "stateCode": "MH",
  "stateName": "Maharashtra",
  "stampDuty": 600000,
  "stampDutyBase": 500000,
  "registrationFee": 30000,
  "registrationCapApplied": true,
  "total": 630000,
  "rateBasis": "Maharashtra (Mumbai): 5% stamp + 1% registration (registration capped at ₹30,000); surcharges: Metro surcharge 1%.",
  "rateEffectiveDate": "2026-04-01",
  "attribution": "AVnester",
  "disclaimer": "..."
}

Run this example in the playground

# stamp duty for a ₹1Cr flat in Pune (man) — both Maharashtra surcharges stack to 7%
curl -X POST https://api.avnester.com/public/v1/estimate_stamp_duty_and_registration \
  -H 'Content-Type: application/json' \
  -d '{
       "propertyValue": 10000000,
       "state": "maharashtra",
       "city": "Pune",
       "buyerGender": "male"
     }'
Response
{
  "propertyValue": 10000000,
  "state": "maharashtra",
  "supported": true,
  "stateCode": "MH",
  "stampDuty": 700000,
  "stampDutyBase": 500000,
  "surcharges": [
    {
      "name": "Municipal corporation surcharge",
      "ratePct": 1,
      "amount": 100000,
      "legalBasis": "Maharashtra Municipal Corporations Act, s.149A (from 1-4-2013)"
    },
    {
      "name": "Metro surcharge",
      "ratePct": 1,
      "amount": 100000,
      "legalBasis": "Maharashtra Municipal Corporations Act, s.149B; Mumbai Municipal Corporation Act, s.144F (from 8-2-2019)"
    }
  ],
  "registrationFee": 30000,
  "registrationCapApplied": true,
  "total": 730000,
  "location": {
    "place": { "slug": "pune", "name": "Pune" },
    "localBody": "municipal_corporation",
    "source": "city",
    "assumed": false
  },
  "attribution": "AVnester",
  "disclaimer": "..."
}

Run this example in the playground

# a state whose rates are not yet checked against its official notification (Bihar)
curl -X POST https://api.avnester.com/public/v1/estimate_stamp_duty_and_registration \
  -H 'Content-Type: application/json' \
  -d '{
       "propertyValue": 5000000,
       "state": "Bihar"
     }'
Response
{
  "propertyValue": 5000000,
  "state": "Bihar",
  "supported": true,
  "stateCode": "BR",
  "stampDuty": 315000,
  "registrationFee": 100000,
  "total": 415000,
  "rateVerification": {
    "status": "unverified",
    "lastVerifiedAt": null,
    "sourceUrl": "https://state.bihar.gov.in/registration/",
    "unverifiedComponents": []
  },
  "attribution": "AVnester",
  "disclaimer": "..."
}

Run this example in the playground

# a woman buying a ₹1Cr flat in Gurugram — Haryana prices by place, and charges registration as a fee by value band plus ₹200, not a percentage
curl -X POST https://api.avnester.com/public/v1/estimate_stamp_duty_and_registration \
  -H 'Content-Type: application/json' \
  -d '{
       "propertyValue": 10000000,
       "state": "haryana",
       "city": "Gurugram",
       "buyerGender": "female"
     }'
Response
{
  "propertyValue": 10000000,
  "state": "haryana",
  "supported": true,
  "stateCode": "HR",
  "stateName": "Haryana",
  "stampDuty": 500000,
  "stampDutyBase": 500000,
  "surcharges": [],
  "registrationFee": 50200,
  "registrationCapApplied": false,
  "total": 550200,
  "rateBasis": "Haryana (Gurgaon): 5% stamp + ₹50,200 registration, a fee by value band incl. ₹200 (woman-buyer rate applied).",
  "location": {
    "place": { "slug": "gurgaon", "name": "Gurgaon" },
    "localBody": "municipal_corporation",
    "source": "city",
    "assumed": false
  },
  "rateVerification": {
    "status": "verified",
    "lastVerifiedAt": "2026-09-24T00:00:00Z",
    "sourceUrl": "https://jamabandi.nic.in/Docs/Updatedstampdutyandregistrationfees.pdf",
    "unverifiedComponents": []
  },
  "attribution": "AVnester",
  "disclaimer": "..."
}

Run this example in the playground

# the first sale of a ₹40L flat in Bengaluru — Karnataka's first-sale rate, with its two levies charged on the duty itemised as a % of the value
curl -X POST https://api.avnester.com/public/v1/estimate_stamp_duty_and_registration \
  -H 'Content-Type: application/json' \
  -d '{
       "propertyValue": 4000000,
       "state": "Karnataka",
       "city": "Bengaluru",
       "firstSale": true
     }'
Response
{
  "propertyValue": 4000000,
  "state": "Karnataka",
  "supported": true,
  "stateCode": "KA",
  "stampDuty": 134400,
  "stampDutyBase": 120000,
  "surcharges": [
    {
      "name": "Additional duty",
      "ratePct": 0.3,
      "amount": 12000,
      "legalBasis": "Karnataka Stamp Act 1957, s.3-B (10% of the stamp duty, statewide)"
    },
    {
      "name": "Local-body surcharge",
      "ratePct": 0.06,
      "amount": 2400,
      "legalBasis": "Greater Bengaluru Governance Act 2024, s.170; Karnataka Municipal Corporations Act 1976, s.140; Karnataka Municipalities Act 1964, s.99 (2% of the stamp duty)"
    }
  ],
  "registrationFee": 80000,
  "total": 214400,
  "rateBasis": "Karnataka (Bengaluru): 3% stamp + 2% registration; surcharges: Additional duty 0.3%, Local-body surcharge 0.06%.",
  "assumptions": [],
  "attribution": "AVnester",
  "disclaimer": "..."
}

Run this example in the playground

# a man and a woman buying a ₹1Cr home together in Delhi — the joint rate, the ₹100 charge on registration, and the share rule the engine does not price, said
curl -X POST https://api.avnester.com/public/v1/estimate_stamp_duty_and_registration \
  -H 'Content-Type: application/json' \
  -d '{
       "propertyValue": 10000000,
       "state": "Delhi",
       "buyerGender": "joint"
     }'
Response
{
  "propertyValue": 10000000,
  "state": "Delhi",
  "supported": true,
  "stateCode": "DL",
  "stampDuty": 500000,
  "registrationFee": 100100,
  "total": 600100,
  "rateBasis": "Delhi: 5% stamp + 1% registration plus ₹100 (joint-owner rate applied).",
  "assumptions": [
    {
      "code": "RULE_NOT_MODELLED",
      "message": "Delhi charges the women's 4% on the woman's share only. This prices a man and a woman in equal shares (5%); other shares pay between 4% and 6% in proportion."
    }
  ],
  "attribution": "AVnester",
  "disclaimer": "..."
}

Run this example in the playground

Rate limits

OAuth (Developer)

30 / min

The same ceiling applies to every tool on a given plan, on both the MCP and REST transports; every plan’s is on Pricing. OAuth registration is free and self-serve. Calls made without signing in have their own per-IP limits — see the quickstart.

Common errors

  • 400Missing state

    `state` is required (since v5 — it used to default silently to Tamil Nadu). The body is invalid_params with an issue whose path is "state". Send the ISO code, slug or name.

  • 200supported: false in body — a state outside India

    Not an HTTP error: every amount is 0, rateEffectiveDate and rulesVersion are null, and rateBasis names the main supported states. Send one of the 28 states and 8 union territories.

  • 429Rate limit exceeded

    Back off until the time in the Retry-After header. Signed in with OAuth, the per-tool limit is counted per user instead of per address; a paid plan raises it.

  • 429Daily call limit reached (calls without signing in)

    Retry-After counts to 00:00 UTC, and only calls that returned an answer count. Signed in, calls count against your plan instead of your IP address.

Next steps