# API Documentation Complete API reference for the ESG Inquiry Gateway with request/response examples. ## Table of Contents - [Authentication](#authentication) - [Person Inquiry](#person-inquiry) - [Real Estate Inquiry](#real-estate-inquiry) - [Shahkar Inquiry](#shahkar-inquiry) - [Postal Code Inquiry](#postal-code-inquiry) - [Sheba Inquiry](#sheba-inquiry) - [Error Responses](#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) ```http X-API-Key: your-api-key-here ``` ### 2. JWT Bearer Token ```http Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... ``` ## Person Inquiry Query person information using national code and birth date. ### Endpoint ``` POST /api/inquiry/person ``` ### Request Headers ```http Content-Type: application/json X-API-Key: your-api-key-here ``` ### Request Body ```json { "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) ```json { "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 ```bash 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 ```yaml /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 ```json { "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) ```json { "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 ```bash 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 ```json { "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) ```json { "success": true, "provider": "MOALLEM", "trackingCode": "b4f34cf6-4239-5cc7-a535-ac73c52e7492", "message": "Shahkar inquiry completed successfully", "data": { "raw": { "nationalCode": "0123456789", "mobileNo": "09123456789", "result": "MATCH", "soap": "..." } }, "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 ```bash 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 ```json { "postalCode": "1234567890" } ``` ### Request Parameters | Field | Type | Required | Description | |-------|------|----------|-------------| | postalCode | string | Yes | 10-digit postal code | ### Success Response (200 OK) ```json { "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 ```bash 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 ```json { "accountOwnerType": "REAL", "nationalId": "0123456789", "shebaId": "IR123456789012345678901234" } ``` ### Request Parameters | Field | Type | Required | Description | |-------|------|----------|-------------| | accountOwnerType | string | Yes | Account owner type: "REAL" (person) or "LEGAL" (company) | | nationalId | string | Conditional | Required if accountOwnerType is "REAL" | | legalId | string | Conditional | Required if accountOwnerType is "LEGAL" | | shebaId | string | Yes | SHEBA/IBAN number (26 characters starting with IR) | ### Success Response (200 OK) ```json { "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 ```bash 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": "REAL", "nationalId": "0123456789", "shebaId": "IR123456789012345678901234" }' ``` ## Error Responses ### 400 Bad Request - Invalid Input ```json { "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 ```json { "statusCode": 401, "message": "Unauthorized", "error": "Unauthorized" } ``` ### 404 Not Found - Invalid Endpoint ```json { "statusCode": 404, "message": "Cannot POST /api/inquiry/invalid", "error": "Not Found" } ``` ### 429 Too Many Requests - Rate Limit Exceeded ```json { "statusCode": 429, "message": "ThrottlerException: Too Many Requests" } ``` ### 500 Internal Server Error - No Providers Available ```json { "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 ```json { "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 ```json { "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-Remaining` shows remaining requests When rate limit is exceeded: ```http 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: ```json { "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