FITALAPI

Eventos de la empresa

GET /v1/events

Eventos de la empresa, del más nuevo al más viejo. Sirve para recuperar lo que un webhook no entregó: pide sin cursor y recorre hasta un evento que ya procesaste. next_cursor sólo camina hacia el pasado y termina en null, así que no lo guardes entre consultas. Filtra con type.

DatoValor
Método y rutaGET /v1/events
Servidorhttps://widget.fital.xyz
operationIdlistEvents
AccesoLlave con el scope events:read
Firma de peticiónNo aplica
IdempotenciaNo aplica
  • Va del más nuevo al más viejo, así que next_cursor sólo camina hacia el pasado y termina en null. Para ver lo nuevo, pide la lista sin cursor y recorre hasta un evento que ya procesaste. Ver El evento siempre queda guardado.

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.
typeconsultatextoNoFiltra por tipo de evento, por ejemplo payment.completed. Hasta 60 caracteres.

Respuestas correctas

200 Correcto

CampoTipoObligatorioDescripción
datalista de objetoSíFilas de esta página.
data[].api_versiontextoSíVersión con que se generó el evento.
data[].created_attexto o nullSíFecha de creación. ISO 8601 en UTC.
data[].dataobjetoSíContenido del evento. Su forma depende de type.
data[].idtextoSíIdentificador del evento, con prefijo evt_. Va firmado: úsalo para ignorar repetidos.
data[].resource_idtextoSíRecurso al que se refiere.
data[].sequenceenteroSíOrden dentro del recurso: un valor mayor es más reciente.
data[].typetextoSíTipo de evento. Ignora los que no conozcas. payment.processing: El pago se aceptó y sigue en curso, o se reabrió. payment.in_review: El pago está en revisión. No lo repitas. payment.completed: El pago se confirmó. payment.failed: El pago no se hizo y no queda dinero en tránsito. payment.returned: El pago se devolvió. Puede llegar después de payment.completed. payment.canceled: El pago se canceló. deposit.received: El dinero ya está acreditado. deposit.in_review: El depósito está en revisión. deposit.returned: El depósito se devolvió. collection.paid: El cobro se pagó. En efectivo, la tienda ya confirmó el pago y el abono a tu cuenta llega después. collection.expired: El cobro venció sin pago. security.ip_allowlist.changed: Cambió la lista de IP de una llave de producción. system.egress_ips.changing: Cambiará una IP de salida de webhooks. Actualiza tu firewall antes de effective_at.
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[].data

Cambia según type. Ver el catálogo de eventos.

Valores de data[].type

Ver el catálogo de eventos. Cada tipo está en el contrato, y aun así ignora los que no conozcas: un tipo nuevo no rompe la versión.

{
  "data": [
    {
      "api_version": "2026-11-01",
      "created_at": "2026-11-04T18:01:30.000Z",
      "data": {
        "amount": "1500.00",
        "currency": "MXN",
        "destination_currency": "MXN",
        "external_ref": "pedido-7731",
        "failure_code": null,
        "final_amount": "1500.00",
        "final_currency": "MXN",
        "id": "pay_6nRtY1wKs3QzD8cL5mVhF2gB",
        "status": "completed",
        "updated_at": "2026-11-04T18:01:30.000Z"
      },
      "id": "evt_5mPqW2xZr8TnC1vH7kLdS4bJ",
      "resource_id": "pay_6nRtY1wKs3QzD8cL5mVhF2gB",
      "sequence": 2,
      "type": "payment.completed"
    }
  ],
  "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 parámetro o campo no cumple el esquema. Mira details.fields.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
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": "events: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-eventos.sh
curl -sS "$FITAL_API/events" \
  -H "Authorization: Bearer $FITAL_KEY"

Guías

Ver esta página en Markdown

En esta página