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

# Tester dans le sandbox

> Créez une clé, exécutez six requêtes depuis ce site et vérifiez le résultat dans la console. Environ 15 minutes.

Vous pouvez exécuter chaque endpoint depuis cette documentation. Le playground de l'API envoie la requête depuis votre navigateur directement à `https://app.sahlfinancial.com/api` avec votre propre clé. Ce site ne relaie pas la requête et ne stocke pas votre clé.

<Warning>
  Utilisez uniquement de faux clients et de faux documents.  N'envoyez jamais un vrai document client.
</Warning>

## Ce dont vous avez besoin

| Élément | D'où il vient |
| - | - |
| Un espace de travail activé pour l'API KYC partenaire | Demandez à Sahl. Sans cela, le formulaire de clé ne propose aucun scope `kyc:` et les appels renvoient 403 `kyc_scope_not_allowed`. |
| Un utilisateur de la console qui peut gérer les clés | Rôle administrateur de l'espace de travail ou gestionnaire d'API, avec une adresse e-mail vérifiée. |
| Une clé d'API avec les scopes que vous testez | Créée dans la console, étapes ci-dessous. |
| Un faux fichier de test (facultatif, pour `/extract`) | N'importe quel JPEG, PNG, WebP, TIFF ou PDF que vous avez créé vous-même, jusqu'à 30 Mo. |

## Étape 1. Créer une clé sandbox

Il n'y a pas de clé sandbox distincte. Une clé fonctionne dans les deux environnements, et chaque appel en choisit un avec le champ `environment` (`sandbox` par défaut). Une « clé sandbox » est une clé que vous n'utilisez qu'avec `environment` défini à `sandbox`.

