---
title: "POST /v1/compact"
method: POST
path: "/v1/compact"
---

# POST /v1/compact

`POST /v1/compact`

Compress chat history and code context by removing irrelevant lines at 33,000 tok/s. Every surviving line is byte-for-byte identical to the original input. Accepts string input or message arrays.

## Request body

- CompactRequest
  - `input` string — Text to compact. One of `input` or `messages` is required.
  - `messages` object[] — Conversation messages to compact. Takes priority over `input`.
    - `role` 'system' | 'user' | 'assistant', required
    - `content` string, required
  - `query` string — Focus query for relevance-based pruning. Lines relevant to this query are kept.
  - `compression_ratio` number — Fraction of input to keep. 0.3 = aggressive, 0.7 = light.
  - `preserve_recent` integer — Keep last N messages uncompressed.
  - `compress_system_messages` boolean — When true, system messages are also compressed. By default they are preserved verbatim.
  - `include_line_ranges` boolean — Include compacted_line_ranges in response.
  - `include_markers` boolean — Include (filtered N lines) text markers. When false, gaps become empty lines.
  - `model` string — Model ID.

## Response `200`

Compact response with compressed output and metadata

- CompactResponse
  - `id` string, required — Unique identifier for the compact request
  - `object` string, required — Object type
  - `model` string, required — Model used
  - `output` string, required — All compacted messages joined into a single string
  - `messages` object[], required — Per-message compaction results
    - `role` string
    - `content` string
    - `compacted_line_ranges` object[] — Ranges of lines that were removed
      - `start` integer
      - `end` integer
    - `kept_line_ranges` object[] — Ranges of lines force-preserved via keepContext tags
      - `start` integer
      - `end` integer
  - `usage` object, required — Usage statistics
    - `input_tokens` integer — Tokens in the input
    - `output_tokens` integer — Tokens in the compacted output
    - `compression_ratio` number — Actual compression ratio achieved
    - `processing_time_ms` integer — Processing time in milliseconds

## Other responses

- `400` — Malformed request or input too large
- `401` — Invalid API key
- `503` — Model not loaded
- `504` — Request timed out

---

[API](https://skmtc.net/morphllm/apis/morph-api.md) · [All operations](https://skmtc.net/morphllm/apis/morph-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/morphllm/morph-api/revisions/9e3d888071b5/schema)
