KDEFY SMS API
REST-API zum Kaufen virtueller Nummern und Empfangen von SMS. Sie nutzt dasselbe Guthaben und dieselben Aktivierungen wie Ihr Konto auf der Website.
https://kdefy-sms.com/api/v1X-API-KeyAlle Routen
| GET | /balance | Kontoguthaben und Summen. |
| GET | /profile | Benutzername, Guthaben und Erstellungsdatum. |
| GET | /countries | Liste der Länder. |
| GET | /services | Dienste eines Landes mit Bestand und Startpreis. |
| GET | /operators | Netzbetreiber eines Landes. |
| GET | /offers | Preisstufen und Bestand eines Dienstes in einem Land. |
| GET POST | /number/get | Kauft eine Nummer oder mehrere mit quantity. |
| GET | /number/status | Aktivierungsstatus und empfangene Codes. |
| GET POST | /number/cancel | Storniert und erstattet den Betrag. |
| GET POST | /number/finish | Beendet die Aktivierung nach dem Code. |
| GET | /activations | Ihre Aktivierungen, auch die von der Website, von der neuesten zur ältesten. |
| GET | /transactions | Aufladungen, Käufe und Erstattungen. |
Mit KI integrieren
Fügen Sie den Text unten in ChatGPT, Claude oder Gemini ein und sagen Sie, was Sie bauen möchten. Der Prompt enthält bereits Routen, Regeln und Fehler der API.
# TAREFA
Escreva o código de integração com a KDEFY SMS API: compra de números virtuais e leitura de SMS.
Use só o que está neste documento. Se faltar informação, pergunte. Não invente rota, campo ou código de erro.
# ANTES DE CODAR
Faça as perguntas abaixo numa única mensagem e espere a resposta. Pule o que eu já tiver dito.
1. Linguagem e framework (com versão).
2. O que o código faz (cadastro automático, revenda, painel...).
3. Onde roda e onde fica o token.
4. Volume esperado (números por minuto) e se precisa de compra em lote.
# COMO RESPONDER
1. Plano em até 3 linhas.
2. Código completo e executável.
3. Como rodar e testar.
4. Limites e riscos que o código trata.
# API
Base URL: https://kdefy-sms.com/api/v1
Auth: header X-API-Key: <TOKEN> em toda requisição. O token vem de variável de ambiente (KDEFY_API_KEY). Nunca no front-end, nunca em log.
Métodos: tudo é GET. /number/get, /number/cancel e /number/finish também aceitam POST.
Resposta: JSON. Sucesso { "status": "success", ... }. Erro { "status": "error", "error": "codigo", "message": "texto" }.
Decida sempre por "error". "message" muda com o idioma.
Limites: 120 requisições por minuto por conta. Compra: até 50 números por requisição e 50 por minuto. Acima disso: limite_de_numeros.
# ROTAS (* = obrigatório)
GET /balance
Saldo e totais da conta.
params: nenhum
retorna: balance_brl, total_spent_brl, total_recharged_brl, currency
GET /profile
Usuário, saldo e data de criação.
params: nenhum
retorna: username, balance_brl, created_at
GET /countries
Lista de países.
params: nenhum
retorna: countries[].id, countries[].name, countries[].dial_code
GET /services
Serviços de um país, com estoque e preço inicial.
params: country*
retorna: country, services[].code, services[].name, services[].available, services[].from_price_brl
erros: pais_invalido
GET /operators
Operadoras de um país.
params: country*
retorna: country, operators[].id, operators[].name
erros: pais_invalido
GET /offers
Faixas de preço e estoque de um serviço num país.
params: country*, service*
retorna: offers[].price_brl, offers[].available
erros: pais_invalido, servico_invalido, sem_numeros_disponiveis
GET|POST /number/get
Compra um número, ou vários com quantity.
params: country*, service*, max_price_brl, operator, quantity, request_id
retorna: id, service, service_name, country, country_name, phone, state, state_label, code, codes, price_brl, seconds_left, cancel_in_seconds, balance_brl, requested, purchased, failed, numbers, errors
erros: pais_invalido, servico_invalido, quantidade_invalida, preco_invalido, operador_invalido, request_id_invalido, request_id_reutilizada, requisicao_em_andamento, saldo_insuficiente, sem_numeros_disponiveis, preco_abaixo_do_minimo, limite_de_numeros, falha_temporaria
GET /number/status
Estado da ativação e códigos recebidos.
params: id*
retorna: id, service, service_name, country, country_name, phone, state, state_label, code, codes, price_brl, seconds_left, cancel_in_seconds
erros: id_invalido, ativacao_nao_encontrada
GET|POST /number/cancel
Cancela e devolve o valor.
params: id*
retorna: id, state, refunded_brl, balance_brl
erros: id_invalido, ativacao_nao_encontrada, ativacao_nao_cancelavel, cancelamento_muito_cedo, falha_temporaria
GET|POST /number/finish
Encerra a ativação depois do código.
params: id*
retorna: id, state
erros: id_invalido, ativacao_nao_encontrada, ativacao_nao_finalizavel
GET /activations
Suas ativações, inclusive as do site, da mais nova para a mais antiga.
params: state, limit
retorna: activations[]
GET /transactions
Recargas, compras e reembolsos.
params: limit
retorna: transactions[].type, transactions[].amount_brl, transactions[].balance_after_brl, transactions[].description, transactions[].created_at
Exemplo, /number/get:
{
"id": "1842",
"service": "wa",
"service_name": "WhatsApp",
"country": 73,
"country_name": "Brasil",
"phone": "5511999999999",
"state": "waiting",
"state_label": "Aguardando código",
"code": null,
"codes": [],
"price_brl": 8.4,
"seconds_left": 1200,
"cancel_in_seconds": 120,
"status": "success",
"balance_brl": 17
}
Exemplo, /number/status com código:
{
"status": "success",
"id": "1842",
"service": "wa",
"service_name": "WhatsApp",
"country": 73,
"country_name": "Brasil",
"phone": "5511999999999",
"state": "code_received",
"state_label": "Código recebido",
"code": "123456",
"codes": [
{
"code": "123456",
"received_at": "2026-10-19T14:02:11.000Z"
}
],
"price_brl": 8.4,
"seconds_left": 1103,
"cancel_in_seconds": 0
}
# ESTADOS (campo state)
waiting: Esperando o primeiro código.
code_received: Código recebido. Códigos novos entram em codes enquanto a ativação estiver aberta.
completed: Finalizada por você (/number/finish).
cancelled: Cancelada. Valor devolvido.
expired: Sem código em 20 min. Valor devolvido automaticamente.
waiting → code_received → completed
waiting → cancelled (cancel, só sem código e após 2 min)
waiting → expired (automático, com reembolso)
# ERROS E O QUE FAZER
401 token_nao_informado / token_invalido
→ Corrija o token. Não repita.
403 conta_bloqueada / token_suspenso
→ Fale com o suporte.
400 pais_invalido / servico_invalido / id_invalido / quantidade_invalida / preco_invalido / operador_invalido / request_id_invalido
→ Corrija a chamada.
402 saldo_insuficiente
→ Recarregue no site.
404 sem_numeros_disponiveis / oferta_indisponivel
→ Suba max_price_brl, troque o país ou tente depois.
404 ativacao_nao_encontrada
→ Confira o id.
409 requisicao_em_andamento
→ Espere e repita a mesma chamada.
409 cancelamento_muito_cedo
→ Espere retry_in_seconds.
409 ativacao_nao_cancelavel / ativacao_nao_finalizavel
→ Consulte /number/status.
422 request_id_reutilizada
→ Use uma request_id nova.
422 preco_abaixo_do_minimo
→ Suba para min_price_brl ou mais.
429 limite_de_requisicoes / limite_de_numeros
→ Espere retry_in_seconds.
502 falha_temporaria
→ Repita com espera crescente, mesma request_id.
# REGRAS DO CÓDIGO
1. Compra nova = request_id nova (UUID). Repetição da mesma compra = mesma request_id. Nunca gere request_id nova para repetir.
2. Repita a compra só em timeout, erro de rede, 502 ou requisicao_em_andamento. Máximo 4 tentativas, esperando 2 s, 4 s, 6 s.
3. saldo_insuficiente e sem_numeros_disponiveis não se repetem. Devolva o erro a quem chamou.
4. Espere o código com /number/status a cada 5 s, com prazo máximo de 20 min. Pare em code preenchido ou state cancelled, expired ou completed.
5. Vários números ao mesmo tempo: uma chamada a /activations?state=active por ciclo, não uma por número.
6. Com código usado: /number/finish. Sem código e desistindo: /number/cancel. Se vier cancelamento_muito_cedo, espere retry_in_seconds e tente de novo. Se vier ativacao_nao_cancelavel, já chegou código: consulte /number/status.
7. Lote (quantity): leia purchased e failed. Compra parcial é normal.
8. 429: espere retry_in_seconds.
9. Timeout de rede de 20 s por chamada.
10. Log com request_id e id da ativação. Nunca com o token.
# EXEMPLO DE REFERÊNCIA (JavaScript)
```js
// Node 18+. Rode com: KDEFY_API_KEY=seu_token node kdefy.mjs
import { randomUUID } from "node:crypto";
const BASE = "https://kdefy-sms.com/api/v1";
const KEY = process.env.KDEFY_API_KEY;
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
async function api(path, params = {}) {
const qs = new URLSearchParams(params).toString();
const res = await fetch(`${BASE}${path}${qs ? "?" + qs : ""}`, {
headers: { "X-API-Key": KEY },
signal: AbortSignal.timeout(20000),
});
const body = await res.json();
if (body.status !== "success") {
const err = new Error(body.message);
err.code = body.error;
err.http = res.status;
err.retryIn = body.retry_in_seconds;
throw err;
}
return body;
}
async function buy(country, service) {
const requestId = randomUUID(); // uma por compra
for (let attempt = 1; attempt <= 4; attempt++) {
try {
return await api("/number/get", { country, service, request_id: requestId });
} catch (e) {
const transient = e.name === "TimeoutError" || e.name === "TypeError" || e.http === 502 || e.code === "requisicao_em_andamento";
if (!transient || attempt === 4) throw e;
await sleep(2000 * attempt); // repete com a mesma request_id
}
}
}
async function waitForCode(id, maxMinutes = 20) {
const deadline = Date.now() + maxMinutes * 60_000;
while (Date.now() < deadline) {
const s = await api("/number/status", { id });
if (s.code || ["cancelled", "expired", "completed"].includes(s.state)) return s;
await sleep(5000);
}
return null;
}
const number = await buy(73, "wa");
console.log("Número:", number.phone);
const result = await waitForCode(number.id);
if (result?.code) {
console.log("Código:", result.code);
await api("/number/finish", { id: number.id });
} else {
try {
await api("/number/cancel", { id: number.id });
} catch (e) {
if (e.code !== "cancelamento_muito_cedo") throw e;
await sleep((e.retryIn + 1) * 1000);
await api("/number/cancel", { id: number.id });
}
console.log("Cancelado e reembolsado.");
}
```
# CHECKLIST ANTES DE ENTREGAR
- Token só de variável de ambiente.
- Toda compra tem request_id, e a repetição reaproveita a mesma.
- Polling de 5 s com prazo máximo.
- Decisões por "error", nunca por "message".
- Cancelamento trata cancelamento_muito_cedo.
- Testes ou passos de teste para: compra ok, repetição com a mesma request_id, saldo_insuficiente, cancelar antes de 2 min.
# MAIS DETALHES
Docs completas em texto: https://kdefy-sms.com/api/v1/docs.txt
Docs completas em JSON: https://kdefy-sms.com/api/v1/docs.json
OpenAPI 3: https://kdefy-sms.com/api/v1/openapi.json
Testkonsole
Meinen Token erzeugen oder ansehen →Diese Werte gelten für alle Tests auf der Seite. Der Token bleibt nur in diesem Tab. Kaufen belastet Ihr Guthaben tatsächlich.
Authentifizierung
Erzeugen Sie den Token unter API im Menü der Website und senden Sie ihn bei jeder Anfrage im Header X-API-Key. Authorization: Bearer und ?api_key= funktionieren ebenfalls, aber die Query-String landet in Proxy-Logs und im Browserverlauf. Ein neuer Token macht den vorherigen sofort ungültig. Verwenden Sie den Token nicht im Frontend.
curl "https://kdefy-sms.com/api/v1/balance" -H "X-API-Key: SEU_TOKEN"curl "https://kdefy-sms.com/api/v1/balance" -H "Authorization: Bearer SEU_TOKEN"curl "https://kdefy-sms.com/api/v1/balance?api_key=SEU_TOKEN"
Antworten und Sprache
- Jede Antwort ist JSON. Erfolg: { "status": "success", ... }. Fehler: { "status": "error", "error": "code", "message": "text" }.
- Entscheiden Sie anhand des Felds error. Es ist stabil. message ist Text für Menschen und kann sich ändern.
- message und state_label folgen der Kontosprache (pt oder en). Zum Erzwingen: ?lang=pt oder ?lang=en.
- JSON-Schlüssel und state-Werte ändern sich nicht mit der Sprache.
- Beträge in BRL mit Dezimalpunkt. Datumsangaben in ISO 8601 (UTC).
Zustände
| state | Bedeutung |
|---|---|
waiting | Wartet auf den ersten Code. |
code_received | Code empfangen. Neue Codes landen in codes, solange die Aktivierung offen ist. |
completed | Von Ihnen abgeschlossen (/number/finish). |
cancelled | Storniert. Betrag erstattet. |
expired | Kein Code innerhalb von 20 Min. Betrag wird automatisch erstattet. |
Limits
- 120 Anfragen pro Minute pro Konto.
- Kauf: bis zu 50 Nummern pro Anfrage und 50 pro Minute. Darüber: limite_de_numeros.
- Status: alle 5 s abfragen. Schnelleres Abfragen beschleunigt den Code nicht.
Kaufablauf
- GET /services?country=73: Dienste des Landes und Startpreis.
- GET /offers?country=73&service=wa (optional): Preisstufen und Bestand.
- GET /number/get?country=73&service=wa&request_id=...: kauft und liefert phone und id.
- GET /number/status?id=ID alle 5 s, bis code gefüllt ist.
- Mit Code: GET /number/finish?id=ID. Ohne Code: GET /number/cancel?id=ID (2 Min. nach dem Kauf möglich) und der Betrag geht zurück aufs Guthaben.
Auf den Code warten
Fragen Sie /number/status alle 5 s ab und hören Sie auf, wenn code gefüllt ist oder state cancelled, expired oder completed wird.
- Legen Sie in Ihrem Code ein Zeitlimit fest (20 Min.).
- Bei mehreren Nummern nutzen Sie /activations?state=active. Ein Aufruf liefert alle aktiven.
- Eine Aktivierung kann mehr als einen Code erhalten. Lesen Sie codes[].
Stapelkauf
quantity=N kauft N Nummern in einem Aufruf, bis zu 50. Ein Teilkauf ist normal: Gehen Bestand oder Guthaben mittendrin aus, wird der Rest nicht berechnet.
- Die Antwort enthält numbers[], requested, purchased und failed.
- errors listet gegebenenfalls die Fehlerursachen auf.
- Limit von 50 Nummern pro Minute pro Konto.
curl "https://kdefy-sms.com/api/v1/number/get?country=73&service=wa&quantity=3&request_id=pedido-0001" \
-H "X-API-Key: $KDEFY_API_KEY"
Idempotenz (request_id)
Senden Sie bei jedem Kauf eine request_id. Bei einem Timeout und Unklarheit, ob der Kauf durchging, wiederholen Sie denselben Aufruf mit derselben request_id. Die API liefert die ursprüngliche Antwort mit dem Header Idempotent-Replay: true und berechnet nicht erneut.
- Neuer Kauf, neue request_id.
- 8 bis 80 Zeichen (Buchstaben, Zahlen, _ . : -). Der Header Idempotency-Key funktioniert ebenfalls.
- Der Schlüssel gilt 24 Std. und wird nur gespeichert, wenn der Kauf erfolgreich war. Ein fehlgeschlagener Kauf kann wiederholt werden.
- Derselbe Schlüssel mit anderen Parametern: request_id_reutilizada.
Vollständiges Beispiel
Kaufen, auf den Code warten und abschließen. Kommt der Code nicht an, stornieren. Der Kauf nutzt request_id, daher dupliziert ein wiederholter Aufruf ihn nicht.
// Node 18+. Rode com: KDEFY_API_KEY=seu_token node kdefy.mjs
import { randomUUID } from "node:crypto";
const BASE = "https://kdefy-sms.com/api/v1";
const KEY = process.env.KDEFY_API_KEY;
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
async function api(path, params = {}) {
const qs = new URLSearchParams(params).toString();
const res = await fetch(`${BASE}${path}${qs ? "?" + qs : ""}`, {
headers: { "X-API-Key": KEY },
signal: AbortSignal.timeout(20000),
});
const body = await res.json();
if (body.status !== "success") {
const err = new Error(body.message);
err.code = body.error;
err.http = res.status;
err.retryIn = body.retry_in_seconds;
throw err;
}
return body;
}
async function buy(country, service) {
const requestId = randomUUID(); // uma por compra
for (let attempt = 1; attempt <= 4; attempt++) {
try {
return await api("/number/get", { country, service, request_id: requestId });
} catch (e) {
const transient = e.name === "TimeoutError" || e.name === "TypeError" || e.http === 502 || e.code === "requisicao_em_andamento";
if (!transient || attempt === 4) throw e;
await sleep(2000 * attempt); // repete com a mesma request_id
}
}
}
async function waitForCode(id, maxMinutes = 20) {
const deadline = Date.now() + maxMinutes * 60_000;
while (Date.now() < deadline) {
const s = await api("/number/status", { id });
if (s.code || ["cancelled", "expired", "completed"].includes(s.state)) return s;
await sleep(5000);
}
return null;
}
const number = await buy(73, "wa");
console.log("Número:", number.phone);
const result = await waitForCode(number.id);
if (result?.code) {
console.log("Código:", result.code);
await api("/number/finish", { id: number.id });
} else {
try {
await api("/number/cancel", { id: number.id });
} catch (e) {
if (e.code !== "cancelamento_muito_cedo") throw e;
await sleep((e.retryIn + 1) * 1000);
await api("/number/cancel", { id: number.id });
}
console.log("Cancelado e reembolsado.");
}# Python 3.9+. pip install requests
# Rode com: KDEFY_API_KEY=seu_token python kdefy.py
import os, time, uuid, requests
BASE = "https://kdefy-sms.com/api/v1"
HEADERS = {"X-API-Key": os.environ["KDEFY_API_KEY"]}
class ApiError(Exception):
def __init__(self, body, http):
super().__init__(body.get("message"))
self.code = body.get("error")
self.http = http
self.retry_in = body.get("retry_in_seconds")
def api(path, **params):
r = requests.get(BASE + path, params=params, headers=HEADERS, timeout=20)
body = r.json()
if body.get("status") != "success":
raise ApiError(body, r.status_code)
return body
def buy(country, service):
request_id = str(uuid.uuid4()) # uma por compra
for attempt in range(1, 5):
try:
return api("/number/get", country=country, service=service, request_id=request_id)
except requests.RequestException:
pass
except ApiError as e:
if not (e.http == 502 or e.code == "requisicao_em_andamento"):
raise
if attempt == 4:
raise RuntimeError("não foi possível comprar agora")
time.sleep(2 * attempt) # repete com a mesma request_id
def wait_for_code(activation_id, max_minutes=20):
deadline = time.time() + max_minutes * 60
while time.time() < deadline:
s = api("/number/status", id=activation_id)
if s["code"] or s["state"] in ("cancelled", "expired", "completed"):
return s
time.sleep(5)
return None
number = buy(73, "wa")
print("Número:", number["phone"])
result = wait_for_code(number["id"])
if result and result["code"]:
print("Código:", result["code"])
api("/number/finish", id=number["id"])
else:
try:
api("/number/cancel", id=number["id"])
except ApiError as e:
if e.code != "cancelamento_muito_cedo":
raise
time.sleep((e.retry_in or 5) + 1)
api("/number/cancel", id=number["id"])
print("Cancelado e reembolsado.")<?php
// PHP 8+ com ext-curl. Rode com: KDEFY_API_KEY=seu_token php kdefy.php
const BASE = "https://kdefy-sms.com/api/v1";
function api(string $path, array $params = []): array {
$ch = curl_init(BASE . $path . ($params ? "?" . http_build_query($params) : ""));
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 20,
CURLOPT_HTTPHEADER => ["X-API-Key: " . getenv("KDEFY_API_KEY")],
]);
$raw = curl_exec($ch);
if ($raw === false) throw new RuntimeException("rede: " . curl_error($ch));
$body = json_decode($raw, true);
if (($body["status"] ?? null) !== "success") {
$e = new RuntimeException($body["error"] ?? "erro_desconhecido");
$e->retryIn = $body["retry_in_seconds"] ?? 0;
throw $e;
}
return $body;
}
$requestId = bin2hex(random_bytes(16)); // uma por compra
$n = api("/number/get", ["country" => 73, "service" => "wa", "request_id" => $requestId]);
echo "Número: {$n['phone']}\n";
$deadline = time() + 20 * 60;
while (time() < $deadline) {
$s = api("/number/status", ["id" => $n["id"]]);
if (!empty($s["code"]) || in_array($s["state"], ["cancelled", "expired", "completed"], true)) break;
sleep(5);
}
if (!empty($s["code"])) {
echo "Código: {$s['code']}\n";
api("/number/finish", ["id" => $n["id"]]);
} else {
api("/number/cancel", ["id" => $n["id"]]);
echo "Cancelado e reembolsado.\n";
}# Ruby 3+. Rode com: KDEFY_API_KEY=seu_token ruby kdefy.rb
require "net/http"
require "json"
require "securerandom"
BASE = "https://kdefy-sms.com/api/v1"
def api(path, params = {})
uri = URI(BASE + path)
uri.query = URI.encode_www_form(params) unless params.empty?
req = Net::HTTP::Get.new(uri, "X-API-Key" => ENV.fetch("KDEFY_API_KEY"))
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https", read_timeout: 20) { |h| h.request(req) }
body = JSON.parse(res.body)
raise "#{body['error']}: #{body['message']}" unless body["status"] == "success"
body
end
n = api("/number/get", country: 73, service: "wa", request_id: SecureRandom.uuid) # uma por compra
puts "Número: #{n['phone']}"
deadline = Time.now + 20 * 60
s = nil
while Time.now < deadline
s = api("/number/status", id: n["id"])
break if s["code"] || %w[cancelled expired completed].include?(s["state"])
sleep 5
end
if s && s["code"]
puts "Código: #{s['code']}"
api("/number/finish", id: n["id"])
else
api("/number/cancel", id: n["id"])
puts "Cancelado e reembolsado."
end#!/usr/bin/env bash
# Requer curl e jq. Rode com: KDEFY_API_KEY=seu_token bash kdefy.sh
set -euo pipefail
BASE="https://kdefy-sms.com/api/v1"
api() { # api /rota chave=valor ...
local path="$1"; shift
local args=(); for kv in "$@"; do args+=(--data-urlencode "$kv"); done
curl -sS --max-time 20 -G "$BASE$path" -H "X-API-Key: $KDEFY_API_KEY" "${args[@]}"
}
num=$(api /number/get country=73 service=wa "request_id=$(uuidgen)") # uma por compra
[ "$(jq -r .status <<<"$num")" = success ] || { jq . <<<"$num"; exit 1; }
id=$(jq -r .id <<<"$num")
echo "Número: $(jq -r .phone <<<"$num")"
for _ in $(seq 240); do # 240 x 5 s = 20 min
st=$(api /number/status "id=$id")
code=$(jq -r '.code // empty' <<<"$st")
state=$(jq -r .state <<<"$st")
[ -n "$code" ] && break
case "$state" in cancelled|expired|completed) break ;; esac
sleep 5
done
if [ -n "${code:-}" ]; then
echo "Código: $code"
api /number/finish "id=$id" >/dev/null
else
api /number/cancel "id=$id" >/dev/null
echo "Cancelado e reembolsado."
fiBest Practices
- Token in einer Umgebungsvariable. Nie im Code, im Frontend oder in einem Repository.
- request_id bei jedem Kauf. Aufruf wiederholt? Dieselbe request_id.
- Polling alle 5 s, mit Zeitlimit.
- Mehrere Nummern: /activations?state=active statt eines /number/status pro Aktivierung.
- Behandeln Sie error, nicht message.
- 429: retry_in_seconds abwarten. 502: mit zunehmender Wartezeit erneut versuchen (2 s, 4 s, 6 s).
- Verwenden Sie max_price_brl als Obergrenze. Preis und Bestand ändern sich, prüfen Sie daher /offers vor großen Stapeln.
- Prüfen Sie /balance vor großen Stapeln.
- Speichern Sie request_id und Aktivierungs-id in Ihren Logs.
- Stornieren Sie nur, was Sie nicht nutzen. Nach dem ersten Code gibt es keine Erstattung.
Konto
/api/v1/balance
Guthaben
Kontoguthaben und Summen.
Antwortfelder
| Feld | Typ | Beschreibung |
|---|---|---|
balance_brl | number | Verfügbares Guthaben. |
total_spent_brl | number | Gesamtausgaben des Kontos. |
total_recharged_brl | number | Insgesamt aufgeladen. |
currency | string | Immer "BRL". |
Beispiel
curl "https://kdefy-sms.com/api/v1/balance" \
-H "X-API-Key: $KDEFY_API_KEY"const res = await fetch("https://kdefy-sms.com/api/v1/balance", {
headers: { "X-API-Key": process.env.KDEFY_API_KEY },
});
const data = await res.json();
if (data.status !== "success") throw new Error(data.error);
console.log(data);import os, requests
r = requests.get(
"https://kdefy-sms.com/api/v1/balance",
headers={"X-API-Key": os.environ["KDEFY_API_KEY"]},
timeout=20,
)
data = r.json()
if data["status"] != "success":
raise RuntimeError(data["error"])
print(data)<?php
$ch = curl_init("https://kdefy-sms.com/api/v1/balance");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 20,
CURLOPT_HTTPHEADER => ["X-API-Key: " . getenv("KDEFY_API_KEY")],
]);
$data = json_decode(curl_exec($ch), true);
if (($data["status"] ?? null) !== "success") {
throw new RuntimeException($data["error"] ?? "erro_desconhecido");
}
print_r($data);require "net/http"
require "json"
uri = URI("https://kdefy-sms.com/api/v1/balance")
req = Net::HTTP::Get.new(uri, "X-API-Key" => ENV.fetch("KDEFY_API_KEY"))
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https", read_timeout: 20) { |http| http.request(req) }
data = JSON.parse(res.body)
abort(data["error"]) unless data["status"] == "success"
puts JSON.pretty_generate(data)#!/usr/bin/env bash
curl -sS --max-time 20 -G "https://kdefy-sms.com/api/v1/balance" \
-H "X-API-Key: $KDEFY_API_KEY" | jq .Antwort
{
"status": "success",
"balance_brl": 25.4,
"total_spent_brl": 12.1,
"total_recharged_brl": 37.5,
"currency": "BRL"
}
Testen
/api/v1/profile
Profil
Benutzername, Guthaben und Erstellungsdatum.
Antwortfelder
| Feld | Typ | Beschreibung |
|---|---|---|
username | string | Benutzername. |
balance_brl | number | Verfügbares Guthaben. |
created_at | string | Kontoerstellung (ISO 8601). |
Beispiel
curl "https://kdefy-sms.com/api/v1/profile" \
-H "X-API-Key: $KDEFY_API_KEY"const res = await fetch("https://kdefy-sms.com/api/v1/profile", {
headers: { "X-API-Key": process.env.KDEFY_API_KEY },
});
const data = await res.json();
if (data.status !== "success") throw new Error(data.error);
console.log(data);import os, requests
r = requests.get(
"https://kdefy-sms.com/api/v1/profile",
headers={"X-API-Key": os.environ["KDEFY_API_KEY"]},
timeout=20,
)
data = r.json()
if data["status"] != "success":
raise RuntimeError(data["error"])
print(data)<?php
$ch = curl_init("https://kdefy-sms.com/api/v1/profile");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 20,
CURLOPT_HTTPHEADER => ["X-API-Key: " . getenv("KDEFY_API_KEY")],
]);
$data = json_decode(curl_exec($ch), true);
if (($data["status"] ?? null) !== "success") {
throw new RuntimeException($data["error"] ?? "erro_desconhecido");
}
print_r($data);require "net/http"
require "json"
uri = URI("https://kdefy-sms.com/api/v1/profile")
req = Net::HTTP::Get.new(uri, "X-API-Key" => ENV.fetch("KDEFY_API_KEY"))
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https", read_timeout: 20) { |http| http.request(req) }
data = JSON.parse(res.body)
abort(data["error"]) unless data["status"] == "success"
puts JSON.pretty_generate(data)#!/usr/bin/env bash
curl -sS --max-time 20 -G "https://kdefy-sms.com/api/v1/profile" \
-H "X-API-Key: $KDEFY_API_KEY" | jq .Antwort
{
"status": "success",
"username": "maria",
"balance_brl": 25.4,
"created_at": "2026-09-01T12:00:00.000Z"
}
Testen
Katalog
/api/v1/countries
Länder
Liste der Länder. Verwenden Sie die id in country.
Antwortfelder
| Feld | Typ | Beschreibung |
|---|---|---|
countries[].id | integer | Länder-ID. In country verwenden. |
countries[].name | string | Name. |
countries[].dial_code | string | null | Vorwahl, z. B. +55. |
Beispiel
curl "https://kdefy-sms.com/api/v1/countries" \
-H "X-API-Key: $KDEFY_API_KEY"const res = await fetch("https://kdefy-sms.com/api/v1/countries", {
headers: { "X-API-Key": process.env.KDEFY_API_KEY },
});
const data = await res.json();
if (data.status !== "success") throw new Error(data.error);
console.log(data);import os, requests
r = requests.get(
"https://kdefy-sms.com/api/v1/countries",
headers={"X-API-Key": os.environ["KDEFY_API_KEY"]},
timeout=20,
)
data = r.json()
if data["status"] != "success":
raise RuntimeError(data["error"])
print(data)<?php
$ch = curl_init("https://kdefy-sms.com/api/v1/countries");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 20,
CURLOPT_HTTPHEADER => ["X-API-Key: " . getenv("KDEFY_API_KEY")],
]);
$data = json_decode(curl_exec($ch), true);
if (($data["status"] ?? null) !== "success") {
throw new RuntimeException($data["error"] ?? "erro_desconhecido");
}
print_r($data);require "net/http"
require "json"
uri = URI("https://kdefy-sms.com/api/v1/countries")
req = Net::HTTP::Get.new(uri, "X-API-Key" => ENV.fetch("KDEFY_API_KEY"))
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https", read_timeout: 20) { |http| http.request(req) }
data = JSON.parse(res.body)
abort(data["error"]) unless data["status"] == "success"
puts JSON.pretty_generate(data)#!/usr/bin/env bash
curl -sS --max-time 20 -G "https://kdefy-sms.com/api/v1/countries" \
-H "X-API-Key: $KDEFY_API_KEY" | jq .Antwort
{
"status": "success",
"countries": [
{
"id": 73,
"name": "Brasil",
"dial_code": "+55"
}
]
}
Testen
/api/v1/services
Dienste
Dienste eines Landes mit Bestand und Startpreis. Verwenden Sie code in service.
Parameter
| Name | Beschreibung | |
|---|---|---|
country | erforderlich | Länder-ID. |
Antwortfelder
| Feld | Typ | Beschreibung |
|---|---|---|
country | integer | Abgefragtes Land. |
services[].code | string | Code. In service verwenden. |
services[].name | string | Name. |
services[].available | integer | Bestand. |
services[].from_price_brl | number | null | Preis des günstigsten Angebots. |
Fehler
Beispiel
curl "https://kdefy-sms.com/api/v1/services?country=73" \
-H "X-API-Key: $KDEFY_API_KEY"const res = await fetch("https://kdefy-sms.com/api/v1/services?country=73", {
headers: { "X-API-Key": process.env.KDEFY_API_KEY },
});
const data = await res.json();
if (data.status !== "success") throw new Error(data.error);
console.log(data);import os, requests
r = requests.get(
"https://kdefy-sms.com/api/v1/services",
params={"country": 73},
headers={"X-API-Key": os.environ["KDEFY_API_KEY"]},
timeout=20,
)
data = r.json()
if data["status"] != "success":
raise RuntimeError(data["error"])
print(data)<?php
$ch = curl_init("https://kdefy-sms.com/api/v1/services?country=73");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 20,
CURLOPT_HTTPHEADER => ["X-API-Key: " . getenv("KDEFY_API_KEY")],
]);
$data = json_decode(curl_exec($ch), true);
if (($data["status"] ?? null) !== "success") {
throw new RuntimeException($data["error"] ?? "erro_desconhecido");
}
print_r($data);require "net/http"
require "json"
uri = URI("https://kdefy-sms.com/api/v1/services?country=73")
req = Net::HTTP::Get.new(uri, "X-API-Key" => ENV.fetch("KDEFY_API_KEY"))
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https", read_timeout: 20) { |http| http.request(req) }
data = JSON.parse(res.body)
abort(data["error"]) unless data["status"] == "success"
puts JSON.pretty_generate(data)#!/usr/bin/env bash
curl -sS --max-time 20 -G "https://kdefy-sms.com/api/v1/services" \
-H "X-API-Key: $KDEFY_API_KEY" \
--data-urlencode "country=73" | jq .Antwort
{
"status": "success",
"country": 73,
"services": [
{
"code": "wa",
"name": "WhatsApp",
"available": 1240,
"from_price_brl": 7.1
}
]
}
Testen
/api/v1/operators
Netzbetreiber
Netzbetreiber eines Landes. Optional in operator beim Kauf.
Parameter
| Name | Beschreibung | |
|---|---|---|
country | erforderlich | Länder-ID. |
Antwortfelder
| Feld | Typ | Beschreibung |
|---|---|---|
country | integer | Abgefragtes Land. |
operators[].id | string | Netzbetreiber-ID. In operator verwenden. |
operators[].name | string | Name. |
Fehler
Beispiel
curl "https://kdefy-sms.com/api/v1/operators?country=73" \
-H "X-API-Key: $KDEFY_API_KEY"const res = await fetch("https://kdefy-sms.com/api/v1/operators?country=73", {
headers: { "X-API-Key": process.env.KDEFY_API_KEY },
});
const data = await res.json();
if (data.status !== "success") throw new Error(data.error);
console.log(data);import os, requests
r = requests.get(
"https://kdefy-sms.com/api/v1/operators",
params={"country": 73},
headers={"X-API-Key": os.environ["KDEFY_API_KEY"]},
timeout=20,
)
data = r.json()
if data["status"] != "success":
raise RuntimeError(data["error"])
print(data)<?php
$ch = curl_init("https://kdefy-sms.com/api/v1/operators?country=73");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 20,
CURLOPT_HTTPHEADER => ["X-API-Key: " . getenv("KDEFY_API_KEY")],
]);
$data = json_decode(curl_exec($ch), true);
if (($data["status"] ?? null) !== "success") {
throw new RuntimeException($data["error"] ?? "erro_desconhecido");
}
print_r($data);require "net/http"
require "json"
uri = URI("https://kdefy-sms.com/api/v1/operators?country=73")
req = Net::HTTP::Get.new(uri, "X-API-Key" => ENV.fetch("KDEFY_API_KEY"))
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https", read_timeout: 20) { |http| http.request(req) }
data = JSON.parse(res.body)
abort(data["error"]) unless data["status"] == "success"
puts JSON.pretty_generate(data)#!/usr/bin/env bash
curl -sS --max-time 20 -G "https://kdefy-sms.com/api/v1/operators" \
-H "X-API-Key: $KDEFY_API_KEY" \
--data-urlencode "country=73" | jq .Antwort
{
"status": "success",
"country": 73,
"operators": [
{
"id": "vivo",
"name": "vivo"
}
]
}
Testen
/api/v1/offers
Angebote
Preisstufen und Bestand eines Dienstes in einem Land. Günstige Stufen haben wenig Bestand; teurere haben meist Nummern.
Parameter
| Name | Beschreibung | |
|---|---|---|
country | erforderlich | Länder-ID. |
service | erforderlich | Dienstcode. |
Antwortfelder
| Feld | Typ | Beschreibung |
|---|---|---|
offers[].price_brl | number | Preis der Stufe. |
offers[].available | integer | Bestand der Stufe. |
Fehler
Beispiel
curl "https://kdefy-sms.com/api/v1/offers?country=73&service=wa" \
-H "X-API-Key: $KDEFY_API_KEY"const res = await fetch("https://kdefy-sms.com/api/v1/offers?country=73&service=wa", {
headers: { "X-API-Key": process.env.KDEFY_API_KEY },
});
const data = await res.json();
if (data.status !== "success") throw new Error(data.error);
console.log(data);import os, requests
r = requests.get(
"https://kdefy-sms.com/api/v1/offers",
params={"country": 73, "service": "wa"},
headers={"X-API-Key": os.environ["KDEFY_API_KEY"]},
timeout=20,
)
data = r.json()
if data["status"] != "success":
raise RuntimeError(data["error"])
print(data)<?php
$ch = curl_init("https://kdefy-sms.com/api/v1/offers?country=73&service=wa");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 20,
CURLOPT_HTTPHEADER => ["X-API-Key: " . getenv("KDEFY_API_KEY")],
]);
$data = json_decode(curl_exec($ch), true);
if (($data["status"] ?? null) !== "success") {
throw new RuntimeException($data["error"] ?? "erro_desconhecido");
}
print_r($data);require "net/http"
require "json"
uri = URI("https://kdefy-sms.com/api/v1/offers?country=73&service=wa")
req = Net::HTTP::Get.new(uri, "X-API-Key" => ENV.fetch("KDEFY_API_KEY"))
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https", read_timeout: 20) { |http| http.request(req) }
data = JSON.parse(res.body)
abort(data["error"]) unless data["status"] == "success"
puts JSON.pretty_generate(data)#!/usr/bin/env bash
curl -sS --max-time 20 -G "https://kdefy-sms.com/api/v1/offers" \
-H "X-API-Key: $KDEFY_API_KEY" \
--data-urlencode "country=73" \
--data-urlencode "service=wa" | jq .Antwort
{
"status": "success",
"country": 73,
"service": "wa",
"offers": [
{
"price_brl": 7.1,
"available": 12
},
{
"price_brl": 8.4,
"available": 340
}
]
}
Testen
Nummern
/api/v1/number/get
Nummer kaufen
Kauft eine Nummer oder mehrere mit quantity. Wird sofort abgebucht. Wird die Nummer storniert oder läuft ohne Code ab, geht der Betrag zurück aufs Guthaben.
Parameter
| Name | Beschreibung | |
|---|---|---|
country | erforderlich | Länder-ID. |
service | erforderlich | Dienstcode. |
max_price_brl | optional | Preisobergrenze. Es wird die teuerste Stufe genutzt, die passt. Ohne Angabe die günstigste. |
operator | optional | Netzbetreiber. Standard: beliebig. Schränkt den Bestand ein. |
quantity | optional | Menge, von 1 bis 50. Ohne Angabe wird 1 gekauft und die Antwort kommt im einfachen Format. |
request_id | optional | Schlüssel gegen Doppelkäufe, 8 bis 80 Zeichen. Der Header Idempotency-Key funktioniert ebenfalls. Empfohlen. |
Antwortfelder
| Feld | Typ | Beschreibung |
|---|---|---|
id | string | Aktivierungs-ID. Wird in /number/status, /number/cancel und /number/finish verwendet. |
service | string | Dienstcode. |
service_name | string | Dienstname. Stammt vom Anbieter und wird nicht übersetzt. |
country | integer | Länder-ID. |
country_name | string | Ländername. |
phone | string | Nummer mit Landesvorwahl, nur Ziffern (5511999999999). |
state | string | Aktivierungsstatus (siehe Status). Fester englischer Wert; verwenden Sie diesen in der Logik. |
state_label | string | Status als Text in der Kontosprache. Nur zur Anzeige. |
code | string | null | Zuletzt empfangener Code. null, solange keiner eingetroffen ist. |
codes | array | Alle Codes, [{ code, received_at }], vom ältesten zum neuesten. |
price_brl | number | Berechneter Betrag in Real. |
seconds_left | integer | Sekunden bis zum Ablauf der Aktivierung. |
cancel_in_seconds | integer | Sekunden bis zur Stornierungsmöglichkeit. 0 = bereits möglich. |
balance_brl | number | Guthaben nach dem Kauf. |
| mit quantity | ||
requested | integer | Angeforderte Menge. |
purchased | integer | Gekaufte Menge. |
failed | integer | Nicht gekaufte Menge (wird nicht berechnet). |
numbers | array | Aktivierungen mit denselben Feldern wie oben. |
errors | array | Fehlercodes der fehlgeschlagenen Käufe (Teilkauf). |
Fehler
Beispiel
curl "https://kdefy-sms.com/api/v1/number/get?country=73&service=wa&request_id=pedido-0001" \
-H "X-API-Key: $KDEFY_API_KEY"const res = await fetch("https://kdefy-sms.com/api/v1/number/get?country=73&service=wa&request_id=pedido-0001", {
headers: { "X-API-Key": process.env.KDEFY_API_KEY },
});
const data = await res.json();
if (data.status !== "success") throw new Error(data.error);
console.log(data);import os, requests
r = requests.get(
"https://kdefy-sms.com/api/v1/number/get",
params={"country": 73, "service": "wa", "request_id": "pedido-0001"},
headers={"X-API-Key": os.environ["KDEFY_API_KEY"]},
timeout=20,
)
data = r.json()
if data["status"] != "success":
raise RuntimeError(data["error"])
print(data)<?php
$ch = curl_init("https://kdefy-sms.com/api/v1/number/get?country=73&service=wa&request_id=pedido-0001");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 20,
CURLOPT_HTTPHEADER => ["X-API-Key: " . getenv("KDEFY_API_KEY")],
]);
$data = json_decode(curl_exec($ch), true);
if (($data["status"] ?? null) !== "success") {
throw new RuntimeException($data["error"] ?? "erro_desconhecido");
}
print_r($data);require "net/http"
require "json"
uri = URI("https://kdefy-sms.com/api/v1/number/get?country=73&service=wa&request_id=pedido-0001")
req = Net::HTTP::Get.new(uri, "X-API-Key" => ENV.fetch("KDEFY_API_KEY"))
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https", read_timeout: 20) { |http| http.request(req) }
data = JSON.parse(res.body)
abort(data["error"]) unless data["status"] == "success"
puts JSON.pretty_generate(data)#!/usr/bin/env bash
curl -sS --max-time 20 -G "https://kdefy-sms.com/api/v1/number/get" \
-H "X-API-Key: $KDEFY_API_KEY" \
--data-urlencode "country=73" \
--data-urlencode "service=wa" \
--data-urlencode "request_id=pedido-0001" | jq .Antwort
{
"id": "1842",
"service": "wa",
"service_name": "WhatsApp",
"country": 73,
"country_name": "Brasil",
"phone": "5511999999999",
"state": "waiting",
"state_label": "Aguardando código",
"code": null,
"codes": [],
"price_brl": 8.4,
"seconds_left": 1200,
"cancel_in_seconds": 120,
"status": "success",
"balance_brl": 17
}
Antwort mit quantity=2
{
"status": "success",
"requested": 2,
"purchased": 2,
"failed": 0,
"numbers": [
{
"id": "1842",
"service": "wa",
"service_name": "WhatsApp",
"country": 73,
"country_name": "Brasil",
"phone": "5511999999999",
"state": "waiting",
"state_label": "Aguardando código",
"code": null,
"codes": [],
"price_brl": 8.4,
"seconds_left": 1200,
"cancel_in_seconds": 120
},
{
"id": "1843",
"service": "wa",
"service_name": "WhatsApp",
"country": 73,
"country_name": "Brasil",
"phone": "5511988887777",
"state": "waiting",
"state_label": "Aguardando código",
"code": null,
"codes": [],
"price_brl": 8.4,
"seconds_left": 1200,
"cancel_in_seconds": 120
}
],
"balance_brl": 8.6
}
Testen
/api/v1/number/status
Status und Code
Aktivierungsstatus und empfangene Codes.
Parameter
| Name | Beschreibung | |
|---|---|---|
id | erforderlich | Aktivierungs-ID, stammt aus dem Kauf. |
Antwortfelder
| Feld | Typ | Beschreibung |
|---|---|---|
id | string | Aktivierungs-ID. Wird in /number/status, /number/cancel und /number/finish verwendet. |
service | string | Dienstcode. |
service_name | string | Dienstname. Stammt vom Anbieter und wird nicht übersetzt. |
country | integer | Länder-ID. |
country_name | string | Ländername. |
phone | string | Nummer mit Landesvorwahl, nur Ziffern (5511999999999). |
state | string | Aktivierungsstatus (siehe Status). Fester englischer Wert; verwenden Sie diesen in der Logik. |
state_label | string | Status als Text in der Kontosprache. Nur zur Anzeige. |
code | string | null | Zuletzt empfangener Code. null, solange keiner eingetroffen ist. |
codes | array | Alle Codes, [{ code, received_at }], vom ältesten zum neuesten. |
price_brl | number | Berechneter Betrag in Real. |
seconds_left | integer | Sekunden bis zum Ablauf der Aktivierung. |
cancel_in_seconds | integer | Sekunden bis zur Stornierungsmöglichkeit. 0 = bereits möglich. |
Fehler
Beispiel
curl "https://kdefy-sms.com/api/v1/number/status?id=1842" \
-H "X-API-Key: $KDEFY_API_KEY"const res = await fetch("https://kdefy-sms.com/api/v1/number/status?id=1842", {
headers: { "X-API-Key": process.env.KDEFY_API_KEY },
});
const data = await res.json();
if (data.status !== "success") throw new Error(data.error);
console.log(data);import os, requests
r = requests.get(
"https://kdefy-sms.com/api/v1/number/status",
params={"id": "1842"},
headers={"X-API-Key": os.environ["KDEFY_API_KEY"]},
timeout=20,
)
data = r.json()
if data["status"] != "success":
raise RuntimeError(data["error"])
print(data)<?php
$ch = curl_init("https://kdefy-sms.com/api/v1/number/status?id=1842");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 20,
CURLOPT_HTTPHEADER => ["X-API-Key: " . getenv("KDEFY_API_KEY")],
]);
$data = json_decode(curl_exec($ch), true);
if (($data["status"] ?? null) !== "success") {
throw new RuntimeException($data["error"] ?? "erro_desconhecido");
}
print_r($data);require "net/http"
require "json"
uri = URI("https://kdefy-sms.com/api/v1/number/status?id=1842")
req = Net::HTTP::Get.new(uri, "X-API-Key" => ENV.fetch("KDEFY_API_KEY"))
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https", read_timeout: 20) { |http| http.request(req) }
data = JSON.parse(res.body)
abort(data["error"]) unless data["status"] == "success"
puts JSON.pretty_generate(data)#!/usr/bin/env bash
curl -sS --max-time 20 -G "https://kdefy-sms.com/api/v1/number/status" \
-H "X-API-Key: $KDEFY_API_KEY" \
--data-urlencode "id=1842" | jq .Antwort
{
"status": "success",
"id": "1842",
"service": "wa",
"service_name": "WhatsApp",
"country": 73,
"country_name": "Brasil",
"phone": "5511999999999",
"state": "code_received",
"state_label": "Código recebido",
"code": "123456",
"codes": [
{
"code": "123456",
"received_at": "2026-10-19T14:02:11.000Z"
}
],
"price_brl": 8.4,
"seconds_left": 1103,
"cancel_in_seconds": 0
}
Testen
/api/v1/number/cancel
Stornieren
Storniert und erstattet den Betrag. Nur ohne Code und 2 Min. nach dem Kauf; davor antwortet die API mit cancelamento_muito_cedo und retry_in_seconds. Über die API gibt es keine Strafe für aufeinanderfolgende Stornierungen.
Parameter
| Name | Beschreibung | |
|---|---|---|
id | erforderlich | Aktivierungs-ID. |
Antwortfelder
| Feld | Typ | Beschreibung |
|---|---|---|
id | string | Aktivierungs-ID. |
state | string | Immer "cancelled". |
refunded_brl | number | Erstatteter Betrag. |
balance_brl | number | Guthaben nach der Erstattung. |
Fehler
Beispiel
curl "https://kdefy-sms.com/api/v1/number/cancel?id=1842" \
-H "X-API-Key: $KDEFY_API_KEY"const res = await fetch("https://kdefy-sms.com/api/v1/number/cancel?id=1842", {
headers: { "X-API-Key": process.env.KDEFY_API_KEY },
});
const data = await res.json();
if (data.status !== "success") throw new Error(data.error);
console.log(data);import os, requests
r = requests.get(
"https://kdefy-sms.com/api/v1/number/cancel",
params={"id": "1842"},
headers={"X-API-Key": os.environ["KDEFY_API_KEY"]},
timeout=20,
)
data = r.json()
if data["status"] != "success":
raise RuntimeError(data["error"])
print(data)<?php
$ch = curl_init("https://kdefy-sms.com/api/v1/number/cancel?id=1842");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 20,
CURLOPT_HTTPHEADER => ["X-API-Key: " . getenv("KDEFY_API_KEY")],
]);
$data = json_decode(curl_exec($ch), true);
if (($data["status"] ?? null) !== "success") {
throw new RuntimeException($data["error"] ?? "erro_desconhecido");
}
print_r($data);require "net/http"
require "json"
uri = URI("https://kdefy-sms.com/api/v1/number/cancel?id=1842")
req = Net::HTTP::Get.new(uri, "X-API-Key" => ENV.fetch("KDEFY_API_KEY"))
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https", read_timeout: 20) { |http| http.request(req) }
data = JSON.parse(res.body)
abort(data["error"]) unless data["status"] == "success"
puts JSON.pretty_generate(data)#!/usr/bin/env bash
curl -sS --max-time 20 -G "https://kdefy-sms.com/api/v1/number/cancel" \
-H "X-API-Key: $KDEFY_API_KEY" \
--data-urlencode "id=1842" | jq .Antwort
{
"status": "success",
"id": "1842",
"state": "cancelled",
"refunded_brl": 8.4,
"balance_brl": 25.4
}
Testen
/api/v1/number/finish
Abschließen
Beendet die Aktivierung nach dem Code. Wartet nicht mehr auf weitere Codes. Keine Erstattung.
Parameter
| Name | Beschreibung | |
|---|---|---|
id | erforderlich | Aktivierungs-ID. |
Antwortfelder
| Feld | Typ | Beschreibung |
|---|---|---|
id | string | Aktivierungs-ID. |
state | string | Immer "completed". |
Fehler
Beispiel
curl "https://kdefy-sms.com/api/v1/number/finish?id=1842" \
-H "X-API-Key: $KDEFY_API_KEY"const res = await fetch("https://kdefy-sms.com/api/v1/number/finish?id=1842", {
headers: { "X-API-Key": process.env.KDEFY_API_KEY },
});
const data = await res.json();
if (data.status !== "success") throw new Error(data.error);
console.log(data);import os, requests
r = requests.get(
"https://kdefy-sms.com/api/v1/number/finish",
params={"id": "1842"},
headers={"X-API-Key": os.environ["KDEFY_API_KEY"]},
timeout=20,
)
data = r.json()
if data["status"] != "success":
raise RuntimeError(data["error"])
print(data)<?php
$ch = curl_init("https://kdefy-sms.com/api/v1/number/finish?id=1842");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 20,
CURLOPT_HTTPHEADER => ["X-API-Key: " . getenv("KDEFY_API_KEY")],
]);
$data = json_decode(curl_exec($ch), true);
if (($data["status"] ?? null) !== "success") {
throw new RuntimeException($data["error"] ?? "erro_desconhecido");
}
print_r($data);require "net/http"
require "json"
uri = URI("https://kdefy-sms.com/api/v1/number/finish?id=1842")
req = Net::HTTP::Get.new(uri, "X-API-Key" => ENV.fetch("KDEFY_API_KEY"))
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https", read_timeout: 20) { |http| http.request(req) }
data = JSON.parse(res.body)
abort(data["error"]) unless data["status"] == "success"
puts JSON.pretty_generate(data)#!/usr/bin/env bash
curl -sS --max-time 20 -G "https://kdefy-sms.com/api/v1/number/finish" \
-H "X-API-Key: $KDEFY_API_KEY" \
--data-urlencode "id=1842" | jq .Antwort
{
"status": "success",
"id": "1842",
"state": "completed"
}
Testen
Verlauf
/api/v1/activations
Aktivierungen auflisten
Ihre Aktivierungen, auch die von der Website, von der neuesten zur ältesten.
Parameter
| Name | Beschreibung | |
|---|---|---|
state | optional | "active" listet nur laufende auf. |
limit | optional | Maximale Anzahl. Standard 50, max. 100. |
Antwortfelder
| Feld | Typ | Beschreibung |
|---|---|---|
activations[] | array | Aktivierungen mit denselben Feldern wie /number/status. |
Beispiel
curl "https://kdefy-sms.com/api/v1/activations?state=active" \
-H "X-API-Key: $KDEFY_API_KEY"const res = await fetch("https://kdefy-sms.com/api/v1/activations?state=active", {
headers: { "X-API-Key": process.env.KDEFY_API_KEY },
});
const data = await res.json();
if (data.status !== "success") throw new Error(data.error);
console.log(data);import os, requests
r = requests.get(
"https://kdefy-sms.com/api/v1/activations",
params={"state": "active"},
headers={"X-API-Key": os.environ["KDEFY_API_KEY"]},
timeout=20,
)
data = r.json()
if data["status"] != "success":
raise RuntimeError(data["error"])
print(data)<?php
$ch = curl_init("https://kdefy-sms.com/api/v1/activations?state=active");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 20,
CURLOPT_HTTPHEADER => ["X-API-Key: " . getenv("KDEFY_API_KEY")],
]);
$data = json_decode(curl_exec($ch), true);
if (($data["status"] ?? null) !== "success") {
throw new RuntimeException($data["error"] ?? "erro_desconhecido");
}
print_r($data);require "net/http"
require "json"
uri = URI("https://kdefy-sms.com/api/v1/activations?state=active")
req = Net::HTTP::Get.new(uri, "X-API-Key" => ENV.fetch("KDEFY_API_KEY"))
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https", read_timeout: 20) { |http| http.request(req) }
data = JSON.parse(res.body)
abort(data["error"]) unless data["status"] == "success"
puts JSON.pretty_generate(data)#!/usr/bin/env bash
curl -sS --max-time 20 -G "https://kdefy-sms.com/api/v1/activations" \
-H "X-API-Key: $KDEFY_API_KEY" \
--data-urlencode "state=active" | jq .Antwort
{
"status": "success",
"activations": [
{
"id": "1842",
"service": "wa",
"service_name": "WhatsApp",
"country": 73,
"country_name": "Brasil",
"phone": "5511999999999",
"state": "waiting",
"state_label": "Aguardando código",
"code": null,
"codes": [],
"price_brl": 8.4,
"seconds_left": 1200,
"cancel_in_seconds": 120
}
]
}
Testen
/api/v1/transactions
Kontoauszug
Aufladungen, Käufe und Erstattungen.
Parameter
| Name | Beschreibung | |
|---|---|---|
limit | optional | Maximale Anzahl. Standard 50, max. 200. |
Antwortfelder
| Feld | Typ | Beschreibung |
|---|---|---|
transactions[].type | string | Typ (PURCHASE, REFUND...). |
transactions[].amount_brl | number | Betrag. |
transactions[].balance_after_brl | number | Guthaben danach. |
transactions[].description | string | Beschreibung. |
transactions[].created_at | string | Datum (ISO 8601). |
Beispiel
curl "https://kdefy-sms.com/api/v1/transactions?limit=20" \
-H "X-API-Key: $KDEFY_API_KEY"const res = await fetch("https://kdefy-sms.com/api/v1/transactions?limit=20", {
headers: { "X-API-Key": process.env.KDEFY_API_KEY },
});
const data = await res.json();
if (data.status !== "success") throw new Error(data.error);
console.log(data);import os, requests
r = requests.get(
"https://kdefy-sms.com/api/v1/transactions",
params={"limit": 20},
headers={"X-API-Key": os.environ["KDEFY_API_KEY"]},
timeout=20,
)
data = r.json()
if data["status"] != "success":
raise RuntimeError(data["error"])
print(data)<?php
$ch = curl_init("https://kdefy-sms.com/api/v1/transactions?limit=20");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 20,
CURLOPT_HTTPHEADER => ["X-API-Key: " . getenv("KDEFY_API_KEY")],
]);
$data = json_decode(curl_exec($ch), true);
if (($data["status"] ?? null) !== "success") {
throw new RuntimeException($data["error"] ?? "erro_desconhecido");
}
print_r($data);require "net/http"
require "json"
uri = URI("https://kdefy-sms.com/api/v1/transactions?limit=20")
req = Net::HTTP::Get.new(uri, "X-API-Key" => ENV.fetch("KDEFY_API_KEY"))
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https", read_timeout: 20) { |http| http.request(req) }
data = JSON.parse(res.body)
abort(data["error"]) unless data["status"] == "success"
puts JSON.pretty_generate(data)#!/usr/bin/env bash
curl -sS --max-time 20 -G "https://kdefy-sms.com/api/v1/transactions" \
-H "X-API-Key: $KDEFY_API_KEY" \
--data-urlencode "limit=20" | jq .Antwort
{
"status": "success",
"transactions": [
{
"type": "PURCHASE",
"amount_brl": 8.4,
"balance_after_brl": 17,
"description": "Compra WhatsApp · Brasil (API)",
"created_at": "2026-10-19T14:00:00.000Z"
}
]
}
Testen
Fehler
Format: { "status": "error", "error": "saldo_insuficiente", "message": "..." }. Entscheiden Sie anhand des Felds error.
| HTTP | error | Wann | Was zu tun ist |
|---|---|---|---|
| 401 | token_nao_informado token_invalido | Token fehlt, ist ungültig oder widerrufen. | Token korrigieren. Nicht wiederholen. |
| 403 | conta_bloqueada token_suspenso | Konto gesperrt oder API vom Admin ausgesetzt. | Wenden Sie sich an den Support. |
| 400 | pais_invalido servico_invalido id_invalido quantidade_invalida preco_invalido operador_invalido request_id_invalido | Parameter fehlt oder ist ungültig. | Aufruf korrigieren. |
| 402 | saldo_insuficiente | Guthaben niedriger als der Preis. | Laden Sie auf der Website auf. |
| 404 | sem_numeros_disponiveis oferta_indisponivel | Aktuell kein Bestand in dieser Stufe. | max_price_brl erhöhen, Land wechseln oder später erneut versuchen. |
| 404 | ativacao_nao_encontrada | ID existiert nicht oder gehört zu einem anderen Konto. | Prüfen Sie die id. |
| 409 | requisicao_em_andamento | Die request_id wird noch verarbeitet. | Warten und denselben Aufruf wiederholen. |
| 409 | cancelamento_muito_cedo | Weniger als 2 Min. seit dem Kauf. | retry_in_seconds abwarten. |
| 409 | ativacao_nao_cancelavel ativacao_nao_finalizavel | Der aktuelle Status erlaubt die Aktion nicht. | Prüfen Sie /number/status. |
| 422 | request_id_reutilizada | Dieselbe request_id mit anderen Parametern. | Verwenden Sie eine neue request_id. |
| 422 | preco_abaixo_do_minimo | max_price_brl liegt unter dem günstigsten Angebot. | Auf min_price_brl oder mehr erhöhen. |
| 429 | limite_de_requisicoes limite_de_numeros | Limit überschritten. | retry_in_seconds abwarten. |
| 502 | falha_temporaria | Vorübergehende Instabilität. Ihnen wird nichts berechnet. | Mit zunehmender Wartezeit wiederholen, gleiche request_id. |
Häufige Fragen
Wie lange dauert der Code?
In der Regel Sekunden, hängt aber vom Dienst ab. Die Aktivierung wartet bis zu 20 Min. Ohne Code in dieser Zeit läuft sie ab und der Betrag geht zurück aufs Guthaben.
Mein Kauf lief in ein Timeout. Und jetzt?
Wiederholen Sie denselben Aufruf mit derselben request_id: Die ursprüngliche Antwort kommt zurück und es wird nichts erneut berechnet. Haben Sie keine request_id verwendet, listen Sie /activations?state=active auf, bevor Sie erneut kaufen.
Kann ich direkt nach dem Kauf stornieren?
Nein. Die Stornierung ist erst 2 Min. nach dem Kauf möglich. cancel_in_seconds zeigt die Restzeit.
sem_numeros_disponiveis trotz Guthaben. Warum?
Die Preisstufe hat aktuell keinen Bestand. Erhöhen Sie max_price_brl, wechseln Sie das Land oder sehen Sie in /offers, wo Bestand ist.
Kann sich der Preis zwischen Abfrage und Kauf ändern?
Das ist möglich. Maßgeblich ist price_brl in der Kaufantwort, und max_price_brl verhindert, dass Ihre Obergrenze überschritten wird.
Brauche ich request_id?
Sie ist nicht Pflicht, aber nutzen Sie sie in jeder Automatisierung. Ohne sie kauft ein versehentlich wiederholter Aufruf doppelt.
Kann ich mehr als 50 Nummern kaufen?
Nicht in einer Anfrage, und die Obergrenze liegt bei 50 pro Minute pro Konto. Darüber antwortet die API mit limite_de_numeros.
Warum kommt die Antwort auf Portugiesisch?
message und state_label folgen der Kontosprache. Erzwingen Sie sie mit ?lang=pt oder ?lang=en. JSON-Schlüssel, state und Fehlercodes sind immer dieselben.
Wie lade ich mein Guthaben auf?
Über die Website mit PIX. Das API-Guthaben ist dasselbe wie auf der Website.
Mein Token ist durchgesickert.
Erzeugen Sie unter API auf der Website einen neuen. Der alte funktioniert sofort nicht mehr. Bei ungewöhnlicher Nutzung wenden Sie sich an den Support.
Nutzungsregeln
- Jede Aktivierung wartet bis zu 20 Min. auf den Code. Ohne Code läuft sie ab und der Betrag geht zurück aufs Guthaben.
- Nach dem ersten Code gibt es keine Erstattung.
- Sie sehen und bedienen nur Ihre eigenen Aktivierungen.
- Guthaben wird über die Website aufgeladen (PIX).
- Jede Anfrage wird im Konto protokolliert. Der Admin kann die Token-Nutzung einsehen.
- Missbrauch oder Betrug kann zur Sperrung des Kontos führen.