1. Connectez-vous sur [app.sahlfinancial.com](https://app.sahlfinancial.com).
2. Ouvrez **Settings**, puis l'onglet **API Keys**.
3. Cliquez sur **New key**. Nommez-la `sandbox-test`.
4. Cochez les scopes que vous voulez tester : `kyc:extract`, `kyc:verify`, `kyc:eid`. Laissez **Bound service account** vide. Si vous le remplissez, chaque appel doit aussi envoyer un jeton d'identité Google dans `X-Partner-Identity`, ce que le playground ne peut pas faire.
5. Cliquez sur **Create API Key**. Le secret apparaît une seule fois, sous la forme `sk_` suivi de 8 caractères, d'un tiret bas et de 64 caractères. Copiez-le maintenant. La console ne peut pas l'afficher de nouveau.

Si vous perdez le secret, créez une autre clé et révoquez l'ancienne. Voir [Authentification](/fr/authentication) pour la rotation.

## Étape 2. Ouvrir le playground

1. Ouvrez l'onglet **API reference** de ce site, puis **Verify a profile**.
2. Cliquez sur **Try it** en haut à droite de la page.
3. Dans le champ **Authorization**, collez votre clé. Collez uniquement la clé. Le playground ajoute `Bearer`.
4. Laissez le serveur à `https://app.sahlfinancial.com/api`.

Le corps de la requête est déjà rempli avec un faux client. Choisissez l'exemple nommé **Minimal profile, no documents** si le playground propose un choix.

<Note>
  Le playground appelle l'API directement depuis votre navigateur. Si une requête échoue avec une erreur réseau avant tout code de statut, votre navigateur l'a bloquée (CORS). Exécutez la même requête avec cURL à partir de l'exemple de code de la page, ou utilisez la [collection Postman](/fr/postman).
</Note>

## Étape 3. Exécuter les six requêtes

Exécutez-les dans cet ordre. Chacune demande quelques clics.

### 3.1 Vérifier un profil

Envoyez l'exemple minimal tel quel.

```json theme={"dark"}
{
  "reference": "client-0001",
  "environment": "sandbox",
  "subject": "Test Client",
  "kind": "individual",
  "values": { "first_name": "Test", "last_name": "Client" },
  "documents": [],
  "require_documents": false
}
```

Attendu : HTTP 200 et un corps de cette forme.

```json theme={"dark"}
{
  "passed": true,
  "checks": [
    { "id": "screening", "label": "Sanctions screening — no matches; PEP not list-screened", "severity": "info", "passed": true, "detail": "screened against 23000 sanctions entries. The bundle carries no PEP list, so politically-exposed status rests on the client's declaration, not on a list check." },
    { "id": "completeness", "label": "KYC/KYB data completeness (7%)", "severity": "warning", "passed": false, "detail": "missing 26 required data point(s): date_of_birth, citizenship, id_type, id_number, id_expiry, street1, city, province" }
  ],
  "critical_failures": [],
  "flags": [ { "id": "completeness", "severity": "warning", "passed": false } ],
  "completeness": { "required": 28, "present": 2, "percent": 7 },
  "policy": { "id": null, "version": 0, "source": "legacy", "regime": "none", "regulator": null, "purpose": "onboarding", "overrides_refused": [] },
  "registry": null,
  "case_id": "00000000-0000-4000-8000-000000000001"
}
```

Les valeurs diffèrent dans votre réponse : `case_id` est un vrai identifiant, le nombre d'entrées dans le détail du screening correspond à la taille de la liste chargée, et la politique de votre espace de travail peut ajouter des contrôles. `passed: true` avec un avertissement de complétude est le résultat normal ici. `flags` et `completeness.missing` sont raccourcis ci-dessus.

### 3.2 La faire échouer volontairement

Passez `require_documents` à `true` et envoyez de nouveau. Si la politique de votre espace de travail le permet, la réponse contient maintenant `passed: false` et un contrôle critique `required:photo_id` avec le détail `no readable government photo ID among the uploads`. Cela montre à quoi ressemble un dossier bloqué.

### 3.3 Lire un document

1. Ouvrez **Read documents**.
2. Définissez `files` avec votre faux bulletin de paie. Définissez `doc_type` à `payslip`, `reference` à `client-0001`, `environment` à `sandbox`, `kind` à `individual`.
3. Envoyez.

Attendu : HTTP 200 avec `fields`, `documents`, `field_count`, `checks`, `reader_unavailable`, `policy`, `case_id` et `document_ids`. Un bulletin de paie ne produit aucun `checks`. Les champs renvoyés dépendent de ce qui est imprimé sur votre fichier ; voir [Types de documents et champs](/fr/guides/document-types).

Chaque lecture est décomptée de votre quota mensuel (2 000 lectures par défaut).

### 3.4 Évaluer le risque

Ouvrez **Verify and assess risk** et choisissez l'exemple **Profile with the suitability answers**. Envoyez.

Attendu : `verification`, `assessment` et `registry`. Avec les valeurs de l'exemple, l'évaluation donne un profil de risque 58 `Balanced`, une capacité 20 `Low`, un risque de conformité `Low` ou `Medium` (selon votre politique et votre liste de screening) et une chaîne `suitability`. Voir [Évaluation du risque](/fr/guides/risk-assessment) pour la construction de chaque nombre.

### 3.5 Facultatif : lancer un contrôle eID

<Warning>
  Cet appel est réel, y compris en sandbox. Le fournisseur eID envoie par e-mail au client un code PIN et un lien dès que la demande est créée. Utilisez une adresse que vous contrôlez. Dans cette version, le client doit être canadien (`CA` ou `CAN`), seul pays que le moteur accepte, et votre espace de travail a besoin de son propre compte chez le fournisseur eID, sinon l'appel renvoie 404 `identity verification is not set up for this tenant`.
</Warning>

Ouvrez **Start an eID check**, indiquez votre propre e-mail, envoyez. Vous obtenez HTTP 201 et une `key`. Ouvrez ensuite **Get an eID check**, saisissez la `key` et envoyez jusqu'à ce que `complete` vaille `true`. Voir [Contrôle eID](/fr/guides/eid).

## Étape 4. Consulter le résultat dans la console

Comme chaque requête portait une `reference`, l'appel a enregistré un dossier dans votre espace de travail.

| Où dans la console | Ce que vous voyez |
| - | - |
| **Cases** | Un dossier par environnement et par référence : `client-0001` dans `sandbox`. |
| **Documents** | Les fichiers que vous avez envoyés, les champs lus et les contrôles par document. |
| **Developers, Call log** | Chaque appel d'API avec son statut, sa latence et son `X-Request-ID`. |

Le badge d'environnement dans la barre supérieure de la console change ce que montrent les listes. Passer en production fonctionne sur tous les plans, dans leurs limites : le plan Free inclut 10 dossiers de production par mois et exige un e-mail professionnel vérifié ; le bac à sable est illimité.

## En cas d'échec

| Ce que vous voyez | Cause | Correction |
| - | - | - |
| 401 `Missing API key` | Le champ Authorization est vide. | Collez la clé. |
| 401 `Invalid or revoked API key` | Faute de frappe, clé révoquée, ou clé d'un autre espace de travail. | Créez une nouvelle clé. |
| 403 `API key lacks the kyc:verify scope` | La clé a été créée sans ce scope. | Créez une clé qui a le scope. |
| 403 `kyc_scope_not_allowed` | L'espace de travail n'est pas activé pour l'API partenaire. | Demandez à Sahl. |
| 422 avec une liste `loc` | Un champ ne correspond pas au schéma. | Lisez `detail[].loc` et `msg`. |
| 429 `kyc_extract_cap_reached` | Le quota mensuel de lectures est épuisé. | Demandez à Sahl de le relever. |

Tous les corps d'erreur figurent dans le [catalogue d'erreurs](/fr/errors).

## Suite

<CardGroup cols={2}>
  <Card title="Postman" icon="paper-plane" href="/fr/postman">Exécutez les mêmes requêtes avec une collection et un script de test.</Card>
  <Card title="Guide pas à pas de bout en bout" icon="route" href="/fr/guides/walkthrough">D'un bulletin de paie et d'une carte nationale d'identité marocaine à une évaluation du risque, avec cURL, JavaScript et Python.</Card>
</CardGroup>


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