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

# GET /v4/opportunities/{id}/storing-ids

`GET /v4/opportunities/{id}/storing-ids`

Get the storingId(s) backing an opportunity, grouped by root campaign. Returns one tree per root campaign matching the requested statuses (default `LIVE`; past root campaigns are excluded). Each node lists its own storingIds, with sub-campaigns nested under `subCampaigns`. Sub-campaigns of a matching root are not status-filtered. The same storingId may appear in more than one tree. Stateless campaigns return an empty `storingIds` array.

## 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

- `campaignStatus` string — Comma-separated statuses to include at the root campaign level (`LIVE`, `PAST`, `SOON`). Default `LIVE` excludes ended root campaigns. Sub-campaigns under a kept root are not status-filtered.

## Response `200`

Response for status 200

- object[]
  - `campaignId` string, required — On-chain campaign id
  - `storingIds` string[], required — Indexing storingId(s) owned by this campaign only (not children's).
  - `subCampaigns` T4[], required — Direct sub-campaign nodes; [] for leaves. Always present. — unresolved $ref

## Other responses

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

---

[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)
