<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aaron Jevil Nazareth</title>
    <description>The latest articles on DEV Community by Aaron Jevil Nazareth (@jevil25).</description>
    <link>https://dev.to/jevil25</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1313261%2Fb66f7534-f139-4937-aa0d-60707b86840f.jpeg</url>
      <title>DEV Community: Aaron Jevil Nazareth</title>
      <link>https://dev.to/jevil25</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jevil25"/>
    <language>en</language>
    <item>
      <title>WhatsApp CRM Integration: Connect Salesforce, HubSpot &amp; Pipedrive</title>
      <dc:creator>Aaron Jevil Nazareth</dc:creator>
      <pubDate>Mon, 07 Sep 2026 10:47:32 +0000</pubDate>
      <link>https://dev.to/jevil25/whatsapp-crm-integration-connect-salesforce-hubspot-pipedrive-41d5</link>
      <guid>https://dev.to/jevil25/whatsapp-crm-integration-connect-salesforce-hubspot-pipedrive-41d5</guid>
      <description>&lt;p&gt;78% of buyers purchase from the company that responds first. Miss the 5-minute window and lead qualification drops by 80%. If your customers are messaging you on WhatsApp and your CRM has no idea, that's the gap costing you the deal.&lt;/p&gt;

&lt;p&gt;WhatsApp gets ~98% open rates and typical replies inside 5 minutes. Email sits around 20% opens with 24–48 hour turnaround. The problem isn't the channel, it's that most CRMs don't talk to it — reps end up juggling two tools and losing context between them.&lt;/p&gt;

&lt;p&gt;Companies that closed this gap saw it show up directly in the numbers: a SaaS company hit &lt;strong&gt;3x faster lead response and 40% more demos booked&lt;/strong&gt;; a real estate agency now closes &lt;strong&gt;60% of deals through WhatsApp conversations&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the integration works
&lt;/h2&gt;

&lt;p&gt;It's a webhook pattern: an incoming WhatsApp message hits your server, your server processes it and calls your CRM's API to create/update a contact, log the conversation, or move a deal forward.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WhatsApp message → your webhook → CRM API call → contact/lead updated, note logged, pipeline moved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;RapidAPI account with WhatsApp API access&lt;/li&gt;
&lt;li&gt;An active WhatsApp session&lt;/li&gt;
&lt;li&gt;A CRM account (HubSpot, Salesforce, or Pipedrive)&lt;/li&gt;
&lt;li&gt;Node.js 18+ or Python 3.9+&lt;/li&gt;
&lt;li&gt;A public webhook URL (ngrok is fine for development)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  HubSpot
&lt;/h2&gt;

&lt;p&gt;Look up or create a contact by phone number, log the WhatsApp message as a note on that contact's timeline, and create a deal directly from the conversation when it qualifies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Salesforce
&lt;/h2&gt;

&lt;p&gt;Search leads/contacts via SOQL by phone number, create a lead with &lt;code&gt;WhatsApp&lt;/code&gt; set as the source, and log a task each time a message comes in so reps see it without switching tabs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pipedrive
&lt;/h2&gt;

&lt;p&gt;Create or find the person, attach the message as a note, and move the linked deal's pipeline stage automatically based on conversation triggers (e.g. "pricing" mentioned → move to Negotiation).&lt;/p&gt;

&lt;p&gt;All three follow the same shape: &lt;strong&gt;webhook receives message → look up or create the record → log the message → optionally trigger a pipeline action.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Automating the follow-up
&lt;/h2&gt;

&lt;p&gt;Once the webhook is wired up, you can layer on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automated follow-up sequences with timed delays after a lead goes quiet&lt;/li&gt;
&lt;li&gt;Lead qualification prompts inside the WhatsApp conversation itself, before it ever reaches a rep&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Shipping it
&lt;/h2&gt;

&lt;p&gt;Containerize the webhook server (Docker), keep your CRM tokens and WhatsApp API key in environment variables, and you've got a production-ready bridge between WhatsApp and whichever CRM you're running.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it's worth
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lead response time&lt;/td&gt;
&lt;td&gt;2–4 hours&lt;/td&gt;
&lt;td&gt;Under 5 minutes (48x faster)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lead-to-demo rate&lt;/td&gt;
&lt;td&gt;8%&lt;/td&gt;
&lt;td&gt;22%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Follow-up completion&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;td&gt;95%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Where to start
&lt;/h2&gt;

