QuickGrow AICyberCraft BangladeshQuickGrow AI
প্ল্যাটফর্ম · পার্টনার এপিআই

একটি সাইনড কলেই তৈরি হয় একটি পূর্ণ ক্লায়েন্ট অ্যাকাউন্ট।

মেসেজিং রিসেল করে এমন প্ল্যাটফর্মের জন্য ২৪টি সার্ভার-টু-সার্ভার এন্ডপয়েন্ট। আপনার প্রতিটি ক্লায়েন্টের জন্য অ্যাকাউন্ট তৈরি করুন, তাদের পক্ষ থেকে বার্তা পাঠান, পাঠানোর আগে খরচের কোট নিন, আর নিজের বিলিংয়ের সঙ্গে মেলাতে লেজার নামিয়ে নিন। প্রভিশনিং চলে আপনার নিজের your id দিয়ে, তাই একই কল দুবার করলেও কোনো সমস্যা নেই।

সাইনড, ৫ মিনিটের উইন্ডো সহস্কোপড কী + IP অ্যালাউলিস্টবারবার কল করলে একই অ্যাকাউন্ট ফেরত আসে
POST /partner/tenants
curl https://server.quickgrow.ai/api/v1/partner/tenants \
  -H "X-Partner-Key: pk_..." \
  -H "X-Partner-Signature: t=1755912000,v1=..." \
  -H "Content-Type: application/json" \
  -d '{
    "externalId": "acme-retail-4821",
    "brandName": "Acme Retail",
    "ownerEmail": "[email protected]",
    "ownerFirstName": "Ayesha",
    "ownerLastName": "Rahman"
  }'

# 201  { "data": { "tenantId": "9f2a1c34-...", "apiKey": "mk_...", "created": true  } }
# the same call again, any time later:
# 201  { "data": { "tenantId": "9f2a1c34-...", "apiKey": null,    "created": false } }

প্রতিটি কল সাইনড, স্কোপড এবং আপনার সার্ভারের সঙ্গে বাঁধা।

পার্টনার কী আমরা ইস্যু করি, নিজে সাইন আপ করে নেওয়ার সুযোগ নেই। এটি একটি সার্ভার-টু-সার্ভার ক্রেডেনশিয়াল: এর সঙ্গে কোনো ব্রাউজার সেশন থাকে না, এটি আপনার ক্লায়েন্টের ব্রাউজারে কখনও পৌঁছায় না, আর কোনো রুটের বডি চলার আগে চারটি আলাদা যাচাই সম্পন্ন হয়।

একটি কী এবং একটি সিগনেচার

আপনার pk_ কী সহ X-Partner-Key পাঠান, আর X-Partner-Signature পাঠান t=<unix>,v1=<hex> আকারে। সিগনেচারটি রিকোয়েস্ট বডির হুবহু বাইটগুলোর উপর তৈরি হয়, চাবি হিসেবে থাকে raw পার্টনার কী, এবং মিলিয়ে দেখা হয় constant-time পদ্ধতিতে।

৫ মিনিটের একটি উইন্ডো

টাইমস্ট্যাম্পটি বডির সঙ্গেই সাইন করা হয় এবং সেটি আমাদের ঘড়ির পাঁচ মিনিটের মধ্যে থাকতে হয়। ফলে ধরে রাখা কোনো রিকোয়েস্ট পরে নতুন টাইমস্ট্যাম্প বসিয়ে আবার চালানো যায় না।

একটি IP অ্যালাউলিস্ট

আপনার ব্যাকএন্ড যেসব ঠিকানা থেকে কল করে সেগুলো আমাদের দিন; বাকি সব ঠিকানা থেকে আসা কল বাতিল হবে। ফলে কী ফাঁস হলেও আপনার নেটওয়ার্কের বাইরে সেটি অকেজো। তালিকা খালি রাখলে এই যাচাই বাদ যায়।

কী-প্রতি স্কোপ

একটি কীতে provision, read, send, billing — এর যেকোনো কটি বা সবগুলো থাকতে পারে। প্রতিটি রুট ঠিক একটি স্কোপ দাবি করে। স্কোপবিহীন কী দিয়ে কিছুই করা যায় না; এটি কোনো দুর্ঘটনা নয়, বরং নিরাপদ ডিফল্ট।

