Trade Name & GSTIN
Some jurisdictions require additional business identifiers when creating beneficiaries. For India-based individual beneficiaries, you can provide a trade name and GSTIN (Goods and Services Tax Identification Number) during beneficiary creation.
When a trade name is submitted, it enters a verification flow that must be approved before virtual accounts can be created for that beneficiary.
Prerequisites
- A valid access token. See Authenticate.
- Your Integrator ID. See Get the Integrator ID.
Fields
The tradeName and gstin fields are part of the person object in the beneficiary request.
| Field | Type | Required | Description |
|---|---|---|---|
tradeName | string | Conditional | The trade name of the individual's business. Max 60 characters. Required if gstin is provided. |
gstin | string | Conditional | GSTIN/UIN number. Must be exactly 15 uppercase alphanumeric characters (e.g., 22AAAAA0000A1Z5). Required if tradeName is provided. |
tradeNameandgstinmust be provided together. Sending one without the other will return a validation error.
Create a beneficiary with trade name and GSTIN
Include tradeName and gstin in the person object when creating an individual beneficiary:
curl -X POST 'https://api.sandbox.caliza.com/core-api/v1/beneficiaries' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer {{ACCESS_TOKEN}}' \
-d '{
"integratorBeneficiaryId": "india-user-001",
"type": "INDIVIDUAL",
"person": {
"firstName": "Raj",
"lastName": "Patel",
"dateOfBirth": "1990-05-15",
"citizenship": "IN",
"idNumber": "ABCDE1234F",
"email": "[email protected]",
"phoneNumber": "+919876543210",
"tradeName": "Patel Electronics",
"gstin": "27AADCP0784Q1ZV",
"address": {
"streetOne": "42 MG Road",
"city": "Mumbai",
"state": "MH",
"zipcode": "400001",
"country": "IN"
}
}
}'const response = await axios.post(
'https://api.sandbox.caliza.com/core-api/v1/beneficiaries',
{
integratorBeneficiaryId: 'india-user-001',
type: 'INDIVIDUAL',
person: {
firstName: 'Raj',
lastName: 'Patel',
dateOfBirth: '1990-05-15',
citizenship: 'IN',
idNumber: 'ABCDE1234F',
email: '[email protected]',
phoneNumber: '+919876543210',
tradeName: 'Patel Electronics',
gstin: '27AADCP0784Q1ZV',
address: {
streetOne: '42 MG Road',
city: 'Mumbai',
state: 'MH',
zipcode: '400001',
country: 'IN'
}
}
},
{
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${accessToken}`
}
}
);The response includes the beneficiary with a tradeNameVerificationStatus of PENDING:
{
"id": "6925dd986a93002882da640b",
"integratorId": "6920925fdbadfe09b1bf9e5e",
"integratorBeneficiaryId": "india-user-001",
"type": "INDIVIDUAL",
"person": {
"firstName": "Raj",
"lastName": "Patel",
"dateOfBirth": "1990-05-15",
"citizenship": "IN",
"idNumber": "ABCDE1234F",
"email": "[email protected]",
"phoneNumber": "+919876543210",
"tradeName": "Patel Electronics",
"gstin": "27AADCP0784Q1ZV",
"tradeNameVerificationStatus": "PENDING",
"address": {
"streetOne": "42 MG Road",
"city": "Mumbai",
"state": "MH",
"zipcode": "400001",
"country": "IN"
}
},
"active": true,
"kycVerified": false,
"status": "PENDING",
"createdDate": "2025-01-15T16:47:20.568615486Z"
}Trade name verification flow
When a beneficiary is created with a tradeName, the system initiates a verification process. The trade name must be reviewed and approved by the Caliza team before certain operations (like virtual account creation) can proceed.
Verification statuses
| Status | Description |
|---|---|
PENDING | Trade name submitted and awaiting review |
VERIFIED | Trade name approved — virtual accounts can be created |
REJECTED | Trade name rejected — integrator is notified via webhook callback with the reason |
How the verification works
- Submission — You create or update a beneficiary with
tradeNameandgstin. ThetradeNameVerificationStatusis automatically set toPENDING. - Review - Caliza checks the GSTIN against the GST registry. When the registration belongs to the beneficiary and is active, the trade name is approved automatically, usually within minutes. Otherwise the Caliza team reviews it.
- Decision — The trade name is either approved (status becomes
VERIFIED) or rejected (status becomesREJECTED). On approval, averifiedTradeNameis set. It can differ from the submitted trade name, because Caliza uses the trade name on the official GST record.
If a trade name is rejected, you will receive a
TRADE_NAME_VERIFICATION_FAILEDwebhook with the rejection reason. See Handling a rejection for the payload and how to retry.
Re-verification on update
If you update an existing beneficiary and change either tradeName or gstin, the verification status automatically resets to PENDING and the trade name must be re-approved. This applies even if the trade name was previously verified.
Handling a rejection
When a trade name is rejected, you receive a TRADE_NAME_VERIFICATION_FAILED webhook. It uses the same envelope and X-Caliza-Webhook-Signature header as other webhooks. The rejection reason is in message, and there is no data object. Both resourceId and beneficiaryId are the beneficiary ID.
{
"eventId": "6af1c2d3e4f5a6b7c8d9e0f1",
"operation": "TRADE_NAME_VERIFICATION_FAILED",
"resourceId": "6925dd986a93002882da640b",
"createdAt": "2026-10-22T10:15:30.123456",
"integratorId": "6920925fdbadfe09b1bf9e5e",
"beneficiaryId": "6925dd986a93002882da640b",
"success": false,
"message": "GSTIN is cancelled in the GST registry"
}Virtual account requests that were parked for the beneficiary stay parked after a rejection. They are not cancelled, so you do not need to submit them again.
To retry:
- You receive
TRADE_NAME_VERIFICATION_FAILED. The beneficiary'stradeNameVerificationStatusisREJECTED. - Update the beneficiary with a corrected
tradeNameand/orgstin. At least one of the two must change; sending the same values again leaves the status atREJECTED. - The status returns to
PENDING, and the new details are checked against the GST registry. A matching, active registration is approved automatically, usually within minutes. Anything else goes to the Caliza team for review. - On approval, all parked VA requests for the beneficiary are released, and you receive a
PAY_IN_ACCOUNT_CREATEDwebhook for each account, with the verified trade name asreceiverName. - If the trade name is rejected again, you receive another
TRADE_NAME_VERIFICATION_FAILEDand can repeat from step 2.
Do not request new virtual accounts while a beneficiary is
REJECTED. Requests are only parked while verification isPENDING, so a request made whileREJECTEDcreates the account right away under the beneficiary's own name, without the trade name. Update the trade name first.
Impact on virtual account creation
Trade name verification directly affects virtual account (VA) creation. This is the key relationship to understand:
If a beneficiary has a PENDING trade name, VA creation requests are parked — they are not rejected, but held in a queue until the trade name is resolved.
How it works
- You request a VA for a beneficiary whose trade name is
PENDING. - The system saves the VA request with a
PARKEDstatus instead of creating the account immediately. - Once the trade name is approved, all parked VA requests for that beneficiary are automatically released and the virtual accounts are created.
- You receive the usual
PAY_IN_ACCOUNT_CREATEDwebhook for each virtual account once they are created.
Flow diagram
Create beneficiary with tradeName + gstin
│
▼
tradeNameVerificationStatus = PENDING
│
├──── Request VA creation ────► VA request is PARKED
│ (not created yet)
▼
Caliza team reviews trade name
│
├── APPROVED ──► verifiedTradeName is set
│ │
│ ├──► All PARKED VA requests are RELEASED
│ │ │
│ │ ▼
│ │ Virtual accounts are created
│ │ (PAY_IN_ACCOUNT_CREATED webhook sent)
│ │
│ └──► Existing virtual accounts are renamed
│ at the bank
│ (PAY_IN_ACCOUNT_UPDATED webhook sent
│ once the bank confirms)
│
└── REJECTED ──► Integrator notified via callback
(TRADE_NAME_VERIFICATION_FAILED)
│
▼
Update beneficiary with corrected
tradeName/gstin to restart verification
Beneficiaries that already have virtual accounts
A trade name is sometimes added to a beneficiary that already has virtual accounts. When that trade name is approved, Caliza asks the bank to rename the existing accounts to the verified trade name.
- The trade name is approved and
verifiedTradeNameis set. - Caliza requests the new name at the bank for each existing virtual account.
- Once the bank confirms the change, you receive a
PAY_IN_ACCOUNT_UPDATEDwebhook for each account. ItsreceiverNameis the new account name, and it includes therequestedTradeNameandverifiedTradeName, so you can see when the verified name differs from what you submitted.
The account number and routing details do not change. Update the deposit instructions you show your end users when you receive PAY_IN_ACCOUNT_UPDATED, so their payers use the current name.
To avoid renaming accounts after the fact, include tradeName and gstin when you create the beneficiary, before requesting virtual accounts. VA requests are then parked until the trade name is approved, and each account is created with the verified name.
If a beneficiary does not have a trade name, VA creation proceeds immediately as usual — the parking mechanism only applies when
tradeNameis present and verification isPENDING.
Checking VA request status
You can check if virtual accounts have been created by listing them:
curl 'https://api.sandbox.caliza.com/core-api/v1/beneficiaries/{{BENEFICIARY_ID}}/virtualAccounts' \
-H 'Authorization: Bearer {{ACCESS_TOKEN}}'const response = await axios.get(
`https://api.sandbox.caliza.com/core-api/v1/beneficiaries/${beneficiaryId}/virtualAccounts`,
{
headers: {
'Authorization': `Bearer ${accessToken}`
}
}
);If the trade name is still pending, this will return an empty array — the VA requests exist but are parked and have not yet produced virtual accounts.
Recommended integration flow
For beneficiaries that require trade name and GSTIN:
- Create the beneficiary with
tradeNameandgstinin thepersonobject. Send them at creation rather than in a later update, so virtual accounts are created with the verified name from the start. - Request VA creation immediately — don't wait for trade name approval. The system will park the request automatically.
- Subscribe to webhooks to be notified when:
PAY_IN_ACCOUNT_CREATED— The trade name was approved and the VA was created.PAY_IN_ACCOUNT_UPDATED- An existing VA was renamed to the verified trade name.TRADE_NAME_VERIFICATION_FAILED— The trade name was rejected; update the beneficiary with corrected details. See Handling a rejection.
- Monitor beneficiary status — Check the
tradeNameVerificationStatusfield on the beneficiary to track the verification state.
Updated about 23 hours ago