&lt;p&gt;Don't build the whole pipeline on day one. Start with contact lookup/creation and message logging — that alone closes most of the response-time gap. Add pipeline automation once the basics are running reliably.&lt;/p&gt;

&lt;p&gt;Full API reference: &lt;a href="https://whatsapp-messaging.retentionstack.agency/docs/api-reference" rel="noopener noreferrer"&gt;https://whatsapp-messaging.retentionstack.agency/docs/api-reference&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://whatsapp-messaging.retentionstack.agency/blog/whatsapp-crm-integration" rel="noopener noreferrer"&gt;Retention Stack&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>whatsapp</category>
      <category>api</category>
      <category>crm</category>
      <category>node</category>
    </item>
    <item>
      <title>WhatsApp API Rate Limits Explained: How to Scale Without Getting Blocked</title>
      <dc:creator>Aaron Jevil Nazareth</dc:creator>
      <pubDate>Mon, 07 Sep 2026 10:45:44 +0000</pubDate>
      <link>https://dev.to/jevil25/whatsapp-api-rate-limits-explained-how-to-scale-without-getting-blocked-fl</link>
      <guid>https://dev.to/jevil25/whatsapp-api-rate-limits-explained-how-to-scale-without-getting-blocked-fl</guid>
      <description>&lt;p&gt;Nothing kills a campaign faster than watching it fail mid-send. If you've hit a wall sending WhatsApp messages, you're probably running into one of three different mechanisms that all get lumped together as "rate limits" — and they need different fixes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three separate systems, one confusing name
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Messaging limits (volume).&lt;/strong&gt; Meta's cap on how many &lt;em&gt;unique&lt;/em&gt; phone numbers you can contact first, outside an existing conversation, in a rolling 24-hour window. Replying to an inbound message doesn't count — every conversation gets a free 24-hour service window once the customer messages you first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Throughput (speed).&lt;/strong&gt; How fast you're sending, in messages per second. Push past it and you get error &lt;code&gt;130429&lt;/code&gt; ("message throughput has been reached") — a backoff signal, not a ban.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session-based API limits.&lt;/strong&gt; If you're on a session-based API rather than the official platform, the messaging-tier system doesn't apply — you're bound by your plan's fixed rate limit and monthly request quota instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  The official tier ladder
&lt;/h2&gt;

&lt;p&gt;WhatsApp Business Accounts move up automatically based on usage quality and consistency — you can't buy your way up:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Unique contacts / 24h&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Starting tier&lt;/td&gt;
&lt;td&gt;250&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 2&lt;/td&gt;
&lt;td&gt;2,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 3&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 4&lt;/td&gt;
&lt;td&gt;100,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 5&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here's the part that trips people up: &lt;strong&gt;daily headroom doesn't protect you from throughput errors.&lt;/strong&gt; A Tier 4 account with 100,000 contacts of daily allowance can still throttle if it tries to send 90,000 messages in one hour — that's a throughput problem, not a volume problem, and the two are tracked independently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Session-based plan limits
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Requests/mo&lt;/th&gt;
&lt;th&gt;Sessions&lt;/th&gt;
&lt;th&gt;Rate limit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;100 (hard limit)&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;10 req/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;1,000 + overage&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;10 req/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ultra&lt;/td&gt;
&lt;td&gt;10,000 + overage&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;20 req/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mega&lt;/td&gt;
&lt;td&gt;50,000 + overage&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;25 req/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What actually triggers a block vs. a throttle
&lt;/h2&gt;

&lt;p&gt;Meta's error codes tell you which problem you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;130429&lt;/strong&gt; — Throughput limit reached. You're sending too fast, slow down.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;131056&lt;/strong&gt; — Recipient rate limit. Too many messages to one number too quickly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;131048&lt;/strong&gt; — Message quality throttling. Recent blocks/reports from recipients triggered a restriction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;80007&lt;/strong&gt; — Account rate limit. The whole WhatsApp Business Account hit capacity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Underneath all of these is &lt;strong&gt;quality rating&lt;/strong&gt; — built from block rates, spam reports, and engagement. A spike in blocks can drop you from Green to Red fast, and your access shrinks automatically with it. Sending too fast gets you throttled. Sending badly gets you blocked. They're different problems with different fixes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pacing your sends (code)
&lt;/h2&gt;