এরর ফেরত আসে একটিমাত্র গঠনে: { error: { code, message } }।
StatusWhat produced it
কী নেই, অচেনা, নিষ্ক্রিয় বা মেয়াদোত্তীর্ণ401pk_ কী-টি কোনো সচল কীর সঙ্গে মেলেনি।
সিগনেচার নেই, ভুল গঠনের বা অমিল401সিগনেচার হেডার নেই, t=…,v1=… গঠনটি ভুল, কিংবা বডির সঙ্গে সেটি মেলে না।
টাইমস্ট্যাম্প ৫ মিনিটের বেশি ব্যবধানে401আপনার দিকে ঘড়ির পার্থক্য, অথবা পুরনো রিকোয়েস্ট আবার পাঠানো হয়েছে।
কলকারী IP অ্যালাউলিস্টে নেই403কী-টি বৈধ, কিন্তু ওই ঠিকানা থেকে নয়।
রুটের প্রয়োজনীয় স্কোপ কী-টিতে নেই403রিড-অনলি কী দিয়ে send বা provision রুটে কল করা হয়েছে।
ক্লায়েন্ট id অন্য পার্টনারের404403 নয় — অ্যাকাউন্টটির অস্তিত্ব আছে কি না, সেটুকুও আপনি জানতে পারবেন না।
মিনিট-প্রতি পাঠানোর সীমা ছোঁয়া হয়েছে429send পথে অ্যাকাউন্ট-প্রতি গতিসীমা।

চাবি আপনার id, আমাদের নয়।

আপনার নিজের সিস্টেমে প্রতিটি ক্লায়েন্টের একটি id আগে থেকেই আছে। সেটি externalId হিসেবে পাঠান, আর পুরো এপিআই জুড়ে ওই অ্যাকাউন্টের পরিচয় হয়ে যায় সেটিই। পরের প্রতিটি রুট ক্লায়েন্টকে আপনার id দিয়েই চেনে, তাই আমাদের id আপনাকে কখনও জমা রাখতে হয় না।

  1. কী আমরা ইস্যু করি

    পার্টনার অ্যাক্সেস আমাদের সঙ্গে কথা বলে ঠিক করা হয়, নিজে সাইন আপ করে নয়। আপনার কোন স্কোপ লাগবে আর কোন ঠিকানা থেকে কল করবেন তা জানান; আমরা একটি pk_ কী দিয়ে দেব।

  2. POST /partner/tenants

    আপনার externalId, ব্র্যান্ডের নাম এবং মালিকের নাম ও ইমেইল পাঠান। দেশ ও মুদ্রা ঐচ্ছিক। ফেরত পাবেন অ্যাকাউন্ট id এবং সেটির জন্য একটি নতুন এপিআই কী।

  3. নিশ্চিন্তে আবার কল করুন

    আপনার পার্টনার id আর আপনার externalId — এই জোড়াটি আমাদের ডেটাবেসে অনন্য। একই কল আবার এলে — রিট্রাই, ডাবল-সাবমিট, কিংবা দুই ওয়ার্কারের প্রতিযোগিতা — একই অ্যাকাউন্ট created:false সহ ফেরত আসে, দ্বিতীয় কোনো কী নয়।

  4. এরপর পাঠান, পড়ুন ও হিসাব মেলান

    সেখান থেকে অ্যাকাউন্টটি আর দশটি QuickGrow অ্যাকাউন্টের মতোই কাজ করে, আর বাকি এন্ডপয়েন্টগুলোতে পাথে নিজের id বসিয়ে আপনি সেটি চালান।

একটি প্রভিশনিং কল আসলে কী কী তৈরি করে

The account

  • নিজস্ব ডেটাসহ আলাদা একটি অ্যাকাউন্ট — আপনার অন্য ক্লায়েন্টদের সঙ্গে কিছুই ভাগাভাগি হয় না
  • আপনার পাঠানো ব্র্যান্ডের নামে তৈরি, আর সেটিই তাদের প্রেরকের নাম হয়
  • দেশ ও মুদ্রা আপনার পেলোড থেকে বসে, না দিলে আমাদের ডিফল্ট থাকে

The login

  • আপনি যাঁর ইমেইল পাঠিয়েছেন, তাঁর জন্য সত্যিকারের একটি মালিক লগইন
  • সাত দিন মেয়াদের একটি পাসওয়ার্ড-সেট লিংক
  • কোনো প্লেইনটেক্সট পাসওয়ার্ড তৈরি, সংরক্ষণ বা ইমেইল করা হয় না — কখনওই নয়

The key

  • ওই অ্যাকাউন্টের জন্য একটি mk_ এপিআই কী, রেসপন্সে একবারই ফেরত আসে
  • স্কোপ: বার্তা পাঠানো ও পড়া, কন্টাক্ট পড়া ও লেখা, টেমপ্লেট পড়া
  • কখনও বিলিং নয়, কখনও সেটিংস নয়, কখনও টিম ব্যবস্থাপনা নয়
