Replace the India GST supplier registration
Replaces the supplier registration whole, creating it when the store has none. A FULL REPLACE. An omitted optional key is CLEARED, not carried over, and the five value fields are required rather than defaulted: a dropped enabled would take the merchant’s invoicing down and a dropped default_rate_bps would read as 0 and tax every unclassified line at nothing, both with a 200 back. expected_updated_at IS REQUIRED and null is a legal value meaning “this store has no configuration yet”. This row has more than one writer, and what a lost write costs here is not a wrong screen: the document is stamped onto every invoice issued afterwards. A mismatch is 409 config_modified. state_code AND created_by ARE REFUSED BY NAME. The state comes from the validated GSTIN, and the actor is the api key that made the call.
Authorizations
A secret API key. Publishable keys cannot reach this API. A key may carry an expiry, and an expired key is refused exactly like an unknown one, with a 401 that names no reason; check the key's expires_at in the dashboard rather than inferring it from a response. When a merchant rolls a key's secret they choose a grace window of up to 3 days, and for its duration BOTH the new secret and the one it replaced authenticate, so an integration moves over on its own deploy schedule instead of at the instant the button is pressed. Move before the window closes: after it, the old secret is refused. Nothing else about this contract moves with a roll. The key keeps its id and its scopes, so the only thing an integration updates is the credential itself.
Headers
A unique key per logical write. Replaying a request with the same key returns the first response byte for byte instead of applying the write twice.
Body
A FULL REPLACE and an upsert: a store with no registration gets one. An omitted optional key is CLEARED rather than carried over, so read the config and send every field back. THE FIVE VALUE FIELDS ARE NOT DEFAULTED. A dropped enabled would switch the merchant's invoicing off and a dropped default_rate_bps would read as 0 and tax every unclassified line at nothing, both answering 200. expected_updated_at IS REQUIRED, and null is the legal value meaning "this store has no configuration yet". A mismatch is 409 config_modified. This row has more than one writer and it is stamped onto every invoice issued after it, so a blind write does not lose a screen's worth of edits, it mints wrong legal documents until somebody notices at filing. state_code and created_by are REFUSED BY NAME rather than ignored. The state is derived from the validated GSTIN, and a state that disagreed with the registration would split every invoice against the wrong one; the actor is the api key that made the call.
The 15-character registration, for example 27AAPFU0939F1ZV. Validated for structure, GST state and the mod-36 check digit, and stored upper-cased. Its first two digits become state_code.
The registered entity name that prints on the invoice, which is often not the store's trading name.
200The rate applied to a line whose product carries no HSN classification, in BASIS POINTS: 18% is 1800, never 18. Zero is legal and means unclassified lines are taxed at nothing.
0 <= x <= 100001 to 6 uppercase letters or digits, leading every generated invoice number (INV in INV/252600001). Changing it renumbers nothing already issued, so a store's history can carry more than one prefix.
6The master switch. false refuses every issue with 409 gst_disabled and keeps every other field, which is the reversible operation this family offers instead of a delete.
The updated_at you read from GET /api/v1/india-gst/config, or null if you expect this store to have no configuration yet. Anything else is 409.
Registered address. Optional, and CLEARED when omitted.
Registered address. Optional, and CLEARED when omitted.
Registered address. Optional, and CLEARED when omitted.
Registered address. Optional, and CLEARED when omitted.
Response
Success
