Developer documentation
সেন্টারসমূহ
Groups and contacts
Groups are saved contact lists you can send to in one call. Groups created through the API and on the Group Contacts page of your dashboard are the same records. Reading needs bulk-sms-groups:read; creating, changing and deleting needs bulk-sms-groups:write and a live key. Groups are shared between test and live mode, so a test key can read them but not change them.
Groups
bulk-sms-groups:read
List your groups. Paginated.
curl -X GET https://e-amarseba.com/api/v1/bulk-sms/groups \
-H "Authorization: Bearer $AMARSEBA_API_KEY" \
-H "Accept: application/json"
use Illuminate\Support\Facades\Http;
$response = Http::withToken(config('services.amarseba.key'))
->acceptJson()
->get('https://e-amarseba.com/api/v1/bulk-sms/groups');
$result = $response->json();
const response = await fetch("https://e-amarseba.com/api/v1/bulk-sms/groups", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.AMARSEBA_API_KEY}`,
Accept: "application/json",
},
});
const result = await response.json();
import os
import requests
response = requests.get(
"https://e-amarseba.com/api/v1/bulk-sms/groups",
headers={
"Authorization": f"Bearer {os.environ['AMARSEBA_API_KEY']}",
"Accept": "application/json",
},
)
result = response.json()
bulk-sms-groups:write
Create a group, optionally with its first contacts.
| Name | Type | Required | Description |
|---|---|---|---|
name |
string | Yes | Up to 100 characters. |
contacts |
object[] | No | Up to 5,000 contacts of {phone, name?, designation?}. |
curl -X POST https://e-amarseba.com/api/v1/bulk-sms/groups \
-H "Authorization: Bearer $AMARSEBA_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"name": "Customers",
"contacts": [
{
"phone": "01712345678",
"name": "Rahim",
"designation": "Manager"
}
]
}'
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
$response = Http::withToken(config('services.amarseba.key'))
->acceptJson()
->withHeaders(['Idempotency-Key' => (string) Str::uuid()])
->post('https://e-amarseba.com/api/v1/bulk-sms/groups', [
'name' => 'Customers',
'contacts' => [
[
'phone' => '01712345678',
'name' => 'Rahim',
'designation' => 'Manager',
],
],
]);
$result = $response->json();
const response = await fetch("https://e-amarseba.com/api/v1/bulk-sms/groups", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.AMARSEBA_API_KEY}`,
Accept: "application/json",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"name": "Customers",
"contacts": [
{
"phone": "01712345678",
"name": "Rahim",
"designation": "Manager"
}
]
}),
});
const result = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://e-amarseba.com/api/v1/bulk-sms/groups",
headers={
"Authorization": f"Bearer {os.environ['AMARSEBA_API_KEY']}",
"Accept": "application/json",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"name": "Customers",
"contacts": [
{
"phone": "01712345678",
"name": "Rahim",
"designation": "Manager",
},
],
},
)
result = response.json()
{
"success": true,
"message": "Group created",
"data": {
"group": {
"group_id": "grp_01j8z3m2c5d8f1g4h7j0k3m6n9",
"name": "Customers",
"active": true,
"contact_count": 1,
"created_at": "2026-09-26T10:00:00.000000Z"
},
"contacts": {
"added": 1,
"updated": 0
}
},
"code": 201,
"timestamp": "2026-09-26T10:00:00.000000Z"
}
bulk-sms-groups:read
One group with its active contact count.
curl -g -X GET https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id} \
-H "Authorization: Bearer $AMARSEBA_API_KEY" \
-H "Accept: application/json"
use Illuminate\Support\Facades\Http;
$response = Http::withToken(config('services.amarseba.key'))
->acceptJson()
->get('https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}');
$result = $response->json();
const response = await fetch("https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.AMARSEBA_API_KEY}`,
Accept: "application/json",
},
});
const result = await response.json();
import os
import requests
response = requests.get(
"https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}",
headers={
"Authorization": f"Bearer {os.environ['AMARSEBA_API_KEY']}",
"Accept": "application/json",
},
)
result = response.json()
bulk-sms-groups:write
Rename a group or switch it on or off.
| Name | Type | Required | Description |
|---|---|---|---|
name |
string | No | Up to 100 characters. |
active |
boolean | No | Whether the group is active. |
curl -g -X PATCH https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id} \
-H "Authorization: Bearer $AMARSEBA_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"name": "VIP customers"
}'
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
$response = Http::withToken(config('services.amarseba.key'))
->acceptJson()
->withHeaders(['Idempotency-Key' => (string) Str::uuid()])
->patch('https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}', [
'name' => 'VIP customers',
]);
$result = $response->json();
const response = await fetch("https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}", {
method: "PATCH",
headers: {
Authorization: `Bearer ${process.env.AMARSEBA_API_KEY}`,
Accept: "application/json",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"name": "VIP customers"
}),
});
const result = await response.json();
import os
import uuid
import requests
response = requests.patch(
"https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}",
headers={
"Authorization": f"Bearer {os.environ['AMARSEBA_API_KEY']}",
"Accept": "application/json",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"name": "VIP customers",
},
)
result = response.json()
bulk-sms-groups:write
Delete a group and all of its contacts.
curl -g -X DELETE https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id} \
-H "Authorization: Bearer $AMARSEBA_API_KEY" \
-H "Accept: application/json"
use Illuminate\Support\Facades\Http;
$response = Http::withToken(config('services.amarseba.key'))
->acceptJson()
->delete('https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}');
$result = $response->json();
const response = await fetch("https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}", {
method: "DELETE",
headers: {
Authorization: `Bearer ${process.env.AMARSEBA_API_KEY}`,
Accept: "application/json",
},
});
const result = await response.json();
import os
import requests
response = requests.delete(
"https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}",
headers={
"Authorization": f"Bearer {os.environ['AMARSEBA_API_KEY']}",
"Accept": "application/json",
},
)
result = response.json()
Contacts
bulk-sms-groups:read
List the contacts of a group in the order they were added. Paginated.
curl -g -X GET https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}/contacts \
-H "Authorization: Bearer $AMARSEBA_API_KEY" \
-H "Accept: application/json"
use Illuminate\Support\Facades\Http;
$response = Http::withToken(config('services.amarseba.key'))
->acceptJson()
->get('https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}/contacts');
$result = $response->json();
const response = await fetch("https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}/contacts", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.AMARSEBA_API_KEY}`,
Accept: "application/json",
},
});
const result = await response.json();
import os
import requests
response = requests.get(
"https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}/contacts",
headers={
"Authorization": f"Bearer {os.environ['AMARSEBA_API_KEY']}",
"Accept": "application/json",
},
)
result = response.json()
bulk-sms-groups:write
Add or update up to 5,000 contacts per call, matched by phone number. For a number already in the group, the name and designation are replaced with the values you send (a missing value clears it) and the contact is reactivated. Any invalid number rejects the whole call with 422 under contacts.N.phone.
| Name | Type | Required | Description |
|---|---|---|---|
contacts |
object[] | Yes | From 1 to 5,000 contacts. |
contacts.*.phone |
string | Yes | A Bangladeshi mobile number in any accepted format. |
contacts.*.name |
string | No | Up to 100 characters. |
contacts.*.designation |
string | No | Up to 100 characters. |
curl -g -X POST https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}/contacts \
-H "Authorization: Bearer $AMARSEBA_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"contacts": [
{
"phone": "01712345678",
"name": "Rahim",
"designation": "Manager"
},
{
"phone": "+8801812345678",
"name": "Karim"
}
]
}'
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
$response = Http::withToken(config('services.amarseba.key'))
->acceptJson()
->withHeaders(['Idempotency-Key' => (string) Str::uuid()])
->post('https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}/contacts', [
'contacts' => [
[
'phone' => '01712345678',
'name' => 'Rahim',
'designation' => 'Manager',
],
[
'phone' => '+8801812345678',
'name' => 'Karim',
],
],
]);
$result = $response->json();
const response = await fetch("https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}/contacts", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.AMARSEBA_API_KEY}`,
Accept: "application/json",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"contacts": [
{
"phone": "01712345678",
"name": "Rahim",
"designation": "Manager"
},
{
"phone": "+8801812345678",
"name": "Karim"
}
]
}),
});
const result = await response.json();
import os
import uuid
import requests
response = requests.post(
"https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}/contacts",
headers={
"Authorization": f"Bearer {os.environ['AMARSEBA_API_KEY']}",
"Accept": "application/json",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"contacts": [
{
"phone": "01712345678",
"name": "Rahim",
"designation": "Manager",
},
{
"phone": "+8801812345678",
"name": "Karim",
},
],
},
)
result = response.json()
{
"success": true,
"message": "Contacts saved",
"data": {
"added": 1,
"updated": 1
},
"code": 200,
"timestamp": "2026-09-26T10:00:00.000000Z"
}
bulk-sms-groups:write
Remove contacts by phone number, up to 5,000 per call.
| Name | Type | Required | Description |
|---|---|---|---|
phones |
string[] | Yes | The numbers to remove, in any accepted format. |
curl -g -X DELETE https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}/contacts \
-H "Authorization: Bearer $AMARSEBA_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"phones": [
"01712345678"
]
}'
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
$response = Http::withToken(config('services.amarseba.key'))
->acceptJson()
->withHeaders(['Idempotency-Key' => (string) Str::uuid()])
->delete('https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}/contacts', [
'phones' => [
'01712345678',
],
]);
$result = $response->json();
const response = await fetch("https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}/contacts", {
method: "DELETE",
headers: {
Authorization: `Bearer ${process.env.AMARSEBA_API_KEY}`,
Accept: "application/json",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"phones": [
"01712345678"
]
}),
});
const result = await response.json();
import os
import uuid
import requests
response = requests.delete(
"https://e-amarseba.com/api/v1/bulk-sms/groups/{group_id}/contacts",
headers={
"Authorization": f"Bearer {os.environ['AMARSEBA_API_KEY']}",
"Accept": "application/json",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"phones": [
"01712345678",
],
},
)
result = response.json()
{
"success": true,
"message": "Contacts removed",
"data": {
"removed": 1
},
"code": 200,
"timestamp": "2026-09-26T10:00:00.000000Z"
}
Sending to a group
Send one body to every active contact with POST /bulk-sms/groups/{group_id}/send. Duplicate numbers are sent once. A group send has no 10,000-recipient cap: large groups are sent in background chunks. An inactive group returns 422 under group_id with "The group is not active", and a group with no active contacts returns "The group has no active contacts".