v1 থেকে মাইগ্রেশন
এই গাইডটি প্রতিটি লিগ্যাসি /create*Message ফিল্ডকে তার Messaging API v2-এর সমতুল্য ফিল্ডে ম্যাপ করে। বিদ্যমান ইন্টিগ্রেশন পোর্ট করার সময় এটি একটি রেফারেন্স হিসাবে ব্যবহার করুন।
উচ্চ-স্তরের পার্থক্য
Anchor link to| দিক | v1 | v2 |
|---|---|---|
| প্রতি চ্যানেলের জন্য এন্ডপয়েন্ট | প্রতি চ্যানেলের জন্য আলাদা মেথড (/createMessage, /createEmailMessage, /createSMSMessage, /createKakaoMessage, …) | একক এন্ডপয়েন্ট — POST /messaging/v2/notify |
| অথ | রিকোয়েস্ট বডিতে auth ফিল্ড | Authorization: Token <API_TOKEN> হেডার |
| টার্গেটিং | মিশ্রিত: একই রিকোয়েস্টে filter + conditions + devices + users | স্পষ্ট বিভাজন: NotifySegment বনাম NotifyTransactional |
| কন্টেন্ট | ফ্ল্যাট content + সহোদর প্ল্যাটফর্ম ব্লক | নেস্টেড payload.content.localized_content.{locale}.{platform} |
| রেসপন্স | MessageCode[] | message_code + ঐচ্ছিক unknown_identifiers |
/createMessage থেকে
Anchor link tov1 notifications[*] এন্ট্রিগুলি স্বতন্ত্র Notify রিকোয়েস্টে পরিণত হয় (প্রতিটিতে একটি মেসেজ)। যদি একটি v1 কলে একাধিক এন্ট্রি থাকে, তবে প্রতিটি এন্ট্রির জন্য একটি Notify ইস্যু করুন।
টার্গেটিং সিদ্ধান্ত। যদি v1 এন্ট্রি devices বা users (স্পষ্ট তালিকা) ব্যবহার করে, তবে এটিকে transactional-এ ম্যাপ করুন। অন্যথায় এটিকে segment-এ ম্যাপ করুন।
রিকোয়েস্ট-স্তরের ফিল্ড
Anchor link toapplication→segment.applicationবাtransactional.application(একই অ্যাপ-কোড ফরম্যাট)।applications_group: v2-তে সমর্থিত নয়। একাধিক প্রতি-অ্যাপ রিকোয়েস্ট ব্যবহার করুন।auth:Authorizationহেডারে সরানো হয়েছে, আর বডিতে নেই।
শিডিউলিং
Anchor link tosend_date("YYYY-MM-DD HH:mm"বা"now") →schedule.at(RFC 3339 UTC টাইমস্ট্যাম্প)। v1-এর"now"পুনরায় তৈরি করতে,schedule.atবর্তমান সময়ে সেট করুন। অতীতের যেকোনো টাইমস্ট্যাম্প অবিলম্বে পাঠানো হয়।ignore_user_timezone→schedule.follow_user_timezone। বিপরীত:ignore_user_timezone: trueহয়ে যায়follow_user_timezone: false।timezone: সমর্থিত নয়। v2 সর্বদাat-এর জন্য UTC ব্যবহার করে। ক্লায়েন্ট-সাইডে রূপান্তর করুন।
টার্গেটিং
Anchor link tofilter(সেগমেন্টের নাম) →segment.code।conditions([[tag, op, value], ...]) →segment.expression। একটি seglang এক্সপ্রেশনে আবার লিখুন। seglang-এ,*হল লজিক্যাল AND এবং অ্যাপ-নির্দিষ্ট ট্যাগগুলিTag("<application-code>", "<tag>", <op>, <value>)হিসাবে রেফারেন্স করা হয়। উদাহরণ:[["Country","EQ","BR"],["Language","EQ","pt"]]এবংconditions_operator: AND→Tag("XXXXX-XXXXX", "Country", EQ, "br") * Tag("XXXXX-XXXXX", "Language", EQ, "pt")।conditions_operator(AND/OR):segment.expression-এ অন্তর্ভুক্ত।devices(hwids বা পুশ টোকেন) →transactional.hwids.listবাtransactional.push_tokens.list। v2 দুটিকে আলাদা করে: hwids যায়hwids-এ, র’ পুশ টোকেন যায়push_tokens-এ।users→transactional.users.list।platforms(সাংখ্যিক কোড[1, 3, …]) →segment.platformsবাtransactional.platforms(স্ট্রিং enum["IOS", "ANDROID", …])। দেখুন প্ল্যাটফর্ম enum।
কন্টেন্ট
Anchor link tocontent(স্ট্রিং) →payload.content.localized_content.default.{platform}.body। v2-তে, কন্টেন্ট সর্বদা প্রতি-লোকেল এবং প্রতি-প্ল্যাটফর্ম হয়। একটি সাধারণ v1 স্ট্রিং বিশেষ"default"কী-এর অধীনে রাখুন (ক্যাচ-অল অনুবাদ, দেখুন ডিভাইসের জন্য লোকেল নির্বাচন)।content({locale: text}) →payload.content.localized_content.{locale}.{platform}.body। প্রতিটি টার্গেটেড প্ল্যাটফর্ম ব্লকে বডি ডুপ্লিকেট করুন।preset→payload.preset।data→payload.custom_data।rich_media→payload.open_action.rich_media.code।link→payload.open_action.link.url।minimize_link(0বা2) →payload.open_action.link.shortener(NONEবাBITLY)।inbox_image→payload.content.localized_content.{locale}.{platform}.inbox.image_url(প্রতিটি প্ল্যাটফর্ম ব্লকের নিজস্বinboxআছে)।inbox_date→payload.content.localized_content.{locale}.{platform}.inbox.expiration_date।inbox_days: সমর্থিত নয়। ক্লায়েন্ট-সাইডে একটি অ্যাবসোলিউটexpiration_date-এ রূপান্তর করুন।
ডেলিভারি কন্ট্রোল
Anchor link todynamic_content/dynamic_content_placeholders→segmentবাtransactional-এdynamic_content_placeholders।campaign→segmentবাtransactional-এcampaign।capping_days→frequency_capping.days।capping_count→frequency_capping.count।send_rate(int) →send_rate.valueএবংsend_rate.bucket: "1s"।message_type("marketing"/"transactional") →message_type(MESSAGE_TYPE_MARKETING/MESSAGE_TYPE_TRANSACTIONAL)।
v2-তে সমর্থিত নয়
Anchor link totransactionId: সরাসরি কোনো সমতুল্য নেই। আপনার দিকে কোরিলেশন ট্র্যাক করুন।template_bindings: Liquid টেমপ্লেট বাইন্ডিং v2-তে উপলব্ধ নয়। যদি আপনি এগুলির উপর নির্ভর করেন তবে v1 ব্যবহার চালিয়ে যান।
প্ল্যাটফর্ম-নির্দিষ্ট ব্লক
Anchor link tov1 প্রতিটি notifications[*] এন্ট্রির শীর্ষ স্তরে প্ল্যাটফর্ম-নির্দিষ্ট প্যারামিটার গ্রহণ করে (ios, android, safari, chrome, …)। v2-তে সেগুলি লোকেল-এর ভিতরে চলে যায়:
// v1"notifications": [{ "content": "Hello", "ios": { "title": "Hi", "sound": "default.caf" }, "android": { "header": "Hi", "led": "#ff0000" }}]
// v2"payload": { "content": { "localized_content": { "en": { "ios": { "title": "Hi", "body": "Hello", "sound": "default.caf" }, "android": { "title": "Hi", "body": "Hello", "led_color": "#ff0000" } } } }}প্ল্যাটফর্ম ব্লকের মধ্যে ফিল্ডের নাম কিছু জায়গায় ভিন্ন। সঠিক v2 নামের জন্য Payload রেফারেন্স দেখুন।
উদাহরণ: আগে এবং পরে
Anchor link tov1 /createMessage (একটি সেগমেন্টে পুশ):
{ "request": { "application": "XXXXX-XXXXX", "auth": "YOUR_API_TOKEN", "notifications": [{ "send_date": "2026-05-01 12:00", "content": "Hello!", "platforms": [1, 3], "filter": "active_users", "campaign": "YYYYY-YYYYY", "capping_days": 7, "capping_count": 3, "message_type": "marketing" }] }}v2 /messaging/v2/notify:
{ "segment": { "application": "XXXXX-XXXXX", "platforms": ["IOS", "ANDROID"], "code": "active_users", "payload": { "content": { "localized_content": { "en": { "ios": { "body": "Hello!" }, "android": { "body": "Hello!" } } } } }, "schedule": { "at": "2026-05-01T12:00:00Z" }, "frequency_capping": { "days": 7, "count": 3 }, "campaign": "YYYYY-YYYYY", "message_type": "MESSAGE_TYPE_MARKETING" }}/createTargetedMessage থেকে
Anchor link to/createTargetedMessage বেশিরভাগ ক্ষেত্রে transactional-এ ম্যাপ করে অথবা segment-এ যদি আপনি এটি শুধুমাত্র একটি ক্রস-অ্যাপ devices_filter হিসাবে ব্যবহার করেন কোনো স্পষ্ট আইডেন্টিফায়ার ছাড়া।
devices_filter→segment.expression(seglang) বাsegment.filter_expression(স্ট্রাকচার্ড)।content→payload.content.localized_content.{locale}.{platform}.body।- অন্যান্য সমস্ত ফিল্ড, উপরের
/createMessage-এর মতো।
/createEmailMessage থেকে
Anchor link toplatforms: ["EMAIL"] এবং একটি email_payload ব্লক সহ Notify-তে যান। সম্পূর্ণ রেফারেন্স: ইমেল পেলোড রেফারেন্স।
subject→email_payload.subject(লোকেল দ্বারা কীড করা ম্যাপ। একক-লোকেল মানগুলিকে{"en": "..."}-এ মোড়ান)।content(HTML) →email_payload.body।email_template→email_payload.email_template।from/from_name→email_payload.from({ "name": "...", "email": "..." })।reply_to/reply_to_name→email_payload.reply_to।list_unsubscribe→email_payload.list_unsubscribe।attachments→email_payload.attachments([{ "name": "...", "content": "<base64>" }])।- টার্গেটিং, শিডিউল, ক্যাম্পেইন, ইত্যাদি,
/createMessage-এর মতো।
/createSMSMessage থেকে
Anchor link toplatforms: ["SMS"] সহ Notify-তে যান। SMS বডি অ্যাপের কনফিগার করা SMS প্রদানকারীর মাধ্যমে ডেলিভার করা হয়। কন্টেন্টটি যেকোনো ভরা প্ল্যাটফর্ম ব্লকে payload.content.localized_content.{locale}.{platform}.body-তে রাখুন।
SMS-নির্দিষ্ট প্রদানকারীর বিকল্পগুলি (প্রেরকের আইডি, ইত্যাদি) রিকোয়েস্ট বডির পরিবর্তে অ্যাপের SMS কনফিগারেশন থেকে আসতে থাকে।
/createKakaoMessage থেকে
Anchor link toplatforms: ["KAKAO"] সহ Notify-তে যান, payload.content.localized_content.{locale}.kakao ব্যবহার করে:
template_id→kakao.template।content→kakao.content।variables→kakao.content_variables(JSON-স্ট্রিংগিফাইড)।
/createWhatsAppMessage থেকে
Anchor link toplatforms: ["WHATS_APP"] সহ Notify-তে যান, payload.content.localized_content.{locale}.whatsapp ব্যবহার করে:
content(ফ্রি-ফর্ম টেক্সট) →whatsapp.content। শুধুমাত্র ২৪-ঘণ্টার গ্রাহক পরিষেবা উইন্ডোর মধ্যে Meta দ্বারা ডেলিভার করা হয়।content_id→whatsapp.content_id। একটি পূর্ব-অনুমোদিত Meta টেমপ্লেটের নাম।language→whatsapp.language। Meta-টেমপ্লেট লোকেল (যেমন"en_US")। বাইরেরLocalizedContentলোকেল কী থেকে স্বাধীন।content_variables(v1-এ অবজেক্ট) →whatsapp.content_variables(JSON-স্ট্রিংগিফাইড অবজেক্ট)। উদাহরণ v1{"1": "John"}হয়ে যায় v2"{\"1\":\"John\"}"।button_url_variables(অবজেক্ট) →whatsapp.button_url_variables(JSON-স্ট্রিংগিফাইড)।header_variables(অবজেক্ট) →whatsapp.header_variables(JSON-স্ট্রিংগিফাইড)।preset→payload.preset(পেলোড স্তরে জেনেরিক প্রিসেট)।- টার্গেটিং: v1-এ
devices-এ যাওয়া WhatsApp ফোন নম্বর (যেমন"whatsapp:+1234567890") একটি ব্যবহারকারীর বিরুদ্ধে/registerDeviceএর মাধ্যমে রেজিস্টার করতে হবে। v2-তে,transactional.users.list(অথবাtransactional.hwids.list-এর মাধ্যমে hwid) দিয়ে ফলস্বরূপ ব্যবহারকারীকে টার্গেট করুন। use_auto_registration: সমর্থিত নয়। পাঠানোর আগে WhatsApp নম্বর রেজিস্টার করুন।
/createLineMessage থেকে
Anchor link toplatforms: ["LINE"] সহ Notify-তে যান, payload.content.localized_content.{locale}.line ব্যবহার করে:
content(প্লেইন টেক্সট) →line.content।preset(LINE প্রিসেট কোড) →line.template। v2 ফিল্ড একটি কোড সংরক্ষণ করে যা Pushwoosh কন্ট্রোল প্যানেলে কনফিগার করা একটি LINE টেমপ্লেটকে রেফারেন্স করে।- ইনলাইন
template(v1 ইমেজ, ক্যারোসেল, বা ফ্লেক্স মেসেজ স্ট্রাকচার): v2-তে সরাসরি সমর্থিত নয়। রিচ মেসেজটিকে কন্ট্রোল প্যানেলে একটি LINE প্রিসেট হিসাবে প্রি-কনফিগার করুন এবংline.template-এর মাধ্যমে এটি রেফারেন্স করুন। - টার্গেটিং: v1
devicesতালিকা (SDK //registerDevice-এর মাধ্যমে রেজিস্টার করা LINE ব্যবহারকারী আইডি) v2-তেtransactional.users.list(অথবাtransactional.hwids.list-এর মাধ্যমে hwid) হয়ে যায়।
রেসপন্সের পার্থক্য
Anchor link tov1 /createMessage রিটার্ন করে:
{ "status_code": 200, "status_message": "OK", "response": { "Messages": ["XXXXX-XXXXX-AAAAA"] }}v2 Notify রিটার্ন করে:
{ "result": { "message_code": "XXXXX-XXXXX-AAAAA", "unknown_identifiers": [] }}নন-200 রেসপন্সগুলি স্ট্যান্ডার্ড gRPC-Gateway এরর এনভেলপ ({ "code": ..., "message": ..., "details": [...] }) অনুসরণ করে, v1-এর status_code / status_message জোড়ার পরিবর্তে।