---
title: "GET /v4/opportunities/{id}/campaigns"
method: GET
path: "/v4/opportunities/{id}/campaigns"
tags: ["Opportunities"]
---

# GET /v4/opportunities/{id}/campaigns

`GET /v4/opportunities/{id}/campaigns`

Get a unique opportunity by ID (hash) or composite identifier (chainId-type-identifier), including related campaigns. Use query parameters to filter results.

## Path parameters

- `id` string, required — **Opportunity ID** (path-only). Two accepted forms: (1) internal numeric hash, ≤20 digits (e.g. `7673870997270712040`), or (2) composite `{chainId}-{type}-{identifier}` (e.g. `1-ERC20LOGPROCESSOR-0x35Cbe8542E70fa2f7F9cDF129F19e593F4b4f560`). The composite form is path-only — query filters (`?id=`, `?opportunityId=`) only accept the numeric form. NOT a campaign ID. See [ID types](/integrate-merkl/id-types).

## Query parameters

- `test` boolean — Include test campaigns
- `point` boolean — Include point campaigns
- `tokenTypes` union[] — Filter by token type. Use POINT to include point campaigns and PRETGE to include preTGE campaigns.
  - union
    - string
    - string
    - string
- `campaigns` boolean — Include campaign data. Will slow down the request
- `excludeSubCampaigns` boolean — Exclude subcampaigns from the results.

## Response `200`

Response for status 200

