---
title: "Retrace a campaign's reallocations (BETA)"
method: GET
path: "/v4/reallocations/report/{campaignId}"
tags: ["Reallocations"]
---

# Retrace a campaign's reallocations (BETA)

`GET /v4/reallocations/report/{campaignId}`

## Request

- Base URL: `https://api.merkl.xyz` (the document declares no server; this is the origin it was published from)
- URL: `https://api.merkl.xyz/v4/reallocations/report/{campaignId}`
- Auth: `apiKey` (a scheme the document does not define)

**Reallocation Report**
<p>Retraces every reallocation ever applied to a campaign, from its latest merkle tree — the newest root whose tree the tree service holds, named in <code>atRoot</code>. The distribution chain is <strong>inferred from the campaign ID</strong>.</p>
<p>A reallocation is a two-step protocol recorded in the tree, and it never changes a campaign's total. Step 1 shrinks the original recipient's leaves to what it had already claimed and stages a marker at the zero address (<code>tmp_reallocation_{from}_{to}</code>). Step 2 drains that marker and either credits the destination (<code>reallocation</code> for a creator request, <code>unclaimedRewards</code> for a wipe sweep) or returns the reward to the original recipient (<code>fail_reallocation</code> / <code>fail_wipe</code>) when it claimed in between.</p>
<p>Drained markers survive at amount zero, so the <code>senders</code> roster and the <code>inFlight</code>, <code>returned</code> and per-destination <code>settled</code> amounts are exact.</p>
<p><strong>Not available here:</strong> per-sender <code>settled</code> and <code>stagedAt</code> (<code>walk</code> is <code>null</code>). A destination's leaf aggregates every sender and a drained marker has no amount left, so recovering those means one tree read per root — see <code>POST /v4/reallocations/report/{campaignId}/walk</code>.</p>
<p><strong>Authentication:</strong> Requires either a valid <code>x-api-key</code> header or the back-office bearer secret.</p>
<p>⚠️ <strong>Beta:</strong> this endpoint is in beta. The behavior, response shape and data format may change at any time without notice.</p>

## Path parameters

- `campaignId` string, required: **On-chain campaign ID** (32-byte hex hash, e.g. `0x93cf385c...`). The distribution chain is inferred from it. NOT internal `Campaign.id`. See [ID types](/integrate-merkl/id-types).

## Response `200`

Response for status 200

- object
  - `campaignId` string, required: Onchain campaign ID the report covers
  - `distributionChainId` number, required: Distribution chain inferred from the campaign ID
  - `rewardToken` object, required
    - `address` string, required
    - `symbol` string, required
    - `decimals` number, required
  - `atRoot` object, required
    - `root` string, required: Merkle root the report describes — the chain's newest one the tree service can read.
    - `timestamp` string, required: Unix timestamp (seconds) of that root
  - `totals` object, required
    - `inFlight` string, required: Sum of every marker still staged, in raw token units
    - `settled` string, required: Sum held at every destination under a reallocation reason, in raw token units
    - `returned` string, required: Sum returned to senders by a failed settle, in raw token units
    - `staged` string: Sum of every step-1 wave the walk observed, in raw token units. Only present on a walk-job result.
  - `destinations` object[], required
    - `to` string, required: Address credited with the reallocated rewards
    - `kind` union, required: `creator-request` — the creator staged an on-chain reallocation (`reason = reallocation`). `wipe` — the wipe job swept unclaimed rewards older than a year to the Merkl dumper (`reason = unclaimedRewards`).
      - string
      - string
    - `settled` string, required: Amount held at this address under the reallocation reason, in raw token units. Aggregated over every sender — per-sender attribution needs the walk job.
  - `senders` object[], required: Every original recipient ever reallocated for this campaign, sorted by amount moved descending.
    - `from` string, required: Original recipient the rewards were taken from
    - `to` string[], required: Destination(s) this sender's rewards were staged toward, parsed from its `tmp_reallocation_{from}_{to}` marker(s). More than one means the sender was reallocated in separate waves to different addresses.
    - `inFlight` string, required: Amount staged at step 1 but not yet settled, in raw token units.
    - `returned` string, required: Amount returned because the sender claimed between step 1 and step 2 (`fail_reallocation` / `fail_wipe`), in raw token units. The sender kept these rewards.
    - `settled` string: Amount taken from this sender that actually reached its destination, in raw token units. Only present on a walk-job result, and only when the walk covered every wave.
    - `stagedAt` object[]: Each step-1 wave that staged rewards from this sender, oldest first. Only present on a walk-job result.
      - `root` string, required: Merkle root of the tree the marker first carried this amount in
      - `timestamp` string, required: Unix timestamp (seconds) of that root
      - `amount` string, required: Amount staged in this wave, in raw token units
      - `to` string, required: Destination this wave was staged toward
  - `walk` object, required
    - `complete` boolean, required: `true` when every step-1 wave was accounted for, so each sender's `settled` is exact. `false` means the walk hit its snapshot budget, or the tree service no longer holds the trees the earliest waves are in, or markers disagreed with the staged total — and the amounts are lower bounds.
    - `incompleteReason` string: Why the walk could not close
    - `rootsScanned` number, required: Roots read — far fewer than the roots covered
    - `oldestRoot` string, required: Oldest root covered — the campaign's first, or the oldest whose tree the tree service still holds
    - `newestRoot` string, required: Newest root covered — the chain's latest readable one

## Changes

- **2026-09-09** `020dd1a3d27d`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/merkl/apis/merkl-api/changes/v4/reallocations/report/:campaignId/get.md)

---

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