Skip to content
Wbiztool

Messaging API

Schedule WhatsApp Messages API

Schedule a WhatsApp text, image or document to go out to a phone number or group at a date and time you choose. Use it for appointment reminders, birthday wishes, follow-ups and time-sensitive offers.

POSThttps://wbiztool.com/api/v1/schedule_msg/

Body: JSON or form fields

The message waits in your queue until the scheduled time and is then sent from your WhatsApp number. The response gives you a msg_id you can use to check its status or cancel it.

Quick example#

curl -X POST https://wbiztool.com/api/v1/schedule_msg/ \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": 12345,
    "api_key": "YOUR_API_KEY",
    "whatsapp_client": 678,
    "msg_type": 0,
    "country_code": "91",
    "phone": "9876543210",
    "msg": "Hi Aman, a reminder that your appointment is today at 11:30 AM.",
    "date": "24/12/2026",
    "time": "09:00",
    "timezone": "Asia/Kolkata"
  }'

Replace 12345, YOUR_API_KEY and 678 with your own values. See Authentication for where to find them.

Request parameters#

Authentication

client_idintegerrequired

Your API Client ID from Settings → API keys.

api_keystringrequired

Your API key from the same page.

whatsapp_clientintegerrequired

ID of the WhatsApp number to send from, from WhatsApp settings. Unlike Send message, this endpoint never picks a number for you.

Schedule

datestringrequired

Day to send the message, in dd/mm/yyyy format, for example 24/12/2026.

timestringrequired

Time to send the message, in 24-hour HH:MM format, for example 09:00 or 18:45. Don't include seconds.

timezonestringoptional

Timezone that date and time are in. Defaults to IST (India) if you leave it out. See Timezones.

Recipient and message

phonestringRequired unless you send group_name

The recipient's WhatsApp number, digits only. Spaces, +, -, . and brackets are removed for you. Send the number either with its country code (919876543210) or without it (9876543210) together with country_code.

group_namestringRequired unless you send phone

Name of a WhatsApp group your number is a member of. It's found the same way as in Send to group. Send phone or group_name, never both.

country_codestringoptional

Country calling code without +, for example 91 for India or 1 for the USA. It's added in front of phone unless the number already starts with it. Exception: with 91, a 10-digit number always gets the prefix. With other codes, send local numbers that start with the same digits with the country code included. Ignored for groups.

msg_typeintegeroptional

0 text (default), 1 image, 2 file or document.

msgstringRequired when msg_type is 0

Message text. For images and files it's the caption and can be empty. WhatsApp formatting works: *bold*, _italic_, ~strikethrough~. message is accepted as an alias.

Images and files

img_urlstringRequired when msg_type is 1

Public http or https URL of the image.

file_urlstringRequired when msg_type is 2

Public http or https URL the file can be downloaded from directly.

file_namestringoptional

File name the recipient sees, such as invoice-4821.pdf. It's sent in lower case, characters such as & : ? * $ ; are replaced with _, and it's cut to 150 characters. If you leave it out, the name comes from the URL.

Delivery options

webhookstringoptional

URL that receives a POST when the message is sent or fails. The payload is the same as for Send message.

When the message is sent#

  • Wbiztool converts date, time and timezone to a single moment and sends the message once that moment has passed, as long as your WhatsApp number is connected.
  • A time in the past is accepted. The message is sent straight away, like a normal send. Double-check the date format (dd/mm/yyyy, day first) so you don't send a message months early.
  • If your number is disconnected at the scheduled time, the message waits and goes out as soon as the number reconnects, even if that's much later than planned. This endpoint has no expiry, so cancel the message if it's no longer relevant. A message still waiting on a disconnected or deleted number 90 days after its scheduled time is deleted.
  • Until it's sent, the message has status 0 (Created) and can be cancelled. It also counts against your remaining credits while it waits.

Timezones#

timezone accepts either a timezone name or one of the abbreviations below.

