All SMS and Billing API resources in one place - exact endpoints, complete Postman descriptions, headers, request bodies, response examples, and ready-to-use code.
1curl --request POST \2 --url api.ubill.dev/v1/sms/send \3 --header 'key: ••••••••'
200 OK{ "statusID": 0, "message": "SMS Sent" }
GETTING STARTED
Working with the uBill API
UBill API - provides programmatic access to our resources. You will be able to integrate our service into your system and communicate with clients easily.
API examples
API implementations in different languages, provided by different sources.
Requests to protected endpoints must include your company’s secret API key. Most endpoints accept it in the key header; several legacy GET/XML endpoints use the key query parameter.
Never expose your API key
Store the key in a server-side environment variable. Never place it in frontend JavaScript, a mobile application, or a public Git repository.
Request headers
key: YOUR_API_KEY
Content-Type: application/json
02
CONVENTIONS
Formats and statuses
The API primarily returns JSON responses. The statusID field identifies the result; a successful request has the value 0. The XML endpoint returns an XML response.
0SMS sent
1Received
2Not delivered
3Awaiting status
4Error
API REFERENCE
All resources and endpoints
The information below is synchronized with the latest version of the public Postman collection.
API GROUP
SMS API
11 endpoint
SMS API / brandName Create
brandName Create
API key · Header
POSThttps://api.ubill.dev/v1/sms/brandNameCreate
Response status
statusID
Description
0
BrandName Created
10
The brandName field is empty
20
The minimum number of characters in the brandName must be 2 and the maximum number 11
30
Unauthorized markings are used in the brandName
40
brandName has already been added
50
Wait for the last added brandName to be authenticated
Secret API key used to authenticate requests. The key can be viewed and managed in the company settings.
brandID
Unique brand identifier within the system.
numbers
Comma-separated list of mobile phone numbers. Numbers must be in international format without00 or +.
text
SMS message content. Any Unicode characters are supported.
Optional Parameters
Parameter
Description
stopList
stopList=false - disables stop list validation. The message will be sent even if the recipient number exists in the stop list.
otp
otp=true - marks the message as an OTP (one-time password / verification code). OTP messages are processed with the highest priority. ⚠️ Must be used only for authentication codes.
sendTime
Scheduled SMS delivery time. Format: Y-m-d H:i (example: 2026-02-01 23:30). The specified time must be in the future. If omitted, the message is sent immediately.
callbackUrl
Individual callback URL for this SMS request. Works only if a default callback URL is configured globally in the API application settings.
Notes
OTP messages are intended strictly for authentication flows (login, verification, password reset).
Misuse of the otp parameter may result in delivery restrictions or account limitations.
Response Status
statusID
Description
0
SMS Sent
10
brandID not found
20
Numbers not found
30
Empty message text
40
Not enough SMS
50
Valid numbers not found
60
Invalid sendTime format. Use Y-m-d H:i
90
JSON Error
99
General error
⚠️ GET Method Limitations
The API does not enforce a strict limit on the number of recipient numbers.
Actual limits are imposed by URL and HTTP header size constraints (Cloudflare, proxies, browsers).
Practical Limits
✅ Up to ~1500 numbers per request works reliably.
⚠️ Around 2000+ numbers may result in Header overflow errors.
These errors occur before the request reaches the API, at the HTTP / proxy level.
Recommendation
Use GET only for small to medium requests.
For large recipient lists, always use POST.
URL parameters 5
keyqueryYOUR_API_KEY
brandIDquery1
numbersquery9955XXXXXXXX,9955XXXXXXXX
textquerymessage
stopListqueryfalse
Code examples
cURL · PHP · JavaScript
cURL
curl --request GET \
--url 'https://api.ubill.dev/v1/sms/send?key=YOUR_API_KEY&brandID=1&numbers=9955XXXXXXXX,9955XXXXXXXX&text=message&stopList=false'
Array of mobile phone numbers. Numbers must be in international format without00 or +. Example: ["9955XXXXXXXX","9955XXXXXXXX"]
text
SMS message content. Any Unicode characters are supported.
Optional Parameters (JSON Body)
Parameter
Description
stopList
false - disables stop list validation. The message will be sent even if the recipient number exists in the stop list.
otp
true - marks the message as an OTP (one-time password / verification code). OTP messages are processed with the highest priority. ⚠️ Must be used only for authentication codes.
sendTime
Scheduled SMS delivery time. Format: Y-m-d H:i (example: "2026-02-01 23:30"). Must be in the future. If omitted, the message is sent immediately.
callbackUrl
Individual callback URL for this SMS request. Works only if a default callback URL is configured globally in the API application settings.
Notes
OTP messages are intended strictly for authentication flows (login, verification, password reset).
Misuse of the otp parameter may result in delivery restrictions or account limitations.
Response Status
statusID
Description
0
SMS Sent
10
brandID not found
20
Numbers not found
30
Empty message text
40
Not enough SMS
50
Valid numbers not found
60
Invalid sendTime format. Use Y-m-d H:i
90
JSON Error
99
General error
⚠️ Limits & Notes
Max request body size: 100 MB → Requests exceeding this size will be rejected.
For large SMS batches, split requests into smaller chunks to avoid timeouts or memory issues.
Use stopList to avoid sending messages to blocked numbers.
Practical Observation from Testing:
In our tests, SMS messages were successfully sent to up to 500,000 numbers in a single request. Sending requests above this number may lead to memory, timeout, or request size issues. Actual limits may vary depending on text length, encoding, and server load.
Recommendation:
For safe and reliable operation, it is recommended to limit requests to around 100,000 numbers per batch.
Request headers 2
Key
Value
Source
key
YOUR_API_KEY
Authentication
Content-Type
application/json
Header
Request body JSON
Request body
{
"brandID": 1,
"numbers": [
9955XXXXXXXX,
9955XXXXXXXX
],
"text": "Message",
"stopList": false, // Enable/disable checking numbers in the stop list
"sendTime": "2026-02-01 23:01" // sendTime (optional)
}
Array of mobile phone numbers. Numbers must be in international format without00 or +. Example: ["9955XXXXXXXX","9955XXXXXXXX"]
text
SMS message content. Any Unicode characters are supported.
Optional Parameters (JSON Body)
Parameter
Description
stopList
false - disables stop list validation. The message will be sent even if the recipient number exists in the stop list.
otp
true - marks the message as an OTP (one-time password / verification code). OTP messages are processed with the highest priority. ⚠️ Must be used only for authentication codes.
sendTime
Scheduled SMS delivery time. Format: Y-m-d H:i (example: "2026-02-01 23:30"). Must be in the future. If omitted, the message is sent immediately.
callbackUrl
Individual callback URL for this SMS request. Works only if a default callback URL is configured globally in the API application settings.
Notes
OTP messages are intended strictly for authentication flows (login, verification, password reset).
Misuse of the otp parameter may result in delivery restrictions or account limitations.
Response Status
statusID
Description
0
SMS Sent
10
brandID not found
20
Numbers not found
30
Empty message text
40
Not enough SMS
50
Valid numbers not found
60
Invalid sendTime format. Use Y-m-d H:i
90
JSON Error
99
General error
⚠️ Limits & Notes
Max request body size: 100 MB → Requests exceeding this size will be rejected.
For large SMS batches, split requests into smaller chunks to avoid timeouts or memory issues.
Use stopList to avoid sending messages to blocked numbers.
Practical Observation from Testing:
SMS per recipient
Maximum numbers per request
1
400,000
2
200,000
3
150,000
4
120,000
5
100,000
6
50,000
Actual limits may vary depending on text length, encoding, and server load.
Recommendation:
For safe and reliable operation, it is recommended to limit requests to the numbers listed above per batch, according to the number of concatenated SMS messages being sent.
API application settings contain one shared HTTPS callback URL. Delivery reports, SMS brand activation notifications, and future API events are sent to this same URL with a GET request.
Use the event parameter to determine the notification type. Return any 2xx HTTP status after successful processing.
Common parameters
Parameter
Description
key
Callback validation key from the API application settings
No response example is available for this endpoint.
Billing API / Customers / Create Customer
Create Customer
API key · Header
POSThttps://api.ubill.dev/v1/customers/create
Creates a new customer together with its phone numbers. The customer number (id in the response, cID internally) is generated automatically and is unique inside the company.
Required permission: customers.create. The request body must be JSON and the Content-Type: application/json header is mandatory.
Request body
Field
Type
Required
Description
typeID
integer
yes
Legal type of the customer, must exist in the uBill customer type list (1 = individual).
name
string, max 50
no
Customer name.
personalNo
string, max 11
no
Personal number or company identification code, alphanumeric only.
email
string
no
Must be a valid email address when sent.
birthDate
string
no
Date in YYYY-MM-DD format.
lang
string
no
One of ka, en, ru. Defaults to the default customer language configured for the company.
address
string, max 50
no
Customer address.
column1, column2
string, max 50
no
Free additional fields.
numbers
array
yes
Phone numbers of the customer, at least one is required.
numbers[] object
Field
Type
Description
number
string
Local number without the country code, 6 to 15 digits.
mobile
string
Full international number. When this key is used the country code is removed from the beginning of the number.
countryCode
string
Country code, defaults to +995.
isPrimary
0 or 1
Marks the main number. When no number is flagged, the first item of the list becomes the primary one.
smsEnabled
0 or 1
Whether the number receives SMS notifications, defaults to 1.
note
string, max 100
Free note for the number.
A single number may also be sent with the short form {"mobile": "9955XXXXXXXX", "countryCode": "+995"} instead of the numbers array. Repeated numbers are silently removed, and a number that already belongs to another customer of the same company is rejected.
Responses
HTTP
statusID
Description
201
0
Customer created, data holds the new customer.
400
400
Validation failed, the errors object names every invalid field.
500
99
The customer could not be saved, nothing is written.
{
"statusID": 400,
"message": "Validation failed",
"data": null,
"errors": {
"typeID": "typeID does not exist",
"birthDate": "birthDate must be a valid date in YYYY-MM-DD format",
"email": "Email is invalid",
"numbers": "Phone number is invalid"
}
}
Number already used400
Response · JSON
{
"statusID": 400,
"message": "Validation failed",
"data": null,
"errors": {
"numbers": "+9955XXXXXXXX is already assigned to another customer"
}
}
Billing API / Customers / Get Customer
Get Customer
API key · Header
GEThttps://api.ubill.dev/v1/customers/100001
This endpoint does not include a separate description in the Postman collection.
Creates a new account (service) for an existing customer. The account number (id in the response) is generated from the company cID settings, exactly like an account created from the uBill web interface.
Required permission: accounts.create. The request body must be JSON and the Content-Type: application/json header is mandatory.
Request body
Field
Type
Required
Description
customerID
integer
yes
Number of the customer the account belongs to, the same id returned by the customer endpoints.
name
string, max 50
no
Account name.
birthDate
string
no
Date in YYYY-MM-DD format.
areaID
integer
no
Settlement identifier of the uBill district list.
address
string, max 50
no
Service address.
geoLocation
string, max 100
no
Coordinates in 41.732438,44.7688134 format.
column1, column2
string, max 50
no
Free additional fields.
tariffID
integer
no
Tariff number of the company.
groupID
integer
no
Group or branch number of the company.
tagsID
array of integers
no
Tag numbers of the company that are attached to the account.
numbers
array
no
Phone numbers of the account, described in the same way as for a customer. Unlike a customer, an account may be created without any number.
Module dependent fields
These fields are only read when the matching module is enabled for the company.
Field
Module
Required
Description
mac
Network
yes
MAC address of the device, unique inside the company.
onuMac
Network
no
ONU MAC address, unique inside the company.
ipRangeID
Network
yes
NAS IP range number. The first free address of that range is assigned to the account automatically and returned as ip.
stbMac
IPTV
no
STB MAC address, unique inside the company.
gpsProviderID
GPS track
yes
GPS provider number of the company.
gpsTrackIdentifier
GPS track
no
Device identifier, unique inside the company.
SMS notification
When the account added SMS notification is switched on in the company settings, the message is sent to every SMS enabled number of the new account and the SMS balance of the company is charged. If the balance is not sufficient, the account is still created and the response carries an extra warning field.
Responses
HTTP
statusID
Description
201
0
Account created, data holds the new account.
400
400
Validation failed, the errors object names every invalid field. Duplicated MAC addresses and phone numbers are reported the same way.
500
99
The account could not be saved, nothing is written.
{
"statusID": 0,
"message": "Account created",
"data": {
"id": 100002,
"customerID": 100001,
"name": "მეორე ბინა",
"mobile": "9955XXXXXXXX",
"numbers": [
{
"mobile": "9955XXXXXXXX",
"countryCode": "+995",
"number": "5XXXXXXXX",
"isPrimary": 1,
"smsEnabled": 1,
"note": null
}
],
"personalNo": "XXXXXXXXXXX",
"birthDate": null,
"areaID": null,
"area": "არ არის მითითებული",
"address": "",
"geoLocation": null,
"column1": "",
"column2": "",
"groupID": null,
"tagsID": [],
"tariffID": null,
"balance": "0.00",
"statusID": 1,
"createdAt": "2026-08-26 13:20:11"
},
"warning": "account was created, but the notification sms was not sent - not enough messages on the balance"
}
Validation failed400
Response · JSON
{
"statusID": 400,
"message": "Validation failed",
"data": null,
"errors": {
"customerID": "Customer not found",
"geoLocation": "geoLocation must look like 41.732438,44.7688134",
"tariffID": "tariffID does not exist",
"mac": "mac is required",
"ipRangeID": "ipRangeID is required"
}
}
MAC already used400
Response · JSON
{
"statusID": 400,
"message": "Account creation failed",
"data": null,
"errors": {
"account": [
"ეს MAC მისამართი უკვე მითითებულია სხვა ანგარიშზე"
]
}
}
Billing API / Accounts / Get Account
Get Account
API key · Header
GEThttps://api.ubill.dev/v1/accounts/100001
This endpoint does not include a separate description in the Postman collection.