15 KiB
API Documentation
Complete API reference for the ESG Inquiry Gateway with request/response examples.
Table of Contents
- Authentication
- Person Inquiry
- Real Estate Inquiry
- Shahkar Inquiry
- Postal Code Inquiry
- Sheba Inquiry
- Error Responses
Base URL
Production: https://api.example.com
Development: http://localhost:8085
Authentication
All API requests require authentication using one of these methods:
1. API Key (Header)
X-API-Key: your-api-key-here
2. JWT Bearer Token
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Person Inquiry
Query person information using national code and birth date.
Endpoint
POST /api/inquiry/person
Request Headers
Content-Type: application/json
X-API-Key: your-api-key-here
Request Body
{
"nationalCode": "0123456789",
"birthDate": "1370/01/01"
}
Request Parameters
| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| nationalCode | string | Yes | 10-digit national identification number | "0123456789" |
| birthDate | string | Yes | Birth date in Persian calendar (YYYY/MM/DD) | "1370/01/01" |
Success Response (200 OK)
{
"success": true,
"provider": "TEJARATNOU",
"trackingCode": "a3e23be5-3128-4bb6-9424-9b62b41d6381",
"message": "Person inquiry completed successfully",
"data": {
"nationalCode": "0123456789",
"birthDate": "1370/01/01",
"fullName": "علی احمدی",
"raw": {
"success": true,
"data": {
"fullName": "علی احمدی",
"fatherName": "محمد",
"birthPlace": "تهران"
}
}
},
"duration": 1250
}
Response Fields
| Field | Type | Description |
|---|---|---|
| success | boolean | Whether the inquiry was successful |
| provider | string | Provider that handled the request (HAMTA, MOALLEM, TEJARATNOU) |
| trackingCode | string | Unique tracking code for this request |
| message | string | Human-readable status message |
| data | object | Inquiry result data |
| data.nationalCode | string | Queried national code |
| data.birthDate | string | Queried birth date |
| data.fullName | string | Person's full name (if found) |
| data.raw | object | Raw response from provider |
| duration | number | Request duration in milliseconds |
cURL Example
curl -X POST https://api.example.com/api/inquiry/person \
-H "Content-Type: application/json" \
-H "X-API-Key: your-api-key-here" \
-d '{
"nationalCode": "0123456789",
"birthDate": "1370/01/01"
}'
Swagger/OpenAPI Definition
/api/inquiry/person:
post:
summary: Person Inquiry
description: Query person information using national code and birth date
tags:
- Inquiry
security:
- ApiKeyAuth: []
- BearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- nationalCode
- birthDate
properties:
nationalCode:
type: string
pattern: '^\d{10}$'
description: 10-digit national identification number
example: "0123456789"
birthDate:
type: string
pattern: '^\d{4}/\d{2}/\d{2}$'
description: Birth date in Persian calendar (YYYY/MM/DD)
example: "1370/01/01"
responses:
'200':
description: Successful inquiry
content:
application/json:
schema:
$ref: '#/components/schemas/PersonInquiryResponse'
'400':
description: Invalid request
'401':
description: Unauthorized
'500':
description: Server error
Real Estate Inquiry
Query real estate/property information.
Endpoint
POST /api/inquiry/real-estate
Request Body
{
"nationalId": "5098961130",
"postalCode": "1349689554"
}
Request Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| nationalId | string | Yes | National identification number |
| postalCode | string | Yes | Property postal code |
Success Response (200 OK)
{
"success": true,
"provider": "HAMTA",
"trackingCode": "a3e23be5-3128-4bb6-9424-9b62b41d6381",
"message": "Real estate inquiry completed successfully",
"data": {
"raw": {
"Result": {
"Result": false,
"ErrorMessage": null,
"ExternalServiceResponseDuration": 114.3783
},
"IsSucceed": true,
"TrackingCode": "YTNlMjNiZTUtMzEyOC00YmI2LTk0MjQtOWI2MmI0MWQ2Mzgx"
}
},
"duration": 1450
}
cURL Example
curl -X POST https://api.example.com/api/inquiry/real-estate \
-H "Content-Type: application/json" \
-H "X-API-Key: your-api-key-here" \
-d '{
"nationalId": "5098961130",
"postalCode": "1349689554"
}'
Shahkar Inquiry
Verify mobile number ownership.
Endpoint
POST /api/inquiry/shahkar
Request Body
{
"nationalCode": "0123456789",
"mobileNo": "09123456789"
}
Request Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| nationalCode | string | Yes | 10-digit national identification number |
| mobileNo | string | Yes | Mobile number (11 digits starting with 09) |
Success Response (200 OK)
{
"success": true,
"provider": "MOALLEM",
"trackingCode": "b4f34cf6-4239-5cc7-a535-ac73c52e7492",
"message": "Shahkar inquiry completed successfully",
"data": {
"raw": {
"nationalCode": "0123456789",
"mobileNo": "09123456789",
"result": "MATCH",
"soap": "<?xml version=\"1.0\" encoding=\"utf-8\"?>..."
}
},
"duration": 890
}
Possible Results
| Result | Description |
|---|---|
| MATCH | Mobile number belongs to the person |
| MISMATCH | Mobile number does not belong to the person |
| NOT_FOUND | No record found |
| ERROR | Service error |
cURL Example
curl -X POST https://api.example.com/api/inquiry/shahkar \
-H "Content-Type: application/json" \
-H "X-API-Key: your-api-key-here" \
-d '{
"nationalCode": "0123456789",
"mobileNo": "09123456789"
}'
Postal Code Inquiry
Lookup address information by postal code.
Endpoint
POST /api/inquiry/postal-code
Request Body
{
"postalCode": "1234567890"
}
Request Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| postalCode | string | Yes | 10-digit postal code |
Success Response (200 OK)
{
"success": true,
"provider": "MOALLEM",
"trackingCode": "c5g45dg7-5340-6dd8-b646-bd84d63f8503",
"message": "Postal code inquiry completed successfully",
"data": {
"raw": {
"province": "تهران",
"city": "تهران",
"district": "منطقه 1",
"street": "خیابان ولیعصر",
"alley": "کوچه شماره 5",
"plaque": "123"
}
},
"duration": 650
}
cURL Example
curl -X POST https://api.example.com/api/inquiry/postal-code \
-H "Content-Type: application/json" \
-H "X-API-Key: your-api-key-here" \
-d '{
"postalCode": "1234567890"
}'
Sheba Inquiry
Verify bank account (SHEBA/IBAN) information.
Endpoint
POST /api/inquiry/sheba
Request Body
{
"accountOwnerType": "1",
"nationalCode": "0123456789",
"legalId": null,
"sheba": "IR123456789012345678901234"
}
Request Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| accountOwnerType | string | No | Account owner type; defaults to "1" in providers |
| nationalCode | string | Yes | Iranian national code (10 digits) |
| legalId | string | No | Legal identifier when needed by the selected account owner type |
| sheba | string | Yes | SHEBA/IBAN number (26 characters starting with IR) |
Success Response (200 OK)
{
"success": true,
"provider": "MOALLEM",
"trackingCode": "d6h56eh8-6451-7ee9-c757-ce95e74g9614",
"message": "Sheba inquiry completed successfully",
"data": {
"raw": {
"IsSucceed": true,
"Result": {
"accountOwner": "علی احمدی",
"bankName": "بانک ملی ایران",
"branchName": "شعبه مرکزی",
"accountNumber": "1234567890",
"isActive": true
}
}
},
"duration": 1120
}
cURL Example
curl -X POST https://api.example.com/api/inquiry/sheba \
-H "Content-Type: application/json" \
-H "X-API-Key: your-api-key-here" \
-d '{
"accountOwnerType": "1",
"nationalCode": "0123456789",
"sheba": "IR123456789012345678901234"
}'
Car Policy By Chassis
Endpoint
POST /api/inquiry/policyByChassis
Request Body
{
"chassisNo": "NAAM01E15HK123456"
}
Car Policy By Plate
Endpoint
POST /api/inquiry/policyByPlate
Request Body
{
"plk1": "12",
"plk2": "ب",
"plk3": "345",
"plksrl": "67"
}
Car Policy By National Code
Endpoint
POST /api/inquiry/policyByNationalCode
Request Body
{
"nationalCode": "0123456789"
}
Error Responses
400 Bad Request - Invalid Input
{
"success": false,
"provider": "GATEWAY",
"trackingCode": "e7i67fi9-7562-8ff0-d868-df06f85h0725",
"message": "Validation failed",
"error": {
"code": "VALIDATION_ERROR",
"message": "nationalCode must be a 10-digit string"
},
"duration": 5
}
401 Unauthorized - Missing/Invalid API Key
{
"statusCode": 401,
"message": "Unauthorized",
"error": "Unauthorized"
}
404 Not Found - Invalid Endpoint
{
"statusCode": 404,
"message": "Cannot POST /api/inquiry/invalid",
"error": "Not Found"
}
429 Too Many Requests - Rate Limit Exceeded
{
"statusCode": 429,
"message": "ThrottlerException: Too Many Requests"
}
500 Internal Server Error - No Providers Available
{
"success": false,
"provider": "GATEWAY",
"trackingCode": "f8j78gj0-8673-9gg1-e979-eg17g96i1836",
"message": "No enabled providers configured for PERSON",
"error": {
"code": "NO_PROVIDERS",
"message": "No enabled providers configured for PERSON"
},
"duration": 2
}
500 Internal Server Error - Provider Service Unavailable
{
"success": false,
"provider": "GATEWAY",
"trackingCode": "g9k89hk1-9784-0hh2-f080-fh28h07j2947",
"message": "TEJARATNOU service is not available",
"error": {
"code": "PROVIDER_SERVICE_NOT_AVAILABLE",
"message": "TEJARATNOU service is not available",
"providerMessage": "Connection timeout",
"providerCode": "ETIMEDOUT"
},
"duration": 10500
}
500 Internal Server Error - All Providers Failed
{
"success": false,
"provider": "GATEWAY",
"trackingCode": "h0l90il2-0895-1ii3-g191-gi39i18k3058",
"message": "TEJARATNOU failed: timeout; HAMTA failed: auth error; MOALLEM failed: network error",
"error": {
"code": "ALL_PROVIDERS_FAILED",
"message": "TEJARATNOU failed: timeout; HAMTA failed: auth error; MOALLEM failed: network error",
"providerMessage": "Connection timeout",
"providerCode": "ETIMEDOUT"
},
"duration": 25000
}
Error Codes Reference
| Code | Description | HTTP Status |
|---|---|---|
| VALIDATION_ERROR | Invalid request parameters | 400 |
| NO_PROVIDERS | No providers configured for inquiry type | 500 |
| PROVIDER_SERVICE_NOT_AVAILABLE | Single provider failed | 500 |
| ALL_PROVIDERS_FAILED | All configured providers failed | 500 |
| PROVIDER_ERROR | Generic provider error | 500 |
| TIMEOUT | Request timeout | 500 |
| NETWORK_ERROR | Network connectivity issue | 500 |
| AUTH_ERROR | Authentication failed | 500 |
| UNSUPPORTED_INQUIRY | Inquiry type not supported | 400 |
Rate Limiting
The API implements rate limiting to prevent abuse:
- Default Limit: 100 requests per minute per API key
- Window: 60 seconds (sliding window)
- Response Header:
X-RateLimit-Remainingshows remaining requests
When rate limit is exceeded:
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1609459200
Response Time SLA
| Inquiry Type | Target Response Time | Timeout |
|---|---|---|
| Person | < 2 seconds | 10 seconds |
| Real Estate | < 3 seconds | 10 seconds |
| Shahkar | < 1.5 seconds | 10 seconds |
| Postal Code | < 1 second | 10 seconds |
| Sheba | < 2 seconds | 10 seconds |
Best Practices
1. Always Include Tracking Code
Store the trackingCode from responses for troubleshooting and support requests.
2. Handle Errors Gracefully
Implement retry logic with exponential backoff for transient errors (5xx).
3. Validate Input Client-Side
Validate national codes, postal codes, and mobile numbers before sending requests.
4. Use Appropriate Timeouts
Set client-side timeouts slightly higher than API timeouts (e.g., 12 seconds).
5. Monitor Rate Limits
Track X-RateLimit-Remaining header and implement client-side throttling.
6. Log All Requests
Log request/response pairs with tracking codes for audit and debugging.
7. Secure API Keys
- Never expose API keys in client-side code
- Rotate keys regularly
- Use environment variables
- Implement key rotation without downtime
Postman Collection
Import this collection to test all endpoints:
{
"info": {
"name": "ESG Inquiry Gateway",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "Person Inquiry",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"value": "application/json"
},
{
"key": "X-API-Key",
"value": "{{api_key}}"
}
],
"body": {
"mode": "raw",
"raw": "{\n \"nationalCode\": \"0123456789\",\n \"birthDate\": \"1370/01/01\"\n}"
},
"url": {
"raw": "{{base_url}}/api/inquiry/person",
"host": ["{{base_url}}"],
"path": ["api", "inquiry", "person"]
}
}
}
],
"variable": [
{
"key": "base_url",
"value": "http://localhost:8085"
},
{
"key": "api_key",
"value": "your-api-key-here"
}
]
}
Support
For API support:
- Documentation: https://docs.example.com
- Status Page: https://status.example.com
- Support Email: support@example.com
- Emergency: +98-21-1234-5678