Pedir un código OTP
curl --request POST \
--url https://api.qbank.cl/platform/v1/otp/challenges \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"action": "payout",
"channel": "whatsapp"
}
'import requests
url = "https://api.qbank.cl/platform/v1/otp/challenges"
payload = {
"action": "payout",
"channel": "whatsapp"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({action: 'payout', channel: 'whatsapp'})
};
fetch('https://api.qbank.cl/platform/v1/otp/challenges', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.qbank.cl/platform/v1/otp/challenges",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'action' => 'payout',
'channel' => 'whatsapp'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.qbank.cl/platform/v1/otp/challenges"
payload := strings.NewReader("{\n \"action\": \"payout\",\n \"channel\": \"whatsapp\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.qbank.cl/platform/v1/otp/challenges")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"action\": \"payout\",\n \"channel\": \"whatsapp\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qbank.cl/platform/v1/otp/challenges")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"action\": \"payout\",\n \"channel\": \"whatsapp\"\n}"
response = http.request(request)
puts response.read_body{
"challenge_id": "6f1c02aa-93a1-4f0e-a7d1-1f2e3c4b5a69",
"account_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"action": "payout",
"channel": "whatsapp",
"phone": "********5678",
"status": "pending",
"created_at": "2026-07-08T21:00:00Z",
"expires_at": "2026-07-08T21:10:00Z"
}
Pedir un código OTP
Envía un código de un solo uso al teléfono de la cuenta por el canal configurado para la acción. Requiere sesión de usuario (JWT) — las API keys reciben 403 session_required. Aplican límites de envío por hora.
POST
/
v1
/
otp
/
challenges
Pedir un código OTP
curl --request POST \
--url https://api.qbank.cl/platform/v1/otp/challenges \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"action": "payout",
"channel": "whatsapp"
}
'import requests
url = "https://api.qbank.cl/platform/v1/otp/challenges"
payload = {
"action": "payout",
"channel": "whatsapp"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({action: 'payout', channel: 'whatsapp'})
};
fetch('https://api.qbank.cl/platform/v1/otp/challenges', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.qbank.cl/platform/v1/otp/challenges",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'action' => 'payout',
'channel' => 'whatsapp'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.qbank.cl/platform/v1/otp/challenges"
payload := strings.NewReader("{\n \"action\": \"payout\",\n \"channel\": \"whatsapp\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.qbank.cl/platform/v1/otp/challenges")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"action\": \"payout\",\n \"channel\": \"whatsapp\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qbank.cl/platform/v1/otp/challenges")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"action\": \"payout\",\n \"channel\": \"whatsapp\"\n}"
response = http.request(request)
puts response.read_body{
"challenge_id": "6f1c02aa-93a1-4f0e-a7d1-1f2e3c4b5a69",
"account_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"action": "payout",
"channel": "whatsapp",
"phone": "********5678",
"status": "pending",
"created_at": "2026-07-08T21:00:00Z",
"expires_at": "2026-07-08T21:10:00Z"
}
Autorizaciones
JWT de sesión (de register/login) o llave de API (pk_...).
X-API-Key: <token> se acepta como header alternativo.
Cuerpo
application/json
Opciones disponibles:
login, payout, crypto_withdrawal, transfer, banking_operation, card_reveal, api_key_create, member_add, phone_change Canal de envío opcional. Si se omite, el servidor lo resuelve desde las preferencias OTP del miembro, con el default de la org como respaldo. El valor se normaliza sin importar mayúsculas.
Opciones disponibles:
sms, whatsapp, email, totp Respuesta
Desafío creado; el código va en camino. El channel resuelto y su destino enmascarado (phone) llegan en el cuerpo.
Opciones disponibles:
login, payout, crypto_withdrawal, transfer, banking_operation, card_reveal, api_key_create, member_add, phone_change Opciones disponibles:
sms, whatsapp, email, totp Destino enmascarado al que viajó el código (teléfono o email), o authenticator_app para TOTP.
Opciones disponibles:
pending, verified, consumed, expired