---
title: "Confirm an outcome policy"
method: POST
path: "/api/v1/policy-compiler/confirm"
---

# Confirm an outcome policy

`POST /api/v1/policy-compiler/confirm`

## Request

- Base URL: `https://spoolis.com`
- URL: `https://spoolis.com/api/v1/policy-compiler/confirm`
- Auth: HTTP bearer

Maps caller-confirmed proposal fields to supported Spool policy fields. Each ambiguous field needs a resolution (a candidate index or a value) before it can be confirmed. Nothing is persisted. Requires a full-scope key.

## Request body

- PolicyConfirmRequest
  - `proposal` object, required
    - `billable_unit` object, required
      - `status` 'extracted' | 'inferred' | 'missing' | 'ambiguous', required
      - `value` string, nullable, required
      - `quotes` object[], required
        - `source_index` integer, required
        - `text` string, required
        - `start` integer, required
        - `end` integer, required
      - `flags` string[], required
      - `candidates` object[]
        - `value` string, required
        - `quotes` object[], required
          - `source_index` integer, required
          - `text` string, required
          - `start` integer, required
          - `end` integer, required
      - `resolved_by` 'caller'
    - `criteria` object, required
      - `status` 'extracted' | 'inferred' | 'missing' | 'ambiguous', required
      - `value` string[], nullable, required
      - `quotes` object[], required
        - `source_index` integer, required
        - `text` string, required
        - `start` integer, required
        - `end` integer, required
      - `flags` string[], required
      - `candidates` object[]
        - `value` string[], required
        - `quotes` object[], required
          - `source_index` integer, required
          - `text` string, required
          - `start` integer, required
          - `end` integer, required
      - `resolved_by` 'caller'
    - `exclusions` object, required
      - `status` 'extracted' | 'inferred' | 'missing' | 'ambiguous', required
      - `value` string[], nullable, required
      - `quotes` object[], required
        - `source_index` integer, required
        - `text` string, required
        - `start` integer, required
        - `end` integer, required
      - `flags` string[], required
      - `candidates` object[]
        - `value` string[], required
        - `quotes` object[], required
          - `source_index` integer, required
          - `text` string, required
          - `start` integer, required
          - `end` integer, required
      - `resolved_by` 'caller'
    - `source_of_truth` object, required
      - `status` 'extracted' | 'inferred' | 'missing' | 'ambiguous', required
      - `value` object, nullable, required
        - `kind` 'buyer' | 'seller' | 'platform' | 'external', required
        - `ref_text` string
      - `quotes` object[], required
        - `source_index` integer, required
        - `text` string, required
        - `start` integer, required
        - `end` integer, required
      - `flags` string[], required
      - `candidates` object[]
        - `value` object, required
          - `kind` 'buyer' | 'seller' | 'platform' | 'external', required
          - `ref_text` string
        - `quotes` object[], required
          - `source_index` integer, required
          - `text` string, required
          - `start` integer, required
          - `end` integer, required
      - `resolved_by` 'caller'
    - `evidence` object, required
      - `status` 'extracted' | 'inferred' | 'missing' | 'ambiguous', required
      - `value` string[], nullable, required
      - `quotes` object[], required
        - `source_index` integer, required
        - `text` string, required
        - `start` integer, required
        - `end` integer, required
      - `flags` string[], required
      - `candidates` object[]
        - `value` string[], required
        - `quotes` object[], required
          - `source_index` integer, required
          - `text` string, required
          - `start` integer, required
          - `end` integer, required
      - `resolved_by` 'caller'
    - `matching_rules` object, required
      - `status` 'extracted' | 'inferred' | 'missing' | 'ambiguous', required
      - `value` object[], nullable, required
        - `match_on` string[], required
        - `tolerance_text` string
        - `tolerance` object
          - `absolute_cents` number, nullable
          - `percentage` string, nullable
          - `basis_points` number, nullable
      - `quotes` object[], required
        - `source_index` integer, required
        - `text` string, required
        - `start` integer, required
        - `end` integer, required
      - `flags` string[], required
      - `candidates` object[]
        - `value` object[], required
          - `match_on` string[], required
          - `tolerance_text` string
          - `tolerance` object
            - `absolute_cents` number, nullable
            - `percentage` string, nullable
            - `basis_points` number, nullable
        - `quotes` object[], required
          - `source_index` integer, required
          - `text` string, required
          - `start` integer, required
          - `end` integer, required
      - `resolved_by` 'caller'
    - `attribution_window` object, required
      - `status` 'extracted' | 'inferred' | 'missing' | 'ambiguous', required
      - `value` object, nullable, required
        - `duration_text` string, required
        - `duration_iso8601` string, nullable, required
      - `quotes` object[], required
        - `source_index` integer, required
        - `text` string, required
        - `start` integer, required
        - `end` integer, required
      - `flags` string[], required
      - `candidates` object[]
        - `value` object, required
          - `duration_text` string, required
          - `duration_iso8601` string, nullable, required
        - `quotes` object[], required
          - `source_index` integer, required
          - `text` string, required
          - `start` integer, required
          - `end` integer, required
      - `resolved_by` 'caller'
    - `finality_window` object, required
      - `status` 'extracted' | 'inferred' | 'missing' | 'ambiguous', required
      - `value` object, nullable, required
        - `after` 'acceptance' | 'evidence' | 'period_end', required
        - `duration_text` string, required
        - `duration_iso8601` string, nullable, required
        - `on_silence` 'keep' | 'hold' | 'reject'
      - `quotes` object[], required
        - `source_index` integer, required
        - `text` string, required
        - `start` integer, required
        - `end` integer, required
      - `flags` string[], required
      - `candidates` object[]
        - `value` object, required
          - `after` 'acceptance' | 'evidence' | 'period_end', required
          - `duration_text` string, required
          - `duration_iso8601` string, nullable, required
          - `on_silence` 'keep' | 'hold' | 'reject'
        - `quotes` object[], required
          - `source_index` integer, required
          - `text` string, required
          - `start` integer, required
          - `end` integer, required
      - `resolved_by` 'caller'
    - `reopen_policy` object, required
      - `status` 'extracted' | 'inferred' | 'missing' | 'ambiguous', required
      - `value` object, nullable, required
        - `allowed` boolean, required
        - `by` string[]
      - `quotes` object[], required
        - `source_index` integer, required
        - `text` string, required
        - `start` integer, required
        - `end` integer, required
      - `flags` string[], required
      - `candidates` object[]
        - `value` object, required
          - `allowed` boolean, required
          - `by` string[]
        - `quotes` object[], required
          - `source_index` integer, required
          - `text` string, required
          - `start` integer, required
          - `end` integer, required
      - `resolved_by` 'caller'
    - `correction_policy` object, required
      - `status` 'extracted' | 'inferred' | 'missing' | 'ambiguous', required
      - `value` object, nullable, required
        - `allowed` boolean, required
        - `requires_authority` boolean
        - `window_text` string
        - `window_iso8601` string, nullable
      - `quotes` object[], required
        - `source_index` integer, required
        - `text` string, required
        - `start` integer, required
        - `end` integer, required
      - `flags` string[], required
      - `candidates` object[]
        - `value` object, required
          - `allowed` boolean, required
          - `requires_authority` boolean
          - `window_text` string
          - `window_iso8601` string, nullable
        - `quotes` object[], required
          - `source_index` integer, required
          - `text` string, required
          - `start` integer, required
          - `end` integer, required
      - `resolved_by` 'caller'
    - `authority` object, required
      - `status` 'extracted' | 'inferred' | 'missing' | 'ambiguous', required
      - `value` object, nullable, required
        - `decided_by` 'buyer' | 'seller' | 'platform', required
      - `quotes` object[], required
        - `source_index` integer, required
        - `text` string, required
        - `start` integer, required
        - `end` integer, required
      - `flags` string[], required
      - `candidates` object[]
        - `value` object, required
          - `decided_by` 'buyer' | 'seller' | 'platform', required
        - `quotes` object[], required
          - `source_index` integer, required
          - `text` string, required
          - `start` integer, required
          - `end` integer, required
      - `resolved_by` 'caller'
    - `dispute_policy` object, required
      - `status` 'extracted' | 'inferred' | 'missing' | 'ambiguous', required
      - `value` object, nullable, required
        - `who_may_dispute` string[], required
        - `window_text` string
        - `window_iso8601` string, nullable
        - `scope` 'units' | 'outcome'
        - `new_evidence` 'allowed' | 'not_allowed'
      - `quotes` object[], required
        - `source_index` integer, required
        - `text` string, required
        - `start` integer, required
        - `end` integer, required
      - `flags` string[], required
      - `candidates` object[]
        - `value` object, required
          - `who_may_dispute` string[], required
          - `window_text` string
          - `window_iso8601` string, nullable
          - `scope` 'units' | 'outcome'
          - `new_evidence` 'allowed' | 'not_allowed'
        - `quotes` object[], required
          - `source_index` integer, required
          - `text` string, required
          - `start` integer, required
          - `end` integer, required
      - `resolved_by` 'caller'
    - `pricing_rule` object, required
      - `status` 'extracted' | 'inferred' | 'missing' | 'ambiguous', required
      - `value` union, required
        - object
          - `shape` 'per_unit', required
          - `amount_text` string, required
          - `unit_amount_cents` number, nullable, required
          - `total_units_text` string
          - `total_units` number, nullable
        - object
          - `shape` 'percentage', required
          - `percentage_text` string, required
          - `percentage` string, nullable, required
          - `basis_points` number, nullable, required
          - `basis` string, required
        - object
          - `shape` 'percentage_capped', required
          - `percentage_text` string, required
          - `percentage` string, nullable, required
          - `basis_points` number, nullable, required
          - `basis` string, required
          - `cap_text` string
          - `cap_cents` number, nullable
          - `floor_text` string
          - `floor_cents` number, nullable
        - object
          - `shape` 'tiered', required
          - `tiers` object[], required
            - `up_to_text` string
            - `up_to_units` number, nullable, required
            - `amount_text` string, required
            - `unit_amount_cents` number, nullable, required
        - object
          - `shape` 'hybrid', required
          - `fixed_text` string, required
          - `fixed_cents` number, nullable, required
          - `percentage_text` string
          - `percentage` string, nullable
          - `basis_points` number, nullable
          - `amount_text` string
          - `unit_amount_cents` number, nullable
        - object
          - `shape` 'unsupported_formula', required
          - `formula` string, required
      - `quotes` object[], required
        - `source_index` integer, required
        - `text` string, required
        - `start` integer, required
        - `end` integer, required
      - `flags` string[], required
      - `candidates` object[]
        - `value` union, required
          - object
            - `shape` 'per_unit', required
            - `amount_text` string, required
            - `unit_amount_cents` number, nullable, required
            - `total_units_text` string
            - `total_units` number, nullable
          - object
            - `shape` 'percentage', required
            - `percentage_text` string, required
            - `percentage` string, nullable, required
            - `basis_points` number, nullable, required
            - `basis` string, required
          - object
            - `shape` 'percentage_capped', required
            - `percentage_text` string, required
            - `percentage` string, nullable, required
            - `basis_points` number, nullable, required
            - `basis` string, required
            - `cap_text` string
            - `cap_cents` number, nullable
            - `floor_text` string
            - `floor_cents` number, nullable
          - object
            - `shape` 'tiered', required
            - `tiers` object[], required
              - …
          - object
            - `shape` 'hybrid', required
            - `fixed_text` string, required
            - `fixed_cents` number, nullable, required
            - `percentage_text` string
            - `percentage` string, nullable
            - `basis_points` number, nullable
            - `amount_text` string
            - `unit_amount_cents` number, nullable
          - object
            - `shape` 'unsupported_formula', required
            - `formula` string, required
        - `quotes` object[], required
          - `source_index` integer, required
          - `text` string, required
          - `start` integer, required
          - `end` integer, required
      - `resolved_by` 'caller'
    - `fact_resolution` object, required
      - `status` 'extracted' | 'inferred' | 'missing' | 'ambiguous', required
      - `value` object, nullable, required
        - `authoritative_source` 'buyer' | 'seller' | 'platform' | 'external', required
        - `on_disagreement` 'uncertain' | 'review'
      - `quotes` object[], required
        - `source_index` integer, required
        - `text` string, required
        - `start` integer, required
        - `end` integer, required
      - `flags` string[], required
      - `candidates` object[]
        - `value` object, required
          - `authoritative_source` 'buyer' | 'seller' | 'platform' | 'external', required
          - `on_disagreement` 'uncertain' | 'review'
        - `quotes` object[], required
          - `source_index` integer, required
          - `text` string, required
          - `start` integer, required
          - `end` integer, required
      - `resolved_by` 'caller'
    - `flags` string[], required
    - `uncertainty` object, required
      - `dropped_ungrounded_count` integer, required
  - `confirmations` object, required
    - `billable_unit` 'confirmed'
    - `criteria` 'confirmed'
    - `exclusions` 'confirmed'
    - `source_of_truth` 'confirmed'
    - `evidence` 'confirmed'
    - `matching_rules` 'confirmed'
    - `attribution_window` 'confirmed'
    - `finality_window` 'confirmed'
    - `reopen_policy` 'confirmed'
    - `correction_policy` 'confirmed'
    - `authority` 'confirmed'
    - `dispute_policy` 'confirmed'
    - `pricing_rule` 'confirmed'
    - `fact_resolution` 'confirmed'
  - `resolutions` object
    - `billable_unit` union
      - object
        - `candidate_index` integer, required
      - object
        - `value` string, required
    - `criteria` union
      - object
        - `candidate_index` integer, required
      - object
        - `value` string[], required
    - `exclusions` union
      - object
        - `candidate_index` integer, required
      - object
        - `value` string[], required
    - `source_of_truth` union
      - object
        - `candidate_index` integer, required
      - object
        - `value` object, required
          - `kind` 'buyer' | 'seller' | 'platform' | 'external', required
          - `ref_text` string
    - `evidence` union
      - object
        - `candidate_index` integer, required
      - object
        - `value` string[], required
    - `matching_rules` union
      - object
        - `candidate_index` integer, required
      - object
        - `value` object[], required
          - `match_on` string[], required
          - `tolerance_text` string
          - `tolerance` object
            - `absolute_cents` number, nullable
            - `percentage` string, nullable
            - `basis_points` number, nullable
    - `attribution_window` union
      - object
        - `candidate_index` integer, required
      - object
        - `value` object, required
          - `duration_text` string, required
          - `duration_iso8601` string, nullable, required
    - `finality_window` union
      - object
        - `candidate_index` integer, required
      - object
        - `value` object, required
          - `after` 'acceptance' | 'evidence' | 'period_end', required
          - `duration_text` string, required
          - `duration_iso8601` string, nullable, required
          - `on_silence` 'keep' | 'hold' | 'reject'
    - `reopen_policy` union
      - object
        - `candidate_index` integer, required
      - object
        - `value` object, required
          - `allowed` boolean, required
          - `by` string[]
    - `correction_policy` union
      - object
        - `candidate_index` integer, required
      - object
        - `value` object, required
          - `allowed` boolean, required
          - `requires_authority` boolean
          - `window_text` string
          - `window_iso8601` string, nullable
    - `authority` union
      - object
        - `candidate_index` integer, required
      - object
        - `value` object, required
          - `decided_by` 'buyer' | 'seller' | 'platform', required
    - `dispute_policy` union
      - object
        - `candidate_index` integer, required
      - object
        - `value` object, required
          - `who_may_dispute` string[], required
          - `window_text` string
          - `window_iso8601` string, nullable
          - `scope` 'units' | 'outcome'
          - `new_evidence` 'allowed' | 'not_allowed'
    - `pricing_rule` union
      - object
        - `candidate_index` integer, required
      - object
        - `value` union, required
          - object
            - `shape` 'per_unit', required
            - `amount_text` string, required
            - `unit_amount_cents` number, nullable, required
            - `total_units_text` string
            - `total_units` number, nullable
          - object
            - `shape` 'percentage', required
            - `percentage_text` string, required
            - `percentage` string, nullable, required
            - `basis_points` number, nullable, required
            - `basis` string, required
          - object
            - `shape` 'percentage_capped', required
            - `percentage_text` string, required
            - `percentage` string, nullable, required
            - `basis_points` number, nullable, required
            - `basis` string, required
            - `cap_text` string
            - `cap_cents` number, nullable
            - `floor_text` string
            - `floor_cents` number, nullable
          - object
            - `shape` 'tiered', required
            - `tiers` object[], required
              - …
          - object
            - `shape` 'hybrid', required
            - `fixed_text` string, required
            - `fixed_cents` number, nullable, required
            - `percentage_text` string
            - `percentage` string, nullable
            - `basis_points` number, nullable
            - `amount_text` string
            - `unit_amount_cents` number, nullable
          - object
            - `shape` 'unsupported_formula', required
            - `formula` string, required
    - `fact_resolution` union
      - object
        - `candidate_index` integer, required
      - object
        - `value` object, required
          - `authoritative_source` 'buyer' | 'seller' | 'platform' | 'external', required
          - `on_disagreement` 'uncertain' | 'review'

## Response `200`

Confirmed Spool policy fields

- PolicyConfirmResponse
  - `finality` object
  - `dispute_policy` object
  - `matching` object
  - `fact_resolution` object
  - `acceptance_authority` object
  - `economics` object
  - `conditions` object[]
  - `unmapped` object[]
  - `unsupported_for_mapping` object[]

## Other responses

- `400`: Machine-readable API error
- `401`: Machine-readable API error
- `403`: Machine-readable API error
- `429`: Machine-readable API error

---

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