SMS for your Heroku app.
One command.

Install the add-on, get a BLOWERIO_URL, send your first message with a single HTTP POST. Replies arrive as webhooks. No SDKs, no accounts to wire up, no telecom homework.

Install on Heroku Read the docs from $3/mo, billed through Heroku
$ heroku addons:create blowerio
Creating blowerio on ⬢ your-app... done
BLOWERIO_URL config var set

$ curl -X POST "$BLOWERIO_URL/messages" \
    -d "to=+61422164266" \
    -d "message=Hello from Blower"
{"message":"ok"}

How it works

Sending in under a minute

If your app can make an HTTP request, it can send SMS. Any language, no client library required.

1

Install the add-on

One command provisions your account and a dedicated sending setup.

$ heroku addons:create blowerio
2

Grab your URL

A single config var appears in your app. That's the whole integration surface.

BLOWERIO_URL=https://…@api.blower.io/messages
3

POST a message

Two parameters: who it's for and what it says. Done.

POST $BLOWERIO_URL/messages

Show me code

Your language already speaks Blower

Because it already speaks HTTP.

curl -X POST "$BLOWERIO_URL/messages" \
  -H "Accept: application/json" \
  -d "to=+61422164266" \
  -d "message=Hello from Blower"
blower = RestClient::Resource.new(ENV['BLOWERIO_URL'])
blower['/messages'].post(to: '+61422164266', message: 'Hello from Blower')
import os, requests

requests.post(
    f"{os.environ['BLOWERIO_URL']}/messages",
    data={"to": "+61422164266", "message": "Hello from Blower"},
)
await fetch(`${process.env.BLOWERIO_URL}/messages`, {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: new URLSearchParams({ to: '+61422164266', message: 'Hello from Blower' })
})
$ch = curl_init($_ENV["BLOWERIO_URL"] . "/messages");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
  'to' => '+61422164266',
  'message' => 'Hello from Blower',
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

Two-way

Replies come to you

Point Blower at an endpoint in your app and inbound messages and delivery updates arrive as plain JSON webhooks.

A reply arrives

Someone texts your number; your app gets a POST.

{
  "event":   "message-received",
  "from":    "+61422164266",
  "to":      "+61488880321",
  "body":    "Yes please!"
}

A message lands

Delivery status callbacks tell you what happened, with automatic retries if your endpoint is briefly down.

{
  "event":   "status-change",
  "to":      "+61422164266",
  "status":  "delivered"
}

What you get

Everything you need, nothing to babysit

📤 Send with one POST

Two form parameters — to and message. No SDK to install or keep updated.

📥 Receive replies

Inbound messages hit your app as JSON webhooks, so conversations are just request handlers.

🔁 Reliable callbacks

Delivery-status webhooks retry with backoff if your endpoint has a bad day, and your dashboard tells you when it does.

📱 Dedicated numbers

Your app gets its own number, with international options available from the dashboard.

🔧 Zero config

One environment variable, set for you at install. Attach it to staging apps and review apps the same way.

📊 A real dashboard

heroku addons:open blowerio — usage, message history, delivery statuses, and your personalised examples.

Your app is one command away from texting

From $3/mo. Billed through Heroku like everything else.