Payment methods
/v1/payment-methods — métodos de pago tokenizados sobre tu cuenta de
Wompi. Ver también el concepto Método de pago.
El objeto PaymentMethod
{
"id": "pm_01HZXK7QJ5M8Z9X2R3TVQ7A1B2",
"customer_id": "cus_01HZXK7QJ5M8Z9X2R3TVQ7A1B2",
"type": "CARD",
"brand": "VISA",
"last4": "4242",
"exp_month": 12,
"exp_year": 2029,
"is_default": true,
"state": "available",
"created_at": "2026-08-24T15:00:00Z"
}| Campo | Tipo |
|---|---|
id | string |
customer_id | string |
type | string (CARD) |
brand | string |
last4 | string |
exp_month | integer |
exp_year | integer |
is_default | boolean |
state | string (pending | available | verification_pending) |
created_at | datetime |
Obtener configuración de tokenización
GET /v1/payment-methods/setup
Devuelve la llave pública de Wompi de tu cuenta, los acceptance tokens y la URL de tokenización. Ningún secreto sale del servidor.
curl
curl https://api.rekurra.dev/v1/payment-methods/setup \
-H "Authorization: Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX"JavaScript (fetch)
const res = await fetch("https://api.rekurra.dev/v1/payment-methods/setup", {
headers: { Authorization: "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX" },
});
const setup = await res.json();Python (requests)
import requests
res = requests.get(
"https://api.rekurra.dev/v1/payment-methods/setup",
headers={"Authorization": "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX"},
)
setup = res.json()Response — 200 OK
{
"public_key": "pub_prod_XXXXXXXXXXXXXXXXXXXX",
"acceptance_token": "eyJhbGciOi...",
"tokenization_url": "https://production.wompi.co/v1/tokens/cards"
}Crear un método de pago
POST /v1/payment-methods
Request body
{
"customer_id": "cus_01HZXK7QJ5M8Z9X2R3TVQ7A1B2",
"type": "CARD",
"token": "tok_test_1234_abcd",
"acceptance_token": "eyJhbGciOi...",
"accept_personal_auth": "eyJhbGciOi...",
"set_default": true
}| Campo | Requerido |
|---|---|
customer_id | Sí |
type | Sí (CARD) |
token | Sí — token devuelto por Wompi al tokenizar la tarjeta |
acceptance_token | Sí |
accept_personal_auth | Sí |
set_default | No |
curl
curl -X POST https://api.rekurra.dev/v1/payment-methods \
-H "Authorization: Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX" \
-H "Content-Type: application/json" \
-d '{
"customer_id": "cus_01HZXK7QJ5M8Z9X2R3TVQ7A1B2",
"type": "CARD",
"token": "tok_test_1234_abcd",
"acceptance_token": "eyJhbGciOi...",
"accept_personal_auth": "eyJhbGciOi...",
"set_default": true
}'JavaScript (fetch)
const res = await fetch("https://api.rekurra.dev/v1/payment-methods", {
method: "POST",
headers: {
Authorization: "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX",
"Content-Type": "application/json",
},
body: JSON.stringify({
customer_id: "cus_01HZXK7QJ5M8Z9X2R3TVQ7A1B2",
type: "CARD",
token: "tok_test_1234_abcd",
acceptance_token: "eyJhbGciOi...",
accept_personal_auth: "eyJhbGciOi...",
set_default: true,
}),
});
const paymentMethod = await res.json();Python (requests)
import requests
res = requests.post(
"https://api.rekurra.dev/v1/payment-methods",
headers={
"Authorization": "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX",
"Content-Type": "application/json",
},
json={
"customer_id": "cus_01HZXK7QJ5M8Z9X2R3TVQ7A1B2",
"type": "CARD",
"token": "tok_test_1234_abcd",
"acceptance_token": "eyJhbGciOi...",
"accept_personal_auth": "eyJhbGciOi...",
"set_default": True,
},
)
payment_method = res.json()Response
201 Created—PaymentMethodconstate: available.202 Accepted—PaymentMethodconstate: verification_pending(3DS pendiente).
Errores posibles
| Status | error.type | Causa |
|---|---|---|
400 | invalid_request | Campos faltantes o token mal formado |
404 | invalid_request | customer_id no existe |
422 | wompi_error | Wompi rechazó la verificación (micro-cobro fallido) |
Listar métodos de pago
GET /v1/payment-methods
Filtro opcional ?customer_id=, más paginación estándar.
curl
curl "https://api.rekurra.dev/v1/payment-methods?customer_id=cus_01HZXK7QJ5M8Z9X2R3TVQ7A1B2" \
-H "Authorization: Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX"JavaScript (fetch)
const res = await fetch(
"https://api.rekurra.dev/v1/payment-methods?customer_id=cus_01HZXK7QJ5M8Z9X2R3TVQ7A1B2",
{ headers: { Authorization: "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX" } }
);
const { data } = await res.json();Python (requests)
import requests
res = requests.get(
"https://api.rekurra.dev/v1/payment-methods",
params={"customer_id": "cus_01HZXK7QJ5M8Z9X2R3TVQ7A1B2"},
headers={"Authorization": "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX"},
)
body = res.json()Obtener un método de pago
GET /v1/payment-methods/{id}
curl
curl https://api.rekurra.dev/v1/payment-methods/pm_01HZXK7QJ5M8Z9X2R3TVQ7A1B2 \
-H "Authorization: Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX"JavaScript (fetch)
const res = await fetch(
"https://api.rekurra.dev/v1/payment-methods/pm_01HZXK7QJ5M8Z9X2R3TVQ7A1B2",
{ headers: { Authorization: "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX" } }
);
const paymentMethod = await res.json();Python (requests)
import requests
res = requests.get(
"https://api.rekurra.dev/v1/payment-methods/pm_01HZXK7QJ5M8Z9X2R3TVQ7A1B2",
headers={"Authorization": "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX"},
)
payment_method = res.json()Errores posibles
| Status | error.type | Causa |
|---|---|---|
404 | invalid_request | El método de pago no existe |
Marcar como método de pago por defecto
POST /v1/payment-methods/{id}/default
curl
curl -X POST https://api.rekurra.dev/v1/payment-methods/pm_01HZXK7QJ5M8Z9X2R3TVQ7A1B2/default \
-H "Authorization: Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX"JavaScript (fetch)
const res = await fetch(
"https://api.rekurra.dev/v1/payment-methods/pm_01HZXK7QJ5M8Z9X2R3TVQ7A1B2/default",
{
method: "POST",
headers: { Authorization: "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX" },
}
);
const paymentMethod = await res.json();Python (requests)
import requests
res = requests.post(
"https://api.rekurra.dev/v1/payment-methods/pm_01HZXK7QJ5M8Z9X2R3TVQ7A1B2/default",
headers={"Authorization": "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX"},
)
payment_method = res.json()Eliminar un método de pago
DELETE /v1/payment-methods/{id}
curl
curl -X DELETE https://api.rekurra.dev/v1/payment-methods/pm_01HZXK7QJ5M8Z9X2R3TVQ7A1B2 \
-H "Authorization: Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX"JavaScript (fetch)
await fetch(
"https://api.rekurra.dev/v1/payment-methods/pm_01HZXK7QJ5M8Z9X2R3TVQ7A1B2",
{
method: "DELETE",
headers: { Authorization: "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX" },
}
);Python (requests)
import requests
requests.delete(
"https://api.rekurra.dev/v1/payment-methods/pm_01HZXK7QJ5M8Z9X2R3TVQ7A1B2",
headers={"Authorization": "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX"},
)Errores posibles
| Status | error.type | Causa |
|---|---|---|
404 | invalid_request | El método de pago no existe |
409 | invalid_request | Es el único método de pago de una suscripción activa |