03 — পাঠানো

একটি পাঠান, কিংবা পঞ্চাশ হাজার।

বার্তা পাঠানোর দুটি পথ আছে। কোড, রসিদ ও অ্যালার্টের জন্য একবারে একটি বার্তা — ফেরত পাবেন মেসেজ id, আর ডেলিভারি ওয়েবহুক এই id-ই বহন করে। অথবা ব্যাচ: নম্বর ও ঠিকানার একটি স্পষ্ট তালিকা কিংবা সেভ করা কোনো সেগমেন্ট, ইনলাইন টেক্সট বা টেমপ্লেট থেকে রেন্ডার করা।

  • Batches take an Idempotency-Key. Repeat it and you get the original batch back, not a second send.
  • scheduledAt queues a batch for later; omit it and it goes now.
  • Quote a batch first and get the recipient count, the SMS segment count and the estimated cost in taka — without sending.
  • Poll the batch for per-state counts, or pull a signed report you can hand a client.
  • Re-queue only the recipients that failed; delivered ones are never touched.
এসএমএস · ইমেইল · হোয়াটসঅ্যাপ প্রাপক-প্রতি সাপ্রেশন
POST /partner/tenants/:externalId/messages/bulk
curl https://server.quickgrow.ai/api/v1/partner/tenants/acme-retail-4821/messages/bulk \
  -H "X-Partner-Key: pk_..." \
  -H "X-Partner-Signature: t=1755912600,v1=..." \
  -H "Idempotency-Key: fees-aug-2026" \
  -H "Content-Type: application/json" \
  -d '{
    "channel": "SMS",
    "recipients": ["+8801710000001", "+8801710000002"],
    "text": "Fees for {{name}} are due Friday.",
    "scheduledAt": "2026-09-01T09:00:00.000Z"
  }'

# 202  { "data": { "batchId": "6c1e...", "accepted": 2, "rejected": [] } }
# then: GET .../messages/bulk/6c1e...         -> per-state counts
#       GET .../messages/bulk/6c1e.../report  -> signed delivery report

যে নিয়মগুলো দেরিতে মাথায় রাখলে ভোগাবে।

এগুলো প্ল্যাটফর্মের নিয়ম, পার্টনার-প্রতি সেটিংস নয়। প্রোডাকশনে গিয়ে টের পাওয়ার বদলে প্রথম স্প্রিন্টেই এগুলো ধরে ডিজাইন করুন।

এটি আগে পড়ুন

রাতের উইন্ডো কঠোরভাবে মানা হয়

বার্তা বেরোনোর আগে এসএমএস ও হোয়াটসঅ্যাপে প্রথমে সম্মতি, তারপর নীরব-সময়ের উইন্ডো, তারপর কন্টাক্ট-প্রতি ফ্রিকোয়েন্সি সীমা যাচাই হয়। বাংলাদেশে এই উইন্ডো ২১:০০ থেকে ০৮:০০। এর ভেতরে পড়া ব্যাচ পরের অনুমোদিত সময়ে সরে যায়; একক পাঠানো বাতিল হয়। ইমেইল এই নিয়মের বাইরে। রাত ১১টায় ওয়ান-টাইম কোড চলে যাবে ধরে নিয়ে কোনো ফ্লো কখনও ডিজাইন করবেন না।

অ্যাকাউন্ট-প্রতি মিনিটের সীমা

পাঠানোর দুটি পথই অ্যাকাউন্ট ও চ্যানেল-প্রতি গতিসীমা যাচাই করে, আর সীমা ছুঁলে rate_limited কোড সহ 429 ফেরত দেয়। এটি প্ল্যাটফর্মের ডিফল্ট — আজ মিনিটে ৬০০ — পার্টনার এপিআই থেকে বাড়ানোর কিছু নয়। একসঙ্গে ঝাঁক না পাঠিয়ে কিউ করে রিট্রাই করুন।

সাপ্রেশন প্রাপক-প্রতি

একটি অ্যাকাউন্টে একটি ফোন নম্বর বা ইমেইলের জন্য অপ্ট-আউট যোগ করুন, আর সেগুলোর তালিকা দেখে নিন। ব্যাচ পথে পাঠানোর সময় এগুলো মানা হয়। প্রাপকের তথ্য ওই অ্যাকাউন্টের নিজস্ব সল্ট দিয়ে হ্যাশ করে রাখা হয়, তাই সাপ্রেশন তালিকা কোনো পাঠযোগ্য ঠিকানা-খাতা নয়।

আপনি জানতে পারবেন, আর প্রমাণও করতে পারবেন।

