רשימת חסומים
רשימת המספרים שאין לשלוח אליהם הודעות בחשבון. מספרים מגיעים אליה כשנמען מבקש להסירו, ואפשר גם להוסיף או להסיר רשומות בעצמכם.
POST https://my.textme.co.il/apiשתי הפעולות האלה מדווחות הצלחה בסטטוס שאינו אפס
addNumBL עונה 946 כשהיא הצליחה, ו-rmNumBL עונה 944 כשחלק מהמספרים שנשלחו לא היו ברשימה. אף אחד מהם אינו 0. קוד שמתייחס ל"סטטוס שאינו 0" כאל כשל ידווח על קריאות תקינות כשבורות — טפלו בהם בנפרד.
blacklist רשימת המספרים החסומים
מחזירה את המספרים שנחסמו בטווח תאריכים, עם התאריך שבו כל אחד נחסם.
פרמטרים
| שם | סוג | תיאור | חובה |
|---|---|---|---|
blacklist | object | מכיל את כל האלמנטים האחרים. | ✔️ |
user | object | מכיל את אלמנט המשתמש. | ✔️ |
username | string | שם המשתמש של החשבון שבו אתם מזוהים במערכת. | ✔️ |
from | string | תחילת הטווח, בפורמט dd/mm/yy hh:mm. | ✔️ |
to | string | סוף הטווח, בפורמט dd/mm/yy hh:mm. | ✔️ |
דוגמת בקשה
<?xml version="1.0" encoding="UTF-8"?>
<blacklist>
<user>
<username>XXXXXX</username>
</user>
<from>02/06/22 00:00</from>
<to>15/12/22 23:59</to>
</blacklist>{
"blacklist": {
"user": {
"username": "XXXXXX"
},
"from": "02/06/22 00:00",
"to": "15/12/22 23:59"
}
}curl --location 'https://my.textme.co.il/api' \
--header "Authorization: Bearer $TEXTME_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{
"blacklist": {
"user": {
"username": "XXXXXX"
},
"from": "02/06/22 00:00",
"to": "15/12/22 23:59"
}
}'// Node.js 18+ / דפדפנים — ללא תלויות
const response = await fetch('https://my.textme.co.il/api', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.TEXTME_API_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
blacklist: {
user: {
username: 'XXXXXX',
},
from: '02/06/22 00:00',
to: '15/12/22 23:59',
},
}),
})
const result = await response.json()
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
if (Number(result.status) !== 0) {
throw new Error(`TextMe ${result.status}: ${result.message}`)
}
console.log(result)<?php
// composer require guzzlehttp/guzzle
$client = new \GuzzleHttp\Client([
'headers' => [
'Authorization' => 'Bearer '.getenv('TEXTME_API_TOKEN'),
'Accept' => 'application/json',
],
]);
$response = $client->post('https://my.textme.co.il/api', [
'json' => [
'blacklist' => [
'user' => [
'username' => 'XXXXXX',
],
'from' => '02/06/22 00:00',
'to' => '15/12/22 23:59',
],
],
]);
$result = json_decode($response->getBody()->getContents(), true);
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
if ((int) $result['status'] !== 0) {
throw new RuntimeException("TextMe {$result['status']}: {$result['message']}");
}
print_r($result);<?php
use Illuminate\Support\Facades\Http;
$result = Http::withToken(config('services.textme.token'))
->acceptJson()
->post('https://my.textme.co.il/api', [
'blacklist' => [
'user' => [
'username' => 'XXXXXX',
],
'from' => '02/06/22 00:00',
'to' => '15/12/22 23:59',
],
])
->throw()
->json();
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
throw_if((int) $result['status'] !== 0, RuntimeException::class,
"TextMe {$result['status']}: {$result['message']}");
logger()->info('TextMe', $result);# pip install httpx
import os
import httpx
response = httpx.post(
"https://my.textme.co.il/api",
headers={"Authorization": f"Bearer {os.environ['TEXTME_API_TOKEN']}"},
json={
"blacklist": {
"user": {
"username": "XXXXXX",
},
"from": "02/06/22 00:00",
"to": "15/12/22 23:59",
},
},
)
response.raise_for_status()
result = response.json()
# גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
if int(result["status"]) != 0:
raise RuntimeError(f"TextMe {result['status']}: {result['message']}")
print(result)package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
payload, _ := json.Marshal(map[string]any{
"blacklist": map[string]any{
"user": map[string]any{
"username": "XXXXXX",
},
"from": "02/06/22 00:00",
"to": "15/12/22 23:59",
},
})
req, _ := http.NewRequest("POST", "https://my.textme.co.il/api", bytes.NewReader(payload))
req.Header.Set("Authorization", "Bearer "+os.Getenv("TEXTME_API_TOKEN"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
var result struct {
Status json.Number `json:"status"`
Message string `json:"message"`
}
if err := json.NewDecoder(res.Body).Decode(&result); err != nil {
panic(err)
}
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
if result.Status.String() != "0" {
panic(fmt.Sprintf("TextMe %s: %s", result.Status, result.Message))
}
fmt.Println(result.Message)
}// Java 17+ — java.net.http, ללא תלויות (פענוח עם Jackson/Gson)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class TextMeBlacklistGet {
public static void main(String[] args) throws Exception {
String body = """
{
"blacklist": {
"user": {
"username": "XXXXXX"
},
"from": "02/06/22 00:00",
"to": "15/12/22 23:59"
}
}
""";
HttpRequest request = HttpRequest.newBuilder(URI.create("https://my.textme.co.il/api"))
.header("Authorization", "Bearer " + System.getenv("TEXTME_API_TOKEN"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
System.out.println(response.body());
}
}// .NET 8+ — System.Net.Http
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
var payload = """
{
"blacklist": {
"user": {
"username": "XXXXXX"
},
"from": "02/06/22 00:00",
"to": "15/12/22 23:59"
}
}
""";
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
"Bearer", Environment.GetEnvironmentVariable("TEXTME_API_TOKEN"));
var response = await http.PostAsync("https://my.textme.co.il/api",
new StringContent(payload, Encoding.UTF8, "application/json"));
var result = JsonDocument.Parse(await response.Content.ReadAsStringAsync()).RootElement;
var status = result.GetProperty("status").ToString();
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
if (status != "0")
{
var message = result.GetProperty("message").ToString();
throw new Exception($"TextMe {status}: {message}");
}
Console.WriteLine(result);require "net/http"
require "json"
uri = URI("https://my.textme.co.il/api")
request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer #{ENV.fetch('TEXTME_API_TOKEN')}"
request["Content-Type"] = "application/json"
request.body = JSON.dump({
"blacklist" => {
"user" => {
"username" => "XXXXXX",
},
"from" => "02/06/22 00:00",
"to" => "15/12/22 23:59",
},
})
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
result = JSON.parse(response.body)
# גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
raise "TextMe #{result['status']}: #{result['message']}" unless result["status"].to_i.zero?
pp result// [dependencies]
// reqwest = { version = "0.12", features = ["json"] }
// tokio = { version = "1", features = ["full"] }
// serde_json = "1"
use serde_json::{json, Value};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let result: Value = reqwest::Client::new()
.post("https://my.textme.co.il/api")
.bearer_auth(std::env::var("TEXTME_API_TOKEN")?)
.json(&json!({
"blacklist": {
"user": {
"username": "XXXXXX"
},
"from": "02/06/22 00:00",
"to": "15/12/22 23:59"
}
}))
.send()
.await?
.json()
.await?;
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
if result["status"] != 0 {
return Err(format!("TextMe {}: {}", result["status"], result["message"]).into());
}
println!("{result}");
Ok(())
}תשובה
<?xml version="1.0" encoding="UTF-8"?>
<blacklist>
<status>0</status>
<message></message>
<transactions>
<transaction>
<phone>5********</phone>
<date>03/12/14 16:38</date>
</transaction>
</transactions>
</blacklist>{
"status": 0,
"message": "",
"transactions": [
{
"phone": "5********",
"date": "22/08/22 11:00"
},
{
"phone": "5********",
"date": "23/11/22 12:37"
}
]
}| שדה | סוג | תיאור |
|---|---|---|
status | int | 0 בהצלחה. |
transactions | array | רשומה אחת לכל מספר חסום. |
transactions[].phone | string | המספר החסום, ממוסך חלקית. |
transactions[].date | string | מועד החסימה, dd/mm/yy hh:mm. |
המספרים חוזרים ממוסכים
הרשומות מוחזרות כ-5******** ולא במלואן. הרשימה ניתנת לביקורת — כמה ביקשו להסירם, ומתי — אבל היא לא מקור שאפשר להשוות מולו את מסד הנתונים שלכם. סמכו על ה-API שיאכוף את רשימת החסימה בזמן השליחה.
שגיאות
| Status | מתי |
|---|---|
2 | חסר from או to. |
3, 10, 11 | טוקן לא תקף, פג תוקף, או שייך ל-username אחר. |
511 | החשבון אינו רשאי לבצע את הפעולה. |
addNumBL חסימת מספרים
מוסיפה מספרים לרשימת החסימה. שליחות אליהם מדוכאות מאותו רגע.
פרמטרים
| שם | סוג | תיאור | חובה |
|---|---|---|---|
addNumBL | object | מכיל את כל האלמנטים האחרים. | ✔️ |
user | object | מכיל את אלמנט המשתמש. | ✔️ |
username | string | שם המשתמש של החשבון שבו אתם מזוהים במערכת. | ✔️ |
phones | object | מכיל את כל אלמנטי הטלפון. | ✔️ |
phone | string | מספר לחסימה. חזרתי. | ✔️ |
דוגמת בקשה
<?xml version="1.0" encoding="UTF-8"?>
<addNumBL>
<user>
<username>xxxxxx</username>
</user>
<phones>
<phone>5********</phone>
<phone>05********</phone>
</phones>
</addNumBL>{
"addNumBL": {
"user": {
"username": "xxxxxx"
},
"phones": {
"phone": [
"5********",
"05********"
]
}
}
}curl --location 'https://my.textme.co.il/api' \
--header "Authorization: Bearer $TEXTME_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{
"addNumBL": {
"user": {
"username": "xxxxxx"
},
"phones": {
"phone": [
"5********",
"05********"
]
}
}
}'// Node.js 18+ / דפדפנים — ללא תלויות
const response = await fetch('https://my.textme.co.il/api', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.TEXTME_API_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
addNumBL: {
user: {
username: 'xxxxxx',
},
phones: {
phone: [
'5********',
'05********',
],
},
},
}),
})
const result = await response.json()
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
if (Number(result.status) !== 0) {
throw new Error(`TextMe ${result.status}: ${result.message}`)
}
console.log(result)<?php
// composer require guzzlehttp/guzzle
$client = new \GuzzleHttp\Client([
'headers' => [
'Authorization' => 'Bearer '.getenv('TEXTME_API_TOKEN'),
'Accept' => 'application/json',
],
]);
$response = $client->post('https://my.textme.co.il/api', [
'json' => [
'addNumBL' => [
'user' => [
'username' => 'xxxxxx',
],
'phones' => [
'phone' => [
'5********',
'05********',
],
],
],
],
]);
$result = json_decode($response->getBody()->getContents(), true);
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
if ((int) $result['status'] !== 0) {
throw new RuntimeException("TextMe {$result['status']}: {$result['message']}");
}
print_r($result);<?php
use Illuminate\Support\Facades\Http;
$result = Http::withToken(config('services.textme.token'))
->acceptJson()
->post('https://my.textme.co.il/api', [
'addNumBL' => [
'user' => [
'username' => 'xxxxxx',
],
'phones' => [
'phone' => [
'5********',
'05********',
],
],
],
])
->throw()
->json();
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
throw_if((int) $result['status'] !== 0, RuntimeException::class,
"TextMe {$result['status']}: {$result['message']}");
logger()->info('TextMe', $result);# pip install httpx
import os
import httpx
response = httpx.post(
"https://my.textme.co.il/api",
headers={"Authorization": f"Bearer {os.environ['TEXTME_API_TOKEN']}"},
json={
"addNumBL": {
"user": {
"username": "xxxxxx",
},
"phones": {
"phone": [
"5********",
"05********",
],
},
},
},
)
response.raise_for_status()
result = response.json()
# גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
if int(result["status"]) != 0:
raise RuntimeError(f"TextMe {result['status']}: {result['message']}")
print(result)package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
payload, _ := json.Marshal(map[string]any{
"addNumBL": map[string]any{
"user": map[string]any{
"username": "xxxxxx",
},
"phones": map[string]any{
"phone": []any{
"5********",
"05********",
},
},
},
})
req, _ := http.NewRequest("POST", "https://my.textme.co.il/api", bytes.NewReader(payload))
req.Header.Set("Authorization", "Bearer "+os.Getenv("TEXTME_API_TOKEN"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
var result struct {
Status json.Number `json:"status"`
Message string `json:"message"`
}
if err := json.NewDecoder(res.Body).Decode(&result); err != nil {
panic(err)
}
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
if result.Status.String() != "0" {
panic(fmt.Sprintf("TextMe %s: %s", result.Status, result.Message))
}
fmt.Println(result.Message)
}// Java 17+ — java.net.http, ללא תלויות (פענוח עם Jackson/Gson)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class TextMeBlacklistAdd {
public static void main(String[] args) throws Exception {
String body = """
{
"addNumBL": {
"user": {
"username": "xxxxxx"
},
"phones": {
"phone": [
"5********",
"05********"
]
}
}
}
""";
HttpRequest request = HttpRequest.newBuilder(URI.create("https://my.textme.co.il/api"))
.header("Authorization", "Bearer " + System.getenv("TEXTME_API_TOKEN"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
System.out.println(response.body());
}
}// .NET 8+ — System.Net.Http
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
var payload = """
{
"addNumBL": {
"user": {
"username": "xxxxxx"
},
"phones": {
"phone": [
"5********",
"05********"
]
}
}
}
""";
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
"Bearer", Environment.GetEnvironmentVariable("TEXTME_API_TOKEN"));
var response = await http.PostAsync("https://my.textme.co.il/api",
new StringContent(payload, Encoding.UTF8, "application/json"));
var result = JsonDocument.Parse(await response.Content.ReadAsStringAsync()).RootElement;
var status = result.GetProperty("status").ToString();
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
if (status != "0")
{
var message = result.GetProperty("message").ToString();
throw new Exception($"TextMe {status}: {message}");
}
Console.WriteLine(result);require "net/http"
require "json"
uri = URI("https://my.textme.co.il/api")
request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer #{ENV.fetch('TEXTME_API_TOKEN')}"
request["Content-Type"] = "application/json"
request.body = JSON.dump({
"addNumBL" => {
"user" => {
"username" => "xxxxxx",
},
"phones" => {
"phone" => [
"5********",
"05********",
],
},
},
})
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
result = JSON.parse(response.body)
# גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
raise "TextMe #{result['status']}: #{result['message']}" unless result["status"].to_i.zero?
pp result// [dependencies]
// reqwest = { version = "0.12", features = ["json"] }
// tokio = { version = "1", features = ["full"] }
// serde_json = "1"
use serde_json::{json, Value};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let result: Value = reqwest::Client::new()
.post("https://my.textme.co.il/api")
.bearer_auth(std::env::var("TEXTME_API_TOKEN")?)
.json(&json!({
"addNumBL": {
"user": {
"username": "xxxxxx"
},
"phones": {
"phone": [
"5********",
"05********"
]
}
}
}))
.send()
.await?
.json()
.await?;
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
if result["status"] != 0 {
return Err(format!("TextMe {}: {}", result["status"], result["message"]).into());
}
println!("{result}");
Ok(())
}תשובה
<?xml version="1.0" encoding="UTF-8"?>
<addNumBL>
<status>946</status>
<message>number has successfully added to blacklist</message>
</addNumBL>{
"status": 946,
"message": "number has successfully added to blacklist"
}| Status | משמעות |
|---|---|
946 | הצלחה. המספרים נוספו. |
שגיאות
| Status | מתי |
|---|---|
2 | phones חסר או ריק. |
9 | מספר קצר או ארוך מדי. |
511 | החשבון אינו רשאי לבצע את הפעולה. |
rmNumBL הסרת חסימה
מסירה מספרים מרשימת החסימה. השדה reason הוא חובה — הפעולה הזו פותחת מחדש ערוץ שמישהו סגר בעבר, ולכן תיעוד הסיבה נדרש ולא אופציונלי.
פרמטרים
| שם | סוג | תיאור | חובה |
|---|---|---|---|
rmNumBL | object | מכיל את כל האלמנטים האחרים. | ✔️ |
user | object | מכיל את אלמנט המשתמש. | ✔️ |
username | string | שם המשתמש של החשבון שבו אתם מזוהים במערכת. | ✔️ |
phones | object | מכיל את כל אלמנטי הטלפון. | ✔️ |
phone | string | מספר להסרת חסימה. חזרתי. | ✔️ |
reason | string | הסיבה להסרת החסימה. | ✔️ |
דוגמת בקשה
<?xml version="1.0" encoding="UTF-8"?>
<rmNumBL>
<user>
<username>xxxxxx</username>
</user>
<phones>
<phone>5********</phone>
<phone>05********</phone>
</phones>
<reason>Customer opted back in by phone</reason>
</rmNumBL>{
"rmNumBL": {
"user": {
"username": "xxxxxx"
},
"phones": {
"phone": [
"5********",
"05********"
]
},
"reason": "Customer opted back in by phone"
}
}curl --location 'https://my.textme.co.il/api' \
--header "Authorization: Bearer $TEXTME_API_TOKEN" \
--header 'Content-Type: application/json' \
--data '{
"rmNumBL": {
"user": {
"username": "xxxxxx"
},
"phones": {
"phone": [
"5********",
"05********"
]
},
"reason": "Customer opted back in by phone"
}
}'// Node.js 18+ / דפדפנים — ללא תלויות
const response = await fetch('https://my.textme.co.il/api', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.TEXTME_API_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
rmNumBL: {
user: {
username: 'xxxxxx',
},
phones: {
phone: [
'5********',
'05********',
],
},
reason: 'Customer opted back in by phone',
},
}),
})
const result = await response.json()
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
if (Number(result.status) !== 0) {
throw new Error(`TextMe ${result.status}: ${result.message}`)
}
console.log(result)<?php
// composer require guzzlehttp/guzzle
$client = new \GuzzleHttp\Client([
'headers' => [
'Authorization' => 'Bearer '.getenv('TEXTME_API_TOKEN'),
'Accept' => 'application/json',
],
]);
$response = $client->post('https://my.textme.co.il/api', [
'json' => [
'rmNumBL' => [
'user' => [
'username' => 'xxxxxx',
],
'phones' => [
'phone' => [
'5********',
'05********',
],
],
'reason' => 'Customer opted back in by phone',
],
],
]);
$result = json_decode($response->getBody()->getContents(), true);
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
if ((int) $result['status'] !== 0) {
throw new RuntimeException("TextMe {$result['status']}: {$result['message']}");
}
print_r($result);<?php
use Illuminate\Support\Facades\Http;
$result = Http::withToken(config('services.textme.token'))
->acceptJson()
->post('https://my.textme.co.il/api', [
'rmNumBL' => [
'user' => [
'username' => 'xxxxxx',
],
'phones' => [
'phone' => [
'5********',
'05********',
],
],
'reason' => 'Customer opted back in by phone',
],
])
->throw()
->json();
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
throw_if((int) $result['status'] !== 0, RuntimeException::class,
"TextMe {$result['status']}: {$result['message']}");
logger()->info('TextMe', $result);# pip install httpx
import os
import httpx
response = httpx.post(
"https://my.textme.co.il/api",
headers={"Authorization": f"Bearer {os.environ['TEXTME_API_TOKEN']}"},
json={
"rmNumBL": {
"user": {
"username": "xxxxxx",
},
"phones": {
"phone": [
"5********",
"05********",
],
},
"reason": "Customer opted back in by phone",
},
},
)
response.raise_for_status()
result = response.json()
# גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
if int(result["status"]) != 0:
raise RuntimeError(f"TextMe {result['status']}: {result['message']}")
print(result)package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
payload, _ := json.Marshal(map[string]any{
"rmNumBL": map[string]any{
"user": map[string]any{
"username": "xxxxxx",
},
"phones": map[string]any{
"phone": []any{
"5********",
"05********",
},
},
"reason": "Customer opted back in by phone",
},
})
req, _ := http.NewRequest("POST", "https://my.textme.co.il/api", bytes.NewReader(payload))
req.Header.Set("Authorization", "Bearer "+os.Getenv("TEXTME_API_TOKEN"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
var result struct {
Status json.Number `json:"status"`
Message string `json:"message"`
}
if err := json.NewDecoder(res.Body).Decode(&result); err != nil {
panic(err)
}
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
if result.Status.String() != "0" {
panic(fmt.Sprintf("TextMe %s: %s", result.Status, result.Message))
}
fmt.Println(result.Message)
}// Java 17+ — java.net.http, ללא תלויות (פענוח עם Jackson/Gson)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class TextMeBlacklistRemove {
public static void main(String[] args) throws Exception {
String body = """
{
"rmNumBL": {
"user": {
"username": "xxxxxx"
},
"phones": {
"phone": [
"5********",
"05********"
]
},
"reason": "Customer opted back in by phone"
}
}
""";
HttpRequest request = HttpRequest.newBuilder(URI.create("https://my.textme.co.il/api"))
.header("Authorization", "Bearer " + System.getenv("TEXTME_API_TOKEN"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
System.out.println(response.body());
}
}// .NET 8+ — System.Net.Http
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
var payload = """
{
"rmNumBL": {
"user": {
"username": "xxxxxx"
},
"phones": {
"phone": [
"5********",
"05********"
]
},
"reason": "Customer opted back in by phone"
}
}
""";
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
"Bearer", Environment.GetEnvironmentVariable("TEXTME_API_TOKEN"));
var response = await http.PostAsync("https://my.textme.co.il/api",
new StringContent(payload, Encoding.UTF8, "application/json"));
var result = JsonDocument.Parse(await response.Content.ReadAsStringAsync()).RootElement;
var status = result.GetProperty("status").ToString();
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
if (status != "0")
{
var message = result.GetProperty("message").ToString();
throw new Exception($"TextMe {status}: {message}");
}
Console.WriteLine(result);require "net/http"
require "json"
uri = URI("https://my.textme.co.il/api")
request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer #{ENV.fetch('TEXTME_API_TOKEN')}"
request["Content-Type"] = "application/json"
request.body = JSON.dump({
"rmNumBL" => {
"user" => {
"username" => "xxxxxx",
},
"phones" => {
"phone" => [
"5********",
"05********",
],
},
"reason" => "Customer opted back in by phone",
},
})
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
result = JSON.parse(response.body)
# גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
raise "TextMe #{result['status']}: #{result['message']}" unless result["status"].to_i.zero?
pp result// [dependencies]
// reqwest = { version = "0.12", features = ["json"] }
// tokio = { version = "1", features = ["full"] }
// serde_json = "1"
use serde_json::{json, Value};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let result: Value = reqwest::Client::new()
.post("https://my.textme.co.il/api")
.bearer_auth(std::env::var("TEXTME_API_TOKEN")?)
.json(&json!({
"rmNumBL": {
"user": {
"username": "xxxxxx"
},
"phones": {
"phone": [
"5********",
"05********"
]
},
"reason": "Customer opted back in by phone"
}
}))
.send()
.await?
.json()
.await?;
// גם שגיאה חוזרת כ-HTTP 200 — הסטטוס שבגוף התשובה הוא הקובע
if result["status"] != 0 {
return Err(format!("TextMe {}: {}", result["status"], result["message"]).into());
}
println!("{result}");
Ok(())
}תשובה
<?xml version="1.0" encoding="UTF-8"?>
<rmNumBL>
<status>944</status>
<message>X phone numbers Successfully deleted , Y Phone numbers not exist in blacklist</message>
</rmNumBL>{
"status": 944,
"message": "X phone numbers Successfully deleted , Y Phone numbers not exist in blacklist"
}| Status | משמעות |
|---|---|
0 | כל המספרים שנשלחו הוסרו. |
944 | הצלחה חלקית. חלק הוסרו; אחרים לא היו ברשימה. ה-message מציין את הכמויות. |
שגיאות
| Status | מתי |
|---|---|
933 | מספר טלפון לא תקין, או ש-reason חסר. |
2 | phones חסר או ריק. |
511 | החשבון אינו רשאי לבצע את הפעולה. |
הערות על השדות
איך מספרים נחסמים
שלושה מסלולים, ורק אחד מהם הוא אתם:
- נמען מבקש להסירו — בלחיצה על קישור ההסרה או בהודעה חוזרת, כשההודעה נשאה
add_unsubscribe. זה המקרה הנפוץ, והוא קורה בלי מעורבות שלכם. - אתם חוסמים אותם עם
addNumBL— כי לקוח ביקש בטלפון או במייל, או כי רשימת הדיכוי שלכם אומרת כך. - המפעיל או הרגולטור חוסמים אותם, מה שמופיע בדוחות המסירה כסטטוס
17או201.
רשימת החסימה נאכפת בשבילכם
אינכם צריכים לסנן יעדים לפני השליחה. מספרים חסומים מושמטים בזמן השליחה, ושליחה שכל יעדיה חסומים נכשלת בסטטוס 8 ולא מדווחת הצלחה בשקט.
כדאי לתעד את הכשל הזה בנפרד: 8 אומר שהקהל התאיין, וזו בעיית נתונים ולא בעיית קוד.
הסרת חסימה באחריות
הסרת מספר מרשימת החסימה פירושה לשלוח הודעה למי שביקש בעבר שתפסיקו. עשו זאת רק עם תיעוד של בקשה לחזור — וזה בדיוק מה ש-reason נועד לו. חוק הספאם הישראלי מטיל את חובת ההוכחה על השולח.
ראו הסרה ורגולציה למחזור המלא.

