BitsMarketsitsMarkets
InicioJuegosGift Cards
Para revendedores

Vende nuestros productos desde tu propia web

Una API sencilla: catálogo con precios, verificación del ID del jugador y pedidos que se cobran de tu saldo y se entregan solos.

01

Crea tu clave

Entra a tu perfil y genera una clave de API. Se muestra una sola vez: guárdala en tu servidor.

02

Carga saldo

Los pedidos se cobran de tu saldo en dólares, al mismo precio que paga cualquier cliente con saldo. Recarga por QR o Binance desde la tienda.

03

Integra y vende

Lista el catálogo, verifica el ID del jugador y crea el pedido. Nosotros lo entregamos; tú consultas el estado y, si es una gift card, recibes el código.

Autenticación

Todas las peticiones llevan la clave en la cabecera Authorization. La clave es secreta: úsala solo desde tu servidor, nunca desde el navegador de tus clientes. Si se expone, revócala desde tu perfil y crea otra.

curl https://bitsmarkets.net/api/v1/catalog/?game=free-fire \
  -H "Authorization: Bearer bmk_TU_CLAVE"

Endpoints

MétodoRutaQué hace
GET/api/v1/account/Tu cuenta y tu saldo en dólares.
GET/api/v1/catalog/Juegos y productos activos, con el precio en dólares que se te cobra por cada uno. Acepta ?game=slug para un solo juego.
GET/api/v1/verify/Verifica un ID de jugador antes de comprar: devuelve el nombre y la región cuando el juego lo permite.
GET · POST/api/v1/orders/Crea un pedido cobrado de tu saldo (POST) o lista los tuyos (GET, con page, page_size, status y since).
GET/api/v1/orders/{id}/Un pedido: su estado y, si es una gift card ya entregada, sus códigos.
curl "https://bitsmarkets.net/api/v1/verify/?game=mobile-legends&player_id=123456789&zone_id=5021" \
  -H "Authorization: Bearer bmk_TU_CLAVE"

Crear un pedido

Envía el producto y el ID del jugador. Con reference (tu propio número de pedido) puedes reintentar sin riesgo: la misma referencia devuelve el mismo pedido y no cobra dos veces.

CampoRequeridoDescripción
product_idSíEl id del producto, tal como viene en el catálogo.
player_idSíEl ID del jugador. Las recargas lo necesitan; las gift cards no.
zone_idSegún el juegoEl servidor o zona, cuando el juego lo pide (requires_zone_id en el catálogo).
referenceSegún el juegoTu referencia, hasta 40 caracteres. Recomendada: es lo que hace seguro reintentar.
contact_emailNoCorreo del comprador final. Si lo mandas, recibe los avisos del pedido.
curl -X POST https://bitsmarkets.net/api/v1/orders/ \
  -H "Authorization: Bearer bmk_TU_CLAVE" \
  -H "Content-Type: application/json" \
  -d '{
    "product_id": 123,
    "player_id": "123456789",
    "zone_id": "5021",
    "reference": "pedido-1001"
  }'

La respuesta, con el pedido ya cobrado y en entrega:

{
  "id": 10234,
  "reference": "pedido-1001",
  "status": "processing",
  "product": { "id": 123, "name": "110 Diamantes", "game_slug": "free-fire", "game_name": "Free Fire" },
  "player_id": "123456789",
  "zone_id": "5021",
  "charged_usd": 1.02,
  "codes": [],
  "origin": "api"
}

Consulta el pedido cada pocos segundos hasta que pase a completed:

curl https://bitsmarkets.net/api/v1/orders/10234/ \
  -H "Authorization: Bearer bmk_TU_CLAVE"

Estados del pedido

  • processing: cobrado y en entrega. Suele tardar segundos o minutos.
  • completed: entregado. Si es una gift card, codes trae los códigos.
  • attention: lo entrega una persona y puede tardar más. Si no se puede entregar, se cancela y el saldo vuelve.
  • cancelled: cancelado y el saldo devuelto.

