---
title: "Prévisualiser ou appliquer une réconciliation du portefeuille"
method: POST
path: "/api/v1/portfolio/reconcile"
tags: ["Projects", "Tasks"]
---

# Prévisualiser ou appliquer une réconciliation du portefeuille

`POST /api/v1/portfolio/reconcile`

## Request

- Base URL: `https://arcadeops.leadalpes.fr`
- URL: `https://arcadeops.leadalpes.fr/api/v1/portfolio/reconcile`
- Auth: HTTP bearer

Calcule d'abord un diff tenanté en dry-run. L'application exige le hash exact de ce diff, les droits PROJECT_UPDATE et TASK_UPDATE, puis effectue les mutations et l'audit dans une transaction sérialisable.

## Request body

- union
  - object
    - `desiredState` object, required
      - `projects` object[]
        - `key` string, required
        - `name` string, required
        - `description` string, nullable
        - `status` 'ACTIVE' | 'PAUSED' | 'COMPLETED' | 'ARCHIVED'
      - `tasks` object[]
        - `taskId` string
        - `projectKey` string, required
        - `title` string, required
        - `objective` string, nullable
        - `status` 'OPEN' | 'IN_PROGRESS' | 'REVIEW' | 'BLOCKED' | 'DONE' | 'CANCELLED'
        - `priority` 'LOW' | 'NORMAL' | 'HIGH' | 'URGENT'
        - `deadline` string, date-time, nullable
    - `dryRun` true, required
  - object
    - `desiredState` object, required
      - `projects` object[]
        - `key` string, required
        - `name` string, required
        - `description` string, nullable
        - `status` 'ACTIVE' | 'PAUSED' | 'COMPLETED' | 'ARCHIVED'
      - `tasks` object[]
        - `taskId` string
        - `projectKey` string, required
        - `title` string, required
        - `objective` string, nullable
        - `status` 'OPEN' | 'IN_PROGRESS' | 'REVIEW' | 'BLOCKED' | 'DONE' | 'CANCELLED'
        - `priority` 'LOW' | 'NORMAL' | 'HIGH' | 'URGENT'
        - `deadline` string, date-time, nullable
    - `dryRun` false, required
    - `expectedDiffHash` string, required

## Response `200`

Diff calculé ou réconciliation appliquée

- object
  - `dryRun` boolean, required
  - `diffHash` string, required
  - `riskLevel` 'R1' | 'R2' | 'R3', required
  - `summary` object, required
    - `mutations` integer, required
    - `projectsToCreate` integer, required
    - `projectsToUpdate` integer, required
    - `tasksToCreate` integer, required
    - `tasksToUpdate` integer, required
  - `operations` object[], required
    - `action` 'CREATE' | 'UPDATE', required
    - `entity` 'PROJECT' | 'TASK', required
    - `ref` string, required
    - `entityId` string, nullable, required
    - `projectKey` string
    - `expectedVersion` string, nullable, required
    - `changes` object, required
  - `collisions` object[], required
    - `code` string, required
    - `ref` string, required
    - `message` string, required
  - `uncertainties` object[], required
    - `code` string, required
    - `ref` string, required
    - `message` string, required
  - `applied` object, nullable, required
    - `projectIds` string[], required
    - `taskIds` string[], required
    - `auditEvent` object, required
      - `id` string, required
      - `action` 'UPDATE', required
      - `entityType` 'PortfolioReconciliation', required
      - `entityId` string, required

## Other responses

- `400`: État désiré invalide, ambigu ou hors limites
- `401`: Authentification requise
- `403`: Droits projet ou tâche insuffisants
- `409`: Hash ou versions du portefeuille en conflit
- `429`: Limite de requêtes atteinte

---

[API](https://skmtc.dev/leadalpes/apis/arcadeops-api.md) · [All operations](https://skmtc.dev/leadalpes/apis/arcadeops-api/llms.txt) · [OpenAPI document](https://skmtc.dev/leadalpes/apis/arcadeops-api/revisions/f10422ec7412?raw)