আমাদের একটি URL ও একটি সিক্রেট দিন, আমরা সেখানে ছয়টি ইভেন্ট পোস্ট করব। প্রতিটি ডেলিভারি আপনার রিকোয়েস্টের মতো একই নিয়মে সাইন করা, তাই আপনার আগে লেখা কোড দিয়েই রিসিভার আমাদের যাচাই করতে পারবে।

ছয়টি ইভেন্ট, সাইনড

tenant.provisioned, subscription.activated, wallet.credited, wallet.low, wallet.depleted এবং wallet.autocredit_failed। প্রতিটির সঙ্গে t=…,v1=… আকারে একটি X-QuickGrow-Signature থাকে, আর আপনি করিলেশন id পাঠিয়ে থাকলে সেটি সাইনড বডির ভেতরেই ফিরে আসে।

ব্যর্থ ডেলিভারি কিউতে জমে, আপনি রিপ্লে করেন

ডেলিভারি ব্যাকঅফ সহ আবার চেষ্টা করা হয়। যেগুলোর চেষ্টা ফুরিয়ে যায়, সেগুলো ফেলে না দিয়ে রেখে দেওয়া হয়, আর একটি কলেই সেগুলো রিপ্লে হয় — সবগুলো একসঙ্গে, কিংবা আপনার নাম করে দেওয়া একটি জব।

অনুমান নয়, লেজার

একটি টাইমস্ট্যাম্পের পর থেকে আপনার যেসব অ্যাকাউন্টে পরিবর্তন হয়েছে সেগুলো চান, প্রতিটির সাবস্ক্রিপশন স্ট্যাটাস, ক্রেডিট, খরচ ও ব্যালেন্স পেয়ে যাবেন। প্রতি রাতে এটি টেনে নিজের ইনভয়েসের সঙ্গে মিলিয়ে নিন।

ওয়ালেট অটো-রিফিল — এটি কী করে, আর কী করে না

প্রতিটি অ্যাকাউন্টের জন্য আপনি একটি থ্রেশহোল্ড ও একটি টপ-আপ পরিমাণ জমা রাখতে পারেন। ব্যালেন্স থ্রেশহোল্ডের নিচে নামলে আমরা পাঠাই wallet.low, email the account owner a reminder, and — once the balance reaches zero — raise wallet.depleted -ও পাঠাই। এটি পাঠায় not charge a saved card. There is no off-session charge today, so a sweep that cannot collect raises wallet.autocredit_failed — কখনও না-ঘটা কোনো ক্রেডিট রেকর্ড করার বদলে। এটিকে একটি লো-ব্যালেন্স অ্যালার্ম হিসেবেই দেখুন, নিজের বকেয়া আদায়ের প্রক্রিয়ায় সেটি যুক্ত করুন, আর টাকা আসলে নিতে হোস্টেড টপ-আপ লিংক ব্যবহার করুন।

২৪টি এন্ডপয়েন্টের সবগুলো, প্রয়োজনীয় স্কোপ অনুযায়ী সাজানো।

সবকিছু থাকে /api/v1/partner-এর নিচে। যেসব রুট একজন নির্দিষ্ট ক্লায়েন্টকে নির্দেশ করে, সেগুলোর পাথে আপনার externalId বসে। আপনার প্রতিটি সার্ভিসকে কেবল সেই স্কোপগুলোই দিন, যেগুলো সে ব্যবহার করে।

provision — ৯

  • POST /tenants
  • PATCH /tenants/:externalId
  • POST /tenants/:externalId/rotate-key

read — ৮

  • GET /branding
  • GET /reconciliation?since=
  • GET /tenants/:externalId/analytics

send — ৩

  • POST /tenants/:externalId/messages
  • POST /tenants/:externalId/messages/bulk
  • POST /tenants/:externalId/messages/bulk/:batchId/retry-failed

billing — ৪

  • GET /plans
  • POST /tenants/:externalId/subscription/checkout-session
  • POST /tenants/:externalId/wallet/topup-session
প্রোডাক্টের ভেতরেই QuickGrow এপিআই রেফারেন্স: একপাশে এন্ডপয়েন্ট ন্যাভিগেটর, পাশে একটি এন্ডপয়েন্টের রিকোয়েস্ট ও রেসপন্সের বিস্তারিত।
Reference

রেফারেন্স প্রোডাক্টেরই অংশ।

