C cenaly.com
मुफ़्त में शुरू करें

अपनी PBX के API और MCP

कुंजियाँ और अनुमतियाँ, REST API, Claude और Cursor के लिए MCP सर्वर, बिना कुंजी के OAuth के माध्यम से ChatGPT और claude.ai कनेक्शन, उदाहरण, सीमाएं और त्रुटियां

On this page 10

अपनी PBX का API और MCP

आपकी अपनी PBX Cenaly आपके प्रोग्राम और AI सहायकों के लिए खुली है:

  • CRM, लेखा प्रणाली, अपनी वेबसाइट — REST API: कॉल लॉग, रिकॉर्डिंग और ट्रांसक्रिप्ट, क्लिक-टू-कॉल, एक्सटेंशन, कॉल फ़ॉरवर्डिंग, कॉल नियम;
  • Claude Code, Claude Desktop, Cursor — कुंजी द्वारा रिमोट MCP सर्वर;
  • ChatGPT, claude.ai, Perplexity, Cursor और VS Code — वही MCP सर्वर बिना कुंजी: आप अपने खाते में साइन इन करते हैं और एक्सेस की अनुमति देते हैं (OAuth)।

सब कुछ खाता स्वामी के नाम पर और केवल उन्हीं अधिकारों के साथ काम करता है जो उसने दिए हैं। हर बदलाव PBX के कार्य लॉग में कुंजी या ऐप के नाम के साथ दिखता है।

पते#

क्या पता
REST API https://api.cenaly.com/pbx-api/v1
MCP सर्वर (streamable HTTP) https://api.cenaly.com/pbx-api/mcp
मेथड्स का दस्तावेज़ीकरण api.cenaly.com/pbx-api/v1/docs
OpenAPI 3.1 विवरण api.cenaly.com/pbx-api/v1/openapi.json
OAuth मेटाडेटा https://api.cenaly.com/.well-known/oauth-authorization-server/pbx-api

कुंजी और अधिकार#

कुंजी केवल खाता स्वामी बनाता है: टेलीफ़ोनी → API और MCP → कुंजियाँ → कुंजी बनाएँ। «PBX प्रशासक» भूमिका वाला कर्मचारी कुंजियाँ नहीं देख सकता — कुंजी स्वामी के नाम पर काम करती है।

  • cpx_… जैसी कुंजी एक बार दिखाई जाती है — बनाने के तुरंत बाद, कनेक्ट करने के लिए तैयार स्निपेट के साथ। हमारे पास केवल उसका फ़िंगरप्रिंट (SHA-256) रहता है, कुंजी बहाल नहीं की जा सकती — केवल नई जारी की जा सकती है।
  • कुंजी को शाखाओं तक सीमित किया जा सकता है (अन्यथा — सभी शाखाएँ, भविष्य की भी) और अवधि तक (30, 90, 365 दिन या अनिश्चितकाल)।
  • «अधिकार» कुंजी के अधिकार और शाखाएँ तुरंत बदल देता है: एकीकरण काम करता रहता है, नए अधिकार अगली रिक्वेस्ट से लागू होते हैं।
  • «रद्द करें» — तुरंत और हमेशा के लिए: इस कुंजी वाली अगली रिक्वेस्ट को 401 मिलेगा।
  • सक्रिय कुंजियाँ और कनेक्शन — प्रति खाता 20 तक।

अधिकार तैयार सेट से या चेकबॉक्स से चुने जाते हैं:

