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

# Réputation & Certification

> Consulter le score et le niveau de certification d'un annotateur.

## Signature

```typescript theme={null}
dloopiq.getUserReputation(userId: string): Promise<UserReputation>
```

***

## Type `UserReputation`

```typescript theme={null}
interface UserReputation {
  userId: string
  score: number              // 0-100, démarre à 50
  goldenTasksAnswered: number
  correctAnswers: number
  accuracy: number           // 0-1, ex: 0.87 = 87%
  certification: CertificationLevel
  nextLevel: NextLevelInfo | null
}

interface NextLevelInfo {
  level: CertificationLevel
  requiredScore: number
  requiredAnswers: number
  missingScore: number
  missingAnswers: number
}

type CertificationLevel = 'Unranked' | 'Bronze' | 'Silver' | 'Gold' | 'Expert'
```

***

## Exemple

```typescript theme={null}
const rep = await dloopiq.getUserReputation('user_abc123')

console.log(rep.score)          // 73
console.log(rep.certification)  // "Silver"
console.log(rep.accuracy)       // 0.82

if (rep.nextLevel) {
  console.log(
    `Prochain niveau : ${rep.nextLevel.level} — ` +
    `manque ${rep.nextLevel.missingScore} points et ` +
    `${rep.nextLevel.missingAnswers} réponses`
  )
  // → "Prochain niveau : Gold — manque 2 points et 150 réponses"
}
```

***

## Niveaux de certification

| Niveau    | Score minimum | Réponses golden minimum |
| --------- | ------------- | ----------------------- |
| Unranked  | —             | \< 10                   |
| Bronze 🥉 | ≥ 40          | ≥ 10                    |
| Silver 🥈 | ≥ 60          | ≥ 50                    |
| Gold 🥇   | ≥ 75          | ≥ 200                   |
| Expert ⭐  | ≥ 90          | ≥ 500                   |

Un utilisateur doit satisfaire **les deux conditions** (score ET nombre de réponses) pour atteindre un niveau.

***

## Comment évolue le score

Le score démarre à **50** pour tout nouvel utilisateur.

| Événement                      | Impact score |
| ------------------------------ | ------------ |
| Golden task — bonne réponse    | +1           |
| Golden task — mauvaise réponse | -3           |
| Score minimum                  | 0            |
| Score maximum                  | 100          |

***

## Affichage suggéré dans votre app

```typescript theme={null}
function CertificationBadge({ userId }: { userId: string }) {
  const [rep, setRep] = useState<UserReputation | null>(null)

  useEffect(() => {
    dloopiq.getUserReputation(userId).then(setRep)
  }, [userId])

  if (!rep) return null

  const emoji = {
    Unranked: '⚪',
    Bronze: '🥉',
    Silver: '🥈',
    Gold: '🥇',
    Expert: '⭐'
  }[rep.certification]

  return (
    <View>
      <Text>{emoji} {rep.certification}</Text>
      <Text>Score : {rep.score}/100</Text>
      <Text>Précision : {Math.round(rep.accuracy * 100)}%</Text>
    </View>
  )
}
```

***

## Progression vers le niveau suivant

```typescript theme={null}
const rep = await dloopiq.getUserReputation(userId)

if (rep.nextLevel) {
  const { level, missingScore, missingAnswers } = rep.nextLevel
  
  // Afficher une barre de progression vers le prochain niveau
  const progressScore = Math.max(0, 1 - missingScore / 15)  // approx
  const progressAnswers = Math.max(0, 1 - missingAnswers / 50)  // approx
  
  showProgressBar(`Vers ${level}`, Math.min(progressScore, progressAnswers))
} else {
  showMessage('Niveau maximum atteint ! Vous êtes Expert ⭐')
}
```

***

## Première visite

Si l'utilisateur n'a encore répondu à aucune tâche, la réputation est créée à la première réponse. Si vous appelez `getUserReputation` avant toute réponse, l'API retourne `null` ou crée un profil vierge selon l'implémentation.

<Note>
  Le score de réputation est **par (développeur, utilisateur)** — un utilisateur peut avoir des scores différents selon l'app dans laquelle il annote.
</Note>
