Skip to content

Guía de integración: informe de ventas

Esta guía está pensada para un canal de ventas que quiere consultar sus propias ventas realizadas a través de la API. Sigue estos pasos en orden.


Requisitos previos

Antes de empezar necesitas:

DatoDónde conseguirlo
sales_channel_slugTe lo proporciona el equipo de beTickets al darte de alta como canal
widget_key (wk_...)Se genera desde el dashboard de beTickets (menú Canales de venta → tu canal → Generar key)
langCódigo de idioma (es, en, ca, etc.)
URL baseProducción: https://api.bticketing.com/api / Preproducción: https://api-pre.betickets.io/api

Paso 1: Obtén un token de acceso

El único endpoint público. Intercambia tu slug + widget_key por un Bearer token.

http
POST /api/sales-channel/v1/auth/token
Content-Type: application/json

{
  "sales_channel_slug": "teatro-calderon",
  "widget_key": "wk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

Respuesta:

json
{
  "success": true,
  "data": {
    "access_token": "1|abc123def456...",
    "token_type": "Bearer",
    "sales_channel_slug": "teatro-calderon"
  }
}

GUARDA ESTE TOKEN

El token anterior se revoca al pedir uno nuevo. Conserva el último token en un lugar seguro (variable de entorno, gestor de secretos, etc.).

A partir de ahora, todas las llamadas deben incluir el token en el header:

http
Authorization: Bearer 1|abc123def456...

Paso 2: Consulta tu informe de ventas

Con el token ya puedes llamar al endpoint de ventas. Este endpoint solo devuelve las órdenes asociadas a tu canal — no ves datos de otros canales.

URL

GET /api/sales-channel/v1/{salesChannelSlug}/{lang}/reports/sales

Sin filtros — todas las ventas

http
GET /api/sales-channel/v1/teatro-calderon/es/reports/sales
Authorization: Bearer 1|abc123def456...

Devuelve las últimas 500 órdenes completadas de tu canal.

Filtrar por un evento concreto

http
GET /api/sales-channel/v1/teatro-calderon/es/reports/sales?event_id=42
Authorization: Bearer 1|abc123def456...

Filtrar por varios eventos

http
GET /api/sales-channel/v1/teatro-calderon/es/reports/sales?event_ids[]=42&event_ids[]=57
Authorization: Bearer 1|abc123def456...

Filtrar por rango de fechas

http
GET /api/sales-channel/v1/teatro-calderon/es/reports/sales?date_from=2025-04-01&date_to=2025-04-30
Authorization: Bearer 1|abc123def456...

LÍMITE DE 90 DÍAS

No puedes solicitar rangos superiores a 90 días. Si lo intentas, la API responderá con un error 422.

Combinar filtros

http
GET /api/sales-channel/v1/teatro-calderon/es/reports/sales?event_ids[]=42&date_from=2025-04-01&date_to=2025-04-30
Authorization: Bearer 1|abc123def456...

Paso 3: Entiende la respuesta

json
{
  "status": 200,
  "success": true,
  "data": {
    "data": [
      {
        "id": 123,
        "order_reference": "ABC-123",
        "type": "purchase",
        "datetime": "2025-04-01T14:30:00+00:00",
        "customer_name": "Juan Pérez",
        "customer_email": "juan@ejemplo.com",
        "event_name": "Concierto de Rock",
        "session_datetime": "2025-05-15T20:00:00+00:00",
        "tickets": 2,
        "base_amount": 100.00,
        "discount_amount": -10.00,
        "fee_amount": 5.00,
        "payment_method": "card",
        "total_amount": 95.00,
        "currency": "EUR",
        "status": "completed"
      }
    ],
    "summary": {
      "transactions": 50,
      "purchases": 40,
      "refunds": 5,
      "reservations": 5,
      "tickets": 120,
      "base_amount": 3000.00,
      "discount_amount": -200.00,
      "fee_amount": 150.00,
      "total_amount": 2950.00,
      "refund_amount": 250.00,
      "net_amount": 2700.00,
      "currency": "EUR"
    }
  },
  "message": "Sales report retrieved successfully"
}

Lista de transacciones (data[].*)

CampoTipoDescripción
idintegerID interno de la orden
order_referencestringCódigo legible de la orden (p.ej. ABC-123)
typestringpurchase (compra), refund (devolución), reservation (reserva)
datetimestring (ISO 8601)Fecha y hora de creación
customer_namestring o nullNombre completo del comprador
customer_emailstring o nullEmail del comprador
event_namestring o nullNombre del evento
session_datetimestring o nullFecha/hora de la sesión
ticketsintegerNúmero de entradas en la orden
base_amountfloatSuma del precio base de las entradas
discount_amountfloatSuma de descuentos (valor negativo)
fee_amountfloatSuma de gastos de gestión
payment_methodstring o nullMétodo de pago usado
total_amountfloatImporte total de la orden
currencystringCódigo de moneda (p.ej. EUR)
statusstringcompleted o cancelled

Resumen (summary.*)

CampoDescripción
transactionsTotal de transacciones en el resultado
purchasesNúmero de compras
refundsNúmero de devoluciones
reservationsNúmero de reservas
ticketsTotal de entradas vendidas
base_amountSuma del precio base
discount_amountSuma de descuentos aplicados
fee_amountSuma de gastos de gestión
total_amountImporte total facturado
refund_amountImporte devuelto (valor absoluto)
net_amountImporte neto (total_amount - refund_amount)
currencyMoneda del resumen

Paso 4: Ejemplos prácticos

Ejemplo 1: Dashboard diario

Un quiosco quiere mostrar al cierre del día cuánto ha vendido:

bash
# Obtener token
TOKEN=$(curl -s -X POST "https://api.bticketing.com/api/sales-channel/v1/auth/token" \
  -H "Content-Type: application/json" \
  -d '{"sales_channel_slug":"teatro-calderon","widget_key":"wk_xxxx"}' \
  | jq -r '.data.access_token')

# Ventas del día de hoy
curl -s "https://api.bticketing.com/api/sales-channel/v1/teatro-calderon/es/reports/sales?date_from=2025-04-27&date_to=2025-04-27" \
  -H "Authorization: Bearer $TOKEN" | jq '.data.summary'

Ejemplo 2: Informe mensual de un evento concreto

bash
TOKEN=$(curl -s -X POST "https://api.bticketing.com/api/sales-channel/v1/auth/token" \
  -H "Content-Type: application/json" \
  -d '{"sales_channel_slug":"teatro-calderon","widget_key":"wk_xxxx"}' \
  | jq -r '.data.access_token')

curl -s "https://api.bticketing.com/api/sales-channel/v1/teatro-calderon/es/reports/sales?event_id=42&date_from=2025-03-01&date_to=2025-03-31" \
  -H "Authorization: Bearer $TOKEN" | jq '.data.summary'

Ejemplo 3: Sincronización de devoluciones

Saca todas las devoluciones de los últimos 7 días filtrando desde el código:

bash
TOKEN=$(curl -s ... | jq -r '.data.access_token')

curl -s "https://api.bticketing.com/api/sales-channel/v1/teatro-calderon/es/reports/sales?date_from=2025-04-20&date_to=2025-04-27" \
  -H "Authorization: Bearer $TOKEN" | jq '.data.data[] | select(.type == "refund")'

Buenas prácticas

  1. Token Management: Solicita el token una vez y reutilízalo. Solo renueva cuando recibas un 401 Unauthorized.
  2. Rangos acotados: No pidas más de 90 días de una vez. Si necesitas un histórico largo, fragmenta en ventanas de 90 días.
  3. Cacheo: El límite es de 500 registros por llamada. Para conjuntos grandes, acota por fechas.
  4. Frecuencia: Consulta el informe con la frecuencia que necesites (cada hora, cada día, etc.). No hay rate limiting específico para este endpoint, pero sé razonable.
  5. Timezona: Todas las fechas se devuelven en formato ISO 8601 con offset UTC. Convierte a tu zona horaria local en el cliente.

Solución de problemas

ErrorCódigoCausa probableSolución
Unauthorized sales channel403Token inválido o el slug de la URL no coincide con el canal del tokenRenueva el token o verifica el slug
The date range cannot exceed 90 days422date_from y date_to distan más de 90 díasReduce el rango a ≤ 90 días
The given data was invalid422Parámetros mal formadosRevisa el formato: Y-m-d para fechas, integer para IDs

Referencias

beTickets — Plataforma de ticketing