---
title: "Détail d'un suivi de chantier (fil, documents liés, avis)"
method: GET
path: "/projects/{id}"
tags: ["Projects"]
---

# Détail d'un suivi de chantier (fil, documents liés, avis)

`GET /projects/{id}`

## Request

- Base URL: `https://api.swipify.fr/api/v1`
- URL: `https://api.swipify.fr/api/v1/projects/{id}`
- Auth: API key in header `X-API-Key`

Fiche du suivi, membres affectés, devis et factures rattachés, messages et jalons du fil avec leurs commentaires (les photos ne sont pas servies par l'API, seul leur nombre l'est), note laissée par le client. Scope requis : `projects:read`.

## Path parameters

- `id` integer, required

## Response `200`

Suivi de chantier (détail)

- ProjectDetail: Suivi de chantier, forme de liste (en-tête du fil partagé avec le client).
  - `id` integer
  - `title` string
  - `status` 'active' | 'completed' | 'archived'
  - `address` string, nullable: Adresse du chantier
  - `startDate` string, date-time, nullable
  - `endDate` string, date-time, nullable: Fin prévue
  - `completedAt` string, date-time, nullable: Fin effective, null tant que le chantier est en cours
  - `nextStep` string, nullable: Prochaine étape annoncée au client
  - `nextStepDate` string, date-time, nullable
  - `customer` DocumentParty, nullable: Client (destinataire), forme allégée.
    - `id` integer
    - `name` string, nullable
  - `review` object, nullable: Note de fin de chantier laissée par le client, null tant qu'il n'en a pas laissé.
    - `rating` integer
    - `comment` string, nullable
  - `createdAt` string, date-time
  - `updatedAt` string, date-time: Dernière activité (message, document rattaché, fin)
  - `completionNote` string, nullable: Mot de fin adressé au client
  - `clientCanPost` boolean: true si le client peut écrire dans le fil
  - `internalNotes` string, nullable: Notes pour l'équipe, jamais montrées au client
  - `members` object[]: Membres d'équipe affectés au chantier
    - `id` integer
    - `name` string, nullable
  - `quotes` object[]: Devis rattachés (émis, jamais les brouillons)
    - `id` integer
    - `number` string, nullable
    - `status` string
    - `object` string, nullable
    - `totalTTC` string
    - `date` string, date-time, nullable
  - `invoices` object[]: Factures rattachées (émises, jamais les brouillons)
    - `id` integer
    - `number` string, nullable
    - `status` string
    - `totalTTC` string
    - `netDueTTC` string, nullable: Restant dû d'une facture de solde, null sinon
    - `date` string, date-time, nullable
    - `dueDate` string, date-time, nullable
    - `paidDate` string, date-time, nullable
    - `quoteId` integer, nullable
    - `isDeposit` boolean: true pour une facture d'acompte
  - `posts` ProjectPost[]: Fil du chantier, du plus ancien au plus récent
    - `id` integer
    - `kind` 'post' | 'milestone'
    - `audience` 'shared' | 'team'
    - `body` string, nullable
    - `author` object
      - `type` 'owner' | 'member' | 'client'
      - `name` string
    - `createdAt` string, date-time
    - `mediaCount` integer: Photos jointes (non servies par l'API)
    - `comments` object[]
      - `id` integer
      - `body` string, nullable
      - `author` object
        - `type` 'owner' | 'member' | 'client'
        - `name` string
      - `createdAt` string, date-time

## Other responses

- `401`: Échec d'authentification : clé API manquante (`missing_api_key`) ou invalide/révoquée/expirée (`invalid_api_key`). Le client doit présenter une clé valide.
- `403`: Clé authentifiée mais non autorisée : scope insuffisant pour cette route (`scope_required`), ou organisation sans abonnement Pro actif (`pro_required`). `GET /me` reste accessible sans Pro pour diagnostiquer la clé.
- `404`: Ressource introuvable

---

[API](https://skmtc.dev/swipify/apis/swipify-api-publique.md) · [All operations](https://skmtc.dev/swipify/apis/swipify-api-publique/llms.txt) · [OpenAPI document](https://skmtc.dev/swipify/apis/swipify-api-publique/revisions/44c17201b479?raw)
