FITALAPI

Movimientos de la cuenta

GET /v1/movements

Movimientos de la cuenta, de esta API y de otros orígenes, en el orden en que cambiaron. payment_id y external_ref dicen de qué pago sale cada uno. Al llegar al final has_more es false y next_cursor sigue presente: guárdalo y úsalo después para recibir sólo lo nuevo. Ese recorrido siguiente empieza en la hora en que abrió el anterior y repasa 2 minutos más, para no perder lo que confirmó tarde, y una fila que cambia mientras recorres vuelve a salir. Por eso un mismo id puede repetirse: quédate con la copia de updated_at más reciente. Con from y to, from debe ser anterior.

DatoValor
Método y rutaGET /v1/movements
Servidorhttps://widget.fital.xyz
operationIdlistMovements
AccesoLlave con el scope movements:read
Firma de peticiónNo aplica
IdempotenciaNo aplica
  • Una fila que cambia mientras recorres puede repetirse, y nunca se omite otra. Deduplica por id. next_cursor puede venir con valor aunque has_more sea false: guárdalo. Ver Paginación.

Encabezados de la petición

EncabezadoObligatorioDescripción
AuthorizationSíBearer y tu llave.
X-Fital-ScenarioNoSólo simuladores: elige la respuesta que quieres practicar.

Parámetros

ParámetroEnTipoObligatorioDescripción
limitconsultatextoNoFilas por página, de 1 a 100. Por omisión, 25.
cursorconsultatextoNoValor de next_cursor de la página anterior. Hasta 1000 caracteres.
fromconsultatextoNoDesde esta fecha de creación, incluida. ISO 8601 en UTC.
toconsultatextoNoHasta esta fecha de creación, sin incluirla. ISO 8601 en UTC.
typeconsultatextoNoFiltra por categoría. payment: Salida por un riel de pago. deposit: Entrada de dinero. crypto: Envío o recepción de un token. internal: Movimiento interno de la cuenta. card: Operación con tarjeta. other: Cualquier otro movimiento.
currencyconsultatextoNoFiltra por cualquiera de las monedas del movimiento.

Valores de type

ValorSignificado
paymentSalida por un riel de pago.
depositEntrada de dinero.
cryptoEnvío o recepción de un token.
internalMovimiento interno de la cuenta.
cardOperación con tarjeta.
otherCualquier otro movimiento.

Respuestas correctas

200 Correcto

CampoTipoObligatorioDescripción
datalista de objetoSíFilas de esta página.
data[].amounttexto o nullSíMonto del movimiento.
data[].completed_attexto o nullSíFecha en que terminó. ISO 8601 en UTC.
data[].created_attexto o nullSíFecha de creación. ISO 8601 en UTC.
data[].currencytexto o nullSíMoneda del monto.
data[].destination_currencytexto o nullSíMoneda de destino.
data[].external_reftexto o nullSíTu external_ref del pago o cobro del que sale este movimiento. null si no tiene.
data[].final_amounttexto o nullSíMonto final, cuando se conoce.
data[].final_currencytexto o nullSíMoneda del monto final.
data[].idtextoSíIdentificador del movimiento, con prefijo mov_.
data[].payment_idtexto o nullSíPago de esta API del que sale este movimiento, con prefijo pay_. null si no salió de un pago creado por esta API.
data[].read_statustextoSíCuánto se pudo leer. complete: Se leyó el detalle completo. partial: No se pudo leer el detalle completo. El estado no avanza con una lectura parcial.
data[].statustextoSíEstado público. Sólo completed, failed, returned y canceled son terminales. processing: Aceptado y en curso, o aún sin confirmar. Consúltalo hasta un estado terminal. in_review: En revisión. No lo repitas: el pago ya existe. completed: Se pagó. Aún puede pasar a returned. failed: No se hizo y no queda dinero en tránsito. returned: Se devolvió y el saldo ya volvió. canceled: Se canceló antes de ejecutarse.
data[].typetextoSíCategoría del movimiento. payment: Salida por un riel de pago. deposit: Entrada de dinero. crypto: Envío o recepción de un token. internal: Movimiento interno de la cuenta. card: Operación con tarjeta. other: Cualquier otro movimiento.
data[].updated_attexto o nullSíÚltima actualización. ISO 8601 en UTC.
has_morebooleanoSítrue si hay más filas después de esta página.
next_cursortexto o nullSíCursor de la página siguiente. null si no hay.

Valores de data[].read_status

ValorSignificado
completeSe leyó el detalle completo.
partialNo se pudo leer el detalle completo. El estado no avanza con una lectura parcial.

Valores de data[].status

ValorSignificado
processingAceptado y en curso, o aún sin confirmar. Consúltalo hasta un estado terminal.
in_reviewEn revisión. No lo repitas: el pago ya existe.
completedSe pagó. Aún puede pasar a returned.
failedNo se hizo y no queda dinero en tránsito.
returnedSe devolvió y el saldo ya volvió.
canceledSe canceló antes de ejecutarse.

Valores de data[].type

