# Developer changelog

> Changes to the MISSIN public API, the MCP server, the SDK and the CLI, by API version, newest first, each with release notes and upgrade steps.

Every change to the public API, by API version, newest first. A version is cut only for a breaking change; everything additive lands in the current one. Until the API is released, breaking changes also land in the current version, marked pre-release. Each version links to its release notes, with the old and new hashes and the upgrade steps. [Versions and stability](https://developer.missin.co.uk/guides/stability.md) explains how versions are named and how long an old one works.

## 2026-10-09.aster

Released 9 Oct 2026 · latest

Release candidate · Pre-release: breaking changes may land in this version without a new one being cut, until the API is released.

No changes since this version was cut.

[Release notes for 2026-10-09.aster](https://developer.missin.co.uk/changelog/2026-10-09.aster.md)

## Before 2026-10-09.aster

### 2026-10-09: Outcomes, not the engine's workings

Seven reads keep their names, tools and commands but return outcomes only. The fields below are removed from the response; read the verdict, tier, trust, evidence and revenue fields that remain. Every one of these operations has a new hash, so regenerate any pinned hash.

- `MendJourney` (`get_mend_journey`) no longer returns `roundsRun`, `thresholds`, `ingress`, `egress`, `model`, `catalogueVersion`, `algorithmVersion`, `stateDigest`, `usageInputTokens`, `usageOutputTokens` or `latencyMs`, and a touchpoint no longer returns `guarded` or `timingSeconds`. It now returns each touchpoint's `mendTier`. `$filter` is unchanged.
- `AttributionEngine` (`get_attribution_engine`, `missin attribution get-engine`) no longer takes `$sample` (`--sample`) and no longer returns `judged` (the judgement sample with its egress, model, versions, rounds and latency), `calibration` (touchpoints grouped by evidence), `versions` (touchpoints grouped by algorithm version) or the month's average latency. Counts, revenue by tier, coverage (`scored`, `unseen`, `channel`) and this month's token cost (`month`, `judgedThisMonth`) remain.
- `AttributionConversions` (`get_attribution_conversions`) no longer returns a touchpoint's itemised points (`discountMatchPts`, `clickIdPts`, `linkMatchPts`, `utmMatchPts`, `clickPts`, `handleMatchPts`, `lastTouchPts`, `campaignMatchPts`, `firstTouchPts`, `channelNamedPts`, `openPts`, `deliveryPts`, `timingPts`), `combinationSignal`, `timingSeconds`, `certaintyRaw`, `validityFactor`, `postLikelihood`, `nominationFactor`, `channelMatch`, `algorithmVersion` or `guarded`, nor a judgement's `algorithmVersion`, `catalogueVersion`, `latencyMs`, `usageInputTokens` or `usageOutputTokens`. Revenue, role, tier, trust, `evidencePct`, `sharePct`, `caused`, the touchpoint and the order's identity remain.
- `FormResponseDetail` (`get_form_response`) no longer returns the judgement's `egress` or `thresholds`.
- `BillingUsageSeries` (`get_billing_usage_series`) no longer returns `byModel`. Use `byProduct` and `byFeature`.
- `AttributionTouchpoints` (`get_attribution_touchpoints`) no longer returns `postLikelihood`, `validityFactor`, `nominationFactor`, `channelMatch` or `guarded`. Role, tier, trust, `evidencePct`, `sharePct`, `caused`, `creditedReported` and the order, post, send or ad remain. Its `filter` no longer accepts `algorithmVersion` or `valueScore`.
- `PostDetail` (`get_post`) no longer returns an attribution's `validityFactor`. A post's own `validity` says whether it is approved.

Three operations are now internal, so a key can no longer call them:

- `PlacementTargets` (`get_placement_targets`, `missin discounts get-placement-targets`) is removed. Use `DiscountPlacementTargets` (`get_discount_placement_targets`, `missin discounts get-discount-placement-targets`), which lists the same targets by discount code and keeps its name.
- `PostCaptionFacts` (`get_post_caption_facts`, `missin posts get-caption-facts`) is removed. It returned the judge's raw output. Read an order's outcome with `MendJourney`.
- SetFormPlacementStepDone (`set_form_placement_step_done`, `missin forms set-placement-step-done`) is removed. It ticked the platform's install checklist and changed nothing about a placement.

### 2026-10-08: Attribution overrides

- `OverrideAttribution` (`client.attribution.override()`, `missin attribution override`, the `override_attribution` tool) is removed. A judgement is the engine's answer, and there is no merchant override of it.
- `AttributionEngine` no longer returns `overrides`, and `MendJourney` no longer returns `attributionOverridesByJudgementId`.

### 2026-10-06: Public API and the MCP server

- The public GraphQL endpoint is `https://api.missin.co.uk/graphql/v1`. Send `Authorization: Bearer sk_live_...` and a persisted operation's name and hash.
- Every public operation has a page in the [API reference](https://developer.missin.co.uk/reference.md), grouped by toolset, with its access level, variables and a request to copy.
- API keys carry an access level (Read, Write or Admin), and Postgres enforces it.
- The MISSIN MCP server is live at `https://api.missin.co.uk/mcp`, authenticated with a secret key. See [Connect Claude](https://developer.missin.co.uk/mcp/connect-claude.md). OAuth is not available yet.
- The `whoami` tool, and the `WhoAmI` operation behind it (the `get_current_api_key` tool), report a key's workspace, access level and creator's display name.
- Ten more reads are open to keys: `CaptureGuardrails`, `CaptureMetrics`, `CaptureQueue`, `CaptureUnitRate`, `HomeOverview`, `RetentionDropOffMedian`, `FormResponsesSurface`, `SearchPlacementTargets`, `Ga4Properties` and, for Admin keys, `BillingUsage`. Each returns the same figures the platform shows for the key's workspace.
- Ga4Properties access raised from read to admin. It lists a Google connection's properties with that connection's own login, so it asks for the level `SetGa4Property` does. No key could call it before this change.
- Waitlists can be paused, moved back to draft and restored from archive: `SetWaitlistStatus` (Write) changes a waitlist's status, and `WaitlistFormSnapshot` (Read) returns the published form a waitlist's signup page renders. Releasing stays `ReleaseWaitlist`.
- Operations that a key cannot call yet, such as creating or revoking keys and starting a top-up, have no reference page.

Source: https://developer.missin.co.uk/changelog
