Saltar al contenido principal

Movimientos

La API de Movimientos te permite recuperar el historial de transacciones y los detalles de movimientos de las cuentas de usuario. Incluye filtrado, paginación y capacidades avanzadas de consulta usando GraphQL.

El objeto Movement

{
"id": 789012,
"amount": 10000,
"currency": "USD",
"state": "completed",
"reference": "REF-123",
"createdAt": "2024-01-15T10:30:00Z",
"completedAt": "2024-01-15T10:31:00Z",
"balanceBefore": 140000,
"balanceAfter": 150000
}

Atributos

AtributoTipoDescripción
idintegerIdentificador único del movimiento
amountintegerMonto del movimiento en céntimos
currencystringCódigo de moneda (USD, EUR, etc.)
statestringEstado del movimiento (pending, completed, failed, cancelled)
referencestringReferencia externa o ID de transacción
createdAtstringMarca temporal ISO 8601 de cuándo se creó el movimiento
completedAtstringMarca temporal ISO 8601 de cuándo se completó el movimiento
balanceBeforeintegerSaldo de la cuenta antes del movimiento en céntimos
balanceAfterintegerSaldo de la cuenta después del movimiento en céntimos

Listar movimientos

Devuelve una lista de movimientos para el usuario autenticado con filtrado y paginación opcionales.

GET/movements/
curl -X GET "https://sandbox.tropipay.me/api/v3/movements/?limit=20&offset=0" \
-H "Authorization: Bearer sk_test_..."

Parámetros

ParámetroTipoRequeridoDescripción
limitintegerNoNúmero de resultados a devolver (máx: 50, por defecto: 20)
offsetintegerNoNúmero de registros a omitir (por defecto: 0)
querystringNoObjeto de filtro codificado en JSON

Objeto de filtro de consulta

El parámetro query acepta un objeto codificado en JSON con los siguientes campos opcionales:

{
"state": ["completed", "pending"],
"currency": "USD",
"amountGte": 1000,
"amountLte": 100000,
"createdAtFrom": "2024-01-01T00:00:00Z",
"createdAtTo": "2024-12-31T23:59:59Z",
"reference": "REF-123"
}
FiltroTipoDescripción
statearrayFiltrar por estados de movimiento
currencystringFiltrar por moneda
amountGteintegerMonto mínimo en céntimos
amountLteintegerMonto máximo en céntimos
createdAtFromstringFecha de inicio (ISO 8601)
createdAtTostringFecha de fin (ISO 8601)
referencestringFiltrar por referencia

Respuesta

{
"items": [
{
"id": 789012,
"amount": 10000,
"currency": "USD",
"state": "completed",
"reference": "REF-123",
"createdAt": "2024-01-15T10:30:00Z",
"completedAt": "2024-01-15T10:31:00Z",
"balanceBefore": 140000,
"balanceAfter": 150000
}
],
"totalCount": 1,
"hasMore": false
}

Parámetros de la respuesta

ParámetroTipoDescripción
itemsarrayArray de objetos de movimiento
totalCountintegerNúmero total de movimientos que coinciden con la consulta
hasMorebooleanIndica si hay más resultados disponibles

Listar movimientos de una cuenta

Devuelve los movimientos de una cuenta específica.

GET/accounts/{accountId}/movements
curl -X GET https://sandbox.tropipay.me/api/v3/accounts/acc_123/movements \
-H "Authorization: Bearer sk_test_..."

Parámetros

Los mismos parámetros que el endpoint general de movimientos, pero filtrados a la cuenta especificada.

Consulta avanzada de movimientos (GraphQL)

Para consultas complejas y filtrado avanzado, usa el endpoint GraphQL.

POST/movements/business
curl -X POST https://sandbox.tropipay.me/api/v3/movements/business \
-H "Authorization: Bearer sk_test_..." \
-H "Content-Type: application/json" \
-d '{
"query": "query GetMovements($filter: MovementFilter, $pagination: Pagination) { movements(filter: $filter, pagination: $pagination) { items { id amount state currency createdAt recipient { name email } sender { name email } } totalCount } }",
"variables": {
"filter": {
"state": ["completed", "pending"],
"amountGte": 100,
"amountLte": 100000,
"createdAtFrom": "2024-01-01T00:00:00Z",
"createdAtTo": "2024-12-31T23:59:59Z"
},
"pagination": {
"limit": 20,
"offset": 0
}
}
}'

Esquema GraphQL

MovementFilter

input MovementFilter {
state: [MovementState!]
currency: String
amountGte: Int
amountLte: Int
createdAtFrom: DateTime
createdAtTo: DateTime
reference: String
accountId: String
}

Pagination

input Pagination {
limit: Int
offset: Int
}

Movement Type

