# Envoyer un fichier

Un fichier s’envoie par son empreinte SHA1. Host ne stocke jamais deux fois le même contenu pour une organisation : tu n’envoies que les fichiers que [Créer un déploiement](/docs/reference/api/deploiements/) signale comme manquants.

## POST `/v2/files`

```bash
SHA=$(sha1sum index.html | cut -d' ' -f1)
curl -X POST https://api.host.hgdc.ch/v2/files \
  -H "Authorization: Bearer $VERCEL_TOKEN" \
  -H "x-vercel-digest: $SHA" \
  -H "Content-Type: application/octet-stream" \
  --data-binary @index.html
```

En Node.js, calcule l’empreinte avant l’envoi :

```javascript
import { createHash } from "node:crypto"
import { readFile } from "node:fs/promises"

const bytes = await readFile("index.html")
const sha = createHash("sha1").update(bytes).digest("hex")

await fetch("https://api.host.hgdc.ch/v2/files", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.VERCEL_TOKEN}`,
    "x-vercel-digest": sha,
    "Content-Type": "application/octet-stream",
  },
  body: bytes,
})
```

### En-têtes

| En-tête           | Valeur                                                   | Requis                                |
| ----------------- | -------------------------------------------------------- | ------------------------------------- |
| `Authorization`   | `Bearer ah_…`                                            | Oui                                   |
| `x-vercel-digest` | Empreinte SHA1 du contenu, en hexadécimal, 40 caractères | Oui. `x-now-digest` est aussi accepté |
| `Content-Type`    | `application/octet-stream`                               | Recommandé                            |

### Corps

Le contenu brut du fichier, 20 Mo au plus.

### Réponse

Réponse `200` avec un objet vide, `{}`.

### Erreurs

| Statut | Code             | Cause                                                                  |
| ------ | ---------------- | ---------------------------------------------------------------------- |
| `400`  | `bad_request`    | En-tête `x-vercel-digest` absent ou mal formé                          |
| `400`  | `invalid_digest` | Le contenu ne correspond pas à l’empreinte annoncée. Recalcule le SHA1 |
| `413`  | `file_too_large` | Le fichier dépasse 20 Mo                                               |

## Limites

L’envoi de fichiers a son propre débit : 6 000 par minute, avec des rafales de 3 000 par clé. Un site Next.js compte souvent des milliers de fichiers : envoie-les en parallèle, mais sans dépasser ce débit. Voir [Limites](/docs/reference/limites/).
