Wordly API দিয়ে তৈরি করুন।
একটি সার্ভার-সাইড API কী ব্যবহার করুন, HTTPS অনুরোধ করুন এবং একটি অনুমানযোগ্য ক্রেডিট-ভিত্তিক বিলিং মডেলের মাধ্যমে প্রতিটি কল ট্র্যাক করুন। এই রেফারেন্সটি বর্তমানে প্রোডাকশনে উপলব্ধ শেষ পয়েন্টগুলিকে নথিভুক্ত করে এবং এখনও প্রস্তুত করা হচ্ছে এমন শেষ পয়েন্টগুলিকে স্পষ্টভাবে চিহ্নিত করে৷
কুইকস্টার্ট
একটি বিনামূল্যের অ্যাকাউন্ট তৈরি করুন, ছয়-সংখ্যার কোড ব্যবহার করে আপনার ইমেল যাচাই করুন এবং আপনার ডেভেলপার ড্যাশবোর্ডে একবার দেখানো API কীটি অনুলিপি করুন।
- 1একটি অ্যাকাউন্ট তৈরি করুন
শুধুমাত্র একটি ইমেল ঠিকানা এবং পাসওয়ার্ড দিয়ে নিবন্ধন করুন.
- 2আপনার ইমেল যাচাই করুন
প্রেরিত কোড লিখুন
[email protected]. Verification grants 50 free credits. - 3আপনার API কী সংরক্ষণ করুন
উত্পন্ন অনুলিপি
wly_live_...কী এবং এটিকে সার্ভার-সাইড এনভায়রনমেন্ট ভেরিয়েবলে রাখুন। - 4একটি পরীক্ষা অনুরোধ করুন
প্রমাণীকরণ যাচাই করতে এবং অবশিষ্ট ব্যালেন্স দেখতে অ্যাকাউন্ট এন্ডপয়েন্টে কল করুন।
curl "https://api.wordlyenglish.com/v1/account" \
-H "Authorization: Bearer $WORDLY_API_KEY" \
-H "Accept: application/json"{
"data": {
"message": "Authenticated",
"credits_remaining": 50
},
"meta": { "lang": "en" }
}বেস ইউআরএল এবং সংস্করণ
সমস্ত প্রোডাকশন এন্ডপয়েন্টগুলি নিম্নলিখিত সংস্করণযুক্ত বেস URL থেকে পরিবেশিত হয়:
https://api.wordlyenglish.com/v1ব্রেকিং প্রতিক্রিয়া বা আচরণ পরিবর্তন একটি নতুন পাথ সংস্করণ ব্যবহার করবে। সংযোজন ক্ষেত্র মধ্যে চালু করা যেতে পারে v1, so clients should ignore response properties they do not recognize.
প্রমাণীকরণ
প্রমাণীকৃত এন্ডপয়েন্টের জন্য HTTP-তে একটি API কী প্রয়োজন Authorization Bearer স্কিম ব্যবহার করে হেডার।
Authorization: Bearer wly_live_your_api_keyব্রাউজার জাভাস্ক্রিপ্ট, পাবলিক গিট রিপোজিটরি, স্ক্রিনশট, লগ, বা বিতরণ করা মোবাইল অ্যাপ্লিকেশনে কখনই একটি লাইভ কী রাখবেন না। আপনার ব্যাকএন্ড থেকে Wordly API কল করুন এবং আপনার নিজের অ্যাপ্লিকেশনটিকে সেই ব্যাকএন্ডের সাথে যোগাযোগ করতে দিন।
স্থানীয়কৃত API বার্তা
এর সাথে প্রতিক্রিয়ার ভাষা সেট করুন ?lang=tr বা মান Accept-Language হেডার ক্যোয়ারী পরামিতি অগ্রাধিকার নিতে. প্রতিটি JSON প্রতিক্রিয়া নির্বাচিত লোকেল ঘোষণা করে Content-Language এবং meta.lang. Error codes remain stable in English for programmatic handling; only the human-readable message is localized.
curl "https://api.wordlyenglish.com/v1/account?lang=tr" \
-H "Authorization: Bearer $WORDLY_API_KEY" \
-H "Accept-Language: tr-TR"সমর্থিত ভাষা কোড: en, tr, de, fr, es, it, pt, nl, pl, ru, uk, ar, fa, he, hi, bn, ur, zh, ja, ko, id, ms, vi, th, sv, no, da, fi, cs, ro.
ক্রেডিট এবং বিলিং
Each successful metered request consumes the documented number of credits. Email-verified accounts receive 50 free credits once. Credits are deducted atomically, so concurrent requests cannot spend the same balance twice. Balance lookup through GET /v1/account is free.
| অপারেশন | ক্রেডিট খরচ | প্রাপ্যতা |
|---|---|---|
GET /v1/status | 0 | লাইভ |
GET /v1/account | 0 | লাইভ |
GET /v1/words/{word} | 1–5 | লাইভ |
GET /v1/words/search | 1 | লাইভ |
GET /v1/words/random | 1 per word | লাইভ |
POST /v1/words/batch | ফিরে আসা রেকর্ডের উপর ভিত্তি করে | লাইভ |
Use GET /v1/account when you need the current balance. Other endpoint responses include the operation charge but omit the remaining balance. When the balance is insufficient, the API returns HTTP 402 এবং অপারেশন প্রক্রিয়া করে না।
{
"error": {
"code": "credits_exhausted",
"message": "Your credit balance is exhausted. Add a package or enable pay-as-you-go to continue.",
"upgrade_url": "/app.php?page=billing"
}
}API key lifecycle
উন্নয়ন, মঞ্চায়ন এবং উৎপাদনের জন্য পৃথক কী তৈরি করুন। Wordly প্রতিটি কী-এর শুধুমাত্র একটি ক্রিপ্টোগ্রাফিক হ্যাশ সংরক্ষণ করে; সম্পূর্ণ মান তৈরি করার সময় একবার প্রদর্শিত হয়।
- পরিবেশ বা পরিষেবা অনুসারে নাম কী।
- পরিবেশ ভেরিয়েবল বা একটি পরিচালিত গোপন দোকান ব্যবহার করুন.
- একটি চাবি উন্মুক্ত হয়ে থাকলে অবিলম্বে প্রত্যাহার করুন।
- পুরানো মান পুনরায় ব্যবহার না করে কী ঘোরান।
- ক্যোয়ারী স্ট্রিং-এ কী পাঠাবেন না।
প্রতিক্রিয়া বিন্যাস
সফল প্রতিক্রিয়া একটি শীর্ষ স্তর ব্যবহার করে data বস্তু এবং একটি অন্তর্ভুক্ত হতে পারে meta বস্তু ত্রুটিগুলি সর্বদা একটি শীর্ষ-স্তর ব্যবহার করে error একটি স্থিতিশীল মেশিন-পাঠযোগ্য বস্তু সহ code এবং একটি মানুষের পাঠযোগ্য message.
{
"data": { ... },
"meta": {
"credits_used": 1,
"request_id": "..."
}
}{
"error": {
"code": "invalid_api_key",
"message": "..."
}
}রাখুন request_id একটি সফল বিল করা অনুরোধ সম্পর্কে সমর্থনের সাথে যোগাযোগ করার সময়। JSON UTF-8 এনকোডেড এবং ক্লায়েন্টদের পাঠাতে হবে Accept: application/json.
Wordly caches shared vocabulary data on the server, never API keys, account identities, balances, rate-limit state, or request identifiers. Public status and language responses advertise shared-cache lifetimes. Authenticated responses remain private, no-store; applications may cache the stable data value in their own trusted backend when appropriate.
উত্পাদনের শেষ পয়েন্ট
/v1/statusলাইভজনসেবা স্বাস্থ্য এবং API সংস্করণ তথ্য প্রদান করে। এই শেষ পয়েন্টের জন্য প্রমাণীকরণের প্রয়োজন নেই এবং শূন্য ক্রেডিট খরচ হয়।
উদাহরণ অনুরোধ
curl "https://api.wordlyenglish.com/v1/status" \
-H "Accept: application/json"200 · Success
{
"data": { "status": "ok", "version": "v1" },
"meta": { "lang": "en" }
}/v1/accountLive · 0 creditsValidates the supplied key and returns the current account balance without charging a credit.
হেডার
| নাম | প্রয়োজন | বর্ণনা |
|---|---|---|
Authorization | হ্যাঁ | Bearer wly_live_... |
Accept | প্রস্তাবিত | application/json |
প্রতিক্রিয়া শিরোনাম
X-Credits-Remaining is returned only by this balance endpoint.
200 · Success
{
"data": { "message": "Authenticated", "credits_remaining": 1250 },
"meta": { "lang": "en" }
}শব্দভান্ডারের শেষ পয়েন্ট
প্রতিটি রেকর্ড তার রিপোর্ট completeness হিসাবে catalog, translated, or enriched. Fields that are not available are returned as null বা উদ্ভাবিত ডেটার পরিবর্তে একটি খালি বস্তু।
GET /v1/words/{word}
একটি সঠিক শব্দ মিল প্রদান করে। ব্যবহার করুন languages=tr,de,fr শুধুমাত্র অনুরোধকৃত অনুবাদ ফেরত দিতে। ক্যাটালগ বা অনুবাদিত রেকর্ডের জন্য 1 ক্রেডিট খরচ হয়; সম্পূর্ণরূপে সমৃদ্ধ প্রোফাইল 5 ক্রেডিট খরচ.
curl "https://api.wordlyenglish.com/v1/words/water?languages=tr,de" \
-H "Authorization: Bearer $WORDLY_API_KEY"GET /v1/words/search
সঙ্গে অনুসন্ধান করুন q এবং ঐচ্ছিক level, part_of_speech, category, limit, and cursor. Limits range from 1 to 50. Pass meta.next_cursor পরবর্তী অনুরোধে
curl "https://api.wordlyenglish.com/v1/words/search?q=app&level=advanced&limit=20" \
-H "Authorization: Bearer $WORDLY_API_KEY"GET /v1/words/random
1-20 এলোমেলো শব্দ প্রদান করে। দ্বারা ফিল্টার level, part_of_speech, or category. Each returned slot costs one credit.
POST /v1/words/batch
একক অনুরোধে 1 থেকে 50টি অনন্য শব্দের মধ্যে দেখা যায়। প্রতিক্রিয়া অনুরোধের আদেশ সংরক্ষণ করে এবং প্রতিটি আইটেমকে চিহ্নিত করে found.
curl -X POST "https://api.wordlyenglish.com/v1/words/batch?lang=tr" \
-H "Authorization: Bearer $WORDLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"words":["water","opportunity"],"languages":["tr","de"]}'GET /v1/languages
সমস্ত 30টি সমর্থিত ইন্টারফেস এবং API-বার্তা লোকেল ফেরত দেয়। শব্দভান্ডারের অনুবাদগুলি শুধুমাত্র উপলব্ধ হলেই ফেরত দেওয়া হয়। এই শেষ বিন্দু সর্বজনীন এবং শূন্য ক্রেডিট খরচ.
হার সীমা
প্রতিটি API কী প্রতি রোলিং মিনিটে 120টি স্বীকৃত অনুরোধের মধ্যে সীমাবদ্ধ। প্রতিক্রিয়া অন্তর্ভুক্ত X-RateLimit-Limit এবং X-RateLimit-Remaining. A 429 rate_limit_exceeded প্রতিক্রিয়া অন্তর্ভুক্ত Retry-After: 60.
/v1/languagesLive · 0 creditsLists all supported interface and API-message locales. Vocabulary translations are returned only when a record contains them.
Query parameters
| নাম | Type | প্রয়োজন | Rules | বর্ণনা |
|---|---|---|---|---|
lang | string | No | Supported locale code | Language for human-readable messages. |
উদাহরণ অনুরোধ
curl "https://api.wordlyenglish.com/v1/languages?lang=tr"200 · Success
{
"data": [{
"code": "tr",
"name": "Türkçe",
"message_localization": true,
"vocabulary_translation": "when_available"
}],
"meta": { "count": 30, "lang": "tr" }
}/v1/words/{word}Live · 1–5 creditsReturns one exact vocabulary record. Catalog and translated records cost 1 credit; enriched records cost 5 credits.
Parameters
| নাম | Location | Type | প্রয়োজন | Rules and meaning |
|---|---|---|---|---|
word | Path | string | হ্যাঁ | Exact word or slug; maximum 120 characters. URL-encode special characters. |
languages | Query | string | No | Comma-separated translation codes, for example tr,de,fr. |
lang | Query | string | No | Human-readable message language; not a vocabulary filter. |
উদাহরণ অনুরোধ
curl "https://api.wordlyenglish.com/v1/words/water?languages=tr,de" \
-H "Authorization: Bearer $WORDLY_API_KEY" \
-H "Accept: application/json"200 · Success
{
"data": {
"id": "water",
"word": "water",
"part_of_speech": "noun",
"level": "basic",
"definition": "A clear liquid essential for life.",
"example": "Please drink enough water every day.",
"translations": { "tr": "su", "de": "Wasser" },
"categories": ["nature", "daily-life"],
"media": {
"image_url": "https://media.example/water.webp",
"audio_url": "https://media.example/water.mp3",
"attribution": {}
},
"completeness": "enriched"
},
"meta": {
"credits_used": 5,
"request_id": "5ebac760-cdc5-4a73-a87b-22463d81483c",
"lang": "en"
}
}404 · Word unavailable
{
"error": { "code": "word_not_found", "message": "The requested word was not found." },
"meta": { "lang": "en" }
}/v1/words/searchলাইভ · 1 ক্রেডিটSearches active vocabulary in alphabetical order. Use the returned cursor for stable forward pagination.
Query parameters
| নাম | Type | প্রয়োজন | Default / limit | বর্ণনা |
|---|---|---|---|---|
q | string | No | Max 120 chars | Case-insensitive contained text. |
level | string | No | Max 30 chars | Exact level filter. |
part_of_speech / pos | string | No | Max 40 chars | Exact grammatical-class filter. |
category | string | No | Max 80 chars | Category-array filter. |
limit | integer | No | 20; min 1, max 50 | Maximum returned records. |
cursor | string | No | Max 120 chars | Previous meta.next_cursor. |
languages | string | No | Comma-separated | Translations to include. |
উদাহরণ অনুরোধ
curl "https://api.wordlyenglish.com/v1/words/search?q=app&level=advanced&languages=tr&limit=2" \
-H "Authorization: Bearer $WORDLY_API_KEY"200 · Success
{
"data": [{
"id": "application",
"word": "application",
"part_of_speech": "noun",
"level": "advanced",
"definition": null,
"example": null,
"translations": { "tr": "uygulama" },
"categories": [],
"media": { "image_url": null, "audio_url": null, "attribution": {} },
"completeness": "translated"
}],
"meta": { "credits_used": 1, "request_id": "...", "lang": "en", "count": 1, "next_cursor": null }
}/v1/words/randomLive · 1 credit per requested slotReturns random active words for quizzes, discovery feeds, and practice sessions.
Query parameters
| নাম | Type | প্রয়োজন | Default / limit | বর্ণনা |
|---|---|---|---|---|
count | integer | No | 1; min 1, max 20 | Requested slots and credit cost. |
level | string | No | Exact value | Level filter. |
part_of_speech / pos | string | No | Exact value | Grammatical-class filter. |
category | string | No | Exact value | Category filter. |
languages | string | No | Comma-separated | Translations to include. |
উদাহরণ অনুরোধ
curl "https://api.wordlyenglish.com/v1/words/random?count=3&level=basic&languages=tr" \
-H "Authorization: Bearer $WORDLY_API_KEY"200 · Success
{
"data": [{ "id": "water", "word": "water", "part_of_speech": "noun", "level": "basic", "definition": null, "example": null, "translations": { "tr": "su" }, "categories": [], "media": { "image_url": null, "audio_url": null, "attribution": {} }, "completeness": "translated" }],
"meta": { "credits_used": 3, "request_id": "...", "lang": "en", "count": 1 }
}/v1/words/batchLive · calculatedLooks up 1–50 unique words while preserving request order. Each enriched result costs 5 credits, another found result costs 1, and the minimum request charge is 1.
হেডার
| নাম | প্রয়োজন | Value |
|---|---|---|
Authorization | হ্যাঁ | Bearer wly_live_... |
Content-Type | হ্যাঁ | application/json |
Accept | প্রস্তাবিত | application/json |
JSON body
| Field | Type | প্রয়োজন | Rules | বর্ণনা |
|---|---|---|---|---|
words | string[] | হ্যাঁ | 1–50 items; each max 120 chars | Words to resolve; duplicates are normalized and removed. |
languages | string[] | No | Supported locale codes | Translations to include. |
উদাহরণ অনুরোধ
curl -X POST "https://api.wordlyenglish.com/v1/words/batch?lang=tr" \
-H "Authorization: Bearer $WORDLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"words":["water","not-a-word"],"languages":["tr","de"]}'200 · Success
{
"data": [
{ "query": "water", "found": true, "word": { "id": "water", "word": "water", "part_of_speech": "noun", "level": "basic", "definition": null, "example": null, "translations": { "tr": "su", "de": "Wasser" }, "categories": [], "media": { "image_url": null, "audio_url": null, "attribution": {} }, "completeness": "translated" } },
{ "query": "not-a-word", "found": false, "word": null }
],
"meta": { "credits_used": 1, "request_id": "...", "lang": "tr", "count": 2 }
}422 · Invalid body
{
"error": { "code": "invalid_request", "message": "Provide between 1 and 50 words." },
"meta": { "lang": "en" }
}Response field reference
Every stable response variable is described below. Additive fields may appear later, so clients should ignore fields they do not recognize.
Vocabulary object
| Field | Type | Nullable | বর্ণনা |
|---|---|---|---|
id | string | No | Stable URL-safe slug. |
word | string | No | Canonical English word. |
part_of_speech | string | হ্যাঁ | Grammatical class. |
level | string | হ্যাঁ | Learning difficulty or catalog level. |
definition | string | হ্যাঁ | Concise English definition. |
example | string | হ্যাঁ | Natural example sentence. |
phonetic | string | হ্যাঁ | Pronunciation transcription when available. |
translations | object<string,string> | No | Locale codes mapped to translations; may be empty. |
synonyms | string[] | No | Available synonyms. |
antonyms | string[] | No | Available antonyms. |
categories | string[] | No | Learning or semantic categories. |
media.image_url | URL string | হ্যাঁ | Learning image URL. |
media.audio_url | URL string | হ্যাঁ | Pronunciation audio URL. |
media.attribution | object | No | Required media attribution metadata. |
completeness | enum | No | catalog, translated, or enriched. |
Meta object
| Field | Type | When present | বর্ণনা |
|---|---|---|---|
credits_used | integer | Metered responses | Credits charged by this request. |
request_id | UUID string | Metered success | Support and billing trace ID. |
lang | string | Always | Selected message locale. |
count | integer | List responses | Number of response items. |
next_cursor | string or null | Search | Next page cursor; null means final page. |
Error object
| Field | Type | বর্ণনা |
|---|---|---|
error.code | string | Stable machine-readable code. |
error.message | string | Localized human-readable explanation. |
error.upgrade_url | string | Relative billing URL on a 402 result. |
meta.lang | string | Error-message locale. |
ত্রুটি
| HTTP | কোড | অর্থ | ক্লায়েন্ট অ্যাকশন |
|---|---|---|---|
| 401 | invalid_api_key | অনুপস্থিত, বিকৃত, প্রত্যাহার করা বা নিষ্ক্রিয় কী। | Bearer হেডার চেক করুন বা কী প্রতিস্থাপন করুন। |
| 402 | credits_exhausted | অ্যাকাউন্টে অপারেশনের জন্য ক্রেডিট নেই। | পুনঃপ্রচার বন্ধ করুন এবং গ্রাহককে বিলিং করতে নির্দেশ করুন। |
| 404 | not_found | অনুরোধ করা শেষ পয়েন্ট উপলব্ধ নেই. | পাথ এবং API সংস্করণ পরীক্ষা করুন. |
| 404 | word_not_found | অনুরোধ করা শব্দভান্ডার এন্ট্রি অনুপলব্ধ. | বানান পরীক্ষা করুন বা অনুসন্ধান ব্যবহার করুন। |
| 422 | invalid_request | একটি প্যারামিটার বা ব্যাচ বডি অবৈধ৷ | পুনরায় চেষ্টা করার আগে অনুরোধটি সংশোধন করুন। |
| 405 | method_not_allowed | The endpoint does not accept the HTTP method. | Use the documented GET or POST method. |
| 413 | payload_too_large | The JSON request body exceeds 64 KB. | Reduce the batch body. |
| 415 | unsupported_media_type | The batch request is not JSON. | Send Content-Type: application/json. |
| 429 | rate_limit_exceeded | API কী প্রতি মিনিটে 120টি অনুরোধ অতিক্রম করেছে৷ | Wait for Retry-After. |
| 5xx | server_error | একটি অপ্রত্যাশিত সার্ভার-সাইড ব্যর্থতা৷ | ব্যাকঅফ দিয়ে পুনরায় চেষ্টা করুন; অবিরাম থাকলে সহায়তার সাথে যোগাযোগ করুন। |
প্রস্তাবিত পুনরায় চেষ্টা নীতি
আবার চেষ্টা করবেন না 401, 402, or 404 স্বয়ংক্রিয়ভাবে ক্ষণস্থায়ী জন্য 5xx প্রতিক্রিয়া, জিটার সহ সূচকীয় ব্যাকঅফ ব্যবহার করুন এবং একটি কঠোর পুনরায় চেষ্টা করুন ক্যাপ। একটি সীমাহীন পুনঃপ্রচেষ্টা লুপ তৈরি করবেন না কারণ প্রতিটি গৃহীত প্রমাণীকৃত অনুরোধ ক্রেডিট গ্রাস করতে পারে।
JavaScript/ Node.js
const response = await fetch('https://api.wordlyenglish.com/v1/account', {
headers: {
Authorization: `Bearer ${process.env.WORDLY_API_KEY}`,
Accept: 'application/json'
}
});
const body = await response.json();
if (!response.ok) {
throw new Error(`${body.error.code}: ${body.error.message}`);
}
console.log(body.data.credits_remaining);পাইথন
import os
import requests
response = requests.get(
'https://api.wordlyenglish.com/v1/account',
headers={
'Authorization': f'Bearer {os.environ["WORDLY_API_KEY"]}',
'Accept': 'application/json',
},
timeout=15,
)
response.raise_for_status()
print(response.json()['data']['credits_remaining'])পিএইচপি
$curl = curl_init('https://api.wordlyenglish.com/v1/account');
curl_setopt_array($curl, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 15,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('WORDLY_API_KEY'),
'Accept: application/json',
],
]);
$body = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_RESPONSE_CODE);
curl_close($curl);
if ($status >= 400) {
throw new RuntimeException('Wordly API request failed');
}
$data = json_decode($body, true, flags: JSON_THROW_ON_ERROR);ডার্ট/ফ্লাটার
ফ্লটার অ্যাপ্লিকেশনের ভিতরে Wordly কী পাঠাবেন না। উদাহরণটি একটি বিশ্বস্ত ডার্ট ব্যাকএন্ড বা সার্ভার ফাংশনের অন্তর্গত।
final response = await http.get(
Uri.parse('https://api.wordlyenglish.com/v1/account'),
headers: {
'Authorization': 'Bearer ${Platform.environment['WORDLY_API_KEY']}',
'Accept': 'application/json',
},
);
final body = jsonDecode(response.body) as Map<String, dynamic>;
if (response.statusCode >= 400) {
throw Exception((body['error'] as Map)['code']);
}উত্পাদন চেকলিস্ট
- প্রক্সি ওয়ার্ডলি একটি বিশ্বস্ত ব্যাকএন্ডের মাধ্যমে অনুরোধ করে।
- সংযোগ এবং প্রতিক্রিয়া সময়সীমা সেট করুন।
- হ্যান্ডেল
401,402,404, and5xxআলাদাভাবে - Query
GET /v1/accountwhen your application needs the current balance. - লগ এন্ডপয়েন্ট, স্ট্যাটাস, লেটেন্সি, এবং
request_idAPI কী লগিং ছাড়াই। - পরিবেশ প্রতি পৃথক কী ব্যবহার করুন এবং পর্যায়ক্রমে তাদের ঘোরান।
- Cache stable vocabulary responses in your backend when appropriate.
আপনার প্রথম অনুরোধ করতে প্রস্তুত?
একটি অ্যাকাউন্ট তৈরি করুন, আপনার ইমেল যাচাই করুন এবং 50টি বিনামূল্যে ক্রেডিট পান৷
ইন্টিগ্রেশন সাহায্য প্রয়োজন? ইমেইল [email protected].