WooCommerce Redsys Gateway REST API
Una REST API para consultar transacciones, gestionar tokens y automatizar flujos de pago desde sistemas externos.
Visión general
El plugin WooCommerce Redsys Gateway Premium expone dos superficies máquina a máquina complementarias sobre el mismo pipeline firmado de Redsys que impulsa un checkout normal (PSD2/SCA del lado del comprador, IPN firmado del lado del banco). Cada pago automatizado sigue terminando en un pedido real de WooCommerce.
| Superficie | Qué es | Namespace |
|---|---|---|
| A2A (Agent2Agent) | Una superficie JSON-RPC 2.0 que permite a un agente de IA autenticado o a un cliente de backend crear, capturar, reembolsar, consultar y tokenizar pagos. | wc-redsys-a2a/v1 |
| UCP (Universal Commerce Protocol) | Una superficie de comercio RESTful: descubrimiento de catálogo, sesiones de carrito y checkout, pedidos, reembolsos y webhooks para flujos de compra agéntica. | redsys-ucp/v1 |
Ambas superficies vienen desactivadas por defecto y deben ser habilitadas por el comerciante en WooCommerce → Ajustes → Redsys Advanced → Agentic Commerce. Hasta que se habiliten, los endpoints devuelven un error de servicio no disponible mientras que los documentos públicos de descubrimiento (Agent Card, manifiesto UCP) siguen siendo accesibles para que un cliente pueda descubrir la superficie.
También existen dos namespaces internos — redsys-acp/v1 (puente Agentic Commerce Protocol) y redsys-app/v1 (rutas auxiliares para móvil/app). Siguen el mismo modelo OAuth y no se cubren endpoint por endpoint aquí.
URLs base y namespaces
Todas las rutas REST se sirven desde la raíz REST de WordPress de tu tienda bajo los namespaces del plugin. Los documentos de descubrimiento se publican además en rutas well-known en la raíz del sitio.
# A2A (JSON-RPC)
https://your-store.com/wp-json/wc-redsys-a2a/v1/
# UCP (REST) — canonical namespace
https://your-store.com/wp-json/redsys-ucp/v1/
# UCP OAuth 2.1 authorization server
https://your-store.com/wp-json/redsys-ucp/oauth/v1/
# Well-known discovery documents
https://your-store.com/.well-known/agent-card.json
https://your-store.com/.well-known/ucp.json
https://your-store.com/.well-known/oauth-authorization-server
Por comodidad, varias capacidades de UCP también se registran bajo alias acotados por capacidad (por ejemplo redsys-ucp/checkout/v1, redsys-ucp/catalog/v1, redsys-ucp/orders/v1) que reflejan las rutas canónicas redsys-ucp/v1. Usa preferentemente el namespace canónico que se muestra a lo largo de esta página.
Autenticación
Ambas superficies se autentican con tokens bearer OAuth 2.1 + PKCE emitidos por el servidor de autorización UCP incluido en el mismo plugin. No hay claves de API estáticas. En cada petición se envía un token en la cabecera Authorization: Bearer.
| Metodo | Ruta | Descripcion |
|---|---|---|
| GET POST | /wp-json/redsys-ucp/oauth/v1/authorize | Endpoint de autorización (flujo authorization-code + PKCE) |
| POST | /wp-json/redsys-ucp/oauth/v1/token | Intercambia un authorization code (o refresh) por un access token |
| POST | /wp-json/redsys-ucp/oauth/v1/register | Registro dinámico de cliente (RFC 7591) |
| POST | /wp-json/redsys-ucp/oauth/v1/introspect | Introspección de token (RFC 7662) |
| POST | /wp-json/redsys-ucp/oauth/v1/revoke | Revocación de token (RFC 7009) |
| GET | /.well-known/oauth-authorization-server | Metadatos del servidor de autorización (RFC 8414) |
| GET | /.well-known/oauth-protected-resource | Metadatos del recurso protegido |
Registra un cliente de forma dinámica y luego ejecuta el flujo estándar authorization-code + PKCE. Los clientes A2A deben registrarse con un client_type que empiece por a2a_; el servidor emite entonces un client_id con la forma a2a_… y un client_secret de un solo uso. Los tokens A2A llevan scopes a2a:payments:*; un token de tipo UCP se rechaza en la superficie A2A y viceversa — las superficies están aisladas a propósito.
POST /wp-json/redsys-ucp/oauth/v1/register
{
"client_name": "Concierge Bot",
"client_type": "a2a_concierge",
"redirect_uris": ["https://bot.example/oauth/callback"],
"scopes": ["a2a:payments:read", "a2a:payments:create"]
}
curl https://your-store.com/wp-json/redsys-ucp/v1/discovery \
-H 'Authorization: Bearer <access_token>' \
-H 'Accept: application/json'
| Scope | Permite |
|---|---|
a2a:payments:read | query_payment_status, list_payments, tasks/get de solo lectura |
a2a:payments:create | create_payment |
a2a:payments:capture | capture_payment (captura post-autorización) |
a2a:payments:refund | refund_payment |
a2a:payments:tokenize | tokenize_card, recurrent_charge |
Los scopes se comparan de forma exacta — a2a:payments:create no implica a2a:payments:read. Cada petición A2A atraviesa una cadena de cinco controles: autenticar, autorizar (scope), lista blanca de IP, ventana horaria y límite de tasa por cliente (por defecto 60/min, 600/hora, 5000/día). Hay una credencial bearer de sandbox disponible para pruebas locales, pero solo se resuelve cuando WP_DEBUG es true y el comerciante la ha habilitado explícitamente; nunca se acepta en una instalación de producción.
A2A — Agent2Agent
A2A es una superficie JSON-RPC 2.0. El descubrimiento se realiza mediante la Agent Card; cada operación es un único POST al endpoint /rpc; las tareas de larga duración informan del progreso mediante Server-Sent Events.
| Metodo | Ruta | Descripcion |
|---|---|---|
| GET | /.well-known/agent-card.json | Agent Card pública. Sin autenticación. Cacheable (ETag, max-age 300) |
| GET | /wp-json/wc-redsys-a2a/v1/agent-card | Agent Card extendida (requiere autenticación) incluyendo skills privadas |
| POST | /wp-json/wc-redsys-a2a/v1/rpc | Endpoint JSON-RPC 2.0 para todas las invocaciones de skills |
| GET | /wp-json/wc-redsys-a2a/v1/tasks/{taskId}/stream | Stream SSE de una tarea. Reanudable con Last-Event-ID |
| GET | /wp-json/wc-redsys-a2a/v1/sca/return/{taskId} | Callback público de navegador tras completar el comprador la SCA |
Transporte JSON-RPC 2.0. El method selecciona el verbo RPC; para tasks/send y tasks/sendSubscribe el params.skill_id selecciona la operación. Los importes siempre son céntimos enteros (1500 = 15,00 EUR); los códigos de moneda son ISO-4217 en mayúsculas.
| Metodo | Propósito |
|---|---|
tasks/send | Invoca una skill. Devuelve una tarea. |
tasks/sendSubscribe | Invoca una skill y devuelve un stream_url al que suscribirse. |
tasks/get | Busca una tarea por id. |
tasks/cancel | Cancela una tarea no terminal. |
agent/listSkills | Lista las skills que el bearer tiene permitido invocar. |
| skill_id | Scope requerido | Descripcion |
|---|---|---|
query_payment_status | a2a:payments:read | Busca un pago por payment_id de A2A o wc_order_id |
list_payments | a2a:payments:read | Lista pagos con filtros |
create_payment | a2a:payments:create | Provisiona un pedido pendiente; devuelve una URL de redirección SCA |
capture_payment | a2a:payments:capture | Captura un pago previamente preautorizado |
refund_payment | a2a:payments:refund | Reembolso total o parcial |
tokenize_card | a2a:payments:tokenize | Almacena un token de tarjeta reutilizable |
recurrent_charge | a2a:payments:tokenize | Cobra sobre un token almacenado |
POST /wp-json/wc-redsys-a2a/v1/rpc
Authorization: Bearer <token>
{
"jsonrpc": "2.0",
"id": 1,
"method": "tasks/send",
"params": {
"skill_id": "create_payment",
"input": {
"amount": 1250,
"currency": "EUR",
"order_reference": "ORDER-2026-001",
"mode": "redirect"
},
"idempotency_key": "5d1c…"
}
}
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"task_id": "b9b3f9a4-…",
"state": "input-required",
"artifacts": {
"sca_redirect_url": "https://your-store.com/checkout/order-pay/…"
}
}
}
Una tarea recorre una máquina de estados estricta: submitted → working → input-required → completed | failed | canceled. El comprador completa la SCA en la URL de redirección exactamente igual que un cliente normal; el IPN firmado de Redsys liquida el pedido y la lógica de webhook refleja el resultado en la tarea. Tanto las llamadas correctas como los errores de negocio usan HTTP 200 con un sobre JSON-RPC; los rechazos de transporte (bearer ausente, límite de tasa) usan HTTP 401/429 y siguen llevando un error JSON-RPC.
UCP — descubrimiento
El manifiesto UCP anuncia las capacidades soportadas, sus URIs de especificación/esquema y el servidor de autorización OAuth. El descubrimiento no requiere autenticación.
| Metodo | Ruta | Descripcion |
|---|---|---|
| GET | /.well-known/ucp.json | Manifiesto UCP (también servido en /.well-known/ucp) |
| GET | /wp-json/redsys-ucp/v1/discovery | Documento de descubrimiento de capacidades UCP |
| POST | /wp-json/redsys-ucp/v1/negotiate | Negocia versiones de capacidad y el transporte preferido |
UCP — catálogo y productos
Descubrimiento de catálogo de solo lectura para compra agéntica. Los ids de producto son ids de producto de WooCommerce. Hay disponible un feed de productos JSON pregenerado para ingestión masiva.
| Metodo | Ruta | Descripcion |
|---|---|---|
| GET | /wp-json/redsys-ucp/v1/catalog/search | Busca en el catálogo |
| GET | /wp-json/redsys-ucp/v1/catalog/{id} | Busca un único artículo del catálogo |
| GET | /wp-json/redsys-ucp/v1/products | Lista productos |
| GET | /wp-json/redsys-ucp/v1/products/{id} | Recupera un único producto |
| GET | /wp-json/redsys-ucp/v1/products/feed.json | Feed completo de productos (JSON) |
| GET | /wp-json/redsys-ucp/v1/products/feed/manifest | Manifiesto del feed (metadatos de fragmentación / frescura) |
Busca productos para un agente. Los parámetros siguientes son los habituales; el conjunto exacto aceptado sigue el esquema de búsqueda de catálogo UCP anunciado en el documento de descubrimiento.
| Nombre | Tipo | Descripcion |
|---|---|---|
q | string | Consulta de texto libre (ejemplo) |
limit | int | Número máximo de resultados a devolver (ejemplo) |
UCP — sesiones de carrito
Una sesión de carrito contiene las líneas de artículos antes del checkout. Crea una y luego léela o actualízala por id.
| Metodo | Ruta | Descripcion |
|---|---|---|
| POST | /wp-json/redsys-ucp/v1/cart-sessions | Crea una sesión de carrito |
| GET | /wp-json/redsys-ucp/v1/cart-sessions/{id} | Recupera una sesión de carrito |
| PUT | /wp-json/redsys-ucp/v1/cart-sessions/{id} | Actualiza líneas de artículos / cantidades |
UCP — sesiones de checkout
Una sesión de checkout convierte un carrito en un pedido pagable. Complétala para desencadenar el pago firmado de Redsys, o cancélala. Las mismas rutas también se exponen bajo el alias genérico /sessions.
| Metodo | Ruta | Descripcion |
|---|---|---|
| POST | /wp-json/redsys-ucp/v1/checkout-sessions | Crea una sesión de checkout |
| GET | /wp-json/redsys-ucp/v1/checkout-sessions/{id} | Recupera una sesión de checkout |
| PUT | /wp-json/redsys-ucp/v1/checkout-sessions/{id} | Actualiza datos de comprador / envío / pago |
| POST | /wp-json/redsys-ucp/v1/checkout-sessions/{id}/complete | Completa la sesión e inicia el pago |
| POST | /wp-json/redsys-ucp/v1/checkout-sessions/{id}/cancel | Cancela la sesión |
Rutas alias: POST /sessions, GET /sessions/{id}, PATCH /sessions/{id}, POST /sessions/{id}/complete, POST /sessions/{id}/cancel.
UCP — pedidos
Lee los pedidos creados a través de la superficie de comercio y actúa sobre ellos. Los ids de pedido son ids de pedido de WooCommerce.
| Metodo | Ruta | Descripcion |
|---|---|---|
| GET | /wp-json/redsys-ucp/v1/orders | Lista pedidos |
| GET | /wp-json/redsys-ucp/v1/orders/{id} | Recupera un único pedido |
| POST | /wp-json/redsys-ucp/v1/orders/{id}/cancel | Cancela un pedido |
| POST | /wp-json/redsys-ucp/v1/orders/{id}/refund | Crea un reembolso total o parcial (sincronizado con Redsys) |
Reembolsa total o parcialmente un pedido pagado. El reembolso se ejecuta contra Redsys y se registra en el pedido de WooCommerce.
| Nombre | Tipo | Descripcion |
|---|---|---|
id | int | id de pedido de WooCommerce (parámetro de ruta) |
amount | int | Importe en céntimos a reembolsar (omitir para un reembolso total) (ejemplo) |
reason | string | Motivo de reembolso opcional (ejemplo) |
{
"order_id": 10432,
"status": "refunded",
"refunded_amount": 1250,
"currency": "EUR"
}
UCP — webhooks
Registra endpoints HTTPS para recibir notificaciones de eventos firmadas (por ejemplo cuando se paga o reembolsa un pedido) en lugar de hacer polling.
| Metodo | Ruta | Descripcion |
|---|---|---|
| POST | /wp-json/redsys-ucp/v1/webhooks | Registra una suscripción a webhook |
| GET | /wp-json/redsys-ucp/v1/webhooks | Lista las suscripciones a webhook |
| DELETE | /wp-json/redsys-ucp/v1/webhooks/{id} | Elimina una suscripción a webhook |
Manejo de errores
Los endpoints REST de UCP devuelven códigos de estado HTTP estándar con un cuerpo de error JSON al estilo de WordPress (code, message, data.status). Los endpoints A2A devuelven sobres de error JSON-RPC; los fallos a nivel de transporte llevan además el estado HTTP correspondiente.
| Estado | Significado | Cuándo |
|---|---|---|
400 | Bad request | Parámetros inválidos o ausentes / fallo de validación de esquema |
401 | Unauthorized | Token bearer ausente, inválido, caducado o revocado |
403 | Forbidden | El token carece del scope requerido, IP no en lista blanca, o fuera de la ventana horaria permitida |
404 | Not found | Ningún recurso (tarea, sesión, pedido) coincide con el id |
429 | Too many requests | Límite de tasa por cliente superado (ventana de minuto / hora / día) |
503 | Service unavailable | La superficie A2A o UCP no está habilitada por el comerciante |
500 | Server error | Error inesperado de la pasarela o de Redsys (consulta los logs de Redsys) |
Códigos de error JSON-RPC de A2A representativos: -32002 scope_denied (con data.required_scope), -32003 rate_limited (con data.window y data.limit), y a2a_client_revoked cuando un token real se corresponde con un cliente revocado.
Consigue acceso completo a la API
La REST API se incluye con el plugin WooCommerce Redsys Gateway Premium.