अधिकार क्या देता है सेट
calls:read कॉल लॉग और रूट के साथ कॉल कार्ड CRM, AI सहायक, केवल पढ़ना, सब
recordings:read बातचीत की रिकॉर्डिंग का लिंक (10 मिनट) और ट्रांसक्रिप्ट CRM, AI सहायक, केवल पढ़ना, सब
calls:dial क्लिक-टू-कॉल: पहले कर्मचारी के फ़ोन पर घंटी बजती है, जवाब के बाद PBX नंबर डायल करता है CRM, AI सहायक, सब
extensions:read एक्सटेंशन, समूह, फ़ॉरवर्डिंग, «परेशान न करें» CRM, AI सहायक, केवल पढ़ना, सब
extensions:write व्यक्तिगत फ़ॉरवर्डिंग और «परेशान न करें» बदलना AI सहायक, सब
presence:read कौन खाली है, घंटी बज रही है, बात कर रहा है AI सहायक, केवल पढ़ना, सब
reports:read अवधि के लिए कॉल सेंटर मेट्रिक्स: सेवा स्तर, प्रतीक्षा, छोड़ी गई कॉल, AHT, FCR, CSAT, कहाँ कॉल खो रहे हैं, कतारों, लाइनों, कर्मचारियों के अनुसार विभाजन केवल पढ़ना, सब
routes:read नंबर, इनकमिंग और आउटगोइंग नियम, नियमों का इतिहास केवल पढ़ना, सब
routes:write कॉल नियम बनाना, बदलना, हटाना और क्रम बदलना, इतिहास से वापस लाना केवल अलग चेकबॉक्स से
config:export PBX सेटिंग्स को फ़ाइल के रूप में निर्यात करना केवल अलग चेकबॉक्स से
config:import तालिकाओं से सेटिंग्स आयात करना: पूर्वावलोकन, फिर लागू करना केवल अलग चेकबॉक्स से
webhooks:write कॉल इवेंट वेबहुक बनाना, बदलना, जाँचना और हटाना केवल अलग चेकबॉक्स से
daynight:write शाखा को दिन के अंत तक या किसी तारीख़ तक बंद करना, खोलना — फ़ोन से *28 जैसा ही केवल अलग चेकबॉक्स से

जो अधिकार कुछ बदलते हैं या मिनट खर्च करते हैं, वे विंडो में एम्बर रंग से चिह्नित हैं। अंतिम तीन अधिकार किसी भी सेट में नहीं हैं, «सब» में भी नहीं — इन्हें केवल सोच-समझकर, अलग चेकबॉक्स से दिया जा सकता है।

ChatGPT, claude.ai, Perplexity, Cursor, VS Code: बिना कुंजी कनेक्शन#

क्लाउड सहायक हेडर में कुंजी नहीं डाल सकते — वे MCP सर्वर को OAuth से जोड़ते हैं। कुंजी बनाने की ज़रूरत नहीं।

claude.ai: सेटिंग्स → कनेक्टर → अपना कनेक्टर जोड़ें → https://api.cenaly.com/pbx-api/mcp पेस्ट करें → कनेक्ट करें।

ChatGPT: सेटिंग्स → ऐप्स और कनेक्टर → अतिरिक्त → डेवलपर मोड चालू करें → बनाएँ → https://api.cenaly.com/pbx-api/mcp पेस्ट करें, प्रमाणीकरण — OAuth।

Perplexity: खाता सेटिंग्स → कनेक्टर → «+ अपना कनेक्टर» → रिमोट → https://api.cenaly.com/pbx-api/mcp पेस्ट करें, प्रमाणीकरण — OAuth।

Cursor और VS Code: https://api.cenaly.com/pbx-api/mcp पते वाला रिमोट (HTTP) MCP सर्वर बिना कुंजी हेडर के जोड़ें — साइन-इन विंडो ब्राउज़र में खुलेगी। Cursor में: .cursor/mcp.json → {"mcpServers": {"cenaly-pbx": {"url": "https://api.cenaly.com/pbx-api/mcp"}}}; VS Code में: «MCP: Add Server» कमांड → HTTP।

इसके बाद सहायक Cenaly की साइन-इन विंडो खोलेगा। साइन इन के बाद आप देखेंगे:

  • कौन एक्सेस माँग रहा है — ऐप का नाम उस पते से होता है जहाँ जवाब लौटेगा: «सत्यापित कनेक्टर · chatgpt.com» (इसी तरह — claude.ai, perplexity.ai, vscode.dev, Cursor), «इस कंप्यूटर पर प्रोग्राम» या चेतावनी «अनजाना पता»। ऐप ने जो नाम भेजा है वह छोटे में दिखता है — उसे कोई भी लिख सकता है;
  • अधिकार — जो ऐप माँग रहा है वह चिह्नित है (अगर वह «सब कुछ» माँगता है, तो «AI सहायक» सेट चिह्नित होता है); «केवल अलग चेकबॉक्स से» वाले अधिकार पहले से कभी चिह्नित नहीं होते;
  • शाखाएँ — सभी या चुनी हुई।

