Realizar venta (TAE, Servicios, Pines)
Descripción
Realiza una venta de cualquier producto de tu catálogo: recarga de tiempo aire (TAE), pago de servicio (SERVICIO) o pin (PIN). El tipo de venta lo determina el carrier_id; el cuerpo de la petición es el mismo para los tres.
La respuesta es síncrona: Orion envía la venta al proveedor y responde con el resultado final en la misma llamada.
URL API
Autenticación
| Header | Requerido | Permiso de la API Key |
|---|---|---|
x-api-key | Sí | Según el carrier_group del producto: sales.tae, sales.services o sales.pins. |
Content-Type | Sí | application/json |
Parámetros de entrada
| Parámetro | Tipo | Requerido | Descripción | Ejemplo |
|---|---|---|---|---|
carrier_id | number (entero) | Sí | id del producto en tu catálogo. | 1 |
amount | number | Sí | Monto en MXN. Debe enviarse como número, no como texto. TAE y PIN: entero y autorizado para el producto. SERVICIO: positivo con hasta 2 decimales. | 50 |
dn | string | Sí | Número celular (10 dígitos) o referencia del servicio, según el input_type del producto. Máximo 100 caracteres. | "5512345678" |
folio | string | Sí | Identificador único de la venta generado por tu sistema. Máximo 100 caracteres. | "POS01-000123" |
El folio es tu llave de idempotencia
- Debe ser único por organización. Usa un UUID o un consecutivo propio.
- Guárdalo en tu base de datos antes de enviar la venta.
- Si envías un
folioque ya existe, Orion no vuelve a vender: responde409 Folio ya utilizado; consulta su estado. - Con ese mismo
folioconsultas el estado en Consultar transacción.
Ejemplo de uso
Endpoint:
curl -s -X POST "$ORION_API/api/v1/tae/do-transaction" \ -H "x-api-key: $ORION_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "carrier_id": 1, "amount": 50, "dn": "5512345678", "folio": "POS01-000123" }'curl -s -X POST "$ORION_API/api/v1/tae/do-transaction" \ -H "x-api-key: $ORION_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "carrier_id": 57, "amount": 845.50, "dn": "123456789012", "folio": "POS01-000124" }'curl -s -X POST "$ORION_API/api/v1/tae/do-transaction" \ -H "x-api-key: $ORION_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "carrier_id": 88, "amount": 200, "dn": "5512345678", "folio": "POS01-000125" }'Respuestas
200 — Venta exitosa Success
{ "error": false, "message": "Venta exitosa", "data": { "transaction_id": 104233, "code": "00", "description": "TRANSACCION EXITOSA", "fee_amount": 0, "total": 50, "folio_carrier": "784512", "esim": null }, "results": 1}{ "error": false, "message": "Venta exitosa", "data": { "transaction_id": 104234, "code": "00", "description": "PAGO APLICADO", "fee_amount": 10, "total": 855.5, "folio_carrier": "GP-99812733", "legend": "Su pago se verá reflejado en 24 horas hábiles", "esim": null }, "results": 1}{ "error": false, "message": "Venta exitosa", "data": { "transaction_id": 104235, "code": "00", "description": "TRANSACCION EXITOSA", "fee_amount": 0, "total": 200, "folio_carrier": "551220", "pin": "XXXX-XXXX-XXXX-XXXX", "legend": "Canjea tu código en play.google.com/redeem", "esim": null }, "results": 1}400 — Venta rechazada Client Error
El proveedor rechazó la venta de forma definitiva (número inválido, servicio sin adeudo, etc.). El message contiene la descripción del rechazo. No se cobró y el saldo apartado se liberó.
{ "error": true, "message": "NUMERO NO SUSCEPTIBLE DE ABONO", "data": [], "results": 0 }Puedes reintentar con datos corregidos usando un folio nuevo.
400 — Validación y saldo Client Error
message | Causa |
|---|---|
carrier_id inválido | Falta carrier_id o no es un entero positivo. |
Monto positivo con máximo 2 decimales requerido | amount falta, no es número (por ejemplo "50" como texto), es ≤ 0 o tiene más de 2 decimales. |
Monto entero positivo requerido para TAE/PIN | Producto TAE o PIN con monto decimal. |
Referencia inválida | dn falta, está vacío o supera 100 caracteres. |
Folio requerido (máximo 100 caracteres) | folio falta, está vacío o supera 100 caracteres. |
Operadora no disponible | El carrier_id no existe o está inactivo. |
Saldo insuficiente | La bolsa del producto no tiene saldo suficiente. |
{ "error": true, "message": "Saldo insuficiente", "data": [], "results": 0 }403 — No autorizado Client Error
message | Causa |
|---|---|
Venta no autorizada | La API Key no tiene el permiso de venta del grupo del producto. |
Línea o canal no habilitado | Tu organización no tiene habilitado ese grupo de productos o el canal API. |
Operadora no habilitada | El producto no está habilitado para tu organización. |
Organización o capacidad suspendida | La organización o la línea se suspendió durante la venta. |
Además de los errores de autenticación descritos en Autenticación (API Key).
409 — Folio ya utilizado Conflict
Ya existe una venta con ese folio en tu organización. No se generó una venta nueva. Consulta el resultado de la original con Consultar transacción.
{ "error": true, "message": "Folio ya utilizado; consulta su estado", "data": [], "results": 0 }502 — Resultado incierto Pendiente
El proveedor no confirmó el resultado (timeout o error de comunicación). La venta pudo haberse aplicado: el saldo queda apartado hasta que se concilie.
{ "error": true, "message": "Resultado incierto; consulta el folio antes de reintentar", "data": [], "results": 0 }503 — Producto no disponible Server Error
No hay ruta de venta para ese producto o monto en este momento. No se cobró.
message | Causa |
|---|---|
SKU no disponible | El monto no está autorizado para el producto (TAE/PIN) o el producto no tiene proveedor activo. |
Sin proveedor asignado | El producto no tiene proveedor configurado. |
Proveedor no disponible | El proveedor del producto está deshabilitado temporalmente. |
429 / 500
| Código | message | Acción |
|---|---|---|
429 | Demasiadas transacciones en poco tiempo, intenta de nuevo en un momento | Espera los segundos indicados en el encabezado RateLimit (reset). No se procesó la venta. |
500 | Error interno | Consulta el folio antes de reintentar. |
Parámetros de salida
| Campo | Tipo | Descripción |
|---|---|---|
transaction_id | number | Identificador interno de la transacción en Orion. |
code | string | Código de resultado. En éxito siempre "00". Ver códigos de transacción. |
description | string | Descripción del resultado devuelta por el proveedor. |
fee_amount | number | Comisión cobrada al cliente final (solo SERVICIO y PIN; 0 en TAE). |
total | number | Lo que debe pagar tu cliente final: amount + fee_amount. |
folio_carrier | string | Folio o autorización del proveedor. Es el comprobante para el cliente y para aclaraciones. |
pin | string | Solo PIN. Código del pin vendido. Puede no venir en otros productos. |
legend | string | Texto opcional del proveedor para imprimir en el ticket (instrucciones, aviso). Puede no venir. |
esim | object | null | Solo en productos ESIM; null en el resto. |
Venta de eSIM
Si tu catálogo incluye productos con input_type: "ESIM", la venta requiere dos campos adicionales y el dn es el teléfono de contacto del cliente:
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
dn | string | Sí | Teléfono de contacto a 10 dígitos. |
customer_name | string | Sí | Nombre completo del cliente (3 a 100 caracteres). |
customer_email | string | Sí | Correo del cliente. Ahí recibe el código QR de activación. |
En éxito, esim trae { "iccid": "...", "msisdn": "...", "qr_link": "https://..." }.
Diagrama de flujo
Resumen de acciones
| HTTP | ¿Se cobró? | Acción recomendada |
|---|---|---|
200 | Sí | Entregar comprobante (folio_carrier, pin). |
400 rechazo / validación | No | Corregir y reintentar con folio nuevo. |
401 / 403 | No | Revisar API Key, permisos y habilitación. |
409 | — | Consultar el folio original. |
429 | No | Esperar y reintentar con el mismo folio. |
502 / 500 / timeout | Puede ser | Consultar el folio. No generar folio nuevo. |
503 | No | Revisar monto o reintentar más tarde. |