Basis-URL
Alle folgenden Routen verwenden diese Basis-URL und liefern UTF-8-JSON.
https://master-sms.shop/api/v1
Master sms API
Integrieren Sie virtuelle Nummern und SMS-Empfang mit einer sicheren und vorhersehbaren API.
Alle folgenden Routen verwenden diese Basis-URL und liefern UTF-8-JSON.
https://master-sms.shop/api/v1
Erstellen Sie einen Schlüssel, speichern Sie das Secret nur serverseitig und führen Sie die erste Guthabenabfrage aus.
Schlüssel verwaltenSenden Sie beide Zugangsdaten bei jeder geschützten Route.
Accept: application/json Content-Type: application/json X-API-Key: your_api_key X-API-Secret: your_api_secret
Erfolge liefern success=true und data. Fehler liefern success=false, error und den passenden HTTP-Status.
{
"success": true,
"data": {
"example": "value"
},
"timestamp": 1785078000
}{
"success": false,
"error": "Fehlerbeschreibung",
"code": 400
}Die dokumentierten Routen entsprechen dem öffentlichen Front Controller der API v1.
/health
Öffentliche Route
Bestätigt die Betriebsbereitschaft und liefert die Version.
{
"success": true,
"data": {
"version": "4.2.0",
"status": "operational",
"timestamp": 1785078000,
"server_time": "2026-07-26 12:00:00",
"request_id": "req_01K123EXAMPLE"
},
"timestamp": 1785078000
}/balance
Authentifizierung erforderlich
Liefert Gesamt-, gesperrtes und verfügbares Guthaben sowie die Währung.
{
"success": true,
"data": {
"balance": 1250.5,
"blocked": 50,
"available": 1200.5,
"currency": "BRL",
"limit": 0
},
"timestamp": 1785078000
}/services
Authentifizierung erforderlich
Listet Länder, Dienste, Betreiber, Anbieter, berechnete Preise und Bestand.
| Parameter | Typ | Beschreibung | Beispiel |
|---|---|---|---|
country | string | Numerischer Ländercode. | 73 |
service | string | Dienstcode, zum Beispiel wa. | wa |
operator | string | Bestimmter Betreiber oder eine vom Anbieter unterstützte Liste. | claro |
available | boolean | Bei true werden nur verfügbare Einträge geliefert. | true |
provider | string | Name oder Kennung des Anbieters. | Hero SMS |
search | string | Textsuche nach Dienst. | WhatsApp |
GET https://master-sms.shop/api/v1/services?country=73&available=true
{
"success": true,
"data": [
{
"country_id": "73",
"country_name": "Brasil",
"services": [
{
"code": "wa",
"name": "WhatsApp",
"operator": "claro",
"price": 2.5,
"stock": 150,
"provider": "Hero SMS",
"category": "messenger",
"markup": 10
}
]
}
],
"timestamp": 1785078000
}/buy
Authentifizierung erforderlich
Kauft eine virtuelle Nummer und erstellt eine SMS-Aktivierung.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
service | string | Ja | Dienstcode, zum Beispiel wa. |
country | string | Ja | Numerischer Ländercode. |
request_id | string | Ja | Eindeutige Kaufversuchs-ID zur Vermeidung von Duplikaten. |
operator | string | Nein | Bestimmter Betreiber oder eine vom Anbieter unterstützte Liste. |
provider | string | Nein | Name oder Kennung des Anbieters. |
max_price | number | Nein | Maximal akzeptierter Preis in der von der API gelieferten Währung. |
{
"service": "wa",
"country": "73",
"operator": "claro",
"provider": "Hero SMS",
"max_price": 5,
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}{
"success": true,
"data": {
"activation_id": "ACT17850780001234",
"phone": "5511999999999",
"operator": "claro",
"price": 2.5,
"currency": "BRL",
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"service_name": "WhatsApp"
},
"timestamp": 1785078000
}/status?activation_id={id}
Authentifizierung erforderlich
Aktualisiert und liefert Status, Nummer und SMS-Code.
| Parameter | Erforderlich | Beschreibung |
|---|---|---|
activation_id | Ja | Beim Kauf gelieferte ID. |
| Status | Beschreibung |
|---|---|
pending | Wartet auf SMS. |
received | SMS empfangen; code enthält den Code. |
canceled | Aktivierung storniert. |
expired | Aktivierung abgelaufen. |
{
"success": true,
"data": {
"activation_id": "ACT17850780001234",
"status": "received",
"phone": "5511999999999",
"created_at": 1785078000,
"code": "123456",
"received_at": 1785078060
},
"timestamp": 1785078060
}/cancel
Authentifizierung erforderlich
Storniert eine berechtigte Aktivierung und meldet die Erstattung.
{ "activation_id": "ACT17850780001234" }{
"success": true,
"data": {
"activation_id": "ACT17850780001234",
"status": "canceled",
"refunded": true,
"refund_amount": 2.5
},
"timestamp": 1785078300
}/webhook
Authentifizierung erforderlich
Registriert, listet und entfernt Ziele für asynchrone Ereignisse.
| Ereignis | Beschreibung |
|---|---|
sms.received | SMS empfangen. |
sms.purchased | Nummer gekauft. |
sms.status | Aktivierungsstatus geändert. |
balance.low | Guthaben unter dem konfigurierten Grenzwert. |
| Feld | Erforderlich | Beschreibung |
|---|---|---|
event | Ja | Name des signierten Ereignisses. |
url | Ja | Öffentliche HTTPS-URL für JSON-POSTs. |
secret | Nein | Secret zur Erzeugung der HMAC-SHA-256-Signatur. |
{
"event": "sms.received",
"url": "https://example.com/webhooks/master-sms",
"secret": "replace_with_a_random_secret"
}Die Liste liefert das gespeicherte Secret niemals zurück.
{ "webhook_id": 1 }{
"event": "sms.received",
"timestamp": 1785078060,
"data": {
"activation_id": "ACT17850780001234",
"code": "123456",
"phone": "5511999999999",
"service": "wa",
"received_at": 1785078060
},
"signature": "legacy_body_signature"
}/stats
Authentifizierung erforderlich
Liefert Summen für Käufe, empfangene SMS, Stornos, Ausgaben und Erstattungen.
{
"success": true,
"data": {
"total_compras": 42,
"total_recebidos": 31,
"total_cancelados": 11,
"total_gasto": 79.5,
"total_estornado": 21
},
"timestamp": 1785078000
}/commissions
Authentifizierung erforderlich
Liefert offene und bezahlte Provisionen sowie den Verlauf des angemeldeten Resellers.
{
"success": true,
"data": {
"pending_total": 15.3,
"paid_total": 120,
"commissions": []
},
"timestamp": 1785078000
}Der Roh-Body wird mit HMAC SHA-256 signiert. Vergleichen Sie X-Webhook-Signature in konstanter Zeit, bevor Sie JSON verarbeiten.
$rawBody = file_get_contents('php://input');
$received = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
$expected = hash_hmac('sha256', $rawBody, getenv('MASTER_SMS_WEBHOOK_SECRET'));
if ($received === '' || !hash_equals($expected, $received)) {
http_response_code(401);
exit;
}
$event = json_decode($rawBody, true, flags: JSON_THROW_ON_ERROR);
http_response_code(204);
Minimale Backend-Clients. Passen Sie Timeouts, Logs und Secret-Speicherung an.
<?php
final class MasterSmsClient
{
public function __construct(
private string $apiKey,
private string $apiSecret,
private string $baseUrl = 'https://master-sms.shop/api/v1'
) {}
public function request(string $method, string $path, ?array $body = null): array
{
$ch = curl_init(rtrim($this->baseUrl, '/') . $path);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Accept: application/json',
'Content-Type: application/json',
'X-API-Key: ' . $this->apiKey,
'X-API-Secret: ' . $this->apiSecret,
],
CURLOPT_POSTFIELDS => $body === null ? null : json_encode($body),
]);
$raw = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($raw === false) {
throw new RuntimeException(curl_error($ch));
}
curl_close($ch);
$result = json_decode($raw, true, flags: JSON_THROW_ON_ERROR);
if ($status < 200 || $status >= 300 || empty($result['success'])) {
throw new RuntimeException($result['error'] ?? "HTTP {$status}", $status);
}
return $result['data'] ?? [];
}
}
$client = new MasterSmsClient(
getenv('MASTER_SMS_API_KEY'),
getenv('MASTER_SMS_API_SECRET')
);
$balance = $client->request('GET', '/balance');
$services = $client->request('GET', '/services?country=73&available=true');
$purchase = $client->request('POST', '/buy', [
'service' => 'wa',
'country' => '73',
'request_id' => bin2hex(random_bytes(16)),
]);
import os
import uuid
import requests
class MasterSmsClient:
def __init__(self):
self.base_url = "https://master-sms.shop/api/v1"
self.session = requests.Session()
self.session.headers.update({
"Accept": "application/json",
"Content-Type": "application/json",
"X-API-Key": os.environ["MASTER_SMS_API_KEY"],
"X-API-Secret": os.environ["MASTER_SMS_API_SECRET"],
})
def request(self, method, path, *, params=None, json=None):
response = self.session.request(
method, self.base_url + path, params=params, json=json, timeout=30
)
payload = response.json()
if not response.ok or not payload.get("success"):
raise RuntimeError(payload.get("error", f"HTTP {response.status_code}"))
return payload.get("data", {})
client = MasterSmsClient()
balance = client.request("GET", "/balance")
services = client.request("GET", "/services", params={
"country": "73", "available": "true"
})
purchase = client.request("POST", "/buy", json={
"service": "wa",
"country": "73",
"request_id": str(uuid.uuid4()),
})
import crypto from "node:crypto";
const baseUrl = "https://master-sms.shop/api/v1";
const headers = {
Accept: "application/json",
"Content-Type": "application/json",
"X-API-Key": process.env.MASTER_SMS_API_KEY,
"X-API-Secret": process.env.MASTER_SMS_API_SECRET,
};
async function request(method, path, body) {
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 30_000);
try {
const response = await fetch(baseUrl + path, {
method,
headers,
body: body ? JSON.stringify(body) : undefined,
signal: controller.signal,
});
const payload = await response.json();
if (!response.ok || !payload.success) {
throw new Error(payload.error ?? `HTTP ${response.status}`);
}
return payload.data ?? {};
} finally {
clearTimeout(timeout);
}
}
const balance = await request("GET", "/balance");
const purchase = await request("POST", "/buy", {
service: "wa",
country: "73",
request_id: crypto.randomUUID(),
});
export MASTER_SMS_API_KEY="your_api_key"
export MASTER_SMS_API_SECRET="your_api_secret"
export MASTER_SMS_BASE_URL="https://master-sms.shop/api/v1"
curl --fail-with-body --silent --show-error \
"$MASTER_SMS_BASE_URL/balance" \
-H "Accept: application/json" \
-H "X-API-Key: $MASTER_SMS_API_KEY" \
-H "X-API-Secret: $MASTER_SMS_API_SECRET"
curl --fail-with-body --silent --show-error \
"$MASTER_SMS_BASE_URL/buy" \
-X POST \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "X-API-Key: $MASTER_SMS_API_KEY" \
-H "X-API-Secret: $MASTER_SMS_API_SECRET" \
--data '{"service":"wa","country":"73","request_id":"550e8400-e29b-41d4-a716-446655440000"}'
Kopieren Sie diesen Prompt, geben Sie Ihren Stack an und senden Sie ihn an eine Programmier-KI. Fügen Sie niemals Ihr API Secret ein.
| Code | Bedeutung | Empfohlene Behandlung |
|---|---|---|
400 | Ungültige Anfrage | Korrigieren Sie JSON, Pflichtfelder oder Regeln. |
401 | Nicht authentifiziert | Prüfen Sie X-API-Key und X-API-Secret. |
402 | Guthaben unzureichend | Laden Sie das Konto vor dem Kauf auf. |
403 | Zugriff verweigert | Aktivieren Sie die Berechtigung oder prüfen Sie die IP-Liste. |
404 | Nicht gefunden | Prüfen Sie Route, Dienst, Bestand oder activation_id. |
405 | Ungültige Methode | Verwenden Sie die dokumentierte HTTP-Methode. |
409 | Idempotenzkonflikt | Nutzen Sie request_id nicht für einen anderen Kauf. |
429 | Limit überschritten | Warten Sie und versuchen Sie es mit Backoff erneut. |
500 | Interner Fehler | Bewahren Sie request_id und vermeiden Sie einen doppelten Kauf. |
Das Minutenlimit hängt vom Schlüssel ab und steht in X-RateLimit-Limit. Verwenden Sie bei HTTP 429 exponentielles Backoff mit Jitter.