> ## Documentation Index
> Fetch the complete documentation index at: https://docs.exponent.finance/llms.txt
> Use this file to discover all available pages before exploring further.

# List reward campaigns

> Retrieve orderbook, YT-holder, and tranching LP-holder reward campaigns.

export const ApiResponse = ({children, errors = {}}) => {
  const [status, setStatus] = useState("200");
  const statuses = ["200", ...Object.keys(errors)];
  return <section className="api-response" aria-label="Response">
      <div className="api-response-header not-prose">
        <h2>Response</h2>
        <div className="api-response-format">
          {statuses.length > 1 ? <select aria-label="Response status" value={status} onChange={event => setStatus(event.target.value)}>
              {statuses.map(code => <option key={code} value={code}>{code}</option>)}
            </select> : <span>200</span>}
          <span className="api-response-mime">application/json</span>
        </div>
      </div>
      <div hidden={status !== "200"}>{children}</div>
      {status !== "200" && <div aria-live="polite">
          {Object.entries(errors[status]).map(([name, value]) => <ResponseField key={name} name={name} type={value === null ? "null" : Array.isArray(value) ? "array" : typeof value}>
              {name === "error" ? "Error message describing why the request failed." : "Additional error details."}
            </ResponseField>)}
        </div>}
    </section>;
};

## Query parameters

<ParamField query="includeInactiveTranching" type="boolean">
  Include persisted campaign status rows, including inactive campaigns. Despite its name, this also merges orderbook and YT-holder status rows. Default: `false`.
</ParamField>

<RequestExample dropdown>
  ```bash cURL theme={null}
  curl https://api.exponent.finance/orderbook-emissions/campaigns
  ```

  ```python Python theme={null}
  import requests

  response = requests.get("https://api.exponent.finance/orderbook-emissions/campaigns", timeout=30)
  response.raise_for_status()
  print(response.json())
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch("https://api.exponent.finance/orderbook-emissions/campaigns");
  if (!response.ok) {
    throw new Error(`Request failed: ${response.status}`);
  }
  const data = await response.json();
  console.log(data);
  ```
</RequestExample>

<ApiResponse errors={{"500": {"error": "<message>"}, "502": {"error": "<message>"}}}>
  <ResponseField name="campaigns" type="object[]">
    Reward campaigns and their eligibility and funding settings.

    <Expandable title="child attributes">
      <ResponseField name="campaigns[].lookThroughEnabled" type="boolean">
        Whether reward eligibility includes supported indirect holdings. Omitted when unavailable.
      </ResponseField>

      <ResponseField name="campaigns[].id" type="string">
        Stable campaign identifier used to request completed reward epochs.
      </ResponseField>

      <ResponseField name="campaigns[].campaignType" type="'orderbook_quote' | 'yt_holder' | 'tranching_lp_holder'">
        Reward eligibility category, such as orderbook quoting or a tranching position.
      </ResponseField>

      <ResponseField name="campaigns[].orderbookAddress" type="string | null">
        Orderbook eligible for this reward campaign, when applicable.
      </ResponseField>

      <ResponseField name="campaigns[].vaultAddress" type="string | null">
        Yield or strategy vault associated with this record.
      </ResponseField>

      <ResponseField name="campaigns[].tranchingMarketAddress" type="string | null">
        Eligible tranching market account, when applicable.
      </ResponseField>

      <ResponseField name="campaigns[].trancheSide" type="'senior' | 'junior'">
        Position side: `senior` or `junior`.
      </ResponseField>

      <ResponseField name="campaigns[].emissionMint" type="string">
        Mint of the token distributed as rewards.
      </ResponseField>

      <ResponseField name="campaigns[].emissionDecimals" type="number">
        Reward-token decimal places used to convert raw amounts to token units.
      </ResponseField>

      <ResponseField name="campaigns[].incentivizedOrderTypes" type="'buyPT' | 'sellPT' | 'buyYT' | 'sellYT'[]">
        Order directions eligible for rewards under this campaign.
      </ResponseField>

      <ResponseField name="campaigns[].priceBandBps" type="number">
        Eligible quote-price band in basis points.
      </ResponseField>

      <ResponseField name="campaigns[].epochCron" type="string">
        Cron expression defining when reward epochs close.
      </ResponseField>

      <ResponseField name="campaigns[].nextEpochCron" type="string | null">
        Replacement epoch schedule that takes effect at `epochCronTransitionAt`, when configured.
      </ResponseField>

      <ResponseField name="campaigns[].epochCronTransitionAt" type="string | null">
        ISO 8601 time at which the replacement epoch schedule takes effect.
      </ResponseField>

      <ResponseField name="campaigns[].maxRewardsApyBps" type="number">
        Maximum reward APY expressed in basis points.
      </ResponseField>

      <ResponseField name="campaigns[].treasuryTokenAccount" type="string">
        Token account funding campaign rewards.
      </ResponseField>

      <ResponseField name="campaigns[].tokenProgramId" type="string">
        Solana token program owning the reward token accounts.
      </ResponseField>

      <ResponseField name="campaigns[].claimAuthority" type="string">
        Authority permitted to authorize reward claims.
      </ResponseField>

      <ResponseField name="campaigns[].isActive" type="boolean | null">
        Whether the campaign is marked active. Omitted when unavailable.
      </ResponseField>

      <ResponseField name="campaigns[].startsAt" type="string | null">
        ISO 8601 start of the campaign or reward period. Omitted when unavailable.
      </ResponseField>

      <ResponseField name="campaigns[].endsAt" type="string | null">
        ISO 8601 end of the campaign or reward period. Omitted when unavailable.
      </ResponseField>

      <ResponseField name="campaigns[].fundingAmountRaw" type="string | null">
        Total campaign funding in raw reward-token units. Omitted when unavailable.
      </ResponseField>

      <ResponseField name="campaigns[].emissionRateRawPerSecond" type="string | null">
        Reward emission rate in raw reward-token units per second. Omitted when unavailable.
      </ResponseField>

      <ResponseField name="campaigns[].distributedRaw" type="string | null">
        Rewards distributed by the campaign, in raw reward-token units. Omitted when unavailable.
      </ResponseField>

      <ResponseField name="campaigns[].undistributedRaw" type="string | null">
        Remaining undistributed funding, in raw reward-token units. Omitted when unavailable.
      </ResponseField>

      <ResponseField name="campaigns[].marketImpliedApy" type="number | null">
        Indexed market implied-rate value used by the reward calculation; null when unavailable.
      </ResponseField>

      <ResponseField name="campaigns[].currentRewardsApy" type="number | null">
        Estimated current campaign reward APY; null when unavailable.
      </ResponseField>

      <ResponseField name="campaigns[].currentRewardsApyByUser" type="object map of number | null">
        Estimated reward APY keyed by wallet address; null when unavailable.
      </ResponseField>

      <ResponseField name="campaigns[].currentRewardsApyByOrderId" type="object map of number | null">
        Estimated reward APY keyed by indexed order ID; null when unavailable.
      </ResponseField>
    </Expandable>
  </ResponseField>
