Skip to content

2-WAY SMS Virtual numbers

Let your customers text you back.

A dedicated Philippine mobile number for your app. Send with one API call, and every reply lands on your webhook and in your UniSMS inbox, threaded by conversation.

Available by request · REST API + webhooks · Works with your existing API key

Send · POST /api/virtual_numbers/sms

$ curl -X POST https://unismsapi.com/api/virtual_numbers/sms \

-u $UNISMS_SECRET_KEY: \

-H "Content-Type: application/json" \

-d '{"from": "+639171234567", "to": "+639987654321", "content": "Hi Ana! Your cleaning is tomorrow at 10AM. Reply YES to confirm."}'

{  "message": {    "reference_id": "tmsg_8a27ce39-…",    "status": "pending",    "to": "+639987654321",    "txt_conversation_id": "tcon_fc33deda-…"  }}
9:41
+63 917 ••• 4567

Today 9:41 AM

Hi Ana! Your cleaning is tomorrow at 10AM. Reply YES to confirm.
YES
Text Message

Your webhook

✓ 200 OK

{
  "event": "txt.received",
  "message": {
    "from": "+639987654321",
    "content": "YES",
    "txt_conversation_id":
      "tcon_fc33deda-…"
  }
}
Number
Real +63 mobile number
Replies
Webhook + inbox
Threads
Grouped by conversation
Auth
Your existing API key

How two-way SMS works

From your API call to their reply, and back to you.

9:41
+63 917 ••• 4567
Hi Ana! Your cleaning is tomorrow at 10AM. Reply YES to confirm.
YES
Confirmed! See you tomorrow.
Text Message

Event log

  1. 01 POST /api/virtual_numbers/sms → 201 · status: pending
  2. 02 Sent to +63 998 ••• 4321 from your number
  3. 03 +63 998 ••• 4321 replied: "YES"
  4. 04 POST your-app.com/hooks/sms · txt.received → 200 OK
  5. 05 Your app replies · tcon_fc33… now has 3 messages
  1. 01 Send

    Your app sends

    POST /api/virtual_numbers/sms with from, to and content. You get a reference_id and the conversation it belongs to.

  2. 02 Deliver

    It reaches their phone

    The message arrives from your +63 number, so it looks like a normal text.

  3. 03 Reply

    They text back

    Your customer replies to the same number, just like they would to anyone else.

  4. 04 Webhook

    You get a txt.received

    UniSMS POSTs the reply to your webhook URL right away, so there's nothing to poll.

  5. 05 Thread

    The conversation stays together

    Every message carries a txt_conversation_id. Read the thread over the API or reply from the dashboard inbox.

Try it

Every reply is something your app can act on.

Tap a reply as the customer. See the webhook UniSMS sends and what your code could answer.

9:41
+63 917 ••• 4567
Your checkup is Fri 2PM. Reply YES to confirm or RESCHED to move it.
RESCHED
No problem. What day works better for you?
Text Message

POST → your webhook

{
  "event": "txt.received",
  "id": "tmsg_84e8…",
  "message": {
    "from": "+639987654321",
    "to": "+639171234567",
    "content": "RESCHED",
    "virtual_number_id": "vnum_6e49…",
    "txt_conversation_id": "tcon_7ef5…"
  }
}

Your app replies

POST /api/virtual_numbers/sms → "No problem. What day works better for you?"

A simulation. Your webhook handler decides what happens next.

Built for conversations

Turn one-way blasts into replies.

A Sender ID can only broadcast. A virtual number lets people answer, so you can confirm, support and follow up by text.

Appointment confirmations

Clinics, salons and service teams confirm or move bookings by text.

Your checkup is Fri 2PM. Reply YES to confirm.
YES

Customer support by text

Let customers reach a real number and get answers from your team.

Hi! This is ACME support. How can we help?
My order hasn't arrived yet

Delivery coordination

Riders and dispatch confirm drop-offs without a phone call.

Rider is 10 mins away. Anyone home to receive?
Yes, the guard will get it

Feedback and surveys

Ask one question and collect answers as webhook events.

How was your visit today? Reply 1 to 5.
5

Lead follow-up

Reply to inquiries from ads and forms on a number people trust.

Thanks for your inquiry! When is a good time to call?
Tomorrow after lunch

Order and booking changes

Customers text changes in, your system updates the order.

Your table for 4 is set for 7PM tonight.
Can we make it 6 people?

Virtual number API

Same API key. Four endpoints. One webhook.

Send from your number, read messages and threads, and receive replies as txt.received events.

Outbound POST

/api/virtual_numbers/sms

Send from your number

from, to and content. Returns the message reference_id and its txt_conversation_id.

Threads GET

/api/virtual_numbers/sms/conversation/:id

Read a conversation

The full thread between your number and one customer, newest first.

Status GET

/api/virtual_numbers/sms/:reference_id

Get a message

Look up a single message and its status.

Numbers GET

/api/virtual_numbers/:reference_id

Number details

Your virtual number, its status and subscription dates.

Inbound WEBHOOK

txt.received

Receive replies

A POST to your HTTPS endpoint for every incoming SMS, with webhook-id and webhook-secret-key headers so you can verify it. Respond 200 to acknowledge.

curl -X POST https://unismsapi.com/api/virtual_numbers/sms \
  -u YOUR_SECRET_KEY: \
  -H "Content-Type: application/json" \
  -d '{"from": "+639123456789", "to": "+639987654321", "content": "Hello from your virtual number!"}'

Virtual number vs Sender ID

Use both. They do different jobs.

Keep your Sender ID for OTPs and announcements. Add a virtual number where you want answers.

Recipients can reply
Sender IDNo
Virtual numberYes, to a real mobile number
Shows as
Sender IDYour brand name
Virtual numberA +63 mobile number
Best for
Sender IDOTPs, alerts, broadcasts
Virtual numberConversations and replies
Links and OTPs
Sender IDAllowed
Virtual numberNot allowed
Incoming messages
Sender IDNot supported
Virtual numberWebhook + inbox, threaded

FAQ

Questions, answered.

What is a virtual number?
A cloud-based Philippine mobile number (also called a long code) that sends and receives SMS through the UniSMS API and dashboard. Your recipients see a regular mobile number they can reply to.
How is it different from a Sender ID?
A Sender ID is one-way: it shows your brand name, but recipients can't reply. A virtual number is two-way: people reply to it and you receive their messages. Many teams use both.
How do I receive replies?
Set your incoming webhook URL in the dashboard. Every reply is sent to it as a txt.received event with the sender, your number, the message and its conversation id. Replies also show up in your dashboard inbox.
What messages can I send?
Conversational messages that follow our acceptable use policy. Links, OTPs and verification codes aren't allowed on virtual numbers because carriers flag them as spam. Use a Sender ID for those.
Can I use my existing UniSMS account and API key?
Yes. Virtual numbers live in the same account and use the same API key and Basic auth as the SMS API.
How do I get a number?
Virtual numbers are available by request. Tell us about your use case and expected volume, and we'll get back to you to set one up on your account.
How much does it cost?
It depends on your use case and volume. Talk to our sales team and we'll send you a quote.
Can I make calls from the number?
No. Virtual numbers send and receive SMS only.

Talk to sales

Get a number for your team.

Virtual numbers are available by request. Tell us what you're building and we'll set you up.

  1. 1 Email us your use case and expected volume.
  2. 2 We confirm availability and set the number up on your account.
  3. 3 It appears on your dashboard once it's active. Point your webhook at it and you're live.

Email sales

Email us about a virtual number →

Or write to business@unismsapi.com

Include if you can

  • Company and what you're building
  • How you'll use replies (support, bookings, surveys…)
  • Expected messages per month
  • How many numbers you need

We reply within 1–2 business days.

Start the conversation.

Tell us what you want to build and we'll set up your number. New to UniSMS? Create a free account and try the SMS API first.