«अनुमति दें» आपको सहायक में वापस ले जाता है, और वह तुरंत PBX के टूल देखने लगता है। कनेक्शन टेलीफ़ोनी → API और MCP → कुंजियाँ में OAuth मार्क और ऐप के पते वाली पंक्ति के रूप में दिखता है — वहीं अधिकार बदले जाते हैं और एक्सेस रद्द किया जाता है। उसी ऐप का दोबारा कनेक्शन उसके अधिकार अपडेट करता है, दूसरा कनेक्शन नहीं बनाता।

कनेक्शन की अनुमति केवल खाता स्वामी ही दे सकता है।

Claude Code, Claude Desktop, Cursor: कुंजी से कनेक्शन#

Claude Code — एक ही कमांड से:

claude mcp add --transport http telephony https://api.cenaly.com/pbx-api/mcp --header "Authorization: Bearer cpx_…"

Claude Desktop, Cursor (.cursor/mcp.json) और सेटिंग्स फ़ाइल वाले अन्य क्लाइंट:

{
  "mcpServers": {
    "telephony": {
      "type": "http",
      "url": "https://api.cenaly.com/pbx-api/mcp",
      "headers": { "Authorization": "Bearer cpx_…" }
    }
  }
}

आपकी कुंजी के साथ तैयार स्निपेट कुंजी बनाने के तुरंत बाद दिखाए जाते हैं। AI सहायक केवल वही टूल देखता है जिनकी अनुमति कुंजी देती है, और यह बता सकता है कि «आज किसने कॉल किया और नहीं जुड़ पाया», «इस गेस्ट को अन्ना के फ़ोन से वापस कॉल करें», «मेरे लिए मोबाइल पर फ़ॉरवर्डिंग चालू करें»।

REST API#

कुंजी हेडर Authorization: Bearer <कुंजी> में (या X-Api-Key)। यदि कुंजी की एक ही शाखा है, तो location पैरामीटर भेजना ज़रूरी नहीं; यदि कई हैं — तो 400 location_required उत्तर उन्हें सूचीबद्ध करेगा।

मेथड पाथ अधिकार क्या करता है
GET /v1/me — कुंजी के अधिकार, शाखाएँ और सीमाएँ
GET /v1/locations — कुंजी की शाखाएँ और उनके PBX
GET /v1/calls calls:read कॉल लॉग: since, until, direction, status (answered, missed, ai), number, extension, limit 100 तक, cursor
GET /v1/calls/{id} calls:read रूट के साथ कॉल: कौन-सा नियम लागू हुआ, किसका फ़ोन बजा, किसने जवाब दिया
GET /v1/calls/{id}/recording recordings:read 10 मिनट के लिए रिकॉर्डिंग का लिंक
GET /v1/calls/{id}/transcript recordings:read बातचीत की ट्रांसक्रिप्ट और सारांश
POST /v1/dial calls:dial क्लिक पर कॉल: { "extension": "101", "number": "+995555123456" }
GET /v1/dial/{commandId} calls:dial क्लिक पर कॉल कैसे चल रही है
GET /v1/extensions extensions:read एक्सटेंशन, समूह, फ़ॉरवर्डिंग, «परेशान न करें»
PUT /v1/extensions/{ext}/forwarding extensions:write एक्सटेंशन की व्यक्तिगत फ़ॉरवर्डिंग
PUT /v1/extensions/{ext}/dnd extensions:write «परेशान न करें»: { "on": true }
GET /v1/presence presence:read अभी कौन खाली है
GET /v1/metrics reports:read अवधि के लिए कॉल सेंटर मेट्रिक्स: from, to (शाखा की स्थानीय तारीखें YYYY-MM-DD, डिफ़ॉल्ट — पिछले 7 दिन), compare (prev, year, prev,year या खाली), sections (metrics,loss,queues,lines,operators,directions,heatmap,daily), callbacks=true — वापस कॉल की गति भी
GET /v1/routes routes:read नंबर, इनकमिंग और आउटगोइंग के नियम
GET /v1/routes/history routes:read नियमों में बदलावों का इतिहास
POST, PUT, DELETE /v1/routes/inbound…, /v1/routes/outbound… routes:write कॉल नियम एक-एक करके: बनाएँ, भेजे गए फ़ील्ड बदलें, हटाएँ, क्रम बदलें, रोलबैक करें
GET, POST /v1/config/export, /v1/config/import config:export, config:import फ़ाइल फ़ॉर्मैट में सेटिंग्स; अपलोड — पूर्वावलोकन, फिर लागू करना
GET /v1/events calls:read शाखा की कॉल घटनाएँ 7 दिनों के लिए (2000 तक): since (घटना id या समय), types, limit (प्रति उत्तर 500 तक)
GET, POST, PATCH, DELETE /v1/webhooks… webhooks:write वेबहुक: सूची, बनाएँ, बदलें, हटाएँ; …/rotate-secret, …/test, …/deliveries
GET, PUT /v1/open-closed routes:read, daynight:write बंद है या नहीं और कब तक; दिन के अंत तक बंद { "closed": true }, तारीख तक { "closed": true, "until": "2026-10-05T09:00" } या खोलें

