API
এখানে কোনো প্রাইভেট এন্ডপয়েন্ট নেই। ইন্টারফেসের জন্যও নয়।
বেশিরভাগ প্রোডাক্টের দুটি API থাকে: একটি ডকুমেন্টেড, যা আপনাকে দেওয়া হয়, আর আরেকটি চমৎকার, যা তাদের নিজেদের স্ক্রিন ব্যবহার করে। দ্বিতীয়টি সবসময় ভালো, আর আপনাকে কখনো তার কাছে যেতে দেওয়া হয় না। এখানে একটিই আছে, এবং ইন্টারফেস তারই একটি ক্লায়েন্ট, অন্য সবার মতোই — যা আমাদের জন্য একটি সীমাবদ্ধতা, এবং এই কারণেই আপনি যা বানাতে চান তা সবই সম্ভব।
এই নিয়মটি আসলে কী খরচ করে
এর অর্থ হলো মাঝে মাঝে একটি স্ক্রিনকে API-এর ঠিক হওয়ার জন্য অপেক্ষা করতে হয়, একটি সুবিধাজনক ফিল্ডের জন্য তাকে পাশ কাটিয়ে যেতে হয় না। কোনো স্ক্রিনের যেদিন এমন কিছু দরকার হয় যা পাবলিক API দিতে পারে না, সেদিনই বোঝা যায় API-টি ভুল, আর সমাধান হলো API-টিই ঠিক করা।
এর প্রতিদান হলো, তিনটি একেবারে ভিন্ন ধরনের ক্লায়েন্টের জন্য প্রায় কোনো অতিরিক্ত খরচ হয় না। MCP সার্ভার একটি ক্লায়েন্ট। dash-b-এর একটি টাইল একটি ক্লায়েন্ট। আপনার নিজের স্ক্রিপ্ট একটি ক্লায়েন্ট। কোনোটিই অন্য কারও জন্য ডিজাইন করা কোনো সারফেস ঘিরে কাজ করা দ্বিতীয় শ্রেণির নাগরিক নয়, কারণ দ্বিতীয় কোনো সারফেস নেই।
ডকুমেন্টেড, এবং পরীক্ষিত
OpenAPI /docs-এ তৈরি হয় এবং প্রতিটি রুটের একটি টেস্ট আছে যা ডকুমেন্টেশনের উদাহরণটিই। কোড থেকে আলাদাভাবে লেখা ডকুমেন্টেশন এক মাসের মধ্যেই সরে যায়; ভুল হলে বিল্ড ব্যর্থ করে দেয় এমন ডকুমেন্টেশন সরে না।
সাইন ইন করা
আপনার castomo অ্যাকাউন্ট, authorization code flow with PKCE-এর মাধ্যমে — dash-b এবং পরিবারের বাকি সবগুলোতে যে অ্যাকাউন্ট ব্যবহার করেন, সেটিই। নিজস্ব কোনো সার্ভার নেই এমন একটি পাতাও এই ফ্লো নিখুঁতভাবে চালাতে পারে; ফ্লোটি মূলত এজন্যই ডিজাইন করা। মেশিন-টু-মেশিন কাজের জন্য, প্রজেক্ট-স্কোপড একটি API কী।
- 1মানুষ
/v1/contacts·/lists·/segments·/tags·/imports - 2বিষয়বস্তু
/v1/creatives, প্রতিটি টার্গেটের জন্য ভ্যালিডেশন, প্রিভিউ ও রেন্ডার সহ - 3অটোমেশন
/v1/funnels·/funnels/:id/versions·/runs·/simulate - 4সম্প্রচার
/v1/campaigns, অডিয়েন্স, ম্যাটেরিয়ালাইজ, শিডিউল ও সেন্ড আলাদা ধাপ হিসেবে - 5ইভেন্ট ইন
/v1/events— আপনার নিজের অ্যাপ্লিকেশনের ইভেন্ট, ট্রিগার হিসেবে - 6ডেলিভারি
/sender-identities·/domains·/apps·/webhooks - 7সংখ্যা
/v1/reports/*, এবং ট্র্যাকিং হোস্টে/track/*
/docs-এ OpenAPIএকই প্রসেসে /mcp
কনভেনশন
castomo-র অন্য প্রতিটি সার্ভিসের মতোই একই কাঠামো
যা শোনার চেয়ে বেশি গুরুত্বপূর্ণ। আপনি যদি ইতিমধ্যে এর কোনো একটিকে কল করে থাকেন, তাহলে এটি কীভাবে উত্তর দেয়, ব্যর্থ হয় ও পেজিনেট করে তা আপনি আগেই জানেন।
একটি এরর এনভেলপ
প্রতিটি ব্যর্থতার একই কাঠামো, একটি স্থিতিশীল কোড এবং মানুষের জন্য লেখা একটি বার্তা। কোনো রুট অসন্তুষ্ট হওয়ার নিজস্ব কোনো পথ বানায় না।
কার্সর পেজিনেশন
অফসেট নয়। আপনি যখন একটি তালিকা ঘেঁটে চলছেন তখন তা বদলে গেলে কোনো সারি নীরবে বাদ পড়ে যায় না বা পুনরাবৃত্তি হয় না — যা অফসেট পেজিনেশন নীরবে ও অহরহ করে।
আইডেম্পোটেন্সি কী
প্রতিটি মিউটেটিং রুটে। আপনি নিশ্চিত না হলে একটি রিকোয়েস্ট আবার পাঠান এবং একই উত্তর পান — দ্বিতীয় কোনো কন্টাক্ট, দ্বিতীয় কোনো ক্যাম্পেইন বা দ্বিতীয় কোনো সেন্ড নয়।
প্রজেক্টে স্কোপড
একটি টোকেন একই সঙ্গে একটি টেন্যান্ট এবং একটি প্রজেক্টকে নির্দেশ করে। রো-লেভেল সিকিউরিটি ডেটাবেসের ভেতরেই প্রয়োগ করা হয়, কোনো ক্লজ যোগ করতে ভুলে যাওয়ার উপর নয়।
ওয়েবহুক আউট
সাইন করা, ব্যাকঅফ সহ পুনরায় চেষ্টা করা, এবং অন্তত একবার ডেলিভার করা — তাই আপনার এন্ডপয়েন্টটিও আইডেম্পোটেন্ট হওয়া উচিত। ইভেন্টগুলো সেই একই শব্দভাণ্ডার ব্যবহার করে যা রিপোর্টগুলো ব্যবহার করে।
মুছে ফেলা ও রপ্তানি
একজন যোগাযোগকে API-এর মাধ্যমে রপ্তানি বা মুছে ফেলা যায়, এবং একটি মুছে ফেলা পরিবারের নিজস্ব অভ্যন্তরীণ চ্যানেল দিয়ে সেই কপি রাখা প্রতিটি সহোদর সার্ভিসে পৌঁছে যায়।

ইন্টারফেস যা কিছু করতে পারে, একটি POST তা-ই করতে পারে।
ইভেন্টই আসল বিষয়
এই পৃষ্ঠার বাকি সবকিছু আপনি যেমন প্রত্যাশা করেন সেরকম পরিকাঠামো। POST /v1/events হলো সেই রুট যা পণ্যটির উদ্দেশ্য বদলে দেয়।
আপনার অ্যাপ্লিকেশন এমন অনেক কিছু জানে যা কোনো মার্কেটিং টুল পর্যবেক্ষণ করতে পারে না: কে অনবোর্ডিং শেষ করেছে, কে একজন সহকর্মীকে আমন্ত্রণ জানিয়েছে, কে একটি সীমা স্পর্শ করেছে, কে রবিবার বিকেলে নিজের ডেটা রপ্তানি করেছে। নিজের টোকেন দিয়ে সেগুলো ইভেন্ট হিসেবে পোস্ট করুন, আর প্রতিটি একটি ট্রিগার, একটি শর্ত এবং একটি সেগমেন্ট হয়ে যাবে।
বাকি সবই যোগাযোগ মডেল থেকে আসে। ইভেন্ট শুধু যোগ করা হয়, কখনো সম্পাদনা করা হয় না; এগুলোই সেই লগ যার ওপর পুরো পণ্যটি দাঁড়িয়ে। আপনার সংজ্ঞায়িত কোনো ইভেন্টে ট্রিগার হওয়া একটি ফানেল কোনো ইন্টিগ্রেশন নয় — এটি message_opened যে একই প্রক্রিয়া ব্যবহার করে, ভেতরে শুধু নামটা আলাদা।
- 1আপনি এটি পোস্ট করেন
POST /v1/events— একটি নাম, একটি যোগাযোগ, একটি পেলোড, একটি আইডেম্পোটেন্সি কী। - 2এটি পৌঁছে যায়যোগাযোগের লগে যোগ হয়ে যায়। এর অস্তিত্ব সম্পর্কে আর কারও জানার প্রয়োজন নেই।
- 3একটি ফানেল শুরু হয়যে ফানেলের প্রবেশপথে সেই ইভেন্টের নাম আছে, তার প্রবেশ শর্ত অনুযায়ী যোগ্য যেকোনো যোগাযোগের জন্য।
- 4অন্য ফানেলগুলো এর ওপর শাখা বিস্তার করে"গত ১৪ দিনে এই ইভেন্টটি ঘটেছে কি না" — এটি একটি সাধারণ সেগমেন্ট শর্ত।
- iএবং এটি রান শেষ করেএকই ইভেন্টের নাম উল্লেখ করা একটি গোল নোড ব্যক্তিটি কাজটি করার মুহূর্তেই একটি সিকোয়েন্স থামিয়ে দেয়।
আপনার শব্দভাণ্ডারআপনার টোকেন
নির্মাণ শুরুর আগে জেনে রাখার মতো সীমানা
ClickSomo আপনার সম্পর্কে তিনটি শনাক্তকারী সংরক্ষণ করে — একটি টেন্যান্ট, একটি প্রকল্প ও একজন ব্যবহারকারী, অস্পষ্ট আইডি হিসেবে — এবং আর কিছুই নয়। কোনো পাসওয়ার্ড নেই, কোনো প্রোফাইল নেই, কোনো কার্ড নেই, কোনো চালান নেই। পরিকল্পনার সীমা সংখ্যা হিসেবে আসে: কত যোগাযোগ, কত প্রেরণ, কত জেনারেশন। পেমেন্টের শব্দভাণ্ডার সেই রেখা কোনো দিকেই অতিক্রম করে না।
আপনার যোগাযোগগুলো আপনারই। আপনি ডেটা নিয়ন্ত্রক; আমরা প্রসেসর। পরিবারের অন্য কোনো পণ্য যেন আপনার যোগাযোগ তালিকা পড়তে বা লিখতে পারে, এমন কোনো রুট নেই, এবং ব্যবহারের জন্য কোনো ইনজেস্ট চ্যানেলও নেই।
যদি আপনি এটি গুরুত্ব সহকারে মূল্যায়ন করছেন: এই ওয়েবসাইটের আর কিছু পড়ার আগে /docs পড়ুন। API-ই পণ্যটি যা করে তার সৎ বর্ণনা, এবং এই পৃষ্ঠাগুলোর প্রতিটি দাবি সেখানে পাওয়া কোনো রুট বা নোড ধরনের সঙ্গে মিলে যায়। স্কিমা বদলালে এই পৃষ্ঠাগুলোও বদলায়।