GET /resources
Search cloud inventory
Find cloud resources by name, project, resource identity, address, kind, or hosting node. Returns runtime identity, hosting metadata and validity windows; names and IPs need not be unique. Supports OData $filter/$select/$orderby/$search/$top/$skip/$count (MCP uses _filter, _top, etc.). Use $orderby with an id tie-breaker and $top/$skip for stable paging. Nested fields use slash paths. This is a Purple Suite mock API, not a native cloud provider API contract.
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Search cloud inventory",
"description": "Find cloud resources by name, project, resource identity, address, kind, or hosting node. Returns runtime identity, hosting metadata and validity windows; names and IPs need not be unique. Supports OData $filter/$select/$orderby/$search/$top/$skip/$count (MCP uses _filter, _top, etc.). Use $orderby with an id tie-breaker and $top/$skip for stable paging. Nested fields use slash paths. This is a Purple Suite mock API, not a native cloud provider API contract.",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
},
{
"in": "query",
"name": "projectId",
"schema": {
"type": "string"
},
"description": "Exact-match projectId filter. Combine with $filter for other predicates."
},
{
"in": "query",
"name": "environment",
"schema": {
"type": "string"
},
"description": "Exact-match environment filter. Combine with $filter for other predicates."
},
{
"in": "query",
"name": "name",
"schema": {
"type": "string"
},
"description": "Exact-match name filter. Combine with $filter for other predicates."
},
{
"in": "query",
"name": "resourceKind",
"schema": {
"type": "string"
},
"description": "Exact-match resourceKind filter. Combine with $filter for other predicates."
},
{
"in": "query",
"name": "resourceUid",
"schema": {
"type": "string"
},
"description": "Exact-match resourceUid filter. Combine with $filter for other predicates."
},
{
"in": "query",
"name": "podUid",
"schema": {
"type": "string"
},
"description": "Exact-match podUid filter. Combine with $filter for other predicates."
},
{
"in": "query",
"name": "hostingNodeName",
"schema": {
"type": "string"
},
"description": "Exact-match hostingNodeName filter. Combine with $filter for other predicates."
},
{
"in": "query",
"name": "cloudInstanceId",
"schema": {
"type": "string"
},
"description": "Exact-match cloudInstanceId filter. Combine with $filter for other predicates."
},
{
"in": "query",
"name": "ipAddress",
"schema": {
"type": "string"
},
"description": "Exact-match ipAddress filter. Combine with $filter for other predicates."
},
{
"in": "query",
"name": "status",
"schema": {
"type": "string"
},
"description": "Exact-match status filter. Combine with $filter for other predicates."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/CloudResource"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}