</ApiResponse>

<ResponseExample>
  ```json 200 theme={null}
  {
    "campaigns": [
      {
        "id": "3fjeZWCo-6FrrzDk5-d139734e",
        "campaignType": "orderbook_quote",
        "lookThroughEnabled": false,
        "isActive": true,
        "orderbookAddress": "3fjeZWCoXxohJXJpAiX995q7S9VNKBUa5YLK4NcSRQ1n",
        "vaultAddress": "Dy8bAHHbxkY87aZbSmycazWvui7kpLU6uAPkEkZA3fj5",
        "tranchingMarketAddress": null,
        "trancheSide": null,
        "emissionMint": "6FrrzDk5mQARGc1TDYoyVnSyRdds1t4PbtohCD6p3tgG",
        "emissionDecimals": 6,
        "incentivizedOrderTypes": [
          "buyYT",
          "sellYT"
        ],
        "priceBandBps": 434,
        "epochCron": "0 10 * * 4",
        "maxRewardsApyBps": 5000,
        "treasuryTokenAccount": "7p62HNzAmZ6DBLUEZbPmWhhLmSaF7E99pwu3P72SW6xg",
        "tokenProgramId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
        "startsAt": "2026-09-09T15:33:16.000Z",
        "endsAt": "2026-10-09T00:00:00.000Z",
        "fundingAmountRaw": "5000999888",
        "distributedRaw": "779073424",
        "undistributedRaw": "4221926464",
        "marketImpliedApy": 47837,
        "currentRewardsApy": null,
        "currentRewardsApyByUser": null,
        "currentRewardsApyByOrderId": null,
        "claimAuthority": "3PcQvSXoNfctD2QSXWpwa6eg9EjYM1UjdFdscV6vVLFe",
        "nextEpochCron": null,
        "epochCronTransitionAt": "2026-09-17T10:00:00+00:00"
      },
      {
        "id": "3mXbVuMy-3ThdFZQK-0de0cae0",
        "campaignType": "orderbook_quote",
        "lookThroughEnabled": false,
        "isActive": true,
        "orderbookAddress": "3mXbVuMynj21doFXXEauJ2tGDV9kS2Q1SnnQDcgD54Bw",
        "vaultAddress": "B78XAMSpB5KQqykw9oEec1nFSPeRqYtbTmsxo9EPwAUW",
        "tranchingMarketAddress": null,
        "trancheSide": null,
        "emissionMint": "3ThdFZQKM6kRyVGLG48kaPg5TRMhYMKY1iCRa9xop1WC",
        "emissionDecimals": 6,
        "incentivizedOrderTypes": [
          "buyYT",
          "sellYT"
        ],
        "priceBandBps": 1000,
        "epochCron": "0 0 * * 1",
        "maxRewardsApyBps": 20000,
        "treasuryTokenAccount": "E1hXS6n311UTNTauqvjabNstqUeqUW4N47pkbbZ52Bwu",
        "tokenProgramId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
        "startsAt": "2026-05-28T16:00:00.000Z",
        "endsAt": "2026-06-27T16:00:00.000Z",
        "fundingAmountRaw": "11624000000",
        "distributedRaw": "9353136815",
        "undistributedRaw": "2270863185",
        "marketImpliedApy": 2397896,
        "currentRewardsApy": null,
        "currentRewardsApyByUser": null,
        "currentRewardsApyByOrderId": null,
        "claimAuthority": "3PcQvSXoNfctD2QSXWpwa6eg9EjYM1UjdFdscV6vVLFe",
        "nextEpochCron": null,
        "epochCronTransitionAt": null
      }
    ]
  }
  ```

  ```json 500 theme={null}
  {
    "error": "<message>"
  }
  ```

  ```json 502 theme={null}
  {
    "error": "<message>"
  }
  ```
</ResponseExample>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.