Sign inGet Started

ईमेल भेजना

POST /v1/email/messages एक ईमेल भेजता है। JSON पेलोड में प्रेषक, प्राप्तकर्ता और सामग्री दें। API एक संदेश ID के साथ 202 Accepted लौटाता है, फिर ईमेल को एसिंक्रोनस रूप से डिलीवर करता है। पूरे स्कीमा के लिए API संदर्भ देखें।

न्यूनतम भेजना

सबसे छोटे मान्य पेलोड में एक from, कम से कम एक to प्राप्तकर्ता, एक subject और एक बॉडी (html, text या दोनों) होते हैं। from पता ऐसे डोमेन पर होना चाहिए जिसे आपने इस वर्कस्पेस में सत्यापित किया है, या ऑनबोर्डिंग डोमेन पर।

const msg = await bird.email.send({
  from: { email: "onboarding@messagebird.dev", name: "Bird" },
  to: ["delivered@messagebird.dev"],
  subject: "Hello from Bird",
  html: "<p>My first Bird email.</p>",
});
console.log(msg.id, msg.status); // "em_…", "accepted"

अपने क्षेत्रीय होस्ट (https://us1.platform.bird.com या https://eu1.platform.bird.com) के साथ मेल खाने वाली bk_{region}_... कुंजी का उपयोग करें।

भेजने के उदाहरण में delivered@messagebird.dev का उपयोग होता है, जो एक सैंडबॉक्स पता है और हमेशा मेल स्वीकार करता है। API प्लेसहोल्डर डोमेन को 422 के साथ अस्वीकार करता है: example.com, example.net, example.org, example.edu, test.com, और आरक्षित .test, .example, .invalid या .localhost TLD के अंतर्गत कोई भी डोमेन। इन डोमेन पर भेजा गया मेल केवल बाउंस हो सकता है, जिससे आपकी प्रेषक प्रतिष्ठा घटती है।

डोमेन सत्यापित करने से पहले भेजना

ऑनबोर्डिंग के दौरान आप हमारे साझा ऑनबोर्डिंग डोमेन onboarding@messagebird.dev से भेज सकते हैं। ऐसे मेल डोमेन जाँच से नहीं गुजरते, लेकिन केवल आपके अपने वर्कस्पेस के सत्यापित सदस्यों और सैंडबॉक्स पतों तक पहुँचते हैं, और उन पर प्रतिदिन प्राप्तकर्ताओं की एक सीमा लागू होती है। सटीक नियम और सीमाएँ क्विकस्टार्ट में हैं।

पेलोड बनाना

प्राप्तकर्ता

to, cc और bcc में से हर एक में अधिकतम 50 पते दिए जा सकते हैं, और to में कम से कम एक पता होना चाहिए। हर प्रविष्टि एक सादा ईमेल स्ट्रिंग, एक RFC 5322 मेलबॉक्स स्ट्रिंग (Jane <jane@acme.com>), या वैकल्पिक प्रदर्शन नाम वाला एक ऑब्जेक्ट होती है।

वर्कस्पेस की सप्रेशन सूची में शामिल प्राप्तकर्ताओं के कारण अनुरोध विफल नहीं होता। अनुरोध फिर भी 202 लौटाता है, और हर सप्रेस किया गया प्राप्तकर्ता रीड एंडपॉइंट पर status: rejected के रूप में recipient_suppressed कारण के साथ लौटता है, तब भी जब भेजे गए संदेश के सभी प्राप्तकर्ता सप्रेस किए गए हों।

सामग्री

इनलाइन भेजने के लिए subject आवश्यक है, अधिकतम 998 अक्षर। html, text या दोनों दें, हर एक अधिकतम 524,288 अक्षर। जहाँ संभव हो, दोनों भेजें: जो क्लाइंट HTML नहीं दिखा सकता, वह टेक्स्ट भाग दिखाता है।

इनलाइन सामग्री को व्यक्तिगत बनाने के लिए विषय या मुख्य भाग में {{ variable }} टोकन रखें और उनके मान parameters में दें, सीरियलाइज़ होने के बाद अधिकतम 16 KB। मानों का एक ही सेट भेजे गए संदेश के सभी प्राप्तकर्ताओं पर लागू होता है, और जिस टोकन की कोई मेल खाती कुंजी नहीं है, वह खाली दिखता है। बार-बार इस्तेमाल होने वाली सामग्री के लिए इसके बजाय टेम्पलेट भेजें।

विषय और मुख्य भाग को Liquid के रूप में प्रोसेस कराने के लिए parameters शामिल करें, चाहे खाली ऑब्जेक्ट ({}) के रूप में ही हो। अगर आप इसे छोड़ देते हैं, तो {{ animal }} जैसे टोकन ठीक वैसे ही भेजे जाते हैं जैसे लिखे गए हैं। हर पैरामीटर का नाम एक ही शब्द होता है, जैसे first_name; बिंदु वाले नाम और आरक्षित नाम bird अस्वीकार किए जाते हैं। अमान्य Liquid सिंटैक्स और असमर्थित टैग या फ़िल्टर 422 लौटाते हैं।

HTML में डाले गए मान एस्केप किए जाते हैं, ताकि वे आसपास के मार्कअप को न बदल सकें। पूरे लिंक या इमेज URL के लिए url_encode के बिना {{ link }} इस्तेमाल करें। URL क्वेरी के अंदर के मान को स्पष्ट रूप से एन्कोड करें, उदाहरण के लिए https://example.com/search?q={{ query | url_encode }}।

जवाब देने का पता और कस्टम हेडर

reply_to में 1 से 25 पते दिए जा सकते हैं, उन्हीं फ़ॉर्मैट में जो प्राप्तकर्ताओं के लिए हैं। प्राप्तकर्ता का हर जवाब इन सभी पतों पर जाता है, इसलिए आम तौर पर एक या दो पते दिए जाते हैं।

headers आपके अपने हेडर के लिए स्ट्रिंग से स्ट्रिंग वाला ऑब्जेक्ट है, उदाहरण के लिए {"X-Campaign": "spring-2026"}। इसमें अधिकतम 25 हेडर हो सकते हैं, और हर मान अधिकतम 998 अक्षर का हो सकता है। तीन तरह के हेडर 422 लौटाते हैं:

  • पते और प्लेटफ़ॉर्म वाले हेडर। संदेश के पते उनके लिए बने फ़ील्ड (from, to, cc, bcc, reply_to, subject) से सेट करें। ये नाम, और हमारे द्वारा आपके लिए बनाए जाने वाले हेडर (Content-Type, Content-Transfer-Encoding, DKIM-Signature, Received, Return-Path), यहाँ सेट नहीं किए जा सकते।
  • List-Unsubscribe और List-Unsubscribe-Post, marketing भेजने पर। ऐसे भेजने पर हम खुद नियमों के अनुरूप एक-क्लिक सदस्यता समाप्ति हेडर सेट करते हैं। transactional भेजने पर हम आपके हेडर ठीक वैसे ही रहने देते हैं जैसे आपने सेट किए हैं।
  • कैरिज रिटर्न या लाइन फ़ीड वाला कोई भी मान।

ट्रैकिंग

track_opens और track_clicks दोनों का डिफ़ॉल्ट मान true है। इस भेजे गए संदेश में ओपन-पिक्सेल जोड़ना या लिंक बदलना छोड़ने के लिए किसी एक को false पर सेट करें। हर विकल्प संदेश में क्या बदलता है, यह ट्रैकिंग और मेट्रिक्स में बताया गया है।

श्रेणी और IP पूल

category सामग्री को वर्गीकृत करता है और सप्रेशन नीति तय करता है। marketing हर सप्रेशन कारण और किसी भी ऑप्ट-आउट पर डिलीवरी रोकता है। transactional शिकायत वाले सप्रेशन या केवल मार्केटिंग वाले ऑप्ट-आउट के बावजूद डिलीवर करता है, पर सभी संदेशों के लिए दर्ज ऑप्ट-आउट इसे भी रोकता है। टेम्पलेट से भेजने पर इसका डिफ़ॉल्ट टेम्पलेट की श्रेणी होती है और अन्यथा marketing, इसलिए रसीदों, पासवर्ड रीसेट और अन्य परिचालन मेल के लिए transactional स्पष्ट रूप से सेट करें। सही चुनाव श्रेणियाँ में बताया गया है। SMTP के ज़रिए सबमिट किए गए मेल की श्रेणी इसके बजाय कुंजी के SMTP कॉन्फ़िगरेशन से आती है।

ip_pool_id भेजने का पूल चुनता है: कोई पूल ID (ipp_...), या साझा पूल से स्पष्ट रूप से भेजने के लिए ipp_shared। अपने संगठन का डिफ़ॉल्ट पूल इस्तेमाल करने के लिए इसे छोड़ दें। अज्ञात पूल, या ऐसा पूल जिसमें भेजने के लिए कोई समर्पित IP उपलब्ध न हो, 422 के साथ अस्वीकार कर दिया जाता है।

फ़ील्ड संदर्भ

फ़ील्डप्रकारआवश्यकसीमाएँ और टिप्पणियाँ
fromपताहाँकिसी सत्यापित डोमेन पर या ऑनबोर्डिंग डोमेन पर होना चाहिए
toपता[]हाँ1 से 50
cc, bccपता[]नहींप्रत्येक में अधिकतम 50
subjectस्ट्रिंगइनलाइन भेजने परअधिकतम 998 अक्षर; टेम्पलेट से भेजते समय इसे छोड़ दें
html, textस्ट्रिंगकम से कम एकप्रत्येक अधिकतम 524,288 अक्षर; टेम्पलेट से भेजते समय इन्हें छोड़ दें
reply_toपता[]नहीं1 से 25; जवाब सूची के हर पते पर जाते हैं
headersऑब्जेक्ट (स्ट्रिंग → स्ट्रिंग)नहींअधिकतम 25; आरक्षित नाम अस्वीकार किए जाते हैं (देखें कस्टम हेडर)
parametersऑब्जेक्टनहींइनलाइन सामग्री में {{ tokens }} के मान; सीरियलाइज़ होने पर अधिकतम 16 KB; सभी प्राप्तकर्ताओं के लिए साझा
tags{name, value}[]नहींअधिकतम 20; नाम ≤ 32 वर्ण, मान ≤ 64 वर्ण; केवल [A-Za-z0-9_-]; हर भेजने में नाम अद्वितीय होने चाहिए
metadataऑब्जेक्टनहींकोई भी JSON, सीरियलाइज़ होने पर अधिकतम 2 KB
track_opensबूलियननहींडिफ़ॉल्ट true
track_clicksबूलियननहींडिफ़ॉल्ट true
categoryस्ट्रिंगनहींmarketing या transactional; टेम्पलेट से भेजने पर डिफ़ॉल्ट रूप से टेम्पलेट की श्रेणी, अन्यथा marketing
ip_pool_idस्ट्रिंगनहींipp_... या ipp_shared; अपने संगठन के डिफ़ॉल्ट पूल के लिए इसे छोड़ दें
templateऑब्जेक्टनहींप्रकाशित टेम्पलेट को id या slug से भेजें, उसके वेरिएबल के लिए parameters और वैकल्पिक language के साथ
attachmentsobject[]नहींअधिकतम 20; देखें अटैचमेंट
scheduled_atRFC 3339 टाइमस्टैम्पनहींइनलाइन सामग्री या template को शेड्यूल करें; देखें शेड्यूल किया गया भेजना

टेम्पलेट के साथ भेजना

इनलाइन सामग्री के बजाय कोई प्रकाशित टेम्पलेट भेजें: template को एक ऑब्जेक्ट पर सेट करें, जो टेम्पलेट को id (emt_...) या slug से पहचानता हो, इन दोनों में से ठीक एक से। उसके वेरिएबल के मान template.parameters में दें। subject, html और text न भेजें, क्योंकि ये टेम्पलेट में पहले से मौजूद हैं।

const msg = await bird.email.send({
  from: { email: "onboarding@messagebird.dev", name: "Bird" },
  to: ["delivered@messagebird.dev"],
  category: "transactional",
  template: {
    slug: "welcome-email",
    parameters: { first_name: "Jane" },
  },
});
console.log(msg.id, msg.status);

टेम्पलेट की सामग्री Liquid में होती है, इसलिए साधारण {{ variable }} प्रतिस्थापन के अलावा इसमें फ़िल्टर, {% if %} शर्तें और {% for %} लूप इस्तेमाल हो सकते हैं। वेरिएबल से वैयक्तिकरण उन कुछ संरचनाओं की सूची देता है जिन्हें प्रकाशन अस्वीकार करता है। template.parameters में आप टेम्पलेट के अपने पैरामीटर के मान नाम के अनुसार रखते हैं। अगर कोई मान छूट जाए, तो भेजना 422 के साथ अस्वीकार होता है, जिसमें उस पैरामीटर का नाम होता है। भेजने से जुड़ी बाकी हर चीज़ इनलाइन भेजने जैसी ही काम करती है, जिसमें प्राप्तकर्ता, tags, metadata, ट्रैकिंग और अटैचमेंट शामिल हैं। टेम्पलेट से भेजने की खास बातें:

  • इनलाइन या टेम्पलेट, दोनों एक साथ कभी नहीं। template के साथ subject, html या text भेजने पर अनुरोध 422 के साथ अस्वीकार होता है। API शीर्ष-स्तरीय parameters फ़ील्ड में वेरिएबल के मान भी अस्वीकार करता है; टेम्पलेट से भेजते समय ये मान template.parameters में जाते हैं।
  • bird ही एकमात्र आरक्षित नाम है। bird. से शुरू होने वाला प्लेसहोल्डर पथ हमारे अपने डेटा को दर्शाता है, जैसे अनसब्सक्राइब लिंक या प्राप्तकर्ता का संपर्क रिकॉर्ड, इसलिए किसी template.parameters कुंजी का नाम bird नहीं हो सकता। बाकी हर कुंजी आप खुद तय करते हैं, और हर कुंजी एक सपाट, एक-शब्द वाला नाम होती है: {"order_number": "A-1043"} से {{ order_number }} भरता है।
  • टेम्पलेट अभी या बाद में भेजा जा सकता है। भेजने को शेड्यूल करने के लिए scheduled_at जोड़ें। स्वीकार करते समय हम प्रकाशित संस्करण, चुनी गई भाषा और पैरामीटर मान तय कर देते हैं। अगर आप भेजने के समय से पहले टेम्पलेट हटा देते हैं, तो संदेश generation_failure के साथ अस्वीकार कर दिया जाता है।
  • भेजने में टेम्पलेट का प्रकाशित संस्करण इस्तेमाल होता है। ड्राफ़्ट कभी नहीं भेजे जाते। अज्ञात टेम्पलेट 404 के साथ अस्वीकार होता है, और जिस टेम्पलेट का कोई प्रकाशित संस्करण नहीं है, वह 422 के साथ।
  • language टेम्पलेट की भाषाओं में से एक चुनता है। टेम्पलेट की डिफ़ॉल्ट भाषा भेजने के लिए इसे छोड़ दें। अगर आप ऐसी भाषा माँगते हैं जो टेम्पलेट में नहीं है, तो टेम्पलेट की अपनी on_missing_language सेटिंग तय करती है कि उसकी जगह सबसे नज़दीकी भाषा भेजी जाए या भेजना अस्वीकार हो। जो टेम्पलेट language_source_required सेट करता है, वह ऐसे भेजने को अस्वीकार करता है जिसमें कोई भाषा नहीं बताई गई हो।
  • टेम्पलेट की श्रेणी डिफ़ॉल्ट है, और आपकी श्रेणी उसकी जगह लागू होती है। category छोड़ने पर भेजना टेम्पलेट की श्रेणी अपना लेता है, इसलिए ट्रांज़ैक्शनल टेम्पलेट के लिए इसे हर कॉल में दोहराने की ज़रूरत नहीं है।

ईमेल टेम्पलेट में टेम्पलेट लिखना, प्रकाशित करना और टेम्पलेट में इस्तेमाल होने वाली संरचनाएँ बताई गई हैं।

टैग और मेटाडेटा में अंतर

दोनों किसी भेजे गए ईमेल के साथ आपका अपना डेटा जोड़ते हैं, और उनमें अंतर यह है कि आप बाद में उस डेटा को कैसे खोजते हैं:

  • tags संरचित {name, value} जोड़े होते हैं: हर भेजने में अधिकतम 20, नाम अधिकतम 32 अक्षर, मान अधिकतम 64 अक्षर, केवल ASCII अक्षर, अंक, अंडरस्कोर और हाइफ़न, और भेजने के भीतर नाम अद्वितीय। टैग फ़िल्टर आयाम हैं, इसलिए आप संदेश सूची को टैग से फ़िल्टर कर सकते हैं और एनालिटिक्स व डैशबोर्ड सारांश को टैग के अनुसार बाँट सकते हैं। इन्हें कम विविधता वाले लेबल के लिए इस्तेमाल करें, जैसे campaign, experiment_variant या source।
  • metadata एक मनचाहा JSON ऑब्जेक्ट है, सीरियलाइज़ होने पर अधिकतम 2 KB। हम इसे सहेजते हैं, API रीड में लौटाते हैं और हर वेबहुक इवेंट में वापस भेजते हैं, इसलिए यह उस संदर्भ के लिए उपयुक्त है जो आप वापस पाना चाहते हैं: आंतरिक ID, फ़ॉरेन कुंजियाँ, संरचित पेलोड।

हर वेबहुक इवेंट में दोनों के साथ सहसंबंध ID (email_id, recipient_id) भी शामिल होते हैं, इसलिए आप दूसरी खोज किए बिना अपने रिकॉर्ड से मिलान कर सकते हैं। __bird से शुरू होने वाले टैग नाम और शीर्ष-स्तरीय मेटाडेटा कुंजियाँ अस्वीकार की जाती हैं। आपको डिवाइस, भौगोलिक क्षेत्र, मेलबॉक्स प्रदाता, बाउंस प्रकार या प्राप्तकर्ता डोमेन को किसी भी फ़ील्ड में डालने की ज़रूरत नहीं है, क्योंकि हम इनमें से हर एक को पहले से एनालिटिक्स आयाम के रूप में दर्ज करते हैं।

कोड उदाहरण
{
  "tags": [{ "name": "campaign", "value": "onboarding" }],
  "metadata": { "user_id": "usr_12345", "order_id": "ord_98765" }
}

अटैचमेंट

attachments हर संदेश में अधिकतम 20 फ़ाइलें लेता है, base64 में एन्कोड किए गए बाइट के रूप में इनलाइन। अगर base64 एन्कोडिंग के बाद संदेश का अनुमानित आकार 20 MB से ज़्यादा होता है, तो हम भेजना अस्वीकार कर देते हैं, इसलिए गुंजाइश रखने के लिए अटैचमेंट की मूल सामग्री 15 MB या उससे कम रखें। अटैचमेंट में फ़ील्ड की शर्तें, इनलाइन इमेज, अवरुद्ध फ़ाइल प्रकार और अटैचमेंट वापस डाउनलोड करने का तरीका दिया गया है।

202 का क्या अर्थ है

सफल भेजने पर 202 Accepted लौटता है, जिसमें em_ उपसर्ग वाली संदेश ID और status: accepted होते हैं:

कोड उदाहरण
{
  "id": "em_01ky7ma8y2es1s2akzk53tmjn0",
  "status": "accepted",
  "category": "marketing",
  "from": { "email": "hello@yourdomain.com" },
  "to": [{ "email": "delivered@messagebird.dev" }],
  "subject": "Hello from Bird",
  "accepted_count": 1,
  "processed_count": 0,
  "delivered_count": 0,
  "deferred_count": 0,
  "bounced_count": 0,
  "complained_count": 0,
  "rejected_count": 0,
  "open_count": 0,
  "click_count": 0,
  "track_opens": true,
  "track_clicks": true,
  "created_at": "2026-07-23T13:58:20.866Z"
}

202 का अर्थ है कि हमने भेजने का अनुरोध स्थायी रूप से स्वीकार कर लिया है। जिन विफलताओं को आप ठीक कर सकते हैं, वे उसी अनुरोध पर 422 के रूप में लौटती हैं: असत्यापित प्रेषक डोमेन, या ऐसा फ़ील्ड जो सत्यापन में विफल हो। हर प्राप्तकर्ता का परिणाम (डिलीवर हुआ, बाउंस हुआ, स्थगित हुआ, शिकायत हुई) बाद में वेबहुक और संदेश पढ़ने वाले एंडपॉइंट के ज़रिए आता है।

इससे दो बातें निकलती हैं:

  • पढ़ने पर स्थिति मिलती है, बॉडी नहीं। GET /v1/email/messages/{message_id} संदेश और प्राप्तकर्ता की स्थिति लौटाता है, कभी भी html या text बॉडी नहीं। जब वर्कस्पेस के लिए सामग्री संग्रहण चालू हो, तो संग्रहीत बॉडी GET /v1/email/messages/{message_id}/content से अधिकतम 30 दिनों तक उपलब्ध रहती हैं।
  • पढ़ने का परिणाम कुछ देर भेजने से पीछे रह सकता है। 202 के तुरंत बाद पढ़ने वाले एंडपॉइंट पर 404 का अर्थ है कि संदेश अभी दिखाई नहीं दे रहा, इसलिए थोड़ी देर में फिर से प्रयास करें।

सुरक्षित रूप से फिर से प्रयास करना

हर तार्किक भेजने के लिए एक अद्वितीय मान के साथ Idempotency-Key हेडर भेजें। अगर अनुरोध सफल हुआ लेकिन आपको प्रतिक्रिया नहीं मिली, तो उसी कुंजी के साथ उसे दोबारा भेजें। API दूसरा ईमेल भेजने के बजाय मूल परिणाम लौटाता है और उसमें Idempotency-Replay हेडर शामिल करता है। Idempotency में कुंजी का प्रारूप और उसके संग्रहण की अवधि दी गई है।

बैच में भेजना

API अनुरोधों की संख्या घटाने के लिए, POST /v1/email/batches अधिकतम 100 स्वतंत्र संदेश स्वीकार करता है और उन्हें एक इकाई के रूप में सत्यापित करता है। एकल-भेजने वाले एंडपॉइंट को लूप में कॉल करना भी समर्थित है। बैच का हर आइटम इसी पेज वाला पेलोड इस्तेमाल करता है, scheduled_at सहित, इसलिए एक बैच में तुरंत और शेड्यूल किए गए संदेश दोनों हो सकते हैं।

बिलिंग

ईमेल भेजने की गिनती आपके प्लान के मासिक कोटे के मुकाबले हर प्राप्तकर्ता के हिसाब से होती है, इसलिए तीन प्राप्तकर्ताओं वाला संदेश तीन भेजने के बराबर गिना जाता है। बिलिंग और उपयोग में गिनती का मॉडल और मौजूदा उपयोग पढ़ने का तरीका दिया गया है।

अगले कदम

इस विषय के लिए दस्तावेज़, गाइड और उदाहरणों के साथ आगे बढ़ें।