Trading - Acciones, Bonos y Cedears

Introducción

El módulo de Trading le permite a tu plataforma ofrecer a tus usuarios la operatoria completa de compra y venta de instrumentos del mercado de capitales argentino: CEDEARs, acciones y bonos. La integración es 100% vía APIs y webhooks.

Tus usuarios pueden consultar instrumentos y precios, enviar órdenes de compra y venta, hacer seguimiento del estado de sus operaciones y visualizar su portfolio en tiempo real.


Prerrequisitos

Onboarding

Para operar Trading, el usuario debe tener una cuenta comitente activa. El flujo de onboarding es el mismo que en los demás módulos:

  1. POST /v2/persons → genera el person_id
  2. POST /identity-documents → carga de documentación de identidad
  3. POST /v2/investment-accounts → genera el investment_account_id
  4. POST /bank-accounts → genera el bank_account_id (recomendado para habilitar retiros)

Sin cuenta comitente activa no es posible operar instrumentos de mercado.

Depósitos (Cash In)

Antes de enviar órdenes, el usuario debe contar con saldo disponible en su cuenta comitente. El proceso es el mismo que en los demás módulos: el usuario transfiere a la cuenta recaudadora y API Broker acredita el saldo automáticamente, notificando al partner vía webhook deposit_create.


Flujo de integración

a. Consulta de instrumentos

Antes de operar, tu plataforma puede consultar el catálogo completo de instrumentos disponibles.

Obtener todos los instrumentos:

GET /api/instruments/market/all

Devuelve el listado completo de CEDEARs, acciones y bonos disponibles para trading.

Recomendación: almacená los instrumentos en tu base de datos y actualizálos periódicamente (por ejemplo, una vez al día). Usá este catálogo para búsquedas por ticker, tipo de activo o mercado.

Obtener instrumento por ID:

GET /api/instruments/market/{market_instrument_id}

b. Consulta de precios

Una vez seleccionado el instrumento, se puede consultar su último precio disponible.

GET /api/prices/market-instrumentsprices/{market_instrument_id}

Util para mostrar precios en la UI, calcular montos estimados de compra o venta, y validar disponibilidad de saldo antes de enviar órdenes.

c. Envío de órdenes

Con el instrumento y el precio definidos, se envía la orden de compra o venta:

POST /api/market/market-order

Body params:

CampoTipoRequeridoDescripción
investment_account_idinteger✅ID de la cuenta comitente del usuario
quantityinteger (≥ 0)✅Cantidad de unidades/lotes a operar
amountnumber (≥ 0)✅Monto de la operación
currency_idstring (≤ 5 chars)✅Moneda de la operación (código ISO 4217, ej: ARS, USD)
market_instrument_idinteger✅ID del instrumento a operar
market_operation_typestring enum✅"buy" para compra / "sell" para venta
instrument_pricenumber (≥ 0)✅Precio del instrumento al momento del envío
terminteger enum✅Plazo de liquidación: 0 (CI), 1 (24hs), 2 (48hs)
external_idstring✅Identificador único del partner para evitar duplicados (idempotencia)
by_amountboolean✅true si la orden se define por monto; false si se define por cantidad
at_market_priceboolean✅true para orden a precio de mercado; false para orden con precio límite
closed_dollar_idinteger❌ID del dólar cerrado (opcional, para operaciones en dólar cable)

Body de ejemplo:

{
  "investment_account_id": 7403,
  "quantity": 10,
  "amount": 50000,
  "currency_id": "ARS",
  "market_instrument_id": 1234,
  "market_operation_type": "buy",
  "instrument_price": 5000,
  "term": 2,
  "external_id": "orden-abc-001",
  "by_amount": false,
  "at_market_price": false
}

Respuestas posibles:

CódigoDescripción
201Orden creada exitosamente
409Conflicto — ya existe una orden con el mismo external_id
422Error de validación
500Error interno del servidor

Nota sobre idempotencia: el campo external_id es obligatorio y debe ser único por operación. Si se reintenta el envío con el mismo external_id, la API retornará 409 en lugar de crear una orden duplicada.

Nota sobre by_amount vs quantity: cuando by_amount es true, el sistema usa el campo amount para determinar cuántas unidades comprar al precio disponible. Cuando es false, usa el campo quantity directamente.

d. Estados de las órdenes

Las órdenes enviadas pueden atravesar los siguientes estados. Es importante distinguir los estados temporales de los finales para reflejarlos correctamente en tu UI.

EstadoDescripciónTipo
SENDING_PENDINGPendiente de envío. Se enviará tan pronto sea posibleTemporal
RETRYSe intentó enviar pero no fue posible. Se reintentaráTemporal
SENTEnviada, esperando confirmación del mercado (BYMA)Temporal
OFFEREDOfertada en el mercadoTemporal
PARTIALLY_COMPLETEDParcialmente ejecutada. Temporal si es del día, final si es de otro díaTemporal / Final
COMPLETEDOrden completamente ejecutadaFinal
CANCELLEDCancelada manualmenteFinal
PENDING_CANCELLATIONCancelación solicitada, pendiente de confirmaciónTemporal
REJECTEDRechazada por el mercadoFinal
NOT_SENTNo enviada por errorFinal
EXPIREDExpirada al cierre del mercadoFinal

e. Consulta del estado de una orden

Una vez enviada la orden, el partner puede consultar su estado en cualquier momento mediante el market_order_id devuelto en el POST /api/market/market-order/.

GET /api/market/market-order/{market_order_id}

Parámetros:

CampoTipoDescripción
market_order_idintegerID de la orden de mercado (path param, requerido)

Respuestas posibles:

CódigoDescripción
200Retorna el estado y detalle completo de la orden
403Sin permisos para acceder a la orden
404Orden no encontrada
422Error de validación
500Error interno del servidor

Nota: Este endpoint es útil para consultas puntuales y reconciliaciones. Para seguimiento en tiempo real, implementar el webhook market_order_update.

f. Obtención de boletos de las órdenes de mercado

Luego de ejecutadas las operaciones, el partner puede obtener los boletos (confirmaciones de mercado) asociados a una cuenta comitente. Esto es útil para mostrar comprobantes al usuario o para procesos de conciliación.

GET /api/market/stock-market-confirmations/confirmations-by-investment-account/{investment_account_id}

Path params:

CampoTipoDescripción
investment_account_idintegerID de la cuenta comitente (requerido)

Query params opcionales:

CampoTipoDescripción
pageinteger (≥ 1)Número de página. Default: 1
sizeinteger (1–100)Cantidad de resultados por página. Default: 50
from_datedateFecha de inicio del filtro (formato YYYY-MM-DD)
to_datedateFecha de fin del filtro (formato YYYY-MM-DD)

Ejemplo de uso:

GET /api/market/stock-market-confirmations/confirmations-by-investment-account/7403?from_date=2024-09-01&to_date=2024-09-30&page=1&size=50

Respuestas posibles:

CódigoDescripción
200Lista paginada de confirmaciones/boletos de la cuenta
404Cuenta comitente no encontrada
422Error de validación
500Error interno del servidor

Nota: Los boletos incluyen el detalle de cada operación ejecutada (instrumento, precio, cantidad, monto). Se recomienda consultar este endpoint para generar comprobantes descargables para el usuario final.

g. Consulta de cuenta, saldos y tenencias

Permite obtener el estado actualizado de la cuenta comitente del usuario.

GET /api/portfolio/accounts-tatements/{investment_account_id}

Este endpoint es clave para validar saldo antes de enviar órdenes, mostrar el portfolio del usuario y reflejar el impacto de órdenes ejecutadas.

h. Retiros (Cash Out)

Una vez que el usuario tiene fondos disponibles en su cuenta comitente, puede retirarlos a una cuenta bancaria same-name:

POST /withdraw-requests

API Broker notifica los cambios de estado del retiro vía webhook withdraw_request_update.

Estados posibles: IN_PROGRESS → COMPLETED / REJECTED


Endpoints principales

MétodoEndpointDescripción
POST/v2/personsAlta de persona
POST/identity-documentsCarga de documentación
POST/v2/investment-accountsAlta de cuenta comitente
POST/bank-accountsAlta de cuenta bancaria
GET/api/instruments/market/allCatálogo de instrumentos
GET/api/instruments/market/{id}Detalle de instrumento
GET/api/prices/market-instrumentsprices/{id}Precio de instrumento
POST/api/market/market-order/Enviar orden de compra/venta
GET/api/portfolio/accountstatements/{id}Saldos y tenencias
POST/withdraw-requestsRetiro de fondos

Webhooks a implementar

Tu plataforma debe exponer una URL para recibir los siguientes eventos:

deposit_create

Notifica los depósitos acreditados: investment_account_id, moneda, monto y fecha.

market_order_update (si disponible)

Notifica cambios de estado en las órdenes enviadas.

withdraw_request_update

Notifica el estado de los retiros: IN_PROGRESS, COMPLETED o REJECTED.

Los webhooks permiten mantener sincronizado el estado operativo sin necesidad de polling constante.


Consideraciones operativas

  • Caché de instrumentos: almacená el catálogo de instrumentos y refrescalo periódicamente. No consultes el endpoint en cada operación.
  • Validación previa: verificar saldo y tenencias antes de enviar órdenes evita rechazos innecesarios.
  • Estados finales vs temporales: manejelos de forma diferenciada en tu UI para no generar confusión al usuario.
  • Órdenes parciales y expiradas: reflejarlas claramente en el portfolio del usuario.
  • Horarios de mercado: tener en cuenta el horario de operación de BYMA y el cierre diario para el manejo de órdenes.
  • Idempotencia: usar external_id en las órdenes para evitar duplicados ante reintentos.

Soporte de desarrollo e integración

API Broker brinda soporte directo durante todo el proceso de integración.

Soporte técnico: implementación de APIs, webhooks y seguridad, manejo de estados de órdenes, testing conjunto en staging.

Soporte de negocio: modelo de revenue share, onboarding regulatorio del partner, estrategia de adopción del módulo.

Soporte operativo: monitoreo de órdenes, conciliación de depósitos y retiros, mesa de operaciones Adcap como respaldo.

El soporte está disponible los días hábiles de mercado de 9 a 18 hs.


Puntos clave para recordar

  1. El onboarding es prerequisito: sin cuenta comitente activa no es posible operar.
  2. El saldo debe estar disponible antes de enviar órdenes: siempre validar via account statements.
  3. Distinguir estados temporales de finales: COMPLETED, REJECTED, NOT_SENT, EXPIRED y CANCELLED son estados finales.
  4. Las órdenes parciales pueden ser temporales o finales según si son del día o de otro día.
  5. Cachear el catálogo de instrumentos y actualizar periódicamente, no en cada operación.
  6. Los retiros son solo a cuentas same-name: no se admiten transferencias a terceros.
  7. Todo es asincrónico: siempre seguir el estado vía webhooks.

Did this page help you?