রিকোয়েস্ট ও রেসপন্সের গঠন, হেডার ও এরর কোড থাকে ব্রাউজ করা যায় এমন একটি রেফারেন্সে — পুরনো হয়ে যাওয়া কোনো PDF-এ নয়। আপনার ক্লায়েন্টরা যে অ্যাকাউন্ট-লেভেল এপিআই ব্যবহার করেন, সেটির ডকুমেন্টেশনও একই জায়গায়।

  • Every success is wrapped in { data: … }; every failure in { error: { code, message } }
  • হোস্টেড চেকআউট ও টপ-আপ লিংকে আপনার নিজের রং ও লোগো ব্যবহার করা যায়
  • GET /branding থেকে Powered by QuickGrow নাম, লোগো ও চ্যানেল আইকন পাওয়া যায়

দুটি আলাদা কাজ, দুটি আলাদা কী।

বেশিরভাগ ইন্টিগ্রেশনের জন্য অ্যাকাউন্ট-লেভেল এপিআই-ই যথেষ্ট। পার্টনার এপিআই দরকার তখনই, যখন আপনি অন্য ব্যবসার অ্যাকাউন্ট তৈরি করছেন ও চালাচ্ছেন।

অ্যাকাউন্ট-লেভেল এপিআই-এর ডকুমেন্টেশন আছে /features/api-তে। ক্লায়েন্ট অ্যাকাউন্ট চালানোর বাণিজ্যিক শর্তগুলো আছে /solutions/agencies-এ।
Account APIPartner API
কার জন্যনিজের বার্তা পাঠায় এমন একটি ব্যবসাক্লায়েন্টদের অ্যাকাউন্ট চালায় এমন একটি প্ল্যাটফর্ম
Credentialmk_ অ্যাকাউন্ট কীpk_ পার্টনার কী এবং একটি রিকোয়েস্ট সিগনেচার
কীভাবে পাবেনড্যাশবোর্ডে নিজেইআমাদের সঙ্গে ঠিক করে
অ্যাকাউন্ট তৈরি করেNoYes
বার্তা পাঠায়YesYes
অন্য অ্যাকাউন্ট পড়েNoকেবল আপনার প্রভিশন করা অ্যাকাউন্টগুলো
সাসপেন্ড, আবার চালু, মুছে ফেলাNoYes
বিলিং ও রিকনসিলিয়েশনNoYes

ইন্টিগ্রেশন লেখা শুরু করার আগে।

আমার প্রভিশনিং কল টাইমআউট হলে এবং আমি রিট্রাই করলে কী হবে?

খারাপ কিছুই হবে না। অ্যাকাউন্টের চাবি আপনার পার্টনার id ও আপনার নিজের externalId মিলিয়ে, আর এই জোড়াটি ডেটাবেসে অনন্য। রিট্রাই করলে বিদ্যমান অ্যাকাউন্টই created:false সহ ফেরত আসে। একই কল নিয়ে দুই ওয়ার্কার প্রতিযোগিতা করলেও ফল একই। শুধু প্রথম কলটিই এপিআই কী ফেরত দেয়, তাই পাওয়ামাত্র সেটি জমা রাখুন।

আপনারা আমার ক্লায়েন্টের জন্য যে কী তৈরি করেন, সেটি কি তাদের বিলিং স্পর্শ করতে পারে?

না। প্রভিশনিংয়ের সময় তৈরি কী-টির স্কোপ কেবল বার্তা পাঠানো ও পড়া, কন্টাক্ট পড়া ও লেখা, এবং টেমপ্লেট পড়া। বিলিং, অ্যাকাউন্ট সেটিংস ও টিম ব্যবস্থাপনা এর স্কোপের বাইরে, তাই কী ফাঁস হলেও তা দিয়ে কিছু কেনা যায় না, কার অ্যাক্সেস আছে তাও বদলানো যায় না।

আপনারা কি আমার ক্লায়েন্টকে ইমেইলে পাসওয়ার্ড পাঠান?

কখনও নয়। আমরা একটি র‍্যান্ডম হ্যাশ রাখি, যাতে লগইনটি থাকে কিন্তু কোনো জানা পাসওয়ার্ড থাকে না, আর তাঁদের একটি পাসওয়ার্ড-সেট লিংক ইমেইল করি যেটির মেয়াদ সাত দিন। প্রথমবার সাইন ইন করার সময় তাঁরা নিজেরাই পাসওয়ার্ড ঠিক করে নেন।

আপনি কী বানাচ্ছেন, আমাদের জানান।

পার্টনার কী হাতে ইস্যু করা হয় — আপনার প্রয়োজন মতো স্কোপ ও সোর্স ঠিকানা সহ। আপনার ইন্টিগ্রেশনের ধরনটি আমাদের পাঠান, আমরা সেটআপ করে দেব।