&lt;p&gt;Whatever plan you're on, respect the per-second cap yourself instead of hoping the API queues for you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Respect per-second caps regardless of plan&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendBatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;requestsPerSecond&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;delayMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ceil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;requestsPerSecond&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;chatId&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://whatsapp-messaging-bot.p.rapidapi.com/v1/sendText&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;chatId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x-rapidapi-key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RAPIDAPI_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x-rapidapi-host&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;whatsapp-messaging-bot.p.rapidapi.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Sent &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;delayMs&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to actually scale safely
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Warm new numbers.&lt;/strong&gt; Low, steady volume for 1–2 weeks before pushing real traffic through them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Segment your lists.&lt;/strong&gt; Opted-in, recently engaged contacts only for marketing sends — this is what protects your quality rating.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Back off on 429s.&lt;/strong&gt; Exponential backoff, not a retry loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch delivery and block/report rates as leading indicators&lt;/strong&gt;, not just your send success rate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Route support replies through the 24-hour window.&lt;/strong&gt; Customer-initiated conversations bypass daily messaging limits entirely — the safest volume you can send is a reply.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Practical patterns
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;E-commerce:&lt;/strong&gt; queue order confirmations instead of firing them all at once — customers still get them in seconds, you stay under the cap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SaaS OTPs:&lt;/strong&gt; provision headroom above your average signup rate for predictable spikes (Monday mornings, post-outage recovery).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support teams:&lt;/strong&gt; lean on inbound-triggered replies — they mostly sidestep rate limits altogether.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;"Rate limit" is really two things — daily volume caps and independent per-second throughput.&lt;/li&gt;
&lt;li&gt;Tier upgrades on the official platform are earned through consistent, quality usage, not purchased.&lt;/li&gt;
&lt;li&gt;Session-based APIs skip the tier ladder for a flat plan-level limit.&lt;/li&gt;
&lt;li&gt;Quality rating (driven by recipient behavior) determines your real access more than raw volume does.&lt;/li&gt;
&lt;li&gt;Support replies inside the 24-hour window are the safest sends you can make.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Full API reference: &lt;a href="https://whatsapp-messaging.retentionstack.agency/docs/api-reference" rel="noopener noreferrer"&gt;https://whatsapp-messaging.retentionstack.agency/docs/api-reference&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://whatsapp-messaging.retentionstack.agency/blog/whatsapp-api-rate-limits-explained" rel="noopener noreferrer"&gt;Retention Stack&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>whatsapp</category>
      <category>api</category>
      <category>backend</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>WhatsApp API vs Twilio: I Ran the Numbers So You Don't Have To</title>
      <dc:creator>Aaron Jevil Nazareth</dc:creator>
      <pubDate>Mon, 07 Sep 2026 10:43:31 +0000</pubDate>
      <link>https://dev.to/jevil25/whatsapp-api-vs-twilio-i-ran-the-numbers-so-you-dont-have-to-67c</link>
      <guid>https://dev.to/jevil25/whatsapp-api-vs-twilio-i-ran-the-numbers-so-you-dont-have-to-67c</guid>
      <description>&lt;p&gt;If you need to send WhatsApp messages from your app, you'll land on two options fast: Twilio (the established, enterprise-grade choice) or a session-based WhatsApp API on RapidAPI (faster to set up, cheaper per message). I compared both on pricing, setup time, features, and rate limits so you don't have to open ten tabs to figure out which one fits your project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Twilio&lt;/th&gt;
&lt;th&gt;WhatsApp API&lt;/th&gt;
&lt;th&gt;Winner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Setup time&lt;/td&gt;
&lt;td&gt;2–4 weeks&lt;/td&gt;
&lt;td&gt;5 minutes&lt;/td&gt;
&lt;td&gt;WhatsApp API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Approval required&lt;/td&gt;
&lt;td&gt;Business verification, mandatory&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;WhatsApp API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost/message&lt;/td&gt;
&lt;td&gt;$0.005–$0.01&lt;/td&gt;
&lt;td&gt;$0.001–$0.005&lt;/td&gt;
&lt;td&gt;WhatsApp API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-contact fee&lt;/td&gt;
&lt;td&gt;$0.43/month&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;WhatsApp API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rate limits&lt;/td&gt;
&lt;td&gt;Custom, 100–1,000 msg/sec (enterprise)&lt;/td&gt;
&lt;td&gt;100–1,000/hour&lt;/td&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Templates&lt;/td&gt;
&lt;td&gt;Pre-approved, required&lt;/td&gt;
&lt;td&gt;Not required&lt;/td&gt;
&lt;td&gt;Twilio (for bulk campaigns)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compliance (HIPAA/SOC2)&lt;/td&gt;
&lt;td&gt;Built in&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Documentation&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning curve&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Beginner-friendly&lt;/td&gt;
&lt;td&gt;WhatsApp API&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The pricing nobody puts on the homepage
&lt;/h2&gt;

