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

# Solicitar Link Mágico

> Envia um link de acesso ao /minha-area para o e-mail registrado do cliente

## Visão Geral

Endpoint público (sem autenticação por API key). Sempre responde **200**, com `maskedEmail = null` quando o CPF/CNPJ não corresponde a nenhum cliente — é assim por design, para evitar enumeração de CPFs cadastrados.

Quando há cliente correspondente, a Garu envia um e-mail com um link da forma `https://garu.com.br/minha-area/<jwt>`. O JWT tem TTL de 24h e é reutilizável dentro desse período.

## Throttle

**3 requisições por hora por IP.** Excedente retorna **429 Too Many Requests**.

## Exemplo de Requisição

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://garu.com.br/api/public/minha-area/request \
    -H "Content-Type: application/json" \
    -d '{ "document": "12345678901" }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch(
    'https://garu.com.br/api/public/minha-area/request',
    {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ document: '12345678901' })
    }
  );

  const { maskedEmail } = await response.json();
  // maskedEmail: 'm***@gmail.com' ou null
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      "https://garu.com.br/api/public/minha-area/request",
      json={"document": "12345678901"}
  )

  masked = response.json()["maskedEmail"]  # 'm***@gmail.com' ou None
  ```
</CodeGroup>

## Parâmetros

<ParamField body="document" type="string" required>
  CPF (11 dígitos) ou CNPJ (14 dígitos). Pontuação é removida no servidor.
</ParamField>

## Resposta

**200 OK** sempre, mesmo sem cliente correspondente:

```json theme={null}
{ "maskedEmail": "m***@gmail.com" }
```

ou

```json theme={null}
{ "maskedEmail": null }
```

<Warning>
  Não tente inferir a existência do CPF pela resposta — o tempo de resposta é constante e o `maskedEmail = null` cobre tanto "CPF inválido" quanto "CPF não cadastrado".
</Warning>

## Erros

* **400 Bad Request** — corpo inválido (ex: `document` ausente).
* **429 Too Many Requests** — throttle de 3/hora/IP excedido.