- object
  - `id` string, required
  - `type` string, required
  - `identifier` string, required
  - `chainId` number, required
  - `name` string, required
  - `description` string, required
  - `howToSteps` string[], required
  - `status` union, required
    - string
    - string
    - string
    - string
  - `action` union, required
    - string
    - string
    - string
    - string
    - string
    - string
    - string
    - string
    - string
    - string
  - `tags` string[], required
  - `mainProtocol` string
  - `depositUrl` string
  - `depositUrls` object[]
    - `id` string, required
    - `title` string, required
    - `url` string, required
    - `subtitle` string
    - `icon` string
    - `priority` number, required
  - `explorerAddress` string
  - `hidden` boolean
  - `tvl` number, required
  - `apr` number, required
  - `dailyRewards` number, required
  - `maxDailyRewards` number
  - `liveCampaigns` number, required
  - `lastCampaignCreatedAt` number, required
  - `earliestCampaignStart` string
  - `latestCampaignStart` string
  - `earliestCampaignEnd` string
  - `latestCampaignEnd` string
  - `nativeApr` number
  - `totalApr` number
  - `maxApr` number
  - `liveCampaignsForCreator` number
  - `soonCampaignsForCreator` number
  - `pastCampaignsForCreator` number
  - `distributionType` string
  - `tokens` object[], required
    - `id` string, required — Unique identifier for the token
    - `name` string, required — Full name of the token
    - `chainId` integer, required — Chain Id
    - `address` string, required — Address
    - `decimals` number, required — Number of decimals for the token
    - `symbol` string, required — Symbol of the token
    - `icon` string, required — URL to the token icon image
    - `verified` boolean, required — Whether the token is verified
    - `isNative` boolean, required — Whether this is a native blockchain token
    - `isTest` boolean, required — Whether this is a test token
    - `type` union, required — Type of the token (TOKEN, PRETGE, POINT)
      - string
      - string
      - string
    - `price` number — Current price of the token in USD
    - `updatedAt` number — Unix timestamp of last price update
    - `priceSource` string — Source of the price information
    - `displaySymbol` string — Custom display symbol override
    - `underlyingTokenId` string — If this token is a wrapper, the ID of the underlying token
    - `priceAlertDismissedAt` number
    - `priceAlertCount` number
  - `chain` object, required — Chain
    - `id` integer, required — Chain Id
    - `name` string, required — Legible name of the chain
    - `icon` string, required — URL to the icon of the chain
    - `liveCampaigns` number, required — Number of campaigns currently live on this chain
    - `endOfDisputePeriod` number, required
    - `explorers` object[]
      - `type` union, required
        - string
        - string
        - string
      - `url` string, required
      - `chainId` number, required
    - `lastClaimsOnchainFetchTimestamp` string, required — Timestamp of the last claims onchain fetch
  - `activePrograms` object[], required
    - `id` string, required
    - `name` string, required
    - `slug` string
    - `description` string
    - `icon` string
  - `protocol` object — Protocol
    - `id` string, required
    - `name` string, required
    - `icon` string, required
    - `tags` string[], required
    - `description` string, required
    - `url` string, required
    - `dailyRewards` number
    - `numberOfLiveCampaigns` number
    - `opportunityLiveTags` string[]
    - `banner` string, required
    - `opportunityBannerLight` string, required
    - `opportunityBannerDark` string, required
    - `trustData` object, required
      - `slug` string, required
      - `category` string, required
      - `audits` string, required
      - `audit_links` string[], required
      - `audit_note` string, required
      - `github` string[], required
      - `twitter` string, required
      - `listedAt` number, required
      - `parentProtocol` string, required
      - `tvl` number
      - `hacks` object[]
        - `date` number, required
        - `name` string, required
        - `amountUSD` number, required
        - `technique` string, required
        - `source` string, required
      - `syncedAt` number, required
  - `aprRecord` object
    - `cumulated` number, required
    - `timestamp` string, required
    - `breakdowns` object[], required
      - `identifier` string, required
      - `type` union, required
        - string
        - string
        - string
      - `value` number, required
      - `timestamp` string, required
      - `distributionType` union
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
  - `nativeAprRecord` object
    - `title` string, required
    - `description` string
    - `value` number, required
    - `timestamp` string, required
    - `amount` unknown
    - `rewardToken` object — Token
      - `id` string, required — Unique identifier for the token
      - `name` string, required — Full name of the token
      - `chainId` integer, required — Chain Id
      - `address` string, required — Address
      - `decimals` number, required — Number of decimals for the token
      - `symbol` string, required — Symbol of the token
      - `icon` string, required — URL to the token icon image
      - `verified` boolean, required — Whether the token is verified
      - `isNative` boolean, required — Whether this is a native blockchain token
      - `isTest` boolean, required — Whether this is a test token
      - `type` union, required — Type of the token (TOKEN, PRETGE, POINT)
        - string
        - string
        - string
      - `price` number — Current price of the token in USD
      - `updatedAt` number — Unix timestamp of last price update
      - `priceSource` string — Source of the price information
      - `displaySymbol` string — Custom display symbol override
      - `underlyingTokenId` string — If this token is a wrapper, the ID of the underlying token
      - `priceAlertDismissedAt` number
      - `priceAlertCount` number
    - `breakdowns` object[]
      - `title` string, required
      - `description` string
      - `value` number, required
      - `amount` unknown
      - `rewardToken` object — Token
        - `id` string, required — Unique identifier for the token
        - `name` string, required — Full name of the token
        - `chainId` integer, required — Chain Id
        - `address` string, required — Address
        - `decimals` number, required — Number of decimals for the token
        - `symbol` string, required — Symbol of the token
        - `icon` string, required — URL to the token icon image
        - `verified` boolean, required — Whether the token is verified
        - `isNative` boolean, required — Whether this is a native blockchain token
        - `isTest` boolean, required — Whether this is a test token
        - `type` union, required — Type of the token (TOKEN, PRETGE, POINT)
          - string
          - string
          - string
        - `price` number — Current price of the token in USD
        - `updatedAt` number — Unix timestamp of last price update
        - `priceSource` string — Source of the price information
        - `displaySymbol` string — Custom display symbol override
        - `underlyingTokenId` string — If this token is a wrapper, the ID of the underlying token
        - `priceAlertDismissedAt` number
        - `priceAlertCount` number
  - `tvlRecord` object
    - `total` number, required
    - `timestamp` string, required
    - `breakdowns` object[], required
      - `identifier` string, required
      - `type` union, required
        - string
        - string
      - `value` number, required
  - `rewardsRecord` object
    - `total` number, required
    - `timestamp` string, required
    - `breakdowns` object[], required
      - `campaignId` string, required
      - `value` number, required
      - `maxValue` number
      - `timestamp` string, required
      - `token` object, required — Token
        - `id` string, required — Unique identifier for the token
        - `name` string, required — Full name of the token
        - `chainId` integer, required — Chain Id
        - `address` string, required — Address
        - `decimals` number, required — Number of decimals for the token
        - `symbol` string, required — Symbol of the token
        - `icon` string, required — URL to the token icon image
        - `verified` boolean, required — Whether the token is verified
        - `isNative` boolean, required — Whether this is a native blockchain token
        - `isTest` boolean, required — Whether this is a test token
        - `type` union, required — Type of the token (TOKEN, PRETGE, POINT)
          - string
          - string
          - string
        - `price` number — Current price of the token in USD
        - `updatedAt` number — Unix timestamp of last price update
        - `priceSource` string — Source of the price information
        - `displaySymbol` string — Custom display symbol override
        - `underlyingTokenId` string — If this token is a wrapper, the ID of the underlying token
        - `priceAlertDismissedAt` number
        - `priceAlertCount` number
      - `amount` string, required
      - `distributionType` union
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
      - `onChainCampaignId` string
  - `campaigns` object[], required
    - `id` string, required — Unique campaign id
    - `computeChainId` number, required — Chain ID where campaign data is computed
    - `distributionChainId` number, required — Chain ID where rewards are distributed
    - `campaignId` string, required — A hash of the campaign, unique per chain. Can be used to identify campaigns across chains
    - `type` string, required — Campaign type identifier
    - `subType` number — Campaign subtype for protocols like Silo, Radiant, Morpho, Dolomite, Compound, Ajna and Euler
    - `amount` string, required — Amount of reward token units being distributed by the campaign
    - `startTimestamp` union, required — Unix timestamp when the campaign starts
      - string
      - string, numeric
      - number
    - `endTimestamp` union, required — Unix timestamp when the campaign ends
      - string
      - string, numeric
      - number
    - `creatorAddress` string, required — Ethereum address of the campaign creator
    - `apr` number — Annual Percentage Rate for this campaign
    - `dailyRewards` number — Total daily rewards distributed in USD
    - `creator` object — Campaign creator information
      - `address` string, required — Creator's Ethereum address
      - `tags` string[] — Tag associated with the creator
      - `creatorId` string, nullable — Merkl creator ID if registered
    - `params` unknown, required
    - `description` string — Campaign description
    - `chain` object, required — Chain
      - `id` integer, required — Chain Id
      - `name` string, required — Legible name of the chain
      - `icon` string, required — URL to the icon of the chain
      - `liveCampaigns` number, required — Number of campaigns currently live on this chain
      - `endOfDisputePeriod` number, required
      - `explorers` object[]
        - `type` union, required
          - string
          - string
          - string
        - `url` string, required
        - `chainId` number, required
      - `lastClaimsOnchainFetchTimestamp` string, required — Timestamp of the last claims onchain fetch
    - `rewardTokenId` string — Internal ID of the reward token
    - `rewardToken` object, required — Token
      - `id` string, required — Unique identifier for the token
      - `name` string, required — Full name of the token
      - `chainId` integer, required — Chain Id
      - `address` string, required — Address
      - `decimals` number, required — Number of decimals for the token
      - `symbol` string, required — Symbol of the token
      - `icon` string, required — URL to the token icon image
      - `verified` boolean, required — Whether the token is verified
      - `isNative` boolean, required — Whether this is a native blockchain token
      - `isTest` boolean, required — Whether this is a test token
      - `type` union, required — Type of the token (TOKEN, PRETGE, POINT)
        - string
        - string
        - string
      - `price` number — Current price of the token in USD
      - `updatedAt` number — Unix timestamp of last price update
      - `priceSource` string — Source of the price information
      - `displaySymbol` string — Custom display symbol override
      - `underlyingTokenId` string — If this token is a wrapper, the ID of the underlying token
      - `priceAlertDismissedAt` number
      - `priceAlertCount` number
    - `opportunityId` string — ID of the associated opportunity
    - `distributionChain` object — Chain
      - `id` integer, required — Chain Id
      - `name` string, required — Legible name of the chain
      - `icon` string, required — URL to the icon of the chain
      - `liveCampaigns` number, required — Number of campaigns currently live on this chain
      - `endOfDisputePeriod` number, required
      - `explorers` object[]
        - `type` union, required
          - string
          - string
          - string
        - `url` string, required
        - `chainId` number, required
      - `lastClaimsOnchainFetchTimestamp` string, required — Timestamp of the last claims onchain fetch
    - `distributionType` union — Type of reward distribution mechanism
      - string
      - string
      - string
      - string
      - string
      - string
      - string
      - string
      - string
      - string
      - string
      - string
      - string
      - string
      - string
      - string
      - string
      - string
      - string
      - string
      - string
      - string
    - `campaignStatus` object, required
      - `campaignId` string, required
      - `computedUntil` union, required
        - string
        - string, numeric
        - number
      - `processingStarted` union, required
        - string
        - string, numeric
        - number
      - `status` string, required
      - `preComputeProcessingStarted` union, required
        - string
        - string, numeric
        - number
      - `preComputeStatus` string, required
      - `delay` union
        - string, numeric
        - number
      - `error` string
      - `details` unknown
    - `createdAt` string, date, required — ISO date when the campaign was created
    - `rootCampaignId` string — ID of the root campaign for hierarchical campaigns
    - `parentCampaignId` string — ID of the parent campaign for sub-campaigns
    - `childCampaignIds` string[] — List of child campaign IDs
    - `dailyRewardsBreakdown` object[] — Daily breakdown of rewards
      - `campaignId` string, required
      - `value` number, required
      - `maxValue` number
      - `timestamp` string, required
      - `token` object, required — Token
        - `id` string, required — Unique identifier for the token
        - `name` string, required — Full name of the token
        - `chainId` integer, required — Chain Id
        - `address` string, required — Address
        - `decimals` number, required — Number of decimals for the token
        - `symbol` string, required — Symbol of the token
        - `icon` string, required — URL to the token icon image
        - `verified` boolean, required — Whether the token is verified
        - `isNative` boolean, required — Whether this is a native blockchain token
        - `isTest` boolean, required — Whether this is a test token
        - `type` union, required — Type of the token (TOKEN, PRETGE, POINT)
          - string
          - string
          - string
        - `price` number — Current price of the token in USD
        - `updatedAt` number — Unix timestamp of last price update
        - `priceSource` string — Source of the price information
        - `displaySymbol` string — Custom display symbol override
        - `underlyingTokenId` string — If this token is a wrapper, the ID of the underlying token
        - `priceAlertDismissedAt` number
        - `priceAlertCount` number
      - `amount` string, required
      - `distributionType` union
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
        - string
      - `onChainCampaignId` string
    - `pauseCompute` string — ISO timestamp when computation was paused
    - `pausePrecompute` string — Reason for pausing precomputation, or null if not paused
    - `hasOverrides` boolean — Whether this campaign has previous config overrides
    - `isPrivate` boolean, required — Indicates if the campaign is private
    - `hidden` boolean — Whether the campaign is hidden from non-test API results
    - `hideLeaderboard` boolean — Whether leaderboard, ranks and reward breakdowns are hidden for this campaign
    - `campaignEncodingHash` string — Hash of the campaign configuration encoding

## Other responses

- `404` — Response for status 404
- `500` — Response for status 500

## Changes

- **2026-09-02** `b7784c9a78b9` — 2 info
  - added `subschema #1, subschema #2` to the response body `allOf` list for the response status `200`
  - removed `subschema #1, subschema #2` from the response body `allOf` list for the response status `200`

[Change history](https://skmtc.dev/merkl/apis/merkl-api/changes/v4/opportunities/:id/campaigns/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-service-production.skmtc.workers.dev/v1/apis/merkl/merkl-api/revisions/3af328974da5/schema)