&lt;p&gt;Twilio's sticker price looks reasonable until you hit the &lt;strong&gt;$0.43 per unique contact per month&lt;/strong&gt; fee. That's not per message — it's per contact, every month they're in your system.&lt;/p&gt;

&lt;p&gt;Take a real example: 10,000 customers, 2 messages a month each.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Twilio:&lt;/strong&gt; $140 in message costs + $4,300 in contact fees = &lt;strong&gt;$4,440/month&lt;/strong&gt; ($53,280/year)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WhatsApp API:&lt;/strong&gt; no per-contact fee = &lt;strong&gt;$60/month&lt;/strong&gt; ($720/year)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At scale it gets worse for Twilio, not better:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Volume&lt;/th&gt;
&lt;th&gt;Twilio&lt;/th&gt;
&lt;th&gt;WhatsApp API&lt;/th&gt;
&lt;th&gt;Savings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;100K messages&lt;/td&gt;
&lt;td&gt;$3,100&lt;/td&gt;
&lt;td&gt;$300&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1M messages&lt;/td&gt;
&lt;td&gt;$9,300&lt;/td&gt;
&lt;td&gt;$3,000&lt;/td&gt;
&lt;td&gt;68%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5M messages&lt;/td&gt;
&lt;td&gt;$41,500&lt;/td&gt;
&lt;td&gt;$15,000&lt;/td&gt;
&lt;td&gt;64%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10M messages&lt;/td&gt;
&lt;td&gt;$73,000&lt;/td&gt;
&lt;td&gt;$30,000&lt;/td&gt;
&lt;td&gt;59%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At 10M messages/month, that's roughly &lt;strong&gt;$516,000/year&lt;/strong&gt; in savings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup: hours vs. weeks
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Twilio (2–4 weeks):&lt;/strong&gt; account creation → sandbox setup → WhatsApp Business Account registration → business verification → API application → template creation and approval (3–5 days per template) → integration testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WhatsApp API (5 minutes):&lt;/strong&gt; sign up on RapidAPI → subscribe → grab your API key → scan a QR code → send your first message.&lt;/p&gt;

&lt;p&gt;No template approval means faster iteration when you're still figuring out what your messages should say.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden costs nobody mentions
&lt;/h2&gt;

&lt;p&gt;Twilio's real bill includes more than the headline rate: the $0.43/contact fee, Twilio Verify charges ($0.07 per OTP attempt), support tiers starting around $400/month, and the 2–4 weeks of developer time spent on onboarding before you send a single message. The WhatsApp API side has none of that — transparent per-message pricing, no per-contact fee, minimal setup overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Twilio actually wins
&lt;/h2&gt;

&lt;p&gt;This isn't "Twilio bad." Twilio wins when you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pre-approved templates for compliant bulk campaigns&lt;/li&gt;
&lt;li&gt;A 99.9% uptime SLA&lt;/li&gt;
&lt;li&gt;Built-in HIPAA/SOC2 compliance&lt;/li&gt;
&lt;li&gt;More than ~1M messages/month with enterprise support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're already deep in a Twilio integration at that scale, the switching cost usually isn't worth it.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the WhatsApp API wins
&lt;/h2&gt;

