---
title: "Read a mutation"
method: GET
path: "/mutations/{id}"
tags: ["Mutations"]
---

# Read a mutation

`GET /mutations/{id}`

## Request

- Base URL: `https://api.adcrunch.dev`
- URL: `https://api.adcrunch.dev/mutations/{id}`
- Auth: HTTP bearer

Reports how a Mutation ended, or that it has not ended.

`running` means the change has not finished. Poll again.

`complete` means the change finished, and `result` says how. `result.ok` of `true` carries what the provider gave back: a create carries the new object id, a copy carries the id of the copy and the `budget` that the copy carries, and every other action carries `success`. `result.ok` of `false` is a provider refusal, with a stable `error` code and a sentence. A refusal is `complete`, not `errored`.

`errored` means the Mutation itself broke down. AdCrunch cannot say whether the provider applied the change, so read the object at the provider before you send the action again.

`priorValue` is present for a change to an object that exists, in each status. It holds the values that the change replaced, read from the provider just before the change, in the field names and units of the action: `{"dailyBudget": 800}` for a budget, `{"status": "ACTIVE"}` for a status. To undo the change, send the same kind again with these values. A create and a copy have none.

A Mutation belongs to one organization. An id from another organization and an id that never existed both answer `404`, so a caller cannot learn which of the two it sent.

This needs `mutation:write`, not `mutation:read`. Polling is the second half of the write that started the Mutation, and the caller polling is the caller that started it. `mutation:read` reads the organization history through `GET /mutations`.

## Path parameters

- `id` string, required: The workflowId that POST /mutations returned.

## Response `200`

The Mutation is running, complete, or errored.

- object
  - `priorValue` object: The values that the change replaced, read from the provider just before the change. It uses the field names and the units of action, for example {"dailyBudget": 800}, {"status": "ACTIVE"}, {"bidStrategy": "COST_CAP", "costCap": 4}, {"startTime": "2026-10-01T00:00:00+0200", "endTime": null} or {"name": "Spring sale"}. To undo the change, send the same kind again with these values. A bid change on a campaign also gives the amount of each ad set in adsets: undo it on each ad set. A create and a copy have none.
  - `result` unknown
  - `status` 'running' | 'complete' | 'errored', required: running means poll again. complete means the change finished, and result says how it ended. errored means the Mutation itself broke down, and AdCrunch cannot say whether the change happened.

## Other responses

- `400`: The request does not match the schema of this operation: a field is missing or has the wrong type, or the body is not valid JSON. `error` is `invalid_request`, and `issues` names each field. Nothing was changed.
- `401`: No API key, or one that does not resolve. See the security scheme. `error` is `unauthorized`.
- `402`: The organization has no active subscription. An owner subscribes at `paywallUrl`. `error` is `organization_unentitled`.
- `403`: The caller does not hold `mutation:write`. `error` is `forbidden`.
- `404`: No such Mutation for your organization. `error` is `not_found`.

---

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