Errores

Cada error vuelve con un mensaje y un codigo estable para que tu sistema decida qué hacer.

  • 401 clave_invalida: la clave no existe o fue revocada.
  • 402 saldo_insuficiente: no alcanza el saldo. La respuesta trae disponible_usd y necesario_usd.
  • 400: falta un campo o no tiene la forma correcta (falta_product_id, falta_player_id, referencia_larga).
  • 409: el producto se agotó justo ahora, o la referencia ya está en uso.
  • 429: demasiadas peticiones. Espera un momento.
  • 503 saldo_sin_tasa: no hay tipo de cambio confiable en este momento. Reintenta en unos minutos.

Webhooks

En vez de sondear, podemos avisarle a tu servidor cuando un pedido de tu clave termina. La URL se configura desde tu perfil, en la clave; ahí también ves el secreto para verificar la firma y puedes enviar una prueba.

Eventos

  • order.completed: entregado. Si es una gift card, order.codes trae los códigos.
  • order.attention: lo entrega una persona y puede tardar más.
  • order.cancelled: cancelado y el saldo devuelto.
  • ping: la prueba que envías desde tu perfil. order viene en null.

Qué recibes

Un POST con JSON. order es el mismo objeto que devuelve el detalle del pedido en ese momento. delivery_id identifica el aviso: si te llega dos veces, ignora el segundo.

POST https://tu-tienda.com/bits/webhook
Content-Type: application/json
X-Bits-Event: order.completed
X-Bits-Delivery: 517
X-Bits-Timestamp: 1758012345
X-Bits-Signature: v1=3f1c9a...

{
  "event": "order.completed",
  "delivery_id": 517,
  "sent_at": "2026-09-16T14:05:45+00:00",
  "order": { "id": 10234, "reference": "pedido-1001", "status": "completed", "codes": ["ABCD-1234"], ... }
}

Verifica la firma

Cada aviso lleva las cabeceras X-Bits-Timestamp y X-Bits-Signature. La firma es HMAC-SHA256 con tu secreto sobre el texto timestamp.cuerpo. Recompútala y compárala; rechaza el aviso si el timestamp tiene más de cinco minutos.

import hmac, hashlib, time

def verificar(cuerpo: bytes, ts: str, firma: str, secreto: str) -> bool:
    if abs(time.time() - int(ts)) > 300:
        return False
    esperada = "v1=" + hmac.new(secreto.encode(), f"{ts}.".encode() + cuerpo, hashlib.sha256).hexdigest()
    return hmac.compare_digest(esperada, firma)
const crypto = require("crypto");

function verificar(cuerpo, ts, firma, secreto) {
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
  const esperada = "v1=" + crypto.createHmac("sha256", secreto).update(ts + ".").update(cuerpo).digest("hex");
  return esperada.length === firma.length && crypto.timingSafeEqual(Buffer.from(esperada), Buffer.from(firma));
}

Reintentos

Responde 2xx en menos de siete segundos. Si tu servidor no responde o devuelve otro código, reintentamos a 1, 5, 15, 60, 180, 720 y 1440 minutos y después lo abandonamos. Lo ves en tu perfil y en la lista de entregas de la API.

La URL tiene que ser https y pública. No aceptamos direcciones internas ni seguimos redirecciones.

Reglas

  • Se cobra de tu saldo en dólares, al mismo precio que paga cualquier cliente con saldo. Tu margen lo pones en tu tienda.
  • La clave va solo en tu servidor. Nunca en una página, una app o un repositorio público.
  • Límites por clave: 60 peticiones por minuto al catálogo y a la cuenta, 120 verificaciones por minuto y 120 pedidos por hora.
  • Esta es la versión v1. Pueden aparecer campos nuevos en las respuestas; los que existen no cambian de significado.

¿Listo para integrar?

Crea tu clave desde el perfil y prueba con el catálogo.

Ir a mi perfil¿Dudas? Escríbenos por WhatsApp