# Démarrage rapide

> Créez votre première session de vérification nouko en sandbox, ouvrez le parcours client et recevez le webhook en 5 minutes.

Source : https://nouko.openclouds.fr/docs/demarrage

## 1. Obtenir une clé de test

Créez un compte, puis ouvrez **Console → Développeurs → Clés API** et créez une clé **sandbox**. Elle commence par `nk_test_` et n’est affichée qu’une fois : enregistrez-la dans une variable d’environnement.

```
export NOUKO_API_KEY="nk_test_…"
```

## 2. Créer une session

**curl**

```bash
curl -X POST https://nouko.openclouds.fr/api/public/v1/sessions \
  -H "Authorization: Bearer $NOUKO_API_KEY" \
  -H "Idempotency-Key: commande-001" \
  -H "Content-Type: application/json" \
  -d '{
    "reference": "client-42",
    "country": "BJ",
    "tier": 2,
    "redirect_url": "https://votre-site.com/kyc/retour",
    "metadata": { "user_id": "42" }
  }'
```

**Node.js**

```javascript
// Node.js 18+ (fetch intégré)
const res = await fetch('https://nouko.openclouds.fr/api/public/v1/sessions', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.NOUKO_API_KEY}`,
    'Idempotency-Key': 'commande-001',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    reference: 'client-42',
    country: 'BJ',
    tier: 2,
    redirect_url: 'https://votre-site.com/kyc/retour',
    metadata: { user_id: '42' },
  }),
});
const session = await res.json();
if (!res.ok) throw new Error(`${session.error.code}: ${session.error.message}`);
// Redirigez votre client vers session.verification_url
console.log(session.id, session.verification_url);
```

**Python**

```python
# pip install requests
import os, requests

res = requests.post(
    "https://nouko.openclouds.fr/api/public/v1/sessions",
    headers={
        "Authorization": f"Bearer {os.environ['NOUKO_API_KEY']}",
        "Idempotency-Key": "commande-001",
    },
    json={
        "reference": "client-42",
        "country": "BJ",
        "tier": 2,
        "redirect_url": "https://votre-site.com/kyc/retour",
        "metadata": {"user_id": "42"},
    },
    timeout=15,
)
session = res.json()
if not res.ok:
    raise RuntimeError(f"{session['error']['code']}: {session['error']['message']}")
print(session["id"], session["verification_url"])
```

**PHP**

```php
<?php
$ch = curl_init('https://nouko.openclouds.fr/api/public/v1/sessions');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . getenv('NOUKO_API_KEY'),
        'Idempotency-Key: commande-001',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'reference' => 'client-42',
        'country' => 'BJ',
        'tier' => 2,
        'redirect_url' => 'https://votre-site.com/kyc/retour',
        'metadata' => ['user_id' => '42'],
    ]),
]);
$session = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($status >= 400) throw new RuntimeException($session['error']['code']);
echo $session['id'], ' ', $session['verification_url'];
```

**Go**

```go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
	"os"
)

func main() {
	body, _ := json.Marshal(map[string]any{
		"reference":    "client-42",
		"country":      "BJ",
		"tier":         2,
		"redirect_url": "https://votre-site.com/kyc/retour",
		"metadata":     map[string]string{"user_id": "42"},
	})
	req, _ := http.NewRequest("POST", "https://nouko.openclouds.fr/api/public/v1/sessions", bytes.NewReader(body))
	req.Header.Set("Authorization", "Bearer "+os.Getenv("NOUKO_API_KEY"))
	req.Header.Set("Idempotency-Key", "commande-001")
	req.Header.Set("Content-Type", "application/json")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	var s struct {
		ID              string `json:"id"`
		VerificationURL string `json:"verification_url"`
	}
	json.NewDecoder(res.Body).Decode(&s)
	fmt.Println(res.StatusCode, s.ID, s.VerificationURL)
}
```

**Java**

```java
// Java 15+
import java.net.URI;
import java.net.http.*;

public class CreateSession {
  public static void main(String[] args) throws Exception {
    String body = """
      {"reference":"client-42","country":"BJ","tier":2,
       "redirect_url":"https://votre-site.com/kyc/retour",
       "metadata":{"user_id":"42"}}""";
    HttpRequest req = HttpRequest.newBuilder(URI.create("https://nouko.openclouds.fr/api/public/v1/sessions"))
        .header("Authorization", "Bearer " + System.getenv("NOUKO_API_KEY"))
        .header("Idempotency-Key", "commande-001")
        .header("Content-Type", "application/json")
        .POST(HttpRequest.BodyPublishers.ofString(body))
        .build();
    HttpResponse<String> res = HttpClient.newHttpClient()
        .send(req, HttpResponse.BodyHandlers.ofString());
    System.out.println(res.statusCode() + " " + res.body());
  }
}
```

**Ruby**

```ruby
require "net/http"
require "json"

uri = URI("https://nouko.openclouds.fr/api/public/v1/sessions")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch("NOUKO_API_KEY")}"
req["Idempotency-Key"] = "commande-001"
req["Content-Type"] = "application/json"
req.body = {
  reference: "client-42", country: "BJ", tier: 2,
  redirect_url: "https://votre-site.com/kyc/retour",
  metadata: { user_id: "42" }
}.to_json

res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
session = JSON.parse(res.body)
puts session["id"], session["verification_url"]
```

Réponse :

```
HTTP/1.1 201 Created
X-Request-Id: 3b1e…

{
  "id": "6f1c2a9e-…",
  "reference": "client-42",
  "status": "draft",
  "country": "BJ",
  "tier": 2,
  "environment": "sandbox",
  "redirect_url": "https://votre-site.com/kyc/retour",
  "metadata": { "user_id": "42" },
  "expires_at": "2026-10-24T18:00:00.000Z",
  "verification_url": "https://nouko.openclouds.fr/verify/…",
  "replayed": false,
  "sandbox_scenario": null
}
```

## 3. Ouvrir le parcours client

Redirigez votre client vers `verification_url`. En sandbox, le parcours affiche « Parcours de test » : vous pouvez remplir avec des données fictives et choisir le résultat. À la fin, le client revient sur votre `redirect_url` avec `?nouko_session=…&status=…`.

> **Attention :** Le retour sur `redirect_url` sert uniquement à l’affichage. N’accordez jamais d’accès sur cette base : la décision fait foi seulement via le webhook signé ou `GET /v1/sessions/{id}/decision`.

## 4. Recevoir la décision

Dans **Console → Développeurs → Webhooks**, ajoutez l’adresse de votre serveur et conservez le secret affiché. Puis implémentez le récepteur : voir [Vérifier la signature](https://nouko.openclouds.fr/docs/signature).

## Raccourci : tester sans interface

Utilisez la référence `test_approve` (ou `test_decline`, `test_review`, `test_expire`) : la session avance immédiatement et les vrais webhooks partent. Voir [Sandbox](https://nouko.openclouds.fr/docs/sandbox).
