> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cbpayapp.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Activos fiat del ledger

> Cómo funcionan los saldos BOB, MXN y ARS en el ledger de CBPay y qué productos los soportan

export const EnvUrls = ({lang = "en"}) => {
  const T = {
    en: {
      test: "Test",
      live: "Live",
      hint: "Same API on both environments — build against test first, then go live by swapping the base URL and the key.",
      guide: "Environments and testing",
      href: "/en/environment-testing"
    },
    es: {
      test: "Test",
      live: "Live",
      hint: "La misma API en ambos ambientes — construye primero contra test y pasa a live cambiando la URL base y la key.",
      guide: "Entorno y pruebas",
      href: "/es/environment-testing"
    },
    zh: {
      test: "Test",
      live: "Live",
      hint: "两个环境的 API 完全一致——先在 test 环境构建，再通过切换基础 URL 和密钥上线。",
      guide: "环境与测试",
      href: "/zh/environment-testing"
    }
  };
  const t = T[lang] || T.en;
  const row = (label, url, keyPattern, badgeCls) => <div className="flex flex-wrap items-center gap-2 px-3 py-2">
      <span className={"rounded px-1.5 py-0.5 text-xs font-semibold uppercase tracking-wide " + badgeCls}>
        {label}
      </span>
      <code className="text-xs">{url}</code>
      <span className="text-xs text-gray-400 dark:text-zinc-500">·</span>
      <code className="text-xs">{keyPattern}</code>
    </div>;
  return <div className="my-4 rounded-xl border border-gray-200 dark:border-zinc-700 divide-y divide-gray-200 dark:divide-zinc-700 text-sm not-prose">
      {row(t.test, "https://cryptobank.qbank.cl/platform", "pk_test_...", "bg-amber-100 text-amber-800 dark:bg-amber-900/40 dark:text-amber-300")}
      {row(t.live, "https://api.qbank.cl/platform", "pk_...", "bg-emerald-100 text-emerald-800 dark:bg-emerald-900/40 dark:text-emerald-300")}
      <p className="px-3 py-2 text-xs text-gray-500 dark:text-zinc-400 m-0">
        {t.hint} <a href={t.href}>{t.guide} →</a>
      </p>
    </div>;
};

<EnvUrls lang="es" />

Las cuentas CBPay ahora exponen tres activos fiat del ledger: **BOB**, **MXN**
y **ARS**. Son saldos independientes, almacenados con dos decimales (unidades
menores), y aparecen junto a USD, USDT, USDC, BTC, GOLD, SILVER y PLATINUM.

```mermaid theme={"theme":{"light":"github-light","dark":"github-dark"}}
flowchart LR
  balances["GET /v1/balances"] --> ledger["10 ledger assets"]
  history["GET /v1/balances/history"] --> ledger
  analytics["GET /v1/analytics/summary"] --> valuation["feed price or unpriced"]
```

## Dónde aparecen

* `GET /v1/balances`: siempre devuelve los diez activos del ledger, incluso
  filas en cero. Los fiat usan dos decimales, por ejemplo `"125.40"`.
* `GET /v1/balances/history`: incluye una serie diaria por cada activo fiat.
  La serie sigue `available`; los holds aparecen en el snapshot actual.
* `GET /v1/analytics/summary`: incluye saldos y volumen fiat cuando existen.
  La valorización USD usa el feed de tasas de la organización (`1 / tasa
  local-por-USD`). Sin una tasa válida, el activo queda como `unpriced` y se
  excluye de los totales USD.

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "account_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  "balances": [
    { "asset": "BOB", "available": "15000.00", "held": "0.00" },
    { "asset": "MXN", "available": "0.00", "held": "0.00" },
    { "asset": "ARS", "available": "0.00", "held": "0.00" }
  ]
}
```

## Transferencias

`POST /v1/transfers` permite transferencias internas del mismo activo cuando
origen y destino usan el mismo asset. La transferencia fiat conserva sus dos
decimales; no convierte implícitamente a USDT ni a otra moneda.

## Gates de producto en v1

Registrar el fiat en el ledger no significa que todos los productos puedan
gastarlo:

| Producto | BOB/MXN/ARS en v1 |
| - | - |
| Saldos, history y analytics | Soportado |
| Transferencias internas del mismo asset | Soportado |
| Settlement de payouts y defaults de organización | Aceptado; la ejecución fiat responde `503 pricing_unavailable` hasta que exista pricing de settlement fiat |
| Swaps | Rechazado con `400 invalid_pair` |
| Checkout | Rechazado como settlement asset con `invalid_asset` |
| POS | Rechazado como settlement asset con `invalid_asset` |
| Tarjetas | Rechazado con `400 spending_asset_unavailable` |

La separación es intencional: un saldo puede existir en el ledger antes de
que exista el pricing o el camino de settlement externo.

## Errores y precisión

Los montos son strings decimales. `1.50` BOB equivale a 150 unidades menores;
`1.234` BOB, MXN o ARS se rechaza. Una solicitud de settlement fiat puede ser
válida en forma y aun así responder `503 pricing_unavailable` hasta que se
implemente el camino de payout fiat.

<AccordionGroup>
  <Accordion title="¿Agregar fiat cambia mi settlement asset por defecto?">
    No. Tu default no cambia. El fiat se usa solo
    cuando el activo está habilitado y el gate del producto lo acepta.
  </Accordion>

  <Accordion title="¿Puedo usar un saldo fiat para pagar una compra con tarjeta?">
    No. Las tarjetas rechazan assets fiat en v1; el saldo sigue visible y usable
    por los productos soportados arriba.
  </Accordion>
</AccordionGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.