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

# Process Crossing Counts (Spot x Future)

## 📖 Descrição

Dispara o processamento **assíncrono** da contagem de cruzamentos de preço (spot x future) para um dia. O endpoint retorna imediatamente com **202 Accepted**. Em background, o serviço consulta todas as operações spot x future do dia, agrupa por ticker e exchange, calcula a quantidade de cruzamentos por grupo e persiste os resultados na base de dados.

***

## 🛠️ Requisição

### Método

`POST`

### URL

```plaintext theme={null}
/v1/arbitrage/future/crossing-counts
```

### Body (opcional)

| Campo  | Tipo   | Obrigatório | Descrição                                                                    |
| ------ | ------ | ----------- | ---------------------------------------------------------------------------- |
| `date` | string | Não         | Data no formato YYYY-MM-DD. Se omitido, usa o dia atual (America/Sao\_Paulo) |

### Exemplo de Requisição

Processar o dia atual (body vazio):

```bash theme={null}
curl -X POST 'localhost:8080/v1/arbitrage/future/crossing-counts' \
  -H 'Content-Type: application/json' \
  -d '{}'
```

Processar uma data específica:

```bash theme={null}
curl -X POST 'localhost:8080/v1/arbitrage/future/crossing-counts' \
  -H 'Content-Type: application/json' \
  -d '{"date": "2026-02-25"}'
```

***

## 📤 Resposta

### Status

`202 Accepted`

A resposta é enviada assim que o processamento é **aceito**. O trabalho pesado (consulta, agrupamento, contagem e gravação) ocorre em background.

### Exemplo de Resposta

```json theme={null}
{
    "processingDate": "2026-02-25",
    "status": "accepted"
}
```

### Campos da Resposta

| Campo            | Tipo   | Descrição                                        |
| ---------------- | ------ | ------------------------------------------------ |
| `processingDate` | string | Data que será (ou foi) processada (YYYY-MM-DD)   |
| `status`         | string | Sempre `"accepted"` quando a requisição é válida |

***

## 📝 Notas

<Callout type="info">
  **Comportamento:**

  * O processamento roda em uma goroutine; não bloqueia a resposta HTTP.
  * Para a data informada (ou dia atual), o serviço busca todas as operações na coleção de operações spot x future, agrupa por `(ticker, exchange)` e, para cada grupo, conta os cruzamentos (inversão de sinal de `spotPrice - futurePrice` ao longo da série ordenada por tempo; pontos em que `spotPrice == futurePrice` são tratados como "toque" e só contam como cruzamento se o sinal de fato inverter).
  * Os resultados são gravados na coleção `spot_future_crossing_counts`, com documentos contendo: `processing_date`, `ticker`, `exchange`, `crossing_count`.
  * A gravação é **idempotente**: cada documento é identificado pela tripla `(processing_date, ticker, exchange)` e gravado via *upsert*. Reprocessar a mesma data **substitui** o valor anterior em vez de inserir duplicatas, evitando que a soma exibida no endpoint de leitura seja inflada.
  * Erros durante o processamento em background são reportados à telemetria; o cliente não recebe retry ou status do job.
</Callout>

<Callout type="warn">
  **Erros comuns:**

  * `500`: erro ao parsear o body (raro; body é opcional). Falhas no processamento assíncrono não alteram o status HTTP (já foi 202).
</Callout>
