# Référence de l’API

> Tous les points d’accès de l’API Fileverity avec leurs paramètres, schémas de requête et de réponse, codes d’erreur et exemples, générés à partir de la spécification OpenAPI 3.1.

Source : https://fileverity.com/fr/docs/api-reference

Cette référence est générée à partir du document OpenAPI 3.1 de l’API, disponible à l’adresse [https://api.fileverity.com/v1/openapi.json](https://api.fileverity.com/v1/openapi.json), et reste donc toujours conforme à l’API. Pour les concepts et les guides, commencez par la [Vue d’ensemble](https://fileverity.com/fr/docs.md).

## Conventions

URL de base : `https://api.fileverity.com/v1`. Authentifiez chaque requête avec `Authorization: Bearer <key>`. Les erreurs ont toutes le même format, décrit dans [Erreurs](https://fileverity.com/fr/docs/errors.md). Chaque réponse comporte un en-tête `x-request-id`, et les réponses authentifiées comportent les en-têtes de limite de débit décrits dans [Limites de débit et en-têtes](https://fileverity.com/fr/docs/rate-limits.md). Les objets imbriqués s’ouvrent dans des sections repliables sous le tableau.

## Détections de texte

### Détecter un texte rédigé par IA

`POST` `https://api.fileverity.com/v1/text/detections`

Classe un texte brut comme rédigé par IA, en partie rédigé par IA ou rédigé par une personne, et renvoie les passages rédigés par IA. Le texte est évalué puis supprimé ; il n’est pas conservé. La facturation compte les points de code Unicode par tranches de 1 000 caractères, arrondies à la tranche supérieure pour chaque requête. Les requêtes rejetées avant l’évaluation ne sont pas facturées. Les clés de test renvoient sans frais un résultat fixe correspondant à un texte rédigé par une personne.

#### Paramètres

| Nom | Emplacement | Type | Obligatoire | Description |
| --- | --- | --- | --- | --- |
| `Idempotency-Key` | en-tête | chaîne | Non | Clé unique de 255 caractères au maximum. Répéter la requête avec la même clé et le même corps dans un délai de 24 heures renvoie la première réponse avec l’en-tête idempotent-replayed: true ; la même clé avec un corps différent renvoie 409. |

#### Corps de la requête : application/json, obligatoire

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `model` | chaîne | Non | ID de modèle ou ID d’instantané. Valeur par défaut : `"fvdoc-3-text"`. |
| `text` | chaîne | Oui | Texte brut, d’au moins 100 mots et de 100 000 caractères au maximum. |
| `language` | une valeur parmi `"en"`, `"fr"`, `"de"`, `"es"`, `"zh"`, `null` | Non | Code ISO 639-1. Détecté automatiquement s’il est omis. Valeur par défaut : `null`. |

#### Réponses

| Statut | Description | Corps |
| --- | --- | --- |
| 200 | Le résultat de la détection. | `TextDetection` |
| 400 | Requête invalide. Codes d’erreur : invalid_json, missing_parameter, text_too_short, unsupported_language, invalid_parameter. | `Error` |
| 401 | Clé d’API manquante ou invalide. Codes d’erreur : missing_api_key, invalid_api_key. | `Error` |
| 402 | Le solde ou la limite de dépense mensuelle de la clé ne permet pas de couvrir la requête. Codes d’erreur : insufficient_balance, spend_limit_reached. | `Error` |
| 404 | Ressource introuvable. Codes d’erreur : model_not_found. | `Error` |
| 409 | Conflit avec l’état actuel. Codes d’erreur : idempotency_mismatch, idempotency_in_progress. | `Error` |
| 413 | Une limite de taille a été dépassée. Codes d’erreur : text_too_long. | `Error` |
| 415 | Type de média ou format de fichier non pris en charge. Codes d’erreur : unsupported_media_type. | `Error` |
| 429 | Trop de requêtes. Codes d’erreur : rate_limited. | `Error` |
| 500 | Erreur interne ; rien n’est facturé. Codes d’erreur : internal_error. | `Error` |
| 502 | L’analyse n’a pas pu aboutir ; rien n’est facturé. Codes d’erreur : analysis_failed. | `Error` |
| 503 | Temporairement indisponible ou saturé ; rien n’est facturé. Réessayez après le nombre de secondes indiqué dans l’en-tête retry-after. Codes d’erreur : service_unavailable. | `Error` |

#### Réponse 200 : TextDetection

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `id` | chaîne | Oui |  |
| `object` | `"text.detection"` | Oui |  |
| `created` | entier | Oui | Horodatage Unix. |
| `model` | chaîne | Oui | Instantané qui a produit le résultat. |
| `livemode` | booléen | Oui | Vaut false pour les clés de test. |
| `language` | une valeur parmi `"en"`, `"fr"`, `"de"`, `"es"`, `"zh"` | Oui |  |
| `verdict` | une valeur parmi `"ai"`, `"mixed"`, `"human"` | Oui | ai : le texte semble entièrement rédigé par IA ; mixed : des passages rédigés par IA au sein d’un texte humain ; human : aucun passage rédigé par IA trouvé. |
| `score` | nombre | Oui | Score du modèle pour le passage qui ressemble le plus à du texte rédigé par IA. Minimum : 0. Maximum : 1. |
| `ai_fraction` | nombre | Oui | Part du texte évalué contenue dans des segments rédigés par IA. Minimum : 0. Maximum : 1. |
| `segments` | tableau d’objets | Oui | Passages rédigés par IA, indiqués par leurs positions dans le texte soumis, en points de code Unicode. Les limites sont approximatives et peuvent inclure des phrases adjacentes. |
| `usage` | objet | Oui |  |

**segments : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `start` | entier | Oui |  |
| `end` | entier | Oui | Borne exclue. |
| `score` | nombre | Oui | Minimum : 0. Maximum : 1. |

**usage : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `characters` | entier | Oui | Points de code Unicode évalués. |
| `free_characters` | entier | Oui | Caractères couverts par le quota de votre démarrage gratuit, non facturés. |
| `billed_units` | entier | Oui | Unités de 1 000 caractères effectivement facturées, après déduction des caractères gratuits ; billed_units × prix unitaire correspond au coût. |

#### Codes d’erreur

| Code | Statut |
| --- | --- |
| `invalid_json` | 400 |
| `missing_parameter` | 400 |
| `unsupported_media_type` | 415 |
| `text_too_short` | 400 |
| `text_too_long` | 413 |
| `unsupported_language` | 400 |
| `model_not_found` | 404 |
| `insufficient_balance` | 402 |
| `spend_limit_reached` | 402 |
| `service_unavailable` | 503 |
| `analysis_failed` | 502 |
| `invalid_parameter` | 400 |
| `idempotency_mismatch` | 409 |
| `idempotency_in_progress` | 409 |
| `missing_api_key` | 401 |
| `invalid_api_key` | 401 |
| `rate_limited` | 429 |
| `internal_error` | 500 |

#### Exemple

**Requête: cURL**

```bash
curl https://api.fileverity.com/v1/text/detections \
  -H "Authorization: Bearer $FILEVERITY_API_KEY" \
  -H "Content-Type: application/json" \
  -d "$(jq -Rs '{text: .}' essay.txt)"
```

**Réponse**

```json
{
  "id": "tdet_8Hk2pQ4vN9sL1xR7cW3mY6zB",
  "object": "text.detection",
  "created": 1793664000,
  "model": "fvdoc-3-text-2026-11-03",
  "livemode": true,
  "language": "en",
  "verdict": "mixed",
  "score": 0.97,
  "ai_fraction": 0.41,
  "segments": [
    {
      "start": 212,
      "end": 433,
      "score": 0.97
    },
    {
      "start": 579,
      "end": 790,
      "score": 0.93
    }
  ],
  "usage": {
    "characters": 1412,
    "free_characters": 0,
    "billed_units": 2
  }
}
```

## Fichiers

### Téléverser un fichier

`POST` `https://api.fileverity.com/v1/files`

Téléverse un fichier en vue de son analyse. Envoyez les fichiers de 4 Mo maximum en multipart/form-data, dans le champ file ; la réponse a le statut uploaded. Les fichiers de plus de 4 Mo doivent être téléversés avec une URL présignée. Envoyez du JSON avec filename, content_type et bytes (documents de 50 Mo maximum) ; la réponse a le statut pending et un objet upload contenant une URL présignée : envoyez-y les octets du fichier avec PUT et les en-têtes indiqués avant son expiration. Un fichier est supprimé au démarrage d’une analyse et, au plus tard, après 24 heures. Un espace de travail peut contenir au maximum 50 fichiers non expirés et 200 Mo par mode à la fois.

#### Paramètres

| Nom | Emplacement | Type | Obligatoire | Description |
| --- | --- | --- | --- | --- |
| `Idempotency-Key` | en-tête | chaîne | Non | Clé unique de 255 caractères au maximum. Répéter la requête avec la même clé et le même corps dans un délai de 24 heures renvoie la première réponse avec l’en-tête idempotent-replayed: true ; la même clé avec un corps différent renvoie 409. |

#### Corps de la requête : multipart/form-data, obligatoire

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `file` | chaîne | Oui | Format : binary. |

#### Corps de la requête : application/json, obligatoire

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `filename` | chaîne | Non |  |
| `content_type` | chaîne | Oui | Type MIME du fichier, par exemple image/jpeg ou application/pdf. |
| `bytes` | entier | Oui | Taille exacte en octets. Minimum : 1. Maximum : 52 428 800. |

#### Réponses

| Statut | Description | Corps |
| --- | --- | --- |
| 201 | Le fichier. | `File` |
| 400 | Requête invalide. Codes d’erreur : invalid_json, missing_parameter, invalid_parameter. | `Error` |
| 401 | Clé d’API manquante ou invalide. Codes d’erreur : missing_api_key, invalid_api_key. | `Error` |
| 409 | Conflit avec l’état actuel. Codes d’erreur : idempotency_mismatch, idempotency_in_progress. | `Error` |
| 413 | Une limite de taille a été dépassée. Codes d’erreur : file_too_large. | `Error` |
| 415 | Type de média ou format de fichier non pris en charge. Codes d’erreur : unsupported_media_type, unsupported_file. | `Error` |
| 422 | Le fichier ne peut pas être traité. Codes d’erreur : invalid_file. | `Error` |
| 429 | Trop de requêtes. Codes d’erreur : pending_files_limit, rate_limited. | `Error` |
| 500 | Erreur interne ; rien n’est facturé. Codes d’erreur : internal_error. | `Error` |

#### Réponse 201 : File

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `id` | chaîne | Oui |  |
| `object` | `"file"` | Oui |  |
| `filename` | chaîne ou null | Oui |  |
| `bytes` | entier ou null | Oui |  |
| `content_type` | chaîne | Oui |  |
| `status` | une valeur parmi `"pending"`, `"uploaded"` | Oui | pending jusqu’à l’arrivée des octets envoyés à l’URL présignée. |
| `livemode` | booléen | Oui | Les fichiers ne sont visibles que par les clés du même mode. |
| `created` | entier | Oui | Horodatage Unix. |
| `expires_at` | entier | Oui | Horodatage Unix après lequel le fichier est supprimé. |
| `upload` | objet | Non | Présent dans la réponse à une requête de téléversement JSON. |

**upload : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `url` | chaîne | Oui | Les clés de test reçoivent une URL factice (test: true) ; rien n’est téléversé ni conservé. |
| `method` | `"PUT"` | Oui |  |
| `headers` | objet de chaînes | Oui |  |
| `expires_at` | entier | Oui | Horodatage Unix. |
| `test` | `true` | Non |  |

#### Codes d’erreur

| Code | Statut |
| --- | --- |
| `invalid_json` | 400 |
| `missing_parameter` | 400 |
| `unsupported_media_type` | 415 |
| `unsupported_file` | 415 |
| `invalid_file` | 422 |
| `file_too_large` | 413 |
| `pending_files_limit` | 429 |
| `invalid_parameter` | 400 |
| `idempotency_mismatch` | 409 |
| `idempotency_in_progress` | 409 |
| `missing_api_key` | 401 |
| `invalid_api_key` | 401 |
| `rate_limited` | 429 |
| `internal_error` | 500 |

#### Exemple

**Requête: cURL**

```bash
curl https://api.fileverity.com/v1/files \
  -H "Authorization: Bearer $FILEVERITY_API_KEY" \
  -F file=@claim-photo.jpg
```

**Réponse**

```json
{
  "id": "file_8Hk2pQ4vN9sL1xR7cW3mY6zB",
  "object": "file",
  "filename": "claim-photo.jpg",
  "bytes": 2481920,
  "content_type": "image/jpeg",
  "status": "uploaded",
  "livemode": true,
  "created": 1793700000,
  "expires_at": 1793786400
}
```

### Récupérer un fichier

`GET` `https://api.fileverity.com/v1/files/{id}`

Renvoie le fichier et indique si ses octets sont arrivés.

#### Paramètres

| Nom | Emplacement | Type | Obligatoire | Description |
| --- | --- | --- | --- | --- |
| `id` | chemin | chaîne | Oui | ID de fichier. |

#### Réponses

| Statut | Description | Corps |
| --- | --- | --- |
| 200 | Le fichier. | `File` |
| 401 | Clé d’API manquante ou invalide. Codes d’erreur : missing_api_key, invalid_api_key. | `Error` |
| 404 | Ressource introuvable. Codes d’erreur : not_found. | `Error` |
| 429 | Trop de requêtes. Codes d’erreur : rate_limited. | `Error` |
| 500 | Erreur interne ; rien n’est facturé. Codes d’erreur : internal_error. | `Error` |

#### Réponse 200 : File

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `id` | chaîne | Oui |  |
| `object` | `"file"` | Oui |  |
| `filename` | chaîne ou null | Oui |  |
| `bytes` | entier ou null | Oui |  |
| `content_type` | chaîne | Oui |  |
| `status` | une valeur parmi `"pending"`, `"uploaded"` | Oui | pending jusqu’à l’arrivée des octets envoyés à l’URL présignée. |
| `livemode` | booléen | Oui | Les fichiers ne sont visibles que par les clés du même mode. |
| `created` | entier | Oui | Horodatage Unix. |
| `expires_at` | entier | Oui | Horodatage Unix après lequel le fichier est supprimé. |
| `upload` | objet | Non | Présent dans la réponse à une requête de téléversement JSON. |

**upload : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `url` | chaîne | Oui | Les clés de test reçoivent une URL factice (test: true) ; rien n’est téléversé ni conservé. |
| `method` | `"PUT"` | Oui |  |
| `headers` | objet de chaînes | Oui |  |
| `expires_at` | entier | Oui | Horodatage Unix. |
| `test` | `true` | Non |  |

#### Codes d’erreur

| Code | Statut |
| --- | --- |
| `not_found` | 404 |
| `missing_api_key` | 401 |
| `invalid_api_key` | 401 |
| `rate_limited` | 429 |
| `internal_error` | 500 |

#### Exemple

**Requête: cURL**

```bash
curl https://api.fileverity.com/v1/files/file_8Hk2pQ4vN9sL1xR7cW3mY6zB \
  -H "Authorization: Bearer $FILEVERITY_API_KEY"
```

**Réponse**

```json
{
  "id": "file_8Hk2pQ4vN9sL1xR7cW3mY6zB",
  "object": "file",
  "filename": "claim-photo.jpg",
  "bytes": 2481920,
  "content_type": "image/jpeg",
  "status": "uploaded",
  "livemode": true,
  "created": 1793700000,
  "expires_at": 1793786400
}
```

### Supprimer un fichier

`DELETE` `https://api.fileverity.com/v1/files/{id}`

Supprime un fichier téléversé et les octets stockés.

#### Paramètres

| Nom | Emplacement | Type | Obligatoire | Description |
| --- | --- | --- | --- | --- |
| `id` | chemin | chaîne | Oui | ID de fichier. |

#### Réponses

| Statut | Description | Corps |
| --- | --- | --- |
| 200 | Le fichier a été supprimé. | `FileDeleted` |
| 401 | Clé d’API manquante ou invalide. Codes d’erreur : missing_api_key, invalid_api_key. | `Error` |
| 404 | Ressource introuvable. Codes d’erreur : not_found. | `Error` |
| 429 | Trop de requêtes. Codes d’erreur : rate_limited. | `Error` |
| 500 | Erreur interne ; rien n’est facturé. Codes d’erreur : internal_error. | `Error` |

#### Réponse 200 : FileDeleted

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `id` | chaîne | Oui |  |
| `object` | `"file"` | Oui |  |
| `deleted` | `true` | Oui |  |

#### Codes d’erreur

| Code | Statut |
| --- | --- |
| `not_found` | 404 |
| `missing_api_key` | 401 |
| `invalid_api_key` | 401 |
| `rate_limited` | 429 |
| `internal_error` | 500 |

#### Exemple

**Requête: cURL**

```bash
curl -X DELETE https://api.fileverity.com/v1/files/file_8Hk2pQ4vN9sL1xR7cW3mY6zB \
  -H "Authorization: Bearer $FILEVERITY_API_KEY"
```

**Réponse**

```json
{
  "id": "file_8Hk2pQ4vN9sL1xR7cW3mY6zB",
  "object": "file",
  "deleted": true
}
```

## Analyses

### Créer une analyse

`POST` `https://api.fileverity.com/v1/analyses`

Analyse un fichier téléversé avec fvimg-2 (images) ou fvdoc-3 (documents). Une analyse correspond à une vérification d’image ou de document. La réponse est 202 avec le statut processing ; le résultat arrive par webhook ou par interrogation de GET /analyses/{id}. Envoyez Prefer: wait=N (jusqu’à 60 secondes) pour maintenir la requête ouverte jusqu’à ce que le résultat soit prêt ; une analyse terminée renvoie 200. Le prix est réservé à la création de l’analyse et libéré si elle échoue ou est annulée. Les résultats sont conservés 7 jours. Lorsque la capacité est saturée, l’API renvoie 503 service_unavailable avec un en-tête retry-after et ne facture rien : réessayez avec la même Idempotency-Key, et exécutez les analyses d’images l’une après l’autre pour un débit optimal. Les clés de test renvoient un résultat d’exemple et ne sont jamais facturées ; le rapport d’exemple ne contient que quelques champs.

#### Paramètres

| Nom | Emplacement | Type | Obligatoire | Description |
| --- | --- | --- | --- | --- |
| `Idempotency-Key` | en-tête | chaîne | Non | Clé unique de 255 caractères au maximum. Répéter la requête avec la même clé et le même corps dans un délai de 24 heures renvoie la première réponse avec l’en-tête idempotent-replayed: true ; la même clé avec un corps différent renvoie 409. |
| `Prefer` | en-tête | chaîne | Non | wait=N maintient la requête ouverte jusqu’à N secondes (60 au maximum), le temps que l’analyse se termine. |

#### Corps de la requête : application/json, obligatoire

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `model` | une valeur parmi `"fvimg-2"`, `"fvimg-2-2026-10-30"`, `"fvdoc-3"`, `"fvdoc-3-2026-11-03"` | Oui | ID de modèle ou ID d’instantané. fvimg-2 analyse les images, fvdoc-3 les documents. |
| `file` | chaîne | Oui | ID d’un fichier téléversé. |
| `metadata` | objet de chaînes | Non | Jusqu’à 16 paires de chaînes (clés de 40 caractères au maximum, valeurs de 500 au maximum), renvoyées avec l’analyse et dans les webhooks. |
| `options` | objet | Non |  |

**options : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `password` | chaîne | Non | Mot de passe d’un document chiffré. Longueur maximale : 256. |
| `locale` | une valeur parmi `"en"`, `"fr"`, `"de"`, `"es"`, `"zh"`, `"vi"`, `"ar"` | Non | Langue des constats du document. Valeur par défaut : `"en"`. |

#### Réponses

| Statut | Description | Corps |
| --- | --- | --- |
| 200 | L’analyse terminée. | `Analysis` |
| 202 | L’analyse est en cours de traitement. | `Analysis` |
| 400 | Requête invalide. Codes d’erreur : invalid_json, missing_parameter, file_not_found, invalid_parameter. | `Error` |
| 401 | Clé d’API manquante ou invalide. Codes d’erreur : missing_api_key, invalid_api_key. | `Error` |
| 402 | Le solde ou la limite de dépense mensuelle de la clé ne permet pas de couvrir la requête. Codes d’erreur : insufficient_balance, spend_limit_reached. | `Error` |
| 404 | Ressource introuvable. Codes d’erreur : model_not_found. | `Error` |
| 409 | Conflit avec l’état actuel. Codes d’erreur : idempotency_mismatch, idempotency_in_progress. | `Error` |
| 413 | Une limite de taille a été dépassée. Codes d’erreur : file_too_large, too_many_pixels, too_many_pages, document_too_long. | `Error` |
| 415 | Type de média ou format de fichier non pris en charge. Codes d’erreur : unsupported_media_type, unsupported_file. | `Error` |
| 422 | Le fichier ne peut pas être traité. Codes d’erreur : invalid_file, password_required, wrong_password, not_examinable. | `Error` |
| 429 | Trop de requêtes. Codes d’erreur : rate_limited. | `Error` |
| 500 | Erreur interne ; rien n’est facturé. Codes d’erreur : internal_error. | `Error` |
| 502 | L’analyse n’a pas pu aboutir ; rien n’est facturé. Codes d’erreur : analysis_failed. | `Error` |
| 503 | Temporairement indisponible ou saturé ; rien n’est facturé. Réessayez après le nombre de secondes indiqué dans l’en-tête retry-after. Codes d’erreur : service_unavailable. | `Error` |

#### Réponse 200 : Analysis

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `id` | chaîne | Oui |  |
| `object` | `"analysis"` | Oui |  |
| `created` | entier | Oui | Horodatage Unix. |
| `model` | chaîne | Oui | Instantané qui a produit le résultat. |
| `livemode` | booléen | Oui |  |
| `status` | une valeur parmi `"processing"`, `"succeeded"`, `"failed"`, `"canceled"` | Oui |  |
| `file` | objet | Oui |  |
| `report_id` | chaîne ou null | Oui | ID de rapport vérifiable, FV-XXXX-XXXX-XXXX. |
| `report_url` | chaîne ou null | Oui | Page de vérification publique du rapport. |
| `summary` | `ImageSummary` ou `DocumentSummary` ou null | Oui | Le verdict court et stable : un ImageSummary pour les images, un DocumentSummary pour les documents, null tant que l’analyse n’a pas abouti. |
| `result` | objet ou null | Oui | Présent dès que le statut est succeeded et jusqu’à l’expiration du résultat. |
| `error` | objet ou null | Oui |  |
| `progress` | objet ou null | Oui |  |
| `usage` | objet | Oui |  |
| `metadata` | objet ou null | Oui |  |
| `completed_at` | entier ou null | Oui |  |
| `expires_at` | entier ou null | Oui | Horodatage Unix après lequel le résultat est supprimé. |

**file : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `name` | chaîne ou null | Non |  |
| `bytes` | entier ou null | Non |  |
| `format` | chaîne ou null | Non |  |

**summary (ImageSummary) : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `level` | une valeur parmi `"L0"`, `"L1"`, `"L2"`, `"L3"`, `"L4"`, `"L5"` | Oui | Niveau de risque, de L0 à L5. |
| `assessment` | une valeur parmi `"authentic_untouched"`, `"authentic_locally_edited"`, `"ai_generated"`, `"undetermined"` | Oui |  |
| `action` | une valeur parmi `"accept"`, `"review"`, `"reject"`, `"resubmit"` | Oui |  |
| `ai` | une valeur parmi `"labelled"`, `"very_likely"`, `"suspected"`, `"undecided"`, `"low"`, `"very_low"`, `"not_evaluated"` | Oui | Le constat sur la génération par IA. |
| `edit` | une valeur parmi `"detected"`, `"suspected"`, `"suspected_record"`, `"review"`, `"generative"`, `"minor"`, `"none"`, `"not_applicable"`, `"not_evaluated"` | Oui | Le constat sur la retouche locale. |

**summary (DocumentSummary) : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `kind` | `"docpro"` | Oui |  |
| `level` | une valeur parmi `"L0"`, `"L1"`, `"L2"`, `"L3"`, `"L4"`, `"L5"` | Oui | Niveau de risque, de L0 à L5. |
| `action` | une valeur parmi `"accept"`, `"note"`, `"review"`, `"reject"`, `"resubmit"` | Oui | note : vérifiez le contenu IA marqué dans le rapport au regard de votre politique. |
| `reason` | chaîne ou null | Oui | Le constat ou la condition à l’origine du niveau, par exemple clean ou incomplete, ou un ID de constat. |
| `findings` | tableau de chaînes | Oui | ID des constats importants. |
| `pages` | entier | Oui | Pages du document. |
| `images` | entier | Oui | Photos intégrées examinées. |
| `text` | une valeur parmi `"ai_generated"`, `"mixed"`, `"human"`, `"inconclusive"`, `null` | Oui | Le verdict sur le texte du document, ou null lorsque le texte n’a pas été évalué. |
| `strong` | `true` | Non | Présent lorsqu’un des constats répertoriés est solide. |

**result : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `report` | `ImageReport` ou `DocumentReport` | Non | Le rapport complet. report.schema vaut fileverity.report/1 pour les images et fileverity.docpro/1 pour les documents. |
| `stamped_at` | entier ou null | Non | Horodatage Unix correspondant à l’horodatage RFC 3161 émis pour le rapport, ou null. |

**report (ImageReport) : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `schema` | `"fileverity.report/1"` | Oui |  |
| `id` | chaîne | Oui | ID de rapport, FV-XXXX-XXXX-XXXX. |
| `sample` | `true` | Non | Présent dans les rapports d’exemple fixes renvoyés par les clés de test. |
| `issuedAt` | chaîne | Non | Date d’émission du rapport, ISO 8601 en UTC. Format : date-time. |
| `issuer` | objet | Non | Émetteur du rapport. |
| `file` | objet | Non | L’image vérifiée. |
| `pro` | objet | Non | Le verdict. Les mêmes valeurs que summary, avec reason. |
| `score` | entier ou null | Non | Score d’authenticité de 0 à 100 par paliers de 5 : dans quelle mesure les preuves étayent le caractère authentique et non retouché de la prise de vue. null si non évalué. |
| `confidence` | une valeur parmi `"high"`, `"medium"`, `"low"` | Non | Ce que ce fichier permet à l’analyse d’établir. Une confiance faible tient en général au fichier lui-même, par exemple une faible résolution ou une forte compression. |
| `questions` | objet | Non | Les trois questions auxquelles le rapport répond. |
| `generator` | objet ou null | Non | Le générateur d’IA identifié pour l’image, ou null. |
| `regions` | tableau d’objets | Non | Zones signalées, en pixels de l’image affichée. |
| `provenance` | objet | Non | Ce que les données propres au fichier indiquent sur son origine. |
| `digest` | chaîne | Non | Empreinte du contenu du rapport, utilisée par la page de vérification. |

**issuer : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `name` | chaîne | Non |  |
| `operator` | chaîne | Non |  |
| `verify` | chaîne | Non | Page de vérification publique du rapport. |

**file : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `name` | chaîne ou null | Non |  |
| `sha256` | chaîne | Non | SHA-256 du fichier vérifié, en hexadécimal. |
| `bytes` | entier | Non |  |
| `width` | entier | Non | Largeur en pixels, telle qu’affichée. |
| `height` | entier | Non | Hauteur en pixels, telle qu’affichée. |
| `format` | chaîne | Non |  |

**pro : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `level` | une valeur parmi `"L0"`, `"L1"`, `"L2"`, `"L3"`, `"L4"`, `"L5"` | Non | Niveau de risque, de L0 à L5. |
| `action` | une valeur parmi `"accept"`, `"review"`, `"reject"`, `"resubmit"` | Non |  |
| `assessment` | une valeur parmi `"authentic_untouched"`, `"authentic_locally_edited"`, `"ai_generated"`, `"undetermined"` | Non |  |
| `reason` | chaîne ou null | Non |  |

**questions : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `ai` | objet | Non |  |
| `edit` | objet | Non |  |
| `source` | objet | Non |  |

**ai : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `key` | une valeur parmi `"labelled"`, `"very_likely"`, `"suspected"`, `"undecided"`, `"low"`, `"very_low"`, `"not_evaluated"` | Non |  |
| `basis` | une valeur parmi `"verified"`, `"detected"`, `"declared"`, `null` | Non | Ce sur quoi repose la réponse. |
| `strength` | une valeur parmi `"strong"`, `"moderate"`, `"limited"`, `null` | Non | Dans quelle mesure les preuves étayent la réponse. |
| `likelihood` | entier ou null | Non | Probabilité de génération par IA, de 0 à 100 par paliers de 5, ou null. |

**edit : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `key` | une valeur parmi `"detected"`, `"suspected"`, `"suspected_record"`, `"review"`, `"generative"`, `"minor"`, `"none"`, `"not_applicable"`, `"not_evaluated"` | Non |  |
| `basis` | une valeur parmi `"verified"`, `"detected"`, `"declared"`, `null` | Non | Ce sur quoi repose la réponse. |
| `strength` | une valeur parmi `"strong"`, `"moderate"`, `"limited"`, `null` | Non | Dans quelle mesure les preuves étayent la réponse. |
| `regions` | entier | Non | Nombre de zones signalées. |

**source : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `key` | chaîne | Non |  |
| `basis` | une valeur parmi `"verified"`, `"detected"`, `"declared"`, `null` | Non | Ce sur quoi repose la réponse. |
| `strength` | une valeur parmi `"strong"`, `"moderate"`, `"limited"`, `null` | Non | Dans quelle mesure les preuves étayent la réponse. |
| `signer` | chaîne ou null | Non |  |
| `aiClaim` | booléen | Non | Indique si les données propres au fichier affirment une génération par IA. |

**generator : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `name` | chaîne | Non |  |
| `basis` | chaîne | Non | Comment le générateur a été identifié. |

**regions : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `id` | chaîne | Non |  |
| `x` | entier | Non |  |
| `y` | entier | Non |  |
| `w` | entier | Non |  |
| `h` | entier | Non |  |
| `strength` | une valeur parmi `"high"`, `"medium"` | Non |  |

**provenance : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `credentials` | une valeur parmi `"valid"`, `"unverified"`, `"issues"`, `"invalid"`, `"removed"`, `"none"` | Non | État des Content Credentials. |
| `signer` | chaîne ou null | Non |  |
| `software` | tableau de chaînes | Non | Logiciel nommé dans les données du fichier. |
| `camera` | chaîne ou null | Non |  |
| `captured` | chaîne ou null | Non | Date de prise de vue enregistrée dans le fichier, le cas échéant. |

**report (DocumentReport) : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `schema` | `"fileverity.docpro/1"` | Oui |  |
| `id` | chaîne | Oui | ID de rapport, FV-XXXX-XXXX-XXXX. |
| `sample` | `true` | Non | Présent dans les rapports d’exemple fixes renvoyés par les clés de test. |
| `issuedAt` | chaîne | Non | Date d’émission du rapport, ISO 8601 en UTC. Format : date-time. |
| `receivedAt` | chaîne | Non | Date de réception du fichier, ISO 8601 en UTC. Format : date-time. |
| `issuer` | objet | Non | Émetteur du rapport. |
| `file` | objet | Non | Le document vérifié. |
| `level` | une valeur parmi `"L0"`, `"L1"`, `"L2"`, `"L3"`, `"L4"`, `"L5"` | Non | Niveau de risque, de L0 à L5. |
| `action` | une valeur parmi `"accept"`, `"note"`, `"review"`, `"reject"`, `"resubmit"` | Non |  |
| `reason` | chaîne ou null | Non | Le constat ou la condition à l’origine du niveau. |
| `findings` | tableau d’objets | Non | Les constats à l’origine du niveau, chacun avec les pages et les photos intégrées auxquelles il se rapporte. |
| `text` | objet | Non | Le résultat pour le texte du document. |
| `images` | tableau d’objets | Non | Les photos et graphiques intégrés, numérotés dans l’ordre du document. |
| `structure` | objet ou null | Non | L’historique des modifications du fichier, ou null s’il n’a pas été examiné. |
| `provenance` | objet | Non | Ce que les données propres au fichier indiquent sur son origine. |
| `digest` | chaîne | Non | Empreinte du contenu du rapport, utilisée par la page de vérification. |

**issuer : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `name` | chaîne | Non |  |
| `operator` | chaîne | Non |  |
| `verify` | chaîne | Non | Page de vérification publique du rapport. |

**file : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `name` | chaîne ou null | Non |  |
| `sha256` | chaîne | Non | SHA-256 du fichier vérifié, en hexadécimal. |
| `bytes` | entier | Non |  |
| `format` | chaîne | Non |  |
| `pages` | entier | Non |  |
| `textLayer` | une valeur parmi `"present"`, `"partial"`, `"absent"` | Non | Indique si le document contient une couche de texte. |

**findings : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `id` | chaîne | Non |  |
| `basis` | une valeur parmi `"verified"`, `"detected"`, `"declared"` | Non |  |
| `strength` | une valeur parmi `"strong"`, `"moderate"`, `"limited"` | Non |  |
| `material` | booléen | Non | Indique si le constat compte dans le niveau. |
| `pages` | tableau d’entiers | Non |  |
| `images` | tableau d’entiers | Non |  |

**text : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `status` | une valeur parmi `"evaluated"`, `"insufficient_text"`, `"unsupported_language"`, `"no_text"` | Non |  |
| `verdict` | une valeur parmi `"ai_generated"`, `"mixed"`, `"human"`, `"inconclusive"` | Non | Présent lorsque le statut est evaluated. |
| `words` | entier | Non |  |
| `languages` | tableau de chaînes | Non |  |
| `passages` | entier | Non | Nombre de passages marqués. |

**images : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `n` | entier | Non |  |
| `pages` | tableau d’entiers | Non |  |
| `kind` | une valeur parmi `"photo"`, `"graphic"` | Non |  |
| `width` | entier | Non |  |
| `height` | entier | Non |  |
| `level` | une valeur parmi `"L0"`, `"L1"`, `"L2"`, `"L3"`, `"L4"`, `"L5"`, `null` | Non |  |
| `assessment` | une valeur parmi `"authentic_untouched"`, `"authentic_locally_edited"`, `"ai_generated"`, `"undetermined"`, `null` | Non |  |
| `ai` | une valeur parmi `"labelled"`, `"very_likely"`, `"suspected"`, `"undecided"`, `"low"`, `"very_low"`, `"not_evaluated"`, `null` | Non |  |
| `edit` | une valeur parmi `"detected"`, `"suspected"`, `"suspected_record"`, `"review"`, `"generative"`, `"minor"`, `"none"`, `"not_applicable"`, `"not_evaluated"`, `null` | Non |  |

**structure : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `revisions` | entier ou null | Non |  |
| `changedPages` | tableau d’entiers | Non |  |
| `addedPages` | entier | Non |  |
| `signatures` | entier | Non |  |

**provenance : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `credentials` | chaîne | Non | État des Content Credentials. |
| `signer` | chaîne ou null | Non |  |
| `aiClaim` | booléen | Non | Indique si les données propres au fichier affirment une génération par IA. |
| `software` | tableau de chaînes | Non |  |
| `created` | chaîne ou null | Non |  |
| `modified` | chaîne ou null | Non |  |
| `revisions` | entier ou null | Non |  |
| `signed` | booléen ou null | Non |  |

**error : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `code` | une valeur parmi `"invalid_json"`, `"missing_parameter"`, `"invalid_parameter"`, `"text_too_short"`, `"text_too_long"`, `"unsupported_media_type"`, `"unsupported_language"`, `"file_not_found"`, `"unsupported_file"`, `"file_too_large"`, `"too_many_pixels"`, `"too_many_pages"`, `"document_too_long"`, `"invalid_file"`, `"password_required"`, `"wrong_password"`, `"not_examinable"`, `"missing_api_key"`, `"invalid_api_key"`, `"insufficient_balance"`, `"spend_limit_reached"`, `"not_found"`, `"model_not_found"`, `"not_cancelable"`, `"canceled"`, `"idempotency_mismatch"`, `"idempotency_in_progress"`, `"pending_files_limit"`, `"rate_limited"`, `"internal_error"`, `"analysis_failed"`, `"service_unavailable"` | Non |  |
| `message` | chaîne | Non |  |

**progress : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `stage` | une valeur parmi `"queued"`, `"reading"`, `"analyzing"`, `"reporting"` | Non |  |
| `done` | entier | Non | Unités terminées dans l’étape en cours, lorsqu’elles sont connues ; sinon 0. |
| `total` | entier | Non | Unités dans l’étape en cours, lorsqu’elles sont connues ; sinon 0. |
| `position` | entier | Non | Position dans la file d’attente tant que l’étape est queued. |

**usage : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `amount` | entier | Non | Montant facturé en cents ; 0 pour les vérifications du démarrage gratuit et pour les échecs. |
| `currency` | `"usd"` | Non |  |
| `funding` | une valeur parmi `"trial"`, `"balance"`, `null` | Non |  |

#### Codes d’erreur

| Code | Statut |
| --- | --- |
| `invalid_json` | 400 |
| `missing_parameter` | 400 |
| `unsupported_media_type` | 415 |
| `model_not_found` | 404 |
| `file_not_found` | 400 |
| `unsupported_file` | 415 |
| `invalid_file` | 422 |
| `file_too_large` | 413 |
| `too_many_pixels` | 413 |
| `too_many_pages` | 413 |
| `document_too_long` | 413 |
| `password_required` | 422 |
| `wrong_password` | 422 |
| `not_examinable` | 422 |
| `insufficient_balance` | 402 |
| `spend_limit_reached` | 402 |
| `service_unavailable` | 503 |
| `analysis_failed` | 502 |
| `invalid_parameter` | 400 |
| `idempotency_mismatch` | 409 |
| `idempotency_in_progress` | 409 |
| `missing_api_key` | 401 |
| `invalid_api_key` | 401 |
| `rate_limited` | 429 |
| `internal_error` | 500 |

#### Exemple

**Requête: cURL**

```bash
curl https://api.fileverity.com/v1/analyses \
  -H "Authorization: Bearer $FILEVERITY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Prefer: wait=60" \
  -d '{"model": "fvimg-2", "file": "file_8Hk2pQ4vN9sL1xR7cW3mY6zB"}'
```

**Réponse**

```json
{
  "id": "an_8Hk2pQ4vN9sL1xR7cW3mY6zB",
  "object": "analysis",
  "created": 1793700120,
  "model": "fvimg-2-2026-10-30",
  "livemode": true,
  "status": "succeeded",
  "file": {
    "name": "claim-photo.jpg",
    "bytes": 2481920,
    "format": "jpeg"
  },
  "report_id": "FV-7K2M-9QXD-4T8R",
  "report_url": "https://fileverity.com/verify/FV-7K2M-9QXD-4T8R",
  "summary": {
    "level": "L2",
    "assessment": "authentic_untouched",
    "action": "accept",
    "ai": "very_low",
    "edit": "none"
  },
  "result": {
    "report": {
      "schema": "fileverity.report/1",
      "id": "FV-7K2M-9QXD-4T8R"
    },
    "stamped_at": 1793700130
  },
  "error": null,
  "progress": null,
  "usage": {
    "amount": 199,
    "currency": "usd",
    "funding": "balance"
  },
  "metadata": {
    "order_id": "A-10492"
  },
  "completed_at": 1793700131,
  "expires_at": 1794304931
}
```

### Lister les analyses

`GET` `https://api.fileverity.com/v1/analyses`

Liste les analyses d’images et de documents de votre espace de travail, des plus récentes aux plus anciennes. Les clés de test reçoivent toujours une liste vide.

#### Paramètres

| Nom | Emplacement | Type | Obligatoire | Description |
| --- | --- | --- | --- | --- |
| `limit` | requête | entier | Non | Valeur par défaut : `20`. Minimum : 1. Maximum : 100. |
| `starting_after` | requête | chaîne | Non | Curseur : le next_cursor de la page précédente. |
| `type` | requête | une valeur parmi `"image"`, `"document"` | Non |  |

#### Réponses

| Statut | Description | Corps |
| --- | --- | --- |
| 200 | Une page d’analyses. | `AnalysisList` |
| 400 | Requête invalide. Codes d’erreur : invalid_parameter. | `Error` |
| 401 | Clé d’API manquante ou invalide. Codes d’erreur : missing_api_key, invalid_api_key. | `Error` |
| 429 | Trop de requêtes. Codes d’erreur : rate_limited. | `Error` |
| 500 | Erreur interne ; rien n’est facturé. Codes d’erreur : internal_error. | `Error` |

#### Réponse 200 : AnalysisList

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `object` | `"list"` | Oui |  |
| `data` | tableau de `Analysis` | Oui |  |
| `has_more` | booléen | Oui |  |
| `next_cursor` | chaîne ou null | Oui | À transmettre comme starting_after pour obtenir la page suivante. |

**data : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `id` | chaîne | Oui |  |
| `object` | `"analysis"` | Oui |  |
| `created` | entier | Oui | Horodatage Unix. |
| `model` | chaîne | Oui | Instantané qui a produit le résultat. |
| `livemode` | booléen | Oui |  |
| `status` | une valeur parmi `"processing"`, `"succeeded"`, `"failed"`, `"canceled"` | Oui |  |
| `file` | objet | Oui |  |
| `report_id` | chaîne ou null | Oui | ID de rapport vérifiable, FV-XXXX-XXXX-XXXX. |
| `report_url` | chaîne ou null | Oui | Page de vérification publique du rapport. |
| `summary` | `ImageSummary` ou `DocumentSummary` ou null | Oui | Le verdict court et stable : un ImageSummary pour les images, un DocumentSummary pour les documents, null tant que l’analyse n’a pas abouti. |
| `result` | objet ou null | Oui | Présent dès que le statut est succeeded et jusqu’à l’expiration du résultat. |
| `error` | objet ou null | Oui |  |
| `progress` | objet ou null | Oui |  |
| `usage` | objet | Oui |  |
| `metadata` | objet ou null | Oui |  |
| `completed_at` | entier ou null | Oui |  |
| `expires_at` | entier ou null | Oui | Horodatage Unix après lequel le résultat est supprimé. |

**file : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `name` | chaîne ou null | Non |  |
| `bytes` | entier ou null | Non |  |
| `format` | chaîne ou null | Non |  |

**result : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `report` | `ImageReport` ou `DocumentReport` | Non | Le rapport complet. report.schema vaut fileverity.report/1 pour les images et fileverity.docpro/1 pour les documents. |
| `stamped_at` | entier ou null | Non | Horodatage Unix correspondant à l’horodatage RFC 3161 émis pour le rapport, ou null. |

**error : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `code` | une valeur parmi `"invalid_json"`, `"missing_parameter"`, `"invalid_parameter"`, `"text_too_short"`, `"text_too_long"`, `"unsupported_media_type"`, `"unsupported_language"`, `"file_not_found"`, `"unsupported_file"`, `"file_too_large"`, `"too_many_pixels"`, `"too_many_pages"`, `"document_too_long"`, `"invalid_file"`, `"password_required"`, `"wrong_password"`, `"not_examinable"`, `"missing_api_key"`, `"invalid_api_key"`, `"insufficient_balance"`, `"spend_limit_reached"`, `"not_found"`, `"model_not_found"`, `"not_cancelable"`, `"canceled"`, `"idempotency_mismatch"`, `"idempotency_in_progress"`, `"pending_files_limit"`, `"rate_limited"`, `"internal_error"`, `"analysis_failed"`, `"service_unavailable"` | Non |  |
| `message` | chaîne | Non |  |

**progress : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `stage` | une valeur parmi `"queued"`, `"reading"`, `"analyzing"`, `"reporting"` | Non |  |
| `done` | entier | Non | Unités terminées dans l’étape en cours, lorsqu’elles sont connues ; sinon 0. |
| `total` | entier | Non | Unités dans l’étape en cours, lorsqu’elles sont connues ; sinon 0. |
| `position` | entier | Non | Position dans la file d’attente tant que l’étape est queued. |

**usage : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `amount` | entier | Non | Montant facturé en cents ; 0 pour les vérifications du démarrage gratuit et pour les échecs. |
| `currency` | `"usd"` | Non |  |
| `funding` | une valeur parmi `"trial"`, `"balance"`, `null` | Non |  |

#### Codes d’erreur

| Code | Statut |
| --- | --- |
| `invalid_parameter` | 400 |
| `missing_api_key` | 401 |
| `invalid_api_key` | 401 |
| `rate_limited` | 429 |
| `internal_error` | 500 |

#### Exemple

**Requête: cURL**

```bash
curl "https://api.fileverity.com/v1/analyses?limit=20&type=image" \
  -H "Authorization: Bearer $FILEVERITY_API_KEY"
```

**Réponse**

```json
{
  "object": "list",
  "data": [
    {
      "id": "an_8Hk2pQ4vN9sL1xR7cW3mY6zB",
      "object": "analysis",
      "created": 1793700120,
      "model": "fvimg-2-2026-10-30",
      "livemode": true,
      "status": "succeeded",
      "file": {
        "name": "claim-photo.jpg",
        "bytes": 2481920,
        "format": "jpeg"
      },
      "report_id": "FV-7K2M-9QXD-4T8R",
      "report_url": "https://fileverity.com/verify/FV-7K2M-9QXD-4T8R",
      "summary": {
        "level": "L2",
        "assessment": "authentic_untouched",
        "action": "accept",
        "ai": "very_low",
        "edit": "none"
      },
      "result": {
        "report": {
          "schema": "fileverity.report/1",
          "id": "FV-7K2M-9QXD-4T8R"
        },
        "stamped_at": 1793700130
      },
      "error": null,
      "progress": null,
      "usage": {
        "amount": 199,
        "currency": "usd",
        "funding": "balance"
      },
      "metadata": {
        "order_id": "A-10492"
      },
      "completed_at": 1793700131,
      "expires_at": 1794304931
    }
  ],
  "has_more": false,
  "next_cursor": null
}
```

### Récupérer une analyse

`GET` `https://api.fileverity.com/v1/analyses/{id}`

Renvoie l’analyse, avec son résultat une fois qu’elle a abouti et jusqu’à son expiration.

#### Paramètres

| Nom | Emplacement | Type | Obligatoire | Description |
| --- | --- | --- | --- | --- |
| `id` | chemin | chaîne | Oui | ID de l’analyse. |

#### Réponses

| Statut | Description | Corps |
| --- | --- | --- |
| 200 | L’analyse. | `Analysis` |
| 401 | Clé d’API manquante ou invalide. Codes d’erreur : missing_api_key, invalid_api_key. | `Error` |
| 404 | Ressource introuvable. Codes d’erreur : not_found. | `Error` |
| 429 | Trop de requêtes. Codes d’erreur : rate_limited. | `Error` |
| 500 | Erreur interne ; rien n’est facturé. Codes d’erreur : internal_error. | `Error` |

#### Réponse 200 : Analysis

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `id` | chaîne | Oui |  |
| `object` | `"analysis"` | Oui |  |
| `created` | entier | Oui | Horodatage Unix. |
| `model` | chaîne | Oui | Instantané qui a produit le résultat. |
| `livemode` | booléen | Oui |  |
| `status` | une valeur parmi `"processing"`, `"succeeded"`, `"failed"`, `"canceled"` | Oui |  |
| `file` | objet | Oui |  |
| `report_id` | chaîne ou null | Oui | ID de rapport vérifiable, FV-XXXX-XXXX-XXXX. |
| `report_url` | chaîne ou null | Oui | Page de vérification publique du rapport. |
| `summary` | `ImageSummary` ou `DocumentSummary` ou null | Oui | Le verdict court et stable : un ImageSummary pour les images, un DocumentSummary pour les documents, null tant que l’analyse n’a pas abouti. |
| `result` | objet ou null | Oui | Présent dès que le statut est succeeded et jusqu’à l’expiration du résultat. |
| `error` | objet ou null | Oui |  |
| `progress` | objet ou null | Oui |  |
| `usage` | objet | Oui |  |
| `metadata` | objet ou null | Oui |  |
| `completed_at` | entier ou null | Oui |  |
| `expires_at` | entier ou null | Oui | Horodatage Unix après lequel le résultat est supprimé. |

**file : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `name` | chaîne ou null | Non |  |
| `bytes` | entier ou null | Non |  |
| `format` | chaîne ou null | Non |  |

**result : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `report` | `ImageReport` ou `DocumentReport` | Non | Le rapport complet. report.schema vaut fileverity.report/1 pour les images et fileverity.docpro/1 pour les documents. |
| `stamped_at` | entier ou null | Non | Horodatage Unix correspondant à l’horodatage RFC 3161 émis pour le rapport, ou null. |

**error : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `code` | une valeur parmi `"invalid_json"`, `"missing_parameter"`, `"invalid_parameter"`, `"text_too_short"`, `"text_too_long"`, `"unsupported_media_type"`, `"unsupported_language"`, `"file_not_found"`, `"unsupported_file"`, `"file_too_large"`, `"too_many_pixels"`, `"too_many_pages"`, `"document_too_long"`, `"invalid_file"`, `"password_required"`, `"wrong_password"`, `"not_examinable"`, `"missing_api_key"`, `"invalid_api_key"`, `"insufficient_balance"`, `"spend_limit_reached"`, `"not_found"`, `"model_not_found"`, `"not_cancelable"`, `"canceled"`, `"idempotency_mismatch"`, `"idempotency_in_progress"`, `"pending_files_limit"`, `"rate_limited"`, `"internal_error"`, `"analysis_failed"`, `"service_unavailable"` | Non |  |
| `message` | chaîne | Non |  |

**progress : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `stage` | une valeur parmi `"queued"`, `"reading"`, `"analyzing"`, `"reporting"` | Non |  |
| `done` | entier | Non | Unités terminées dans l’étape en cours, lorsqu’elles sont connues ; sinon 0. |
| `total` | entier | Non | Unités dans l’étape en cours, lorsqu’elles sont connues ; sinon 0. |
| `position` | entier | Non | Position dans la file d’attente tant que l’étape est queued. |

**usage : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `amount` | entier | Non | Montant facturé en cents ; 0 pour les vérifications du démarrage gratuit et pour les échecs. |
| `currency` | `"usd"` | Non |  |
| `funding` | une valeur parmi `"trial"`, `"balance"`, `null` | Non |  |

#### Codes d’erreur

| Code | Statut |
| --- | --- |
| `not_found` | 404 |
| `missing_api_key` | 401 |
| `invalid_api_key` | 401 |
| `rate_limited` | 429 |
| `internal_error` | 500 |

#### Exemple

**Requête: cURL**

```bash
curl https://api.fileverity.com/v1/analyses/an_8Hk2pQ4vN9sL1xR7cW3mY6zB \
  -H "Authorization: Bearer $FILEVERITY_API_KEY"
```

**Réponse**

```json
{
  "id": "an_8Hk2pQ4vN9sL1xR7cW3mY6zB",
  "object": "analysis",
  "created": 1793700120,
  "model": "fvimg-2-2026-10-30",
  "livemode": true,
  "status": "succeeded",
  "file": {
    "name": "claim-photo.jpg",
    "bytes": 2481920,
    "format": "jpeg"
  },
  "report_id": "FV-7K2M-9QXD-4T8R",
  "report_url": "https://fileverity.com/verify/FV-7K2M-9QXD-4T8R",
  "summary": {
    "level": "L2",
    "assessment": "authentic_untouched",
    "action": "accept",
    "ai": "very_low",
    "edit": "none"
  },
  "result": {
    "report": {
      "schema": "fileverity.report/1",
      "id": "FV-7K2M-9QXD-4T8R"
    },
    "stamped_at": 1793700130
  },
  "error": null,
  "progress": null,
  "usage": {
    "amount": 199,
    "currency": "usd",
    "funding": "balance"
  },
  "metadata": {
    "order_id": "A-10492"
  },
  "completed_at": 1793700131,
  "expires_at": 1794304931
}
```

### Annuler une analyse

`POST` `https://api.fileverity.com/v1/analyses/{id}/cancel`

Annule une analyse de document encore en cours et libère le montant réservé. Les analyses d’images ne peuvent plus être annulées une fois créées.

#### Paramètres

| Nom | Emplacement | Type | Obligatoire | Description |
| --- | --- | --- | --- | --- |
| `id` | chemin | chaîne | Oui | ID de l’analyse. |
| `Idempotency-Key` | en-tête | chaîne | Non | Clé unique de 255 caractères au maximum. Répéter la requête avec la même clé et le même corps dans un délai de 24 heures renvoie la première réponse avec l’en-tête idempotent-replayed: true ; la même clé avec un corps différent renvoie 409. |

#### Réponses

| Statut | Description | Corps |
| --- | --- | --- |
| 200 | L’analyse annulée. | `Analysis` |
| 400 | Requête invalide. Codes d’erreur : invalid_parameter. | `Error` |
| 401 | Clé d’API manquante ou invalide. Codes d’erreur : missing_api_key, invalid_api_key. | `Error` |
| 404 | Ressource introuvable. Codes d’erreur : not_found. | `Error` |
| 409 | Conflit avec l’état actuel. Codes d’erreur : not_cancelable, idempotency_mismatch, idempotency_in_progress. | `Error` |
| 429 | Trop de requêtes. Codes d’erreur : rate_limited. | `Error` |
| 500 | Erreur interne ; rien n’est facturé. Codes d’erreur : internal_error. | `Error` |

#### Réponse 200 : Analysis

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `id` | chaîne | Oui |  |
| `object` | `"analysis"` | Oui |  |
| `created` | entier | Oui | Horodatage Unix. |
| `model` | chaîne | Oui | Instantané qui a produit le résultat. |
| `livemode` | booléen | Oui |  |
| `status` | une valeur parmi `"processing"`, `"succeeded"`, `"failed"`, `"canceled"` | Oui |  |
| `file` | objet | Oui |  |
| `report_id` | chaîne ou null | Oui | ID de rapport vérifiable, FV-XXXX-XXXX-XXXX. |
| `report_url` | chaîne ou null | Oui | Page de vérification publique du rapport. |
| `summary` | `ImageSummary` ou `DocumentSummary` ou null | Oui | Le verdict court et stable : un ImageSummary pour les images, un DocumentSummary pour les documents, null tant que l’analyse n’a pas abouti. |
| `result` | objet ou null | Oui | Présent dès que le statut est succeeded et jusqu’à l’expiration du résultat. |
| `error` | objet ou null | Oui |  |
| `progress` | objet ou null | Oui |  |
| `usage` | objet | Oui |  |
| `metadata` | objet ou null | Oui |  |
| `completed_at` | entier ou null | Oui |  |
| `expires_at` | entier ou null | Oui | Horodatage Unix après lequel le résultat est supprimé. |

**file : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `name` | chaîne ou null | Non |  |
| `bytes` | entier ou null | Non |  |
| `format` | chaîne ou null | Non |  |

**result : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `report` | `ImageReport` ou `DocumentReport` | Non | Le rapport complet. report.schema vaut fileverity.report/1 pour les images et fileverity.docpro/1 pour les documents. |
| `stamped_at` | entier ou null | Non | Horodatage Unix correspondant à l’horodatage RFC 3161 émis pour le rapport, ou null. |

**error : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `code` | une valeur parmi `"invalid_json"`, `"missing_parameter"`, `"invalid_parameter"`, `"text_too_short"`, `"text_too_long"`, `"unsupported_media_type"`, `"unsupported_language"`, `"file_not_found"`, `"unsupported_file"`, `"file_too_large"`, `"too_many_pixels"`, `"too_many_pages"`, `"document_too_long"`, `"invalid_file"`, `"password_required"`, `"wrong_password"`, `"not_examinable"`, `"missing_api_key"`, `"invalid_api_key"`, `"insufficient_balance"`, `"spend_limit_reached"`, `"not_found"`, `"model_not_found"`, `"not_cancelable"`, `"canceled"`, `"idempotency_mismatch"`, `"idempotency_in_progress"`, `"pending_files_limit"`, `"rate_limited"`, `"internal_error"`, `"analysis_failed"`, `"service_unavailable"` | Non |  |
| `message` | chaîne | Non |  |

**progress : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `stage` | une valeur parmi `"queued"`, `"reading"`, `"analyzing"`, `"reporting"` | Non |  |
| `done` | entier | Non | Unités terminées dans l’étape en cours, lorsqu’elles sont connues ; sinon 0. |
| `total` | entier | Non | Unités dans l’étape en cours, lorsqu’elles sont connues ; sinon 0. |
| `position` | entier | Non | Position dans la file d’attente tant que l’étape est queued. |

**usage : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `amount` | entier | Non | Montant facturé en cents ; 0 pour les vérifications du démarrage gratuit et pour les échecs. |
| `currency` | `"usd"` | Non |  |
| `funding` | une valeur parmi `"trial"`, `"balance"`, `null` | Non |  |

#### Codes d’erreur

| Code | Statut |
| --- | --- |
| `not_found` | 404 |
| `not_cancelable` | 409 |
| `invalid_parameter` | 400 |
| `idempotency_mismatch` | 409 |
| `idempotency_in_progress` | 409 |
| `missing_api_key` | 401 |
| `invalid_api_key` | 401 |
| `rate_limited` | 429 |
| `internal_error` | 500 |

#### Exemple

**Requête: cURL**

```bash
curl -X POST https://api.fileverity.com/v1/analyses/an_8Hk2pQ4vN9sL1xR7cW3mY6zB/cancel \
  -H "Authorization: Bearer $FILEVERITY_API_KEY"
```

**Réponse**

```json
{
  "id": "an_8Hk2pQ4vN9sL1xR7cW3mY6zB",
  "object": "analysis",
  "created": 1793700120,
  "model": "fvimg-2-2026-10-30",
  "livemode": true,
  "status": "canceled",
  "file": {
    "name": "claim-photo.jpg",
    "bytes": 2481920,
    "format": "jpeg"
  },
  "report_id": null,
  "report_url": null,
  "summary": null,
  "result": null,
  "error": {
    "code": "canceled",
    "message": "The analysis was canceled. You were not charged."
  },
  "progress": null,
  "usage": {
    "amount": 0,
    "currency": "usd",
    "funding": null
  },
  "metadata": null,
  "completed_at": 1793700135,
  "expires_at": null
}
```

### Télécharger le rapport PDF

`GET` `https://api.fileverity.com/v1/analyses/{id}/report.pdf`

Renvoie le rapport PDF scellé d’une analyse réussie tant que son résultat est conservé. Les clés de test reçoivent 404. Les preuves du document, comme les images de pages, sont disponibles pendant 3 heures après l’analyse ; ensuite, le PDF ne les contient plus, ce que signale x-evidence-included: false.

#### Paramètres

| Nom | Emplacement | Type | Obligatoire | Description |
| --- | --- | --- | --- | --- |
| `id` | chemin | chaîne | Oui | ID de l’analyse. |
| `locale` | requête | une valeur parmi `"en"`, `"fr"`, `"de"`, `"es"`, `"zh"`, `"vi"`, `"ar"` | Non | Valeur par défaut : `"en"`. |

#### Réponses

| Statut | Description | Corps |
| --- | --- | --- |
| 200 | Le rapport PDF. | Fichier PDF |
| 400 | Requête invalide. Codes d’erreur : invalid_parameter. | `Error` |
| 401 | Clé d’API manquante ou invalide. Codes d’erreur : missing_api_key, invalid_api_key. | `Error` |
| 404 | Ressource introuvable. Codes d’erreur : not_found. | `Error` |
| 429 | Trop de requêtes. Codes d’erreur : rate_limited. | `Error` |
| 500 | Erreur interne ; rien n’est facturé. Codes d’erreur : internal_error. | `Error` |

#### Codes d’erreur

| Code | Statut |
| --- | --- |
| `invalid_parameter` | 400 |
| `not_found` | 404 |
| `missing_api_key` | 401 |
| `invalid_api_key` | 401 |
| `rate_limited` | 429 |
| `internal_error` | 500 |

#### Exemple

**Requête: cURL**

```bash
curl "https://api.fileverity.com/v1/analyses/an_8Hk2pQ4vN9sL1xR7cW3mY6zB/report.pdf?locale=en" \
  -H "Authorization: Bearer $FILEVERITY_API_KEY" \
  -o Fileverity-FV-7K2M-9QXD-4T8R.pdf
```

## Modèles

### Lister les modèles

`GET` `https://api.fileverity.com/v1/models`

Liste les modèles disponibles pour votre clé d’API.

#### Réponses

| Statut | Description | Corps |
| --- | --- | --- |
| 200 | Les modèles disponibles. | `ModelList` |
| 401 | Clé d’API manquante ou invalide. Codes d’erreur : missing_api_key, invalid_api_key. | `Error` |
| 429 | Trop de requêtes. Codes d’erreur : rate_limited. | `Error` |
| 500 | Erreur interne ; rien n’est facturé. Codes d’erreur : internal_error. | `Error` |

#### Réponse 200 : ModelList

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `object` | `"list"` | Oui |  |
| `data` | tableau de `Model` | Oui |  |

**data : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `id` | chaîne | Oui |  |
| `object` | `"model"` | Oui |  |
| `created` | entier | Oui | Horodatage Unix de l’instantané actuel. |
| `owned_by` | chaîne | Oui |  |
| `name` | chaîne | Oui |  |
| `type` | une valeur parmi `"image"`, `"document"`, `"text"` | Oui |  |
| `description` | chaîne | Oui |  |
| `snapshot` | chaîne | Oui | Instantané daté vers lequel pointe actuellement l’ID. |
| `status` | une valeur parmi `"available"`, `"preview"`, `"deprecated"` | Oui |  |
| `input` | objet | Oui | Entrée acceptée. Pour les fichiers : formats et limites de taille ; pour le texte : langues et limites de longueur. |
| `output` | objet | Oui |  |
| `pricing` | objet | Oui |  |

**input : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `formats` | tableau de chaînes | Non |  |
| `max_bytes` | entier | Non |  |
| `max_megapixels` | entier | Non |  |
| `max_pages` | entier | Non |  |
| `languages` | tableau de chaînes | Non |  |
| `min_words` | entier | Non |  |
| `max_characters` | entier | Non |  |

**output : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `schema` | chaîne | Oui | Schéma du rapport dans les résultats d’analyse. |

**pricing : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `currency` | `"usd"` | Oui |  |
| `unit` | chaîne | Oui |  |
| `unit_amount` | entier | Oui | Prix unitaire en cents. |

#### Codes d’erreur

| Code | Statut |
| --- | --- |
| `missing_api_key` | 401 |
| `invalid_api_key` | 401 |
| `rate_limited` | 429 |
| `internal_error` | 500 |

#### Exemple

**Requête: cURL**

```bash
curl https://api.fileverity.com/v1/models \
  -H "Authorization: Bearer $FILEVERITY_API_KEY"
```

**Réponse**

```json
{
  "object": "list",
  "data": [
    {
      "id": "fvimg-2",
      "object": "model",
      "created": 1793318400,
      "owned_by": "fileverity",
      "name": "FVIMG V2",
      "type": "image",
      "description": "Image authenticity analysis. Detects AI generation and local edits, checks content credentials and metadata, and returns a verifiable report.",
      "snapshot": "fvimg-2-2026-10-30",
      "status": "available",
      "input": {
        "formats": [
          "jpeg",
          "png",
          "webp"
        ],
        "max_bytes": 10485760,
        "max_megapixels": 40
      },
      "output": {
        "schema": "fileverity.report/1"
      },
      "pricing": {
        "currency": "usd",
        "unit": "image",
        "unit_amount": 199
      }
    },
    {
      "id": "fvdoc-3",
      "object": "model",
      "created": 1793664000,
      "owned_by": "fileverity",
      "name": "FVDOC V3",
      "type": "document",
      "description": "Document fraud analysis. Evaluates AI-written text, embedded photos, edit history and signatures, and returns a verifiable report.",
      "snapshot": "fvdoc-3-2026-11-03",
      "status": "available",
      "input": {
        "formats": [
          "pdf",
          "docx",
          "doc",
          "rtf",
          "odt",
          "pptx",
          "txt"
        ],
        "max_bytes": 52428800,
        "max_pages": 100
      },
      "output": {
        "schema": "fileverity.docpro/1"
      },
      "pricing": {
        "currency": "usd",
        "unit": "document",
        "unit_amount": 599
      }
    },
    {
      "id": "fvdoc-3-text",
      "object": "model",
      "created": 1793664000,
      "owned_by": "fileverity",
      "name": "FVDOC V3 Text",
      "type": "text",
      "description": "AI-written text detection. Classifies plain text as AI-written, partly AI-written or human-written and marks the AI-written passages.",
      "snapshot": "fvdoc-3-text-2026-11-03",
      "status": "available",
      "input": {
        "languages": [
          "en",
          "fr",
          "de",
          "es",
          "zh"
        ],
        "min_words": 100,
        "max_characters": 100000
      },
      "output": {
        "schema": "fileverity.text-detection/1"
      },
      "pricing": {
        "currency": "usd",
        "unit": "1000_characters",
        "unit_amount": 14
      }
    }
  ]
}
```

### Récupérer un modèle

`GET` `https://api.fileverity.com/v1/models/{model}`

Récupère un modèle à partir de son ID ou de son ID d’instantané.

#### Paramètres

| Nom | Emplacement | Type | Obligatoire | Description |
| --- | --- | --- | --- | --- |
| `model` | chemin | chaîne | Oui | ID de modèle ou ID d’instantané. |

#### Réponses

| Statut | Description | Corps |
| --- | --- | --- |
| 200 | Le modèle. | `Model` |
| 401 | Clé d’API manquante ou invalide. Codes d’erreur : missing_api_key, invalid_api_key. | `Error` |
| 404 | Ressource introuvable. Codes d’erreur : model_not_found. | `Error` |
| 429 | Trop de requêtes. Codes d’erreur : rate_limited. | `Error` |
| 500 | Erreur interne ; rien n’est facturé. Codes d’erreur : internal_error. | `Error` |

#### Réponse 200 : Model

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `id` | chaîne | Oui |  |
| `object` | `"model"` | Oui |  |
| `created` | entier | Oui | Horodatage Unix de l’instantané actuel. |
| `owned_by` | chaîne | Oui |  |
| `name` | chaîne | Oui |  |
| `type` | une valeur parmi `"image"`, `"document"`, `"text"` | Oui |  |
| `description` | chaîne | Oui |  |
| `snapshot` | chaîne | Oui | Instantané daté vers lequel pointe actuellement l’ID. |
| `status` | une valeur parmi `"available"`, `"preview"`, `"deprecated"` | Oui |  |
| `input` | objet | Oui | Entrée acceptée. Pour les fichiers : formats et limites de taille ; pour le texte : langues et limites de longueur. |
| `output` | objet | Oui |  |
| `pricing` | objet | Oui |  |

**input : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `formats` | tableau de chaînes | Non |  |
| `max_bytes` | entier | Non |  |
| `max_megapixels` | entier | Non |  |
| `max_pages` | entier | Non |  |
| `languages` | tableau de chaînes | Non |  |
| `min_words` | entier | Non |  |
| `max_characters` | entier | Non |  |

**output : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `schema` | chaîne | Oui | Schéma du rapport dans les résultats d’analyse. |

**pricing : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `currency` | `"usd"` | Oui |  |
| `unit` | chaîne | Oui |  |
| `unit_amount` | entier | Oui | Prix unitaire en cents. |

#### Codes d’erreur

| Code | Statut |
| --- | --- |
| `model_not_found` | 404 |
| `missing_api_key` | 401 |
| `invalid_api_key` | 401 |
| `rate_limited` | 429 |
| `internal_error` | 500 |

#### Exemple

**Requête: cURL**

```bash
curl https://api.fileverity.com/v1/models/fvimg-2 \
  -H "Authorization: Bearer $FILEVERITY_API_KEY"
```

**Réponse**

```json
{
  "id": "fvimg-2",
  "object": "model",
  "created": 1793318400,
  "owned_by": "fileverity",
  "name": "FVIMG V2",
  "type": "image",
  "description": "Image authenticity analysis. Detects AI generation and local edits, checks content credentials and metadata, and returns a verifiable report.",
  "snapshot": "fvimg-2-2026-10-30",
  "status": "available",
  "input": {
    "formats": [
      "jpeg",
      "png",
      "webp"
    ],
    "max_bytes": 10485760,
    "max_megapixels": 40
  },
  "output": {
    "schema": "fileverity.report/1"
  },
  "pricing": {
    "currency": "usd",
    "unit": "image",
    "unit_amount": 199
  }
}
```

## Événements webhook

Fileverity envoie ces événements à vos points de terminaison webhook. Les règles de vérification et d’envoi sont décrites dans [Webhooks](https://fileverity.com/fr/docs/webhooks.md).

### Événement analysis.completed

Envoyé à vos points de terminaison webhook selon la spécification Standard Webhooks : les en-têtes webhook-id, webhook-timestamp et webhook-signature (v1,<base64 HMAC-SHA256 de id.timestamp.body>, avec pour clé la partie base64 de votre secret whsec_). Répondez par un code 2xx quelconque dans un délai de 10 secondes ; les échecs donnent lieu à de nouvelles tentatives avec un backoff exponentiel pendant 3 jours.

#### Corps de la requête : application/json, obligatoire

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `id` | chaîne | Oui | Également envoyé dans l’en-tête webhook-id ; utilisez-le pour dédupliquer les nouvelles tentatives. |
| `object` | `"event"` | Oui |  |
| `type` | une valeur parmi `"analysis.completed"`, `"analysis.failed"`, `"balance.low"` | Oui |  |
| `created` | entier | Oui | Horodatage Unix. |
| `data` | `Analysis` ou `BalanceLow` | Oui | Les événements analysis.* contiennent le même objet que GET /analyses/{id}, avec result toujours à null ; récupérez le résultat avec ce point d’accès. Les événements balance.low contiennent le solde et le seuil en cents. |

**data (BalanceLow) : champs**

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `balance` | entier | Oui | Solde en cents. |
| `threshold` | entier | Oui | Seuil d’alerte en cents. |

### Événement analysis.failed

Envoyé à vos points de terminaison webhook selon la spécification Standard Webhooks : les en-têtes webhook-id, webhook-timestamp et webhook-signature (v1,<base64 HMAC-SHA256 de id.timestamp.body>, avec pour clé la partie base64 de votre secret whsec_). Répondez par un code 2xx quelconque dans un délai de 10 secondes ; les échecs donnent lieu à de nouvelles tentatives avec un backoff exponentiel pendant 3 jours.

#### Corps de la requête : application/json, obligatoire

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `id` | chaîne | Oui | Également envoyé dans l’en-tête webhook-id ; utilisez-le pour dédupliquer les nouvelles tentatives. |
| `object` | `"event"` | Oui |  |
| `type` | une valeur parmi `"analysis.completed"`, `"analysis.failed"`, `"balance.low"` | Oui |  |
| `created` | entier | Oui | Horodatage Unix. |
| `data` | `Analysis` ou `BalanceLow` | Oui | Les événements analysis.* contiennent le même objet que GET /analyses/{id}, avec result toujours à null ; récupérez le résultat avec ce point d’accès. Les événements balance.low contiennent le solde et le seuil en cents. |

### Événement balance.low

Envoyé à vos points de terminaison webhook selon la spécification Standard Webhooks : les en-têtes webhook-id, webhook-timestamp et webhook-signature (v1,<base64 HMAC-SHA256 de id.timestamp.body>, avec pour clé la partie base64 de votre secret whsec_). Répondez par un code 2xx quelconque dans un délai de 10 secondes ; les échecs donnent lieu à de nouvelles tentatives avec un backoff exponentiel pendant 3 jours.

#### Corps de la requête : application/json, obligatoire

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `id` | chaîne | Oui | Également envoyé dans l’en-tête webhook-id ; utilisez-le pour dédupliquer les nouvelles tentatives. |
| `object` | `"event"` | Oui |  |
| `type` | une valeur parmi `"analysis.completed"`, `"analysis.failed"`, `"balance.low"` | Oui |  |
| `created` | entier | Oui | Horodatage Unix. |
| `data` | `Analysis` ou `BalanceLow` | Oui | Les événements analysis.* contiennent le même objet que GET /analyses/{id}, avec result toujours à null ; récupérez le résultat avec ce point d’accès. Les événements balance.low contiennent le solde et le seuil en cents. |

**OpenAPI**

```bash
curl https://api.fileverity.com/v1/openapi.json
```

