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

# Obtenir le PDF du devis

> Télécharger un PDF de devis (signé si disponible, sinon non signé)

## Autorisation

<ParamField header="Authorization" type="string" required>
  Jeton Bearer pour l'authentification. Format : `Bearer qwoty_your_token`
</ParamField>

## Paramètres de chemin

<ParamField path="id" type="string" required>
  UUID du projet
</ParamField>

## Paramètres de requête

<ParamField query="force" type="boolean" default="false">
  Force la régénération du PDF avant le téléchargement. Utilisez `true` pour contourner les vérifications de fraîcheur.
</ParamField>

## Comportement

* Si le projet est `accepted` et qu'un PDF signé existe, le fichier signé est retourné.
* Sinon, un PDF non signé est retourné (généré à la demande si nécessaire).
* La réponse est un téléchargement de fichier avec le type de contenu `application/pdf`.

**Source :** `src/app/api/projects/[id]/pdf/route.ts` (maintenu en dehors de `app/api/(bff)/` en tant que contrat HTTP documenté et compatible avec les outils).

## Exemples

<CodeGroup>
  ```bash cURL theme={null}
  curl --request GET \
    --url "https://qwoty.app/api/projects/550e8400-e29b-41d4-a716-446655440000/pdf?force=false" \
    --header "Authorization: Bearer qwoty_your_token" \
    --output quote.pdf
  ```

  ```javascript JavaScript theme={null}
  const projectId = '550e8400-e29b-41d4-a716-446655440000'

  const response = await fetch(
    `https://qwoty.app/api/projects/${projectId}/pdf?force=false`,
    {
      headers: {
        Authorization: 'Bearer qwoty_your_token',
      },
    },
  )

  if (!response.ok) {
    const error = await response.json()
    throw new Error(error.error)
  }

  const blob = await response.blob()
  ```

  ```python Python theme={null}
  import requests

  project_id = '550e8400-e29b-41d4-a716-446655440000'

  response = requests.get(
      f'https://qwoty.app/api/projects/{project_id}/pdf?force=false',
      headers={
          'Authorization': 'Bearer qwoty_your_token'
      }
  )

  if response.status_code != 200:
      raise Exception(response.json().get('error', 'Échec de la requête'))

  with open('quote.pdf', 'wb') as f:
      f.write(response.content)
  ```
</CodeGroup>

## Réponse

<ResponseField name="Content-Type" type="string">
  Toujours `application/pdf` en cas de succès.
</ResponseField>

<ResponseField name="Content-Disposition" type="string">
  Nom de fichier en pièce jointe. Exemple : `quote-Q-2024-001.pdf` ou
  `quote-Q-2024-001-signed.pdf`.
</ResponseField>

<ResponseExample>
  ```text 200 application/pdf theme={null}
  (fichier PDF binaire)
  ```

  ```json 404 theme={null}
  {
    "error": "Project not found"
  }
  ```

  ```json 500 theme={null}
  {
    "error": "Failed to prepare PDF"
  }
  ```
</ResponseExample>
