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

# Publicar el ranking

> Usa nuestro embed o construye una interfaz propia con la API pública.

## Opción A: frontend de Exura Tech

Comparte el `ranking_link` que entrega la API administrativa: `https://<frontend>/embed/competitions/{uuid}`. También puedes insertarlo en una página del broker:

```html theme={"theme":{"light":"github-light","dark":"github-dark"}}
<iframe
  src="https://<frontend>/embed/competitions/<competition-uuid>"
  title="Ranking de competencia"
  loading="lazy"
  style="width:100%;min-height:760px;border:0"
></iframe>
```

Sustituye origen y UUID por los valores recibidos; no insertes secretos en la URL. La vista muestra estado, premios configurados, ranking y detalle al seleccionar una fila. Actualiza los datos aproximadamente cada 20 segundos; la sincronización de trading del servidor tiene su propio intervalo.

## Opción B: frontend del broker

Las siguientes rutas son de lectura pública:

| Método | Ruta | Uso |
| - | - | - |
| `GET` | `/api/v1/competitions/{uuid}` | Estado, horarios y premios |
| `GET` | `/api/v1/competitions/{uuid}/leaderboard?limit=100&offset=0` | Ranking paginado |
| `GET` | `/api/v1/competitions/{uuid}/participants/{participant_uuid}/history` | Curva y hasta cinco cierres recientes |

El leaderboard devuelve `competition`, `generated_at`, `total` e `items`. Cada fila contiene `rank`, `participant_uuid`, `login`, `profit_net`, `balance`, `equity`, `closed_deals`, `last_sync_at` y `prize`. El orden es por profit neto USD descendente; un empate se resuelve por orden de registro y cada fila recibe un puesto único.

El historial se consulta bajo demanda. Su `curve` empieza en cero y reúne todos los cierres elegibles; `deals` contiene solo los últimos cinco. Durante la competencia se obtiene de MT5 y se cachea por 30 segundos **por proceso API**. Después de completarse el archivo diferido se lee desde la base de datos. El frontend debe tratar `503` como indisponibilidad temporal y permitir reintentar.

### Ejemplo de lectura para una interfaz propia

```javascript theme={"theme":{"light":"github-light","dark":"github-dark"}}
const apiOrigin = "https://api.example.com";
const competitionUuid = "<competition-uuid>";

async function readJson(path) {
  const response = await fetch(`${apiOrigin}${path}`, { cache: "no-store" });
  if (!response.ok) throw new Error(`Competition API: ${response.status}`);
  return response.json();
}

const metadata = await readJson(`/api/v1/competitions/${competitionUuid}`);
const leaderboard = await readJson(
  `/api/v1/competitions/${competitionUuid}/leaderboard?limit=100&offset=0`
);

// Load history when a viewer selects a row, not for every row on every refresh.
const selected = leaderboard.items[0];
if (selected) {
  const history = await readJson(
    `/api/v1/competitions/${competitionUuid}/participants/${selected.participant_uuid}/history`
  );
  console.log(metadata.status, selected.rank, history.curve, history.deals);
}
```

Pagina usando `total`, `limit` y `offset` si hay más de 100 cuentas. Actualiza ranking y estado con un intervalo moderado; abre historial solo al seleccionar una cuenta. El dato puede retrasarse hasta la siguiente sincronización del worker. Muestra `last_sync_at` y una opción de reintento si una lectura falla.

> [!WARNING]
>
> Estas rutas exponen públicamente login y resultados. Antes de construir un frontend propio, revisa las condiciones de publicación y privacidad acordadas con tus participantes. Configura CORS en el servidor si tu aplicación web llama la API desde otro origen; una integración backend no depende de CORS.


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