---
title: "Verify an already-performed schedule proposal recovery"
method: POST
path: "/accountant/companies/{customerId}/schedule-proposals/{id}/recovery/resolve"
tags: ["Accountant Portal", "Schedule Proposals"]
---

# Verify an already-performed schedule proposal recovery

`POST /accountant/companies/{customerId}/schedule-proposals/{id}/recovery/resolve`

## Request

- Base URL: `https://api.medianfi.com/api/v1`
- URL: `https://api.medianfi.com/api/v1/accountant/companies/{customerId}/schedule-proposals/{id}/recovery/resolve`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Requires a fresh live accountant assignment. This operation never creates, edits, deletes, pauses, or voids ledger artifacts. It verifies pre-existing safe voids or one existing exact net-negating correction from authoritative server reads, records the audit/history, and idempotently completes the high-priority recovery task.

## Request body

- ResolveScheduleProposalRecoveryInput
  - `expectedRevision` string, required
  - `correctionJournalEntryId` string, uuid
  - `note` string

## Response `200`

Verified recovery, unchanged safe proposal, and completed task

- ScheduleProposalRecoveryResolutionResponse
  - `success` boolean, required
  - `data` object, required
    - `recovery` ScheduleProposalRecovery, required
      - `proposalId` string, uuid, required
      - `status` 'pending' | 'resolved', required
      - `revision` string, required
      - `incidentReason` string, required
      - `recoveryTaskId` string, uuid, nullable, required
      - `artifacts` ScheduleProposalRecoveryArtifacts, required
        - `definitionIds` string[], required
        - `runIds` string[], required
        - `openingJournalEntryIds` string[], required
        - `postedRunJournalEntryIds` string[], required
      - `requirements` object, required
        - `correctionJournalEntryRequired` boolean, required
        - `originalsMustBeVoided` boolean, required
        - `definitionsMustBeInactive` true, required
      - `resolution` object, nullable, required
        - `mode` 'originals_voided' | 'net_negating_correction', required
        - `correctionJournalEntryId` string, uuid, nullable, required
      - `resolvedAt` string, date-time, nullable, required
      - `resolvedBy` string, uuid, nullable, required
    - `proposal` ScheduleProposal, required: One AI-detected deferral/accrual candidate with its derived schedule inputs and confidence. Never a book write on its own; materialization (#1266 Phase B) turns approved proposals into schedule definitions.
      - `id` string, uuid
      - `companyId` string, uuid
      - `entityId` string, uuid, nullable
      - `currency` string, nullable
      - `proposalType` 'deferral' | 'accrual'
      - `kind` 'prepaid_amortization' | 'deferred_revenue_recognition' | 'accrual'
      - `derivedInputs` object: Zod-validated derived inputs (per-type schema; legs are ScheduleProposalLeg items).
      - `totalAmountCents` integer
      - `startDate` string, date
      - `endDate` string, date, nullable
      - `confidencePct` number
      - `confidenceBand` 'high' | 'medium' | 'low'
      - `confidenceComponents` object
      - `detectionSignals` object
      - `reasoning` string, nullable
      - `sourceKind` string
      - `sourceId` string, nullable
      - `dedupKey` string
      - `inputHash` string
      - `matchKey` string, nullable
      - `status` 'proposed' | 'pending_review' | 'approved' | 'rejected' | 'blocked' | 'posted' | 'superseded' | 'expired'
      - `blockedReason` string, nullable
      - `escalatedAt` string, date-time, nullable
      - `escalationReason` string, nullable
      - `metadata` object
        - `clarification` ScheduleProposalClarification
          - `state` 'draft' | 'sent', required
          - `question` string, required
          - `draftedAt` string, date-time, required
          - `sentAt` string, date-time
          - `sentByUserId` string, uuid, nullable
          - `threadId` string, uuid
          - `initialMessageId` string, uuid
          - `thread` ScheduleProposalClarificationThread
            - `id` string, uuid, required
            - `status` 'open' | 'resolved' | 'archived', required
            - `ownership` 'ai' | 'accountant', required
            - `blocksClose` false, required
            - `initialMessageId` string, uuid, required
            - `hasCustomerReply` boolean, required
            - `customerReplyCount` integer, required
            - `lastCustomerReplyAt` string, date-time, nullable
      - `reviewedBy` string, uuid, nullable
      - `reviewedAt` string, date-time, nullable
      - `reviewNotes` string, nullable
      - `editedInputs` object, nullable
      - `scheduleDefinitionIds` string[], nullable
      - `postedJeId` string, uuid, nullable
      - `createdBy` string, uuid, nullable
      - `createdAt` string, date-time
      - `updatedAt` string, date-time
    - `task` ScheduleProposalRecoveryTask, required
      - `id` string, uuid, required
      - `companyId` string, uuid, required
      - `accountantId` string, uuid, required
      - `title` string
      - `description` string, nullable
      - `type` 'schedule_proposal_recovery', required
      - `sourceKey` string, required
      - `priority` 'high', required
      - `status` 'pending' | 'in_progress' | 'completed' | 'cancelled', required
      - `dueDate` string, date-time, nullable
      - `completedAt` string, date-time, nullable
      - `createdAt` string, date-time
      - `updatedAt` string, date-time

## Other responses

- `401`: Authentication required
- `403`: Insufficient permissions or not a company member
- `404`: Resource not found
- `409`: Stale revision or unsafe/ambiguous accounting state
- `422`: Request failed validation

---

[API](https://skmtc.dev/medianfi/apis/median-api.md) · [All operations](https://skmtc.dev/medianfi/apis/median-api/llms.txt) · [OpenAPI document](https://skmtc.dev/medianfi/apis/median-api/revisions/20090ea32b0d?raw)