ValorSignificado
paymentSalida por un riel de pago.
depositEntrada de dinero.
cryptoEnvío o recepción de un token.
internalMovimiento interno de la cuenta.
cardOperación con tarjeta.
otherCualquier otro movimiento.
{
  "data": [
    {
      "amount": "1500.00",
      "completed_at": "2026-11-04T18:01:30.000Z",
      "created_at": "2026-11-04T18:00:00.000Z",
      "currency": "MXN",
      "destination_currency": "MXN",
      "external_ref": "pedido-7731",
      "final_amount": "1500.00",
      "final_currency": "MXN",
      "id": "mov_2hKsV9tBq4XzM7nD1cYpL6rF",
      "payment_id": "pay_6nRtY1wKs3QzD8cL5mVhF2gB",
      "read_status": "complete",
      "status": "completed",
      "type": "payment",
      "updated_at": "2026-11-04T18:01:30.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Encabezados de la respuesta

EncabezadoContenido
X-Request-IdIdentificador de la petición. Cítalo con soporte.
Retry-AfterSegundos a esperar, con 429 y a veces con 503.

Errores

Todos usan la forma de Errores: error.code, message, request_id, details, retryable y docs_url. Decide por code.

HTTPCódigoCuándo saleretryable
400invalid_requestAlgún filtro no cumple el esquema, from no es anterior a to, o el cursor es inválido o de otra consulta.false
401invalid_api_keyLa llave falta, está mal formada, venció o fue revocada, o la empresa está suspendida.false
401wrong_environmentLa llave es de otro ambiente.false
403forbidden_scopeLa llave no tiene el scope de esta operación. details.required_scope lo nombra.false
403ip_not_allowedLa IP de origen no está activa en la lista de esa llave.false
403kyb_requiredLa empresa no tiene KYB aprobado o aún no está inscrita.false
403account_not_activeLa cuenta no está activa.false
429rate_limitedSuperaste un límite de peticiones. Llega con Retry-After.true
500internal_errorFallo nuestro. El resultado de la petición no se conoce.true
503service_unavailableEl servicio no está disponible por ahora. El resultado de la petición no se conoce.true

Ejemplos de error

400 invalid_request:

{
  "error": {
    "code": "invalid_request",
    "message": "Petición inválida",
    "request_id": "0123456789abcdef0123456789abcdef",
    "details": {
      "fields": {
        "limit": "Entre 1 y 100"
      }
    },
    "retryable": false,
    "docs_url": "https://merchants.fital.xyz/docs/errores/#invalid_request"
  }
}

401 invalid_api_key:

{
  "error": {
    "code": "invalid_api_key",
    "message": "Credencial inválida",
    "request_id": "0123456789abcdef0123456789abcdef",
    "details": {},
    "retryable": false,
    "docs_url": "https://merchants.fital.xyz/docs/errores/#invalid_api_key"
  }
}

403 forbidden_scope:

{
  "error": {
    "code": "forbidden_scope",
    "message": "La llave no tiene permiso para esta operación",
    "request_id": "0123456789abcdef0123456789abcdef",
    "details": {
      "required_scope": "movements:read"
    },
    "retryable": false,
    "docs_url": "https://merchants.fital.xyz/docs/errores/#forbidden_scope"
  }
}

429 rate_limited:

{
  "error": {
    "code": "rate_limited",
    "message": "Demasiadas peticiones",
    "request_id": "0123456789abcdef0123456789abcdef",
    "details": {},
    "retryable": true,
    "docs_url": "https://merchants.fital.xyz/docs/errores/#rate_limited"
  }
}

500 internal_error:

{
  "error": {
    "code": "internal_error",
    "message": "Error interno",
    "request_id": "0123456789abcdef0123456789abcdef",
    "details": {},
    "retryable": true,
    "docs_url": "https://merchants.fital.xyz/docs/errores/#internal_error"
  }
}

503 service_unavailable:

{
  "error": {
    "code": "service_unavailable",
    "message": "Servicio no disponible",
    "request_id": "0123456789abcdef0123456789abcdef",
    "details": {},
    "retryable": true,
    "docs_url": "https://merchants.fital.xyz/docs/errores/#service_unavailable"
  }
}

Reintentos

Es una lectura: repetirla no tiene efecto.

  • 429 rate_limited: Espera lo que indique Retry-After y repite.
  • 500 internal_error: Repite con espera exponencial.
  • 503 service_unavailable: Repite con espera exponencial. Respeta Retry-After si viene.

Ver Reintentos y Límites.

Muestras

Variables de estas muestras: simulador público, sin cuenta

Define esto en tu terminal. Con estos valores las muestras corren tal cual contra el simulador público:

export FITAL_API="https://widget.fital.xyz/explorar/v1"
export FITAL_KEY="sk_test_sandbox_publica"

En la cuenta de prueba o en producción cambia la base, la llave y el secreto, y sustituye los id de ejemplo por los tuyos. Ver Ambientes.

op-listar-movimientos.sh
curl -sS "$FITAL_API/movements" \
  -H "Authorization: Bearer $FITAL_KEY"

Guías

Ver esta página en Markdown

En esta página