বিষয়বস্তুতে যান

v1 থেকে মাইগ্রেশন

এই গাইডটি প্রতিটি লিগ্যাসি /create*Message ফিল্ডকে তার Messaging API v2-এর সমতুল্য ফিল্ডে ম্যাপ করে। বিদ্যমান ইন্টিগ্রেশন পোর্ট করার সময় এটি একটি রেফারেন্স হিসাবে ব্যবহার করুন।

উচ্চ-স্তরের পার্থক্য

Anchor link to
দিকv1v2
প্রতি চ্যানেলের জন্য এন্ডপয়েন্টপ্রতি চ্যানেলের জন্য আলাদা মেথড (/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 to

v1 notifications[*] এন্ট্রিগুলি স্বতন্ত্র Notify রিকোয়েস্টে পরিণত হয় (প্রতিটিতে একটি মেসেজ)। যদি একটি v1 কলে একাধিক এন্ট্রি থাকে, তবে প্রতিটি এন্ট্রির জন্য একটি Notify ইস্যু করুন।

টার্গেটিং সিদ্ধান্ত। যদি v1 এন্ট্রি devices বা users (স্পষ্ট তালিকা) ব্যবহার করে, তবে এটিকে transactional-এ ম্যাপ করুন। অন্যথায় এটিকে segment-এ ম্যাপ করুন।

রিকোয়েস্ট-স্তরের ফিল্ড

Anchor link to
  • applicationsegment.application বা transactional.application (একই অ্যাপ-কোড ফরম্যাট)।
  • applications_group: v2-তে সমর্থিত নয়। একাধিক প্রতি-অ্যাপ রিকোয়েস্ট ব্যবহার করুন।
  • auth: Authorization হেডারে সরানো হয়েছে, আর বডিতে নেই।

শিডিউলিং

Anchor link to
  • send_date ("YYYY-MM-DD HH:mm" বা "now") → schedule.at (RFC 3339 UTC টাইমস্ট্যাম্প)। v1-এর "now" পুনরায় তৈরি করতে, schedule.at বর্তমান সময়ে সেট করুন। অতীতের যেকোনো টাইমস্ট্যাম্প অবিলম্বে পাঠানো হয়।
  • ignore_user_timezoneschedule.follow_user_timezoneবিপরীত: ignore_user_timezone: true হয়ে যায় follow_user_timezone: false
  • timezone: সমর্থিত নয়। v2 সর্বদা at-এর জন্য UTC ব্যবহার করে। ক্লায়েন্ট-সাইডে রূপান্তর করুন।

টার্গেটিং

Anchor link to
  • filter (সেগমেন্টের নাম) → 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: ANDTag("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-এ।
  • userstransactional.users.list
  • platforms (সাংখ্যিক কোড [1, 3, …]) → segment.platforms বা transactional.platforms (স্ট্রিং enum ["IOS", "ANDROID", …])। দেখুন প্ল্যাটফর্ম enum

কন্টেন্ট

Anchor link to
  • content (স্ট্রিং) → payload.content.localized_content.default.{platform}.body। v2-তে, কন্টেন্ট সর্বদা প্রতি-লোকেল এবং প্রতি-প্ল্যাটফর্ম হয়। একটি সাধারণ v1 স্ট্রিং বিশেষ "default" কী-এর অধীনে রাখুন (ক্যাচ-অল অনুবাদ, দেখুন ডিভাইসের জন্য লোকেল নির্বাচন)।
  • content ({locale: text}) → payload.content.localized_content.{locale}.{platform}.body। প্রতিটি টার্গেটেড প্ল্যাটফর্ম ব্লকে বডি ডুপ্লিকেট করুন।
  • presetpayload.preset
  • datapayload.custom_data
  • rich_mediapayload.open_action.rich_media.code
  • linkpayload.open_action.link.url
  • minimize_link (0 বা 2) → payload.open_action.link.shortener (NONE বা BITLY)।
  • inbox_imagepayload.content.localized_content.{locale}.{platform}.inbox.image_url (প্রতিটি প্ল্যাটফর্ম ব্লকের নিজস্ব inbox আছে)।
  • inbox_datepayload.content.localized_content.{locale}.{platform}.inbox.expiration_date
  • inbox_days: সমর্থিত নয়। ক্লায়েন্ট-সাইডে একটি অ্যাবসোলিউট expiration_date-এ রূপান্তর করুন।

ডেলিভারি কন্ট্রোল

Anchor link to
  • dynamic_content / dynamic_content_placeholderssegment বা transactional-এ dynamic_content_placeholders
  • campaignsegment বা transactional-এ campaign
  • capping_daysfrequency_capping.days
  • capping_countfrequency_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 to
  • transactionId: সরাসরি কোনো সমতুল্য নেই। আপনার দিকে কোরিলেশন ট্র্যাক করুন।
  • template_bindings: Liquid টেমপ্লেট বাইন্ডিং v2-তে উপলব্ধ নয়। যদি আপনি এগুলির উপর নির্ভর করেন তবে v1 ব্যবহার চালিয়ে যান।

প্ল্যাটফর্ম-নির্দিষ্ট ব্লক

Anchor link to

v1 প্রতিটি 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 to

v1 /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_filtersegment.expression (seglang) বা segment.filter_expression (স্ট্রাকচার্ড)।
  • contentpayload.content.localized_content.{locale}.{platform}.body
  • অন্যান্য সমস্ত ফিল্ড, উপরের /createMessage-এর মতো।

/createEmailMessage থেকে

Anchor link to

platforms: ["EMAIL"] এবং একটি email_payload ব্লক সহ Notify-তে যান। সম্পূর্ণ রেফারেন্স: ইমেল পেলোড রেফারেন্স

  • subjectemail_payload.subject (লোকেল দ্বারা কীড করা ম্যাপ। একক-লোকেল মানগুলিকে {"en": "..."}-এ মোড়ান)।
  • content (HTML) → email_payload.body
  • email_templateemail_payload.email_template
  • from / from_nameemail_payload.from ({ "name": "...", "email": "..." })।
  • reply_to / reply_to_nameemail_payload.reply_to
  • list_unsubscribeemail_payload.list_unsubscribe
  • attachmentsemail_payload.attachments ([{ "name": "...", "content": "<base64>" }])।
  • টার্গেটিং, শিডিউল, ক্যাম্পেইন, ইত্যাদি, /createMessage-এর মতো।

/createSMSMessage থেকে

Anchor link to

platforms: ["SMS"] সহ Notify-তে যান। SMS বডি অ্যাপের কনফিগার করা SMS প্রদানকারীর মাধ্যমে ডেলিভার করা হয়। কন্টেন্টটি যেকোনো ভরা প্ল্যাটফর্ম ব্লকে payload.content.localized_content.{locale}.{platform}.body-তে রাখুন।

SMS-নির্দিষ্ট প্রদানকারীর বিকল্পগুলি (প্রেরকের আইডি, ইত্যাদি) রিকোয়েস্ট বডির পরিবর্তে অ্যাপের SMS কনফিগারেশন থেকে আসতে থাকে।

/createKakaoMessage থেকে

Anchor link to

platforms: ["KAKAO"] সহ Notify-তে যান, payload.content.localized_content.{locale}.kakao ব্যবহার করে:

  • template_idkakao.template
  • contentkakao.content
  • variableskakao.content_variables (JSON-স্ট্রিংগিফাইড)।

/createWhatsAppMessage থেকে

Anchor link to

platforms: ["WHATS_APP"] সহ Notify-তে যান, payload.content.localized_content.{locale}.whatsapp ব্যবহার করে:

  • content (ফ্রি-ফর্ম টেক্সট) → whatsapp.content। শুধুমাত্র ২৪-ঘণ্টার গ্রাহক পরিষেবা উইন্ডোর মধ্যে Meta দ্বারা ডেলিভার করা হয়।
  • content_idwhatsapp.content_id। একটি পূর্ব-অনুমোদিত Meta টেমপ্লেটের নাম।
  • languagewhatsapp.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-স্ট্রিংগিফাইড)।
  • presetpayload.preset (পেলোড স্তরে জেনেরিক প্রিসেট)।
  • টার্গেটিং: v1-এ devices-এ যাওয়া WhatsApp ফোন নম্বর (যেমন "whatsapp:+1234567890") একটি ব্যবহারকারীর বিরুদ্ধে /registerDevice এর মাধ্যমে রেজিস্টার করতে হবে। v2-তে, transactional.users.list (অথবা transactional.hwids.list-এর মাধ্যমে hwid) দিয়ে ফলস্বরূপ ব্যবহারকারীকে টার্গেট করুন।
  • use_auto_registration: সমর্থিত নয়। পাঠানোর আগে WhatsApp নম্বর রেজিস্টার করুন।

/createLineMessage থেকে

Anchor link to

platforms: ["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 to

v1 /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 জোড়ার পরিবর্তে।