type Movement {
id: ID!
amount: Int!
currency: String!
state: MovementState!
reference: String
createdAt: DateTime!
completedAt: DateTime
balanceBefore: Int!
balanceAfter: Int!
recipient: User
sender: User
account: Account!
}

MovementState Enum

enum MovementState {
PENDING
COMPLETED
FAILED
CANCELLED
}

Respuesta GraphQL

{
"data": {
"movements": {
"items": [
{
"id": "789012",
"amount": 10000,
"state": "COMPLETED",
"currency": "USD",
"createdAt": "2024-01-15T10:30:00Z",
"recipient": {
"name": "John",
"email": "john@example.com"
},
"sender": {
"name": "Jane",
"email": "jane@example.com"
}
}
],
"totalCount": 1
}
}
}

Reembolsar una transacción

Permite a un usuario reembolsar una transacción previamente completada.

POST/movements/in/refund

Autenticación:

  • Requiere autenticación de usuario (token JWT)
  • Requiere autenticación de dos factores (2FA) habilitada
  • Requiere permiso ALLOW_REFUND
curl -X POST https://sandbox.tropipay.me/api/v3/movements/in/refund \
-H "Authorization: Bearer sk_test_..." \
-H "Content-Type: application/json" \
-d '{
"orderCode": "ORD-123456",
"amount": 5000
}'

Parámetros del cuerpo de la solicitud

ParámetroTipoRequeridoDescripción
orderCodestringCódigo del pedido/transacción a reembolsar
amountnumberMonto a reembolsar en céntimos
securityCodestring2fa para la cuenta. En sandbox siempre "123456" o autenticador.

Respuesta

Código de estado: 200 OK

Devuelve un objeto de reserva con los detalles del reembolso generado.

{
"id": 123456,
"orderCode": "ORD-123456",
"amount": 5000,
"currency": "USD",
"state": "completed",
"type": "refund",
"createdAt": "2024-01-15T10:30:00Z",
"completedAt": "2024-01-15T10:31:00Z"
}

Respuestas de error

Código de estadoDescripción
400Bad Request - Faltan parámetros requeridos o los valores son inválidos
401Unauthorized - Usuario no autenticado
403Forbidden - El usuario no tiene permiso ALLOW_REFUND o el 2FA no está habilitado
404Not Found - El código de orden no existe
500Internal Server Error - Error durante el procesamiento del reembolso

Ejemplo de respuesta de error

{
"error": {
"type": "permission_error",
"code": "missing_permission",
"message": "User does not have ALLOW_REFUND permission"
}
}

Notas

  • El reembolso se procesa como una solicitud iniciada por el cliente
  • Tanto el código de orden como el monto deben ser válidos
  • La transacción debe estar en un estado reembolsable
  • El 2FA debe estar habilitado en la cuenta de usuario

Estados de movimiento

EstadoDescripción
pendingEl movimiento está siendo procesado
completedEl movimiento se completó exitosamente
failedEl movimiento falló debido a un error
cancelledEl movimiento fue cancelado por el usuario o el sistema

Paginación

Todos los endpoints de movimientos soportan paginación usando los parámetros limit y offset:

  • limit: Número máximo de resultados a devolver (1-50, por defecto: 20)
  • offset: Número de registros a omitir (por defecto: 0)

Ejemplo de paginación

# Obtener los primeros 20 movimientos
curl -X GET "https://sandbox.tropipay.me/api/v3/movements/?limit=20&offset=0"

# Obtener los siguientes 20 movimientos
curl -X GET "https://sandbox.tropipay.me/api/v3/movements/?limit=20&offset=20"

Manejo de errores

La API de Movimientos utiliza códigos de respuesta HTTP convencionales para indicar el éxito o fracaso de una solicitud a la API.

Códigos de error comunes

CódigoDescripción
400Bad Request - Parámetros de consulta inválidos
401Unauthorized - Autenticación inválida
403Forbidden - Permisos insuficientes
404Not Found - La cuenta o el movimiento no existen
422Unprocessable Entity - Parámetros de filtro inválidos
429Too Many Requests - Límite de tasa excedido
500Internal Server Error

Ejemplo de respuesta de error

{
"error": {
"type": "invalid_request_error",
"code": "invalid_filter",
"message": "Invalid date format in createdAtFrom parameter",
"param": "query.createdAtFrom"
}
}

Mejores prácticas

  1. Usa paginación para conjuntos grandes de resultados y mejorar el rendimiento
  2. Filtra por rango de fechas para limitar el alcance de tus consultas
  3. Usa estados específicos para obtener solo los movimientos que necesitas
  4. Cachea resultados cuando sea apropiado para reducir llamadas a la API
  5. Usa GraphQL para consultas complejas que requieren datos relacionados