> For the complete documentation index, see [llms.txt](https://v2.dataos.info/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://v2.dataos.info/references/v1/interfaces/apis/core-apis/api-reference/tenant-resources.md).

# Tenant apps & links

Aggregates **apps** and **links** registered for a tenant. The gateway calls Collated metadata listing, fetches full detail for each resource, and returns a single paginated response with enriched fields (title, products, owners, URL, and more).

### GET `/v1/tenants/{tenant}/resources/apps`

**Description:** List tenant apps and links

**Upstream:** Collated (metadata + resource detail)

### Path Parameters

<table><thead><tr><th width="163.9154052734375">Name</th><th width="133.426513671875">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tenant</code></td><td>string</td><td>Tenant identifier, e.g. <code>engineering</code></td></tr></tbody></table>

### Query Parameters

Behavior depends on whether `product` is present. `type` is always forced to `link,app` by the gateway; clients should not pass `type`.

**Without `product` (standard listing),** forwarded to Collated metadata listing, except `product` and `type`:

<table><thead><tr><th width="126.452392578125">Name</th><th width="151.3109130859375">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>page</code></td><td>number</td><td>Page number, default <code>1</code> (Collated pagination)</td></tr><tr><td><code>size</code></td><td>number</td><td>Page size, default <code>20</code> (Collated pagination)</td></tr><tr><td><code>status</code></td><td>string</td><td>Filter by resource status (e.g. <code>active</code>, <code>deleted</code>)</td></tr><tr><td><code>owner</code></td><td>string</td><td>Filter by owner</td></tr><tr><td><code>version</code></td><td>string</td><td>Filter by resource version</td></tr><tr><td><code>q</code></td><td>string</td><td>Search/filter string (passed through if supported by Collated)</td></tr></tbody></table>

Pagination fields in the response (`page`, `size`, `total_pages`, `total_records`) reflect Collated's metadata pagination.

**With `product`:**

<table><thead><tr><th width="124.650390625">Name</th><th width="117.89453125">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>product</code></td><td>string</td><td>Required in this mode. Comma-separated product names. <strong>OR</strong> match: a resource is included if its <code>products</code> list contains any of the given values, e.g. <code>product=platform-observability,order-intelligence</code></td></tr><tr><td><code>page</code></td><td>number</td><td>Page number, default <code>1</code>, applied <strong>after</strong> product filtering</td></tr><tr><td><code>size</code></td><td>number</td><td>Page size, default <code>20</code>, applied <strong>after</strong> product filtering</td></tr><tr><td><code>status</code></td><td>string</td><td>Passed to metadata fetch, along with other Collated filters</td></tr><tr><td><code>owner</code></td><td>string</td><td>Passed to metadata fetch</td></tr><tr><td><code>version</code></td><td>string</td><td>Passed to metadata fetch</td></tr><tr><td><code>q</code></td><td>string</td><td>Passed to metadata fetch</td></tr></tbody></table>

{% hint style="info" %}
When `product` is present, the gateway loads **all** matching app/link metadata, fetches resource details, keeps items whose `products` match any requested product, then paginates the **filtered** result set. Response pagination counts filtered items, not the raw Collated page.
{% endhint %}

### Headers

<table><thead><tr><th width="225.5260009765625">Name</th><th>Value</th></tr></thead><tbody><tr><td><code>Authorization</code> or <code>apikey</code></td><td><code>Bearer &#x3C;access_token></code> or <code>&#x3C;your-apikey></code>, required when gateway auth is enabled. See <a href="/pages/dDkusShTSZhYHkMmHOt1">Authentication</a></td></tr><tr><td><code>Accept</code></td><td><code>application/json</code> (recommended)</td></tr><tr><td><code>Dataos-Correlation-Id</code></td><td>Optional tracing ID</td></tr></tbody></table>

**cURL:**

{% code title="List all apps/links" %}

```bash
curl -X GET \
  "https://$BASE_URL/v1/tenants/engineering/resources/apps" \
  -H "Accept: application/json" \
  -H "apikey: <your-apikey>"
```

{% endcode %}

{% code title="Filter by status" %}

```bash
curl -X GET \
  "https://$BASE_URL/v1/tenants/engineering/resources/apps?status=active&page=1&size=24" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <access_token>"
```

{% endcode %}

{% code title="Filter by product (OR match across multiple products)" %}

```bash
curl -X GET \
  "https://$BASE_URL/v1/tenants/engineering/resources/apps?product=platform-observability,order-intelligence&page=1&size=20" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <access_token>"
```

{% endcode %}

### Response

{% tabs %}
{% tab title="200" %}

```json
{
  "data": [
    {
      "id": "app:v1alpha:nginx-app",
      "name": "nginx-app",
      "title": "nginx-app",
      "domain": "platform",
      "description": "Simple nginx service exposed through DataOS ingress.",
      "owners": ["piyushtmdcio"],
      "products": ["platform-observability"],
      "tags": ["app", "nginx"],
      "references": [{ "title": "Nginx Docs", "url": "https://nginx.org/en/docs/" }],
      "url": "https://example.example/nginxp",
      "status": "active"
    }
  ],
  "page": 1,
  "size": 20,
  "total_pages": 1,
  "total_records": 5
}
```

`data[]` items may omit any optional field (`icon`, `domain`, `description`, `owners`, `products`, `tags`, `references`, `url`).
{% endtab %}

{% tab title="401" %}

```json
{
  "status": 401,
  "error": { "code": "COMMON.AUTH.UNAUTHORIZED", "message": "..." }
}
```

Missing or invalid auth.
{% endtab %}

{% tab title="403" %}

```json
{
  "status": 403,
  "error": { "code": "COMMON.AUTH.FORBIDDEN", "message": "..." }
}
```

Auth token valid but access denied.
{% endtab %}

{% tab title="500" %}

```json
{
  "status": 500,
  "error": { "code": "COMMON.INTERNAL.ERROR", "message": "..." }
}
```

Internal gateway error.
{% endtab %}

{% tab title="502" %}

```json
{
  "status": 502,
  "error": { "code": "COMMON.PROXY.UPSTREAM_ERROR", "message": "...", "details": {} }
}
```

Collated upstream failure.
{% endtab %}
{% endtabs %}

### Notes

* Always returns both apps and links for the tenant.
* Without `product`, pagination matches Collated metadata pages (one metadata page of IDs → details for that page).
* With `product`, filtering uses each resource's detail-level `products` field; pagination is computed on the filtered list.
* Resources may appear with `status: deleted` unless filtered out with `status=active`.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://v2.dataos.info/references/v1/interfaces/apis/core-apis/api-reference/tenant-resources.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
