Early access · Android phones

Your phone is
the gateway.

Turn the Android phone your business already has into a texting line with an API, an inbox and webhooks. Customers see the number they know. No new number, no carrier paperwork.

Install the app, scan a code, send your first text in about five minutes.
Your toolsAnything that can make a web request
API
Request
POST https://api.phonegateway.app/v1/messages { "to": "+19165550142", "body": "Hi Maria, your estimate is ready. Does Thursday 9am still work?" }202 Accepted · { "status": "queued", "id": "msg_8f2c…" }
Webhook
message.receivedPOST https://yourapp.com/hooks/textswaiting
ConnectedBright Coat Painting · Front desk · (916) 555-0199
SENT TODAY14
RECEIVED3
↑
(916) 555-0177Reminder · 8:30 AM
Delivered
↓
(916) 555-0177“Sounds good”
Received
Maria's phoneSees your real number
SMS
Example request and conversation. No texts are sent from this page.
How it works

Three steps.
No new number.

PhoneGateway runs on a phone you own, with the SIM and plan you already pay for. We add the API, the dashboard and the safety rails.

PhoneGatewayBusiness texting line
Install on an Android phone

1Install the app

Any Android phone with a SIM. A spare phone on a charger at the shop works well.

Scan from your dashboardThe phone trades the code for its own key. The link works once.Paired · Front desk

2Scan to connect

Open your dashboard, add a phone, scan the code. The phone is connected in seconds and only ever talks to our servers.

POST /v1/messages X-API-Key: ptl_… { "to": "+1…", "body": "On my way!" } → queued → sent → delivered

3Send from anywhere

One request from your app, a form, Zapier or the dashboard. The phone sends it from its SIM and reports back.

What you get

An inbox, webhooks
and replies handled.

Every text in and out of the phone is in one place, your other tools hear about it the moment it happens, and STOP is honored without you lifting a finger.

MG
(916) 555-0142Great, can you come Thursday?
DP
(916) 555-0177Sounds good
LO
(530) 555-0160You: Your estimate is attached…

☰A shared inbox

Read and reply from any computer. Anyone on your team can answer; the customer still sees one number.

message.deliveredPOST https://yourapp.com/hooks/texts200 OK · signed
X-PTL-Signature: t=1731…,v1=9c4e…

⇢Webhooks, signed

Received, sent, delivered, failed, opted out. Each delivery is signed and retried until your server says OK.

STOP
You're unsubscribed and won't get more texts from us.
Number added to your STOP list

✋STOP, handled

STOP, HELP and START are answered on the spot. A number that opted out is blocked for your account, and nobody else's.

The API

One POST.
Your phone does the rest.

A plain JSON API with keys you make in the dashboard. Idempotency keys, message history, conversations and per-phone sending. Full reference in the docs.

curl https://api.phonegateway.app/v1/messages \
  -H "X-API-Key: ptl_your_key" \
  -H "Content-Type: application/json" \
  -d '{"to": "+19165550142",
       "body": "Hi Maria, your estimate is ready.",
       "ref": "estimate-1042"}'
const res = await fetch("https://api.phonegateway.app/v1/messages", {
  method: "POST",
  headers: { "X-API-Key": process.env.PHONEGATEWAY_KEY,
             "Content-Type": "application/json" },
  body: JSON.stringify({ to: "+19165550142",
                         body: "Hi Maria, your estimate is ready.",
                         ref: "estimate-1042" }),
});
const { message } = await res.json();  // message.status === "queued"
import requests, os

r = requests.post("https://api.phonegateway.app/v1/messages",
    headers={"X-API-Key": os.environ["PHONEGATEWAY_KEY"]},
    json={"to": "+19165550142",
          "body": "Hi Maria, your estimate is ready.",
          "ref": "estimate-1042"})
print(r.json()["message"]["status"])   # queued
HTTP/1.1 202 Accepted
{
  "message": {
    "id": "msg_8f2c1a7e9b3d4c5e6f70",
    "direction": "outbound",
    "status": "queued",
    "contact": "+19165550142",
    "line_number": "+19165550199",
    "ref": "estimate-1042",
    "segments": 1,
    "queued_at": 1731024180
  },
  "deduped": false
}
message.receivedwebhookA customer texted the phone. Body, number, and the ref of your last text to them.
message.sentwebhookThe phone handed it to the carrier.
message.deliveredwebhookThe carrier confirmed delivery to the handset.
message.failedwebhookIt could not be sent, with the reason.
contact.opted_outwebhookSomeone replied STOP. Stop texting them in your tools too.
Full API reference →
Guardrails

Built to keep
your number healthy.

Carriers watch personal numbers for bulk patterns. PhoneGateway paces sends, respects quiet hours and pauses a phone before a problem turns into a suspended line. Every limit is yours to adjust.

30 / 150Per hour, per day

Sensible caps per phone, so a bug in your code can't blast a backlog.

10 sGap between sends

Texts leave one at a time at a human pace. Auto-replies skip the gap.

9 pm – 8 amQuiet hours

Checked in the recipient's time zone from their area code, not yours.

3 STOPsAuto-pause

Three opt-outs in a day from one phone's sends pauses that phone until you look.

Who it's for

Businesses that text.
Developers who build for them.

If the texts should come from the number on your trucks, your door and your Google listing, this is the simplest way to automate them.

Service businesses

Appointment reminders, "on my way" texts, estimate follow-ups and review requests from the shop phone, answered from any computer.

Developers

SMS in your app without a carrier registration process or per-message pricing. Keys, idempotency, webhooks and history like you'd expect, plus an MCP server so Claude Code, Codex or any AI agent can text through your account.

Platforms

Give each of your customers their own texting line on their own phone. One platform key creates accounts, pairs phones and sends on their behalf.

Pricing

One plan.
No per-text fees.

Texts go out on the carrier plan you already pay for, so we never charge per message. One price covers the account, every phone on it and everyone on your team.

Monthly$9per month

Cancel anytime.

Start a 3-day trial ↗
Yearly Two months off$90per year · $7.50 a month

Billed once a year.

Start a 3-day trial ↗

Everything, on both

  • Send and receive texts from the number your customers know
  • Up to ten phones on one account
  • Shared inbox, message history, search by your own reference
  • API keys, idempotency and signed webhooks
  • STOP, HELP, quiet hours and pacing handled
  • No card to start the trial
Questions

Good to know

What does it cost?

$9 a month, or $90 a year, for the whole account: every phone on it, the dashboard, the API and webhooks. Start with a 3-day trial, no card needed. We don't charge per text; texts go out on your carrier plan.

Does it need a special phone or plan?

Any Android phone (Android 8 or newer) with a SIM and a plan that includes texting. Many businesses use a spare phone that sits on a charger. Your carrier's normal texting rules and any plan charges apply.

Does it work with iPhone?

Not for sending. iOS doesn't let apps send texts on your behalf. The dashboard works in any browser, including on an iPhone.

Is this allowed?

You're texting your own customers from your own phone, which is what the phone is for. The rules that apply to any business texting still apply: text people who agreed to hear from you, identify yourself, and honor STOP. PhoneGateway handles STOP automatically and paces sends so your number doesn't look like a bulk sender. It's not built for mass marketing blasts, and our terms don't allow them.

Does the app read my personal texts?

The app receives texts that arrive on the connected phone while it's connected, so replies reach your inbox and STOP works. It doesn't read older messages, your contacts, photos or other apps. Most people connect a phone used only for the business.

What happens if the phone goes offline?

Texts wait in the queue and go out when it's back. If it stays offline past your limit (six hours by default), waiting texts fail with a clear reason and your webhook hears about it, so an old backlog never blasts out later.

Can I connect more than one phone?

Yes, up to ten per account. Sends go to the phone that checked in most recently, or to the one you name in the request.

Give your phone
an API.