फ़ील्ड का पूरा विवरण — दस्तावेज़ीकरण पेज पर और OpenAPI में।

आज किसने कॉल किया और नहीं जुड़ पाया:

curl -H "Authorization: Bearer cpx_…" \
  "https://api.cenaly.com/pbx-api/v1/calls?status=missed&since=$(date -u +%Y-%m-%dT00:00:00Z)"

एक्सटेंशन 101 के फ़ोन से क्लाइंट को वापस कॉल करें:

curl -X POST -H "Authorization: Bearer cpx_…" -H "Content-Type: application/json" \
  -d '{"extension":"101","number":"+995555123456"}' "https://api.cenaly.com/pbx-api/v1/dial"

सितंबर के मेट्रिक्स, अगस्त और पिछले साल के सितंबर से तुलना के साथ — अपने BI पैनल के लिए:

curl -H "Authorization: Bearer cpx_…" \
  "https://api.cenaly.com/pbx-api/v1/metrics?from=2026-09-01&to=2026-09-30&compare=prev,year"

उत्तर में metrics — वही आँकड़े जो टेलीफ़ोनी → कॉल लॉग → एनालिटिक्स स्क्रीन पर हैं: इनकमिंग, स्वीकृत और छूटी हुई, सेवा स्तर (सीमा और लक्ष्य — कतार की सेटिंग्स से), औसत और अधिकतम प्रतीक्षा, बिना छोटी कॉल के छोड़े गए की हिस्सेदारी, AHT, FCR, ट्रांसफ़र और बॉट की हिस्सेदारी, CSAT। compare.prev और compare.year — पिछली अवधि और एक साल पहले की उसी अवधि के वही फ़ील्ड। पिछले साल से तुलना 400 दिन तक की अवधियों के लिए गिनी जाती है।

अगर कर्मचारी ने 15 सेकंड में जवाब नहीं दिया तो मोबाइल पर फ़ॉरवर्डिंग चालू करें:

curl -X PUT -H "Authorization: Bearer cpx_…" -H "Content-Type: application/json" \
  -d '{"forward":{"noAnswer":{"kind":"number","number":"+995599000111"},"noAnswerSec":15}}' \
  "https://api.cenaly.com/pbx-api/v1/extensions/101/forwarding"

MCP टूल्स#

वही ऑपरेशन जो REST में हैं। क्लाइंट को केवल वही टूल्स दिखते हैं जिन्हें कुंजी या कनेक्शन ने अनुमति दी है:

टूल्स अधिकार
list_locations —
list_calls, get_call calls:read
get_call_recording, get_call_transcript recordings:read
call_number, get_dial_status calls:dial
list_extensions extensions:read
set_forwarding, set_do_not_disturb extensions:write
get_presence presence:read
get_call_metrics reports:read
list_routes, list_route_history routes:read
save_inbound_rule, delete_inbound_rule, move_inbound_rule, save_outbound_rule, delete_outbound_rule, move_outbound_rule, set_outbound_calls, restore_route_version routes:write
export_config config:export
import_config config:import
get_call_events calls:read
list_webhooks, save_webhook, delete_webhook, rotate_webhook_secret, test_webhook, list_webhook_deliveries webhooks:write
get_open_closed routes:read
set_open_closed daynight:write

सर्वर बिना सेशन के काम करता है (streamable HTTP, JSON-RPC 2.0): initialize, tools/list, tools/call.

अपने कनेक्टर के डेवलपर्स के लिए OAuth#

प्राधिकरण सर्वर MCP प्राधिकरण विनिर्देश का पालन करता है — जो भी क्लाइंट इसका समर्थन करता है, वह उपयुक्त है:

  1. बिना टोकन के MCP को अनुरोध 401 पाता है, हेडर के साथ WWW-Authenticate: Bearer resource_metadata="https://api.cenaly.com/.well-known/oauth-protected-resource/pbx-api/mcp".
  2. संसाधन मेटाडेटा (RFC 9728) प्राधिकरण सर्वर का नाम बताते हैं — https://api.cenaly.com/pbx-api; उसका मेटाडेटा (RFC 8414) — पते पर https://api.cenaly.com/.well-known/oauth-authorization-server/pbx-api (और …/pbx-api/.well-known/openid-configuration)।
  3. क्लाइंट का डायनामिक रजिस्ट्रेशन (RFC 7591): POST /pbx-api/oauth/register. वापसी पता — केवल localhost / 127.0.0.1 (कोई भी पोर्ट) या किसी ज्ञात कनेक्टर का पता (claude.ai, claude.com, chatgpt.com, chat.openai.com, vscode.dev, www.perplexity.ai, enterprise.perplexity.ai; Cursor के लिए — और ठीक cursor://anysphere.cursor-mcp/oauth/callback)। क्लाइंट के लॉगिन का तरीका — none (सार्वजनिक क्लाइंट), client_secret_post या client_secret_basic।
  4. PKCE के साथ प्राधिकरण कोड (केवल S256): GET /pbx-api/oauth/authorize → मालिक के लॉगिन और सहमति की विंडो → आपके पते पर code, state और iss के साथ वापसी। पैरामीटर resource — MCP सर्वर का पता।
  5. टोकन: POST /pbx-api/oauth/token. कोड एकबारगी होता है और 2 मिनट तक चलता है (गलत code_verifier उसे रद्द कर देता है); एक्सेस टोकन — 1 घंटा; रीफ़्रेश टोकन — 90 दिन, हर रीफ़्रेश पर नया जारी होता है, पुराना काम करना बंद कर देता है।
  6. रद्द करना: POST /pbx-api/oauth/revoke (RFC 7009) कनेक्शन को पूरी तरह रद्द कर देता है — जैसे «API और MCP» विंडो में «रद्द करें»।

एक्सेस टोकन हर वहाँ स्वीकार किया जाता है जहाँ कुंजी: MCP में भी और REST में भी, उन अधिकारों और शाखाओं के साथ जिन्हें मालिक ने अनुमति दी है।

सीमाएँ और त्रुटियाँ#

  • प्रति कुंजी या कनेक्शन: 120 अनुरोध प्रति मिनट और 20 000 प्रति दिन (REST और MCP मिलाकर)।
  • क्लिक पर कॉल — अलग से: 10 प्रति मिनट और 300 प्रति दिन।
  • जर्नल — प्रति अनुरोध 100 कॉल तक; शाखा की PBX के जर्नल में — पिछले 90 दिनों की अंतिम 400 कॉल।
कोड त्रुटि क्या करें
401 api_key_missing, api_key_invalid कुंजी नहीं है, वह रद्द की गई है या समाप्त हो गई है; OAuth टोकन समाप्त हो गया है — उसे रीफ़्रेश करें
403 scope_required कुंजी में अधिकार नहीं है — उसे «अधिकार» में जोड़ें
400 location_required कुंजी की कई शाखाएँ हैं — location भेजें
404 location_not_found शाखा नहीं है या कुंजी अन्य शाखाओं तक सीमित है
429 rate_limited सीमा समाप्त हो गई, Retry-After सेकंड के बाद दोबारा प्रयास करें

कॉल की घटनाएँ#

रीयल टाइम में — PBX वेबहुक: टेलीफ़ोनी → API और MCP → वेबहुक या webhooks:write अधिकार वाली कुंजी से POST /v1/webhooks। आपके https पते पर हर घटना के लिए कुछ ही सेकंड में POST आता है: call.started (शुरू हुआ: दिशा, कौन, कहाँ, लाइन), call.ringing (किसके पास बज रहा है — हर फ़ोन के लिए एक-एक), call.answered (किसने जवाब दिया), call.transferred (किसने और किसे ट्रांसफ़र किया), call.ended (नतीजा, अवधि, बातचीत, किसने जवाब दिया)। वेबहुक को शाखाओं और घटना प्रकारों तक सीमित किया जा सकता है।

{ "id": "1727771234.56:2", "type": "call.answered", "createdAt": "2026-10-01T10:00:05Z",
  "locationId": "…", "webhookId": "wh_…", "attempt": 1,
  "data": { "callId": "1727771234.56", "seq": 2, "direction": "inbound",
            "from": { "number": "+995555123456" }, "party": { "extension": "101", "name": "Анна" } } }

हस्ताक्षर — हेडर X-Cenaly-Signature: t=<unix समय>,v1=<"t.बॉडी" का वेबहुक सीक्रेट से HMAC-SHA256>। दोबारा गणना करें, स्थिर समय में तुलना करें और 5 मिनट से पुराने t को अस्वीकार करें। सीक्रेट whsec_… एक बार दिखाया जाता है; «नया सीक्रेट» पुराने को तुरंत रद्द कर देता है।

डिलीवरी — 10 सेकंड में 2xx जवाब दें। वरना हम 10 सेकंड, 30 सेकंड, 2, 5, 10, 15 और 15 मिनट के अंतराल पर दोबारा भेजते हैं (8 प्रयास, लगभग एक घंटा); दोबारा भेजे गए अनुरोध में वही id होता है — उसी से डुप्लिकेट हटाएँ। डिलीवरी लॉग (जवाब कोड, समय, प्रयास) वेबहुक विंडो में और GET /v1/webhooks/{id}/deliveries से मिलता है; «जाँचें» एक सेवा संदेश webhook.ping भेजता है। पता लगातार 3 दिन तक एक भी डिलीवरी स्वीकार नहीं करता — वेबहुक अपने आप बंद हो जाता है: मालिक को ईमेल आता है, «वेबहुक» विंडो में «स्वतः बंद» का निशान और «चालू करें» बटन दिखता है (या { "enabled": true } के साथ PATCH /v1/webhooks/{id})।

अपने सर्वर के बिना — वही फ़ीड पोलिंग से: GET /v1/events?since=<अंतिम घटना की id> या MCP टूल get_call_events (शाखा की पिछले 7 दिनों की घटनाएँ, अधिकतम 2000; एक जवाब में अधिकतम 500, more: true — उसी since से आगे बढ़ें)।

रिकॉर्डिंग संसाधित होने के बाद — ट्रांसक्रिप्ट और विश्लेषण वाला कॉल «कॉल» अनुभाग में «वेबहुक» स्रोत के वेबहुक से आता है।

«खुला / बंद» — { "closed": true } के साथ PUT /v1/open-closed शाखा को दिन के अंत तक बंद कर देता है (फ़ोन से *28 की तरह: कॉल «घंटों के बाहर» के नियमों से जाते हैं), false — खोल देता है; GET दिखाता है कि बंद है या नहीं और किसने किया। "until" के साथ — उस क्षण तक बंद (30 दिन से अधिक नहीं), फिर अपने आप खुल जाएगा: बिना ऑफ़सेट वाला समय (2026-10-05T09:00) शाखा के टाइमज़ोन में पढ़ा जाता है; false उसे भी हटा देता है। रूटिंग में «*28 कोड से बंद करें» का चेकबॉक्स चालू होना चाहिए (वरना 409)।

सुरक्षा#

  • कुंजी एक बार दिखाई जाती है और हमारे पास केवल उसके फ़िंगरप्रिंट के रूप में रहती है; लीक हुई कुंजी एक बटन से रद्द हो जाती है।
  • OAuth कनेक्शन की अनुमति केवल मालिक दे सकता है, और दिखता है कि पहुँच किस पते को जा रही है; अनुमत कनेक्शन को अधिकारों और शाखाओं तक सीमित किया जा सकता है और कभी भी रद्द किया जा सकता है।
  • फ़ोन नंबर आपके ग्राहकों का व्यक्तिगत डेटा हैं: जर्नल और रिकॉर्डिंग के अधिकार केवल उन्हीं एकीकरणों को दें जिन्हें वे वाकई चाहिए।
  • कुंजी या कनेक्शन से जुड़ा हर बदलाव PBX के कार्रवाई लॉग में कुंजी या ऐप के नाम के साथ दर्ज होता है।
Was this article helpful?