Timezone names such as Asia/Kolkata, America/New_York, Europe/London or Australia/Sydney. Any name from the IANA timezone database works. This is the most reliable option. See the Timezone reference for a list.

Abbreviations must be in capital letters. Each one maps to a region, and that region's daylight saving time is applied automatically:

AbbreviationTreated as
ISTAsia/Kolkata
UTCUTC
GMTGMT
ESTUS/Eastern
CSTUS/Central
MSTUS/Mountain
PSTUS/Pacific
CET, CESTEurope/Paris
EET, EESTEurope/Athens
JSTAsia/Tokyo
AEST, AEDTAustralia/Sydney

For example, EST in July means New York summer time (UTC−4), not a fixed UTC−5.

Scheduling for a group#

curl -X POST https://wbiztool.com/api/v1/schedule_msg/ \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": 12345,
    "api_key": "YOUR_API_KEY",
    "whatsapp_client": 678,
    "msg_type": 0,
    "group_name": "Sales Team Mumbai",
    "msg": "Team meeting starts in 15 minutes.",
    "date": "24/12/2026",
    "time": "14:45",
    "timezone": "Asia/Kolkata"
  }'

Response#

A successful request returns HTTP 200:

{
  "msg_id": 9817263,
  "message": "Created",
  "status": 1
}
FieldTypeDescription
statusinteger1 if the message was scheduled, 0 if the request failed.
messagestringCreated on success, otherwise the error.
msg_idintegerID of the scheduled message. Save it to check the status or cancel it later. Only present on success.

The response doesn't repeat the scheduled time or timezone, so log what you sent.

Errors#

Most errors return HTTP 200 with status set to 0, so always check status in the body:

{ "message": "Scheduled date & time is not in valid format", "status": 0 }
MessageHow to fix it
Auth ErrorSend both client_id and api_key.
Invalid Client IdSend client_id as a number. Returned with HTTP 403.
Auth Error: invalid api keyCheck the key exists, hasn't been deleted and belongs to this client_id. Returned with HTTP 400.
Either phone or group_name parameter is requiredAdd phone or group_name.
Please provide either phone OR group_name, not bothRemove one of them.
Invalid phone numberphone must contain only digits (6–17 of them), optionally starting with +.
Invalid Contact Number "…"With the country code added, the number must be 6–15 digits long.
Msg cant be nullText messages (msg_type 0) need msg.
Image Url Can't be nullFor msg_type 1, send img_url.
File Url Can't be nullFor msg_type 2, send file_url.
Scheduled date & time is not in valid formatdate or time is missing, or timezone is an empty string.
Not enough creditsYour plan has no messages left.
Demo Account can not access apisUse a regular account.
Invalid JSON format: …The JSON body isn't valid, or you sent form fields without client_id.

Tips#

  • Build the date carefully: in Python use strftime("%d/%m/%Y") and strftime("%H:%M"). In JavaScript, format the date and time in the same timezone you send in timezone, not your server's local time:

    const tz = "Asia/Kolkata"; // d is the Date to send at
    const date = new Intl.DateTimeFormat("en-GB", { timeZone: tz, day: "2-digit", month: "2-digit", year: "numeric" }).format(d); // "24/12/2026"
    const time = new Intl.DateTimeFormat("en-GB", { timeZone: tz, hour: "2-digit", minute: "2-digit", hourCycle: "h23" }).format(d); // "09:00"
  • Confirm the time: schedule a test message five minutes ahead and check it arrives when you expect.

  • Change of plans: to reschedule, cancel the message and schedule a new one.

  • Don't use the official clients to schedule for now: Python's schedule_message sends the date as YYYY-MM-DD (the response is {}), and Node's scheduleMessage sends schedule_time, which this endpoint doesn't read. Call the endpoint directly as shown above.

  • Recurring messages: for messages that repeat, such as monthly payment reminders, see Create reminder.