---
title: "Validate + quote (no order created)"
method: POST
path: "/stamp-orders/validate"
tags: ["Stamp orders"]
---

# Validate + quote (no order created)

`POST /stamp-orders/validate`

## Request

- Base URL: `https://esahayak.io/api/v1`
- URL: `https://esahayak.io/api/v1/stamp-orders/validate`
- Auth: HTTP bearer

Dry-run an order: returns per-row blocking errors and non-blocking warnings plus a price quote (face value + service fee + 18% GST on the fee). Creates nothing and reserves nothing. Always call this before `create` so you never commit an order with bad rows or insufficient balance. Mixed-state payloads report the blocking per-row code `MIXED_STATE` (one order = one state). Rows in states whose live availability switch is off (see `GET /states/availability`) report the blocking error code `STATE_INACTIVE`.

## Request body

- object
  - `stamps` StampInput[], required
    - `clientReference` string: Optional. Your per-stamp id, echoed in stamp/order responses and webhooks.
    - `state` string, required: Required. State name or code. Must be the SAME state on every stamp in the order (one order = one state) — differing rows are rejected with per-row code `MIXED_STATE`.
    - `category` 'e_stamp' | 'traditional_stamp': Optional. Defaults to `e_stamp`.
    - `articleCode` string, required: Required. Validated against the state's article catalogue where one exists; free-text otherwise.
    - `denomination` number, required: Required. Face value (₹). Validated vs the state min/max, the article's minimum / fixed allowedAmounts, and the state's amountMultipleOf (Uttar Pradesh: multiples of ₹10 — an off-step value fails with AMOUNT_NOT_MULTIPLE).
    - `stampDutyPayer` string: Optional. The party paying stamp duty: the first or the second party's name (case, spacing and punctuation such as . , - & ( ) / _ ignored; other characters must match), or `FIRST_PARTY` / `SECOND_PARTY`. Defaults to the first party; stored as that party's name. In states where the sheet is endorsed to the first party (Telangana), the payer is always the first party. A name that is neither party, or `SECOND_PARTY` on a stamp with no second party, is rejected with per-row code `PAYER_NOT_A_PARTY`.
    - `payerPhone` string: Optional payer phone number.
    - `payerGender` 'MALE' | 'FEMALE' | 'OTHER': Required over ₹500 in catalogue states.
    - `firstParty` StampParty, required: A party to the instrument. `name` is required; address / father-or-husband name / gender are required only in states whose article requires them (see /states/{code}).
      - `name` string, required
      - `address` string: Party address. Required where isFirstPartyAddressRequired; optional (recommended) elsewhere — e.g. Haryana. Stored on the stamp and shown to the fulfilling partner.
      - `phone` string
      - `fatherHusbandName` string: Required where the state requires it.
      - `gender` 'MALE' | 'FEMALE' | 'OTHER': Payer gender — required over ₹500 in catalogue states.
    - `secondParty` StampParty: A party to the instrument. `name` is required; address / father-or-husband name / gender are required only in states whose article requires them (see /states/{code}).
      - `name` string, required
      - `address` string: Party address. Required where isFirstPartyAddressRequired; optional (recommended) elsewhere — e.g. Haryana. Stored on the stamp and shown to the fulfilling partner.
      - `phone` string
      - `fatherHusbandName` string: Required where the state requires it.
      - `gender` 'MALE' | 'FEMALE' | 'OTHER': Payer gender — required over ₹500 in catalogue states.
    - `purpose` string: Optional. Purpose / instrument description.
    - `district` string: Optional district code. Strongly recommended in sroRequired states (e.g. Haryana, Himachal Pradesh) — the partner procures from this jurisdiction. Validated against /states/{code}/districts where the state has a district catalogue; free-text otherwise.
    - `sro` string: Optional sub-registrar office / tehsil code. Send together with `district`; validated against /states/{code}/districts/{districtCode}/sros where the district has an SRO catalogue.
    - `cessAmount` number: Required in isCessRequired states.
    - `propertyArea` object: Optional property area details. If you send a unit other than `Not Applicable`, also send a positive value.
      - `unit` 'Square Feet' | 'Square Yard' | 'Square Meters' | 'Not Applicable'
      - `value` number
    - `costCentre` string: Optional. Your internal cost centre for reconciliation.
    - `businessUnit` string: Optional. Your internal business unit for reconciliation.
    - `linkedDocRef` string: Optional. Your reference to the underlying document.
    - `quantity` integer: Optional. Mint N identical stamps with distinct client references. Defaults to 1.

## Response `200`

Per-row errors/warnings + a quote (face value + service fee + 18% GST on fee).

## Other responses

- `401`: Missing / invalid / expired / revoked key

---

[API](https://skmtc.dev/esahayak/apis/esahayak-stamp-api.md) - [All operations](https://skmtc.dev/esahayak/apis/esahayak-stamp-api/llms.txt) - [OpenAPI document](https://skmtc.dev/esahayak/apis/esahayak-stamp-api/revisions/cca124862a3e?raw)
