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

# Authentification

> Obtenez et gérez vos tokens JWT via les endpoints /public.

<Note>
  Ces endpoints ne nécessitent **aucune authentification** — les headers `apiKey` et `apiId` ne sont pas requis.
</Note>

***

## POST /public/access\_token

Authentifie un utilisateur et retourne un token d'accès JWT ainsi qu'un refresh token.

### Headers

| Header         | Valeur             |
| -------------- | ------------------ |
| `Content-Type` | `application/json` |

### Corps de la requête

```json theme={null}
{
  "username": "user@example.com",
  "password": "motdepasse"
}
```

| Champ      | Type   | Obligatoire | Description           |
| ---------- | ------ | ----------- | --------------------- |
| `username` | String | Oui         | Identifiant du compte |
| `password` | String | Oui         | Mot de passe          |

### Exemples

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://api.remita.cm/public/access_token \
    -H "Content-Type: application/json" \
    -d '{
      "username": "user@example.com",
      "password": "motdepasse"
    }'
  ```

  ```java Java theme={null}
  String body = """
      {
        "username": "user@example.com",
        "password": "motdepasse"
      }
      """;

  HttpClient client = HttpClient.newHttpClient();
  HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://api.remita.cm/public/access_token"))
      .header("Content-Type", "application/json")
      .POST(HttpRequest.BodyPublishers.ofString(body))
      .build();

  HttpResponse<String> response = client.send(request,
      HttpResponse.BodyHandlers.ofString());
  System.out.println(response.body());
  ```

  ```php PHP theme={null}
  <?php
  $ch = curl_init('https://api.remita.cm/public/access_token');
  curl_setopt_array($ch, [
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_POST           => true,
      CURLOPT_HTTPHEADER     => ['Content-Type: application/json'],
      CURLOPT_POSTFIELDS     => json_encode([
          'username' => 'user@example.com',
          'password' => 'motdepasse',
      ]),
  ]);
  $response = curl_exec($ch);
  curl_close($ch);
  $token = json_decode($response, true);
  echo "Access Token: " . $token['access_token'];
  ```

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

  response = requests.post(
      "https://api.remita.cm/public/access_token",
      json={"username": "user@example.com", "password": "motdepasse"}
  )
  token_data = response.json()
  access_token = token_data["access_token"]
  print(f"Access Token: {access_token}")
  ```
</CodeGroup>

### Réponse (200)

```json theme={null}
{
  "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_type": "Bearer",
  "expires_in": 3600
}
```

| Champ           | Type   | Description                                   |
| --------------- | ------ | --------------------------------------------- |
| `access_token`  | String | JWT à passer dans `Authorization: Bearer ...` |
| `refresh_token` | String | Token de renouvellement                       |
| `token_type`    | String | Toujours `Bearer`                             |
| `expires_in`    | Number | Durée de validité en secondes                 |

### Erreurs

| Code  | Description               |
| ----- | ------------------------- |
| `400` | Corps de requête invalide |
| `401` | Identifiants incorrects   |
| `500` | Erreur interne serveur    |

***

## POST /public/refresh\_token

Renouvelle un token d'accès expiré à partir du refresh token.

### Corps de la requête

```json theme={null}
{
  "refreshToken": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."
}
```

| Champ          | Type   | Obligatoire | Description                   |
| -------------- | ------ | ----------- | ----------------------------- |
| `refreshToken` | String | Oui         | Le refresh token à renouveler |

### Exemples

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://api.remita.cm/public/refresh_token \
    -H "Content-Type: application/json" \
    -d '{"refreshToken": "eyJhbGci..."}'
  ```

  ```java Java theme={null}
  String body = "{\"refreshToken\": \"eyJhbGci...\"}";

  HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://api.remita.cm/public/refresh_token"))
      .header("Content-Type", "application/json")
      .POST(HttpRequest.BodyPublishers.ofString(body))
      .build();

  HttpResponse<String> response = client.send(request,
      HttpResponse.BodyHandlers.ofString());
  System.out.println(response.body());
  ```

  ```php PHP theme={null}
  <?php
  $ch = curl_init('https://api.remita.cm/public/refresh_token');
  curl_setopt_array($ch, [
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_POST           => true,
      CURLOPT_HTTPHEADER     => ['Content-Type: application/json'],
      CURLOPT_POSTFIELDS     => json_encode(['refreshToken' => 'eyJhbGci...']),
  ]);
  $response = curl_exec($ch);
  curl_close($ch);
  print_r(json_decode($response, true));
  ```

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

  response = requests.post(
      "https://api.remita.cm/public/refresh_token",
      json={"refreshToken": "eyJhbGci..."}
  )
  print(response.json())
  ```
</CodeGroup>

### Réponse (200)

Même structure que `/public/access_token` avec de nouveaux tokens.

```json theme={null}
{
  "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_type": "Bearer",
  "expires_in": 3600
}
```

### Erreurs

| Code  | Description                      |
| ----- | -------------------------------- |
| `400` | Refresh token invalide ou expiré |
| `500` | Erreur interne serveur           |

***

<Tip>
  Stockez le `refresh_token` de manière sécurisée et renouvelez votre `access_token` avant son expiration pour éviter toute interruption de service. Voici un exemple de renouvellement automatique :

  ```python theme={null}
  def make_request(url, access_token, refresh_token, **kwargs):
      headers = {"Authorization": f"Bearer {access_token}", **kwargs.pop("headers", {})}
      response = requests.request("GET", url, headers=headers, **kwargs)
      if response.status_code == 401:
          new_tokens = requests.post(
              "https://api.remita.cm/public/refresh_token",
              json={"refreshToken": refresh_token}
          ).json()
          headers["Authorization"] = f"Bearer {new_tokens['access_token']}"
          response = requests.request("GET", url, headers=headers, **kwargs)
      return response
  ```
</Tip>
