---
search:
  tags:
    - offline-sync
    - POST
seo:
  description: >-
    Compute the server-owned sync plan for a matter. Reference for the POST
    /api/v1/sync/matters/{id}/reconcile endpoint in the Basenet Public API.
sidebar:
  label: Compute the server-owned sync plan for a matter
  badge: POST
title: Compute the server-owned sync plan for a matter
type: openapi-operation
---
Endpoint: `POST /api/v1/sync/matters/{id}/reconcile`

Authentication: `bearerAuth` (Scoped API token (bnx\_…). Required scopes are noted per operation.)

Parameters:
- `id` (in path, string, required)

Request body (`application/json`):
- `supportedContractVersions` (array of one of `"v1"`, optional)
- `files` (array of object, required)
- `files[].relativePath` (string, required)
- `files[].checksum` (string, required)
- `files[].size` (integer, required)

Responses:
- `200`: Server-computed sync plan and DMS metadata for downloads/conflicts
- `400`: Invalid request
- `401`: Unauthenticated
- `403`: Forbidden (missing scope or permission)
- `429`: Rate limited

Response 200 body (`application/json`):
- `contractVersion` (one of `"v1"`, required)
- `matterId` (string, required)
- `plan` (object, required)
- `plan.actions` (array of object, required)
- `plan.actions[].kind` (one of `"download"`, `"upload"`, `"conflict"`, `"dms_deleted"`, `"device_deleted"`, required)
- `plan.actions[].reason` (one of `"new"`, `"dms_changed"`, `"device_changed"`, optional)
- `plan.actions[].relativePath` (string, required)
- `plan.actions[].documentId` (string or null, optional)
- `plan.actions[].detail` (string, optional)
- `plan.summary` (object, required)
- `plan.summary.download` (integer, required)
- `plan.summary.upload` (integer, required)
- `plan.summary.conflict` (integer, required)
- `plan.summary.dmsDeleted` (integer, required)
- `plan.summary.deviceDeleted` (integer, required)
- `plan.summary.noop` (integer, required)
- `documents` (object, required)