&lt;p&gt;For everyone else — startups, SMBs, side projects, anything under roughly 100K messages/month — it wins on setup time and cost, with identical core message types (text, image, file, video, audio, plus &lt;strong&gt;group and channel support&lt;/strong&gt;, which Twilio doesn't offer at all).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real scenarios:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Startup MVP&lt;/strong&gt; → WhatsApp API (5-minute setup, $2–5/month)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support chatbot, variable volume&lt;/strong&gt; → WhatsApp API (~$30/month vs. ~$150 on Twilio)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E-commerce at medium scale needing bulk templates&lt;/strong&gt; → Twilio&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise, 1M+ messages/month, compliance requirements&lt;/strong&gt; → Twilio&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The honest take
&lt;/h2&gt;

&lt;p&gt;Twilio is the safe, battle-tested enterprise choice. The WhatsApp API is the smart option for the ~90% of developers who don't need Twilio's compliance stack or template infrastructure yet — same core functionality, a fraction of the cost, and you're sending your first message in 5 minutes instead of your first support ticket to Twilio's sales team.&lt;/p&gt;

&lt;p&gt;Try it free (no card required): &lt;a href="https://rapidapi.com/jevil257/api/whatsapp-messaging-bot" rel="noopener noreferrer"&gt;https://rapidapi.com/jevil257/api/whatsapp-messaging-bot&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://whatsapp-messaging.retentionstack.agency/blog/whatsapp-api-vs-twilio" rel="noopener noreferrer"&gt;Retention Stack&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>whatsapp</category>
      <category>twilio</category>
    </item>
    <item>
      <title>How to Send WhatsApp Messages from Python in 5 Minutes (No Meta Approval Needed)</title>
      <dc:creator>Aaron Jevil Nazareth</dc:creator>
      <pubDate>Sun, 01 Mar 2026 13:50:51 +0000</pubDate>
      <link>https://dev.to/jevil25/how-to-send-whatsapp-messages-from-python-in-5-minutes-no-meta-approval-needed-593h</link>
      <guid>https://dev.to/jevil25/how-to-send-whatsapp-messages-from-python-in-5-minutes-no-meta-approval-needed-593h</guid>
      <description>&lt;p&gt;If you've ever tried to add WhatsApp messaging to a Python app, you know the pain. The official WhatsApp Business API requires a verified Facebook Business account, a Meta Business Manager setup, and a waiting period that can stretch weeks — before you've sent a single message.&lt;/p&gt;

&lt;p&gt;This tutorial shows you a simpler way. You'll go from zero to sending a real WhatsApp message in Python in under 5 minutes, using the &lt;a href="https://rapidapi.com/jevil257/api/whatsapp-messaging-bot" rel="noopener noreferrer"&gt;WA Messaging Bot API&lt;/a&gt; on RapidAPI.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You'll Build
&lt;/h2&gt;

&lt;p&gt;By the end of this tutorial you'll have a Python script that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates a WhatsApp session&lt;/li&gt;
&lt;li&gt;Authenticates via a QR code (once, then it persists)&lt;/li&gt;
&lt;li&gt;Sends a text message to any WhatsApp number&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No Meta account. No business verification. No per-conversation fees.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.7+&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;requests&lt;/code&gt; library (&lt;code&gt;pip install requests&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;A free RapidAPI account&lt;/li&gt;
&lt;li&gt;A phone with WhatsApp installed&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1 — Get Your Free API Key
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://rapidapi.com" rel="noopener noreferrer"&gt;rapidapi.com&lt;/a&gt; and create a free account&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;"WhatsApp Messaging Bot"&lt;/strong&gt; or go directly to the &lt;a href="https://rapidapi.com/jevil257/api/whatsapp-messaging-bot" rel="noopener noreferrer"&gt;API listing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Subscribe to the &lt;strong&gt;Basic plan&lt;/strong&gt; (free, 100 requests/month, no credit card)&lt;/li&gt;
&lt;li&gt;Copy your &lt;code&gt;X-RapidAPI-Key&lt;/code&gt; from the API Settings panel&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You'll use this key in every request.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2 — Create a Session
&lt;/h2&gt;

&lt;p&gt;A session represents a connected WhatsApp account. Think of it like a named slot for your WhatsApp number.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_RAPIDAPI_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://whatsapp-messaging-bot.p.rapidapi.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;HEADERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x-rapidapi-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x-rapidapi-host&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;whatsapp-messaging-bot.p.rapidapi.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Create a session
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/sessions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="c1"&gt;# → {"success": true, "data": {"name": "my-session", "status": "STOPPED"}}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 3 — Start the Session and Get a QR Code
&lt;/h2&gt;

&lt;p&gt;Now start the session to initiate the WhatsApp connection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Start the session
&lt;/span&gt;&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/sessions/start&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-session&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Get the QR code and save it as an image
&lt;/span&gt;&lt;span class="n"&gt;qr_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/my-session/auth/qr?format=binary&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qr-code.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qr_response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;QR code saved! Open qr-code.png and scan it with WhatsApp.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;qr-code.png&lt;/code&gt;, then on your phone:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open WhatsApp → Settings → Linked Devices&lt;/li&gt;
&lt;li&gt;Tap "Link a Device"&lt;/li&gt;
&lt;li&gt;Scan the QR code&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ QR codes expire in ~60 seconds. If it expires, just call the endpoint again for a fresh one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once scanned, your session status changes to &lt;code&gt;WORKING&lt;/code&gt;. You only need to do this once — the session persists.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4 — Send Your First Message
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/sendText&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chatId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;14155552671&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Replace with the recipient's number (with country code)
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello! 👋 This is my first WhatsApp message from Python.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;session&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;session_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="c1"&gt;# → {"success": true, "data": {"id": "true_14155552671@c.us_ABCDEF123456", ...}}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The message appears in WhatsApp instantly.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Tip:&lt;/strong&gt; Always include the country code in the phone number, with no spaces or dashes. For example, a US number would be &lt;code&gt;14155552671&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Bonus — Verify a Number Before Sending
&lt;/h2&gt;

&lt;p&gt;Avoid delivery failures by checking if a number is on WhatsApp first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/contacts/check-exists&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;phone&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;14155552671&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;session&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-session&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;numberExists&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Number is on WhatsApp! Chat ID:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chatId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Number is NOT on WhatsApp.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the returned &lt;code&gt;chatId&lt;/code&gt; (not the raw phone number) for all subsequent sends — this is especially important for Brazilian numbers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bonus — Send an Image
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/sendImage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chatId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;14155552671&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/photo.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mimetype&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image/jpeg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;caption&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Check this out! 🔥&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API also supports files, voice notes, video, location, reactions, and group/channel broadcasting. Full docs at &lt;a href="https://whatsapp-messaging.retentionstack.agency" rel="noopener noreferrer"&gt;whatsapp-messaging.retentionstack.agency&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Full Script
&lt;/h2&gt;

&lt;p&gt;Here's everything in one place:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_RAPIDAPI_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://whatsapp-messaging-bot.p.rapidapi.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;SESSION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-session&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;RECIPIENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;14155552671&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# Replace with real number
&lt;/span&gt;
&lt;span class="n"&gt;HEADERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x-rapidapi-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x-rapidapi-host&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;whatsapp-messaging-bot.p.rapidapi.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Create session
&lt;/span&gt;&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/sessions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SESSION&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Start session
&lt;/span&gt;&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/sessions/start&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SESSION&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Get QR code
&lt;/span&gt;&lt;span class="n"&gt;qr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;SESSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/auth/qr?format=binary&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qr-code.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Scan qr-code.png with WhatsApp, then press Enter to continue...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 4. Send message
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/sendText&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chatId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RECIPIENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello from Python! 👋&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;The API is hosted on RapidAPI with a free tier:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Requests/month&lt;/th&gt;
&lt;th&gt;Sessions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$4.99/mo&lt;/td&gt;
&lt;td&gt;1,000&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ultra ⭐&lt;/td&gt;
&lt;td&gt;$14.99/mo&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mega&lt;/td&gt;
&lt;td&gt;$49/mo&lt;/td&gt;
&lt;td&gt;50,000&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The free plan is enough to prototype and test everything in this tutorial.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Can Build With This
&lt;/h2&gt;

&lt;p&gt;Once you have messaging working, the use cases open up fast:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OTP / 2FA&lt;/strong&gt; — send one-time passwords via WhatsApp instead of SMS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Order notifications&lt;/strong&gt; — automated shipping and delivery updates for e-commerce&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Appointment reminders&lt;/strong&gt; — reduce no-shows with automated WhatsApp reminders&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring alerts&lt;/strong&gt; — send server/app alerts directly to your WhatsApp&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WhatsApp bots&lt;/strong&gt; — combine with webhooks to receive and reply to incoming messages&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;In 5 minutes you went from zero to sending a real WhatsApp message from Python — without a Meta account, business verification, or per-conversation fees.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;a href="https://whatsapp-messaging.retentionstack.agency" rel="noopener noreferrer"&gt;Full docs &amp;amp; examples&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📦 &lt;a href="https://rapidapi.com/jevil257/api/whatsapp-messaging-bot" rel="noopener noreferrer"&gt;RapidAPI listing&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you build something with it, drop a comment below — I'd love to see what you make. And if you run into any issues, I'm happy to help debug in the comments.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://retentionstack.com" rel="noopener noreferrer"&gt;Retention Stack&lt;/a&gt; · &lt;a href="mailto:support@retentionstack.agency"&gt;support@retentionstack.agency&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>api</category>
    </item>
  </channel>
</rss>
