# Search

> Part of the Cowliss docs. Markdown for every page: append `index.md` to its URL. Site map: /llms.txt

<!-- GENERATED by apps/docs/scripts/generate-api-reference.ts. Do not edit. Regenerate with `pnpm -F cowliss-docs generate`. -->

Search resolves an exact match, never a fuzzy one. A prefixed id (`usr_`, `evt_`, `src_`, `seg_`, `app_`, `exe_`, `dlv_`, `dom_`) names one resource; an automation, template or segment key, an app slug and an identifier value of any kind are tried too, and every hit comes back in that order. Each hit carries its parents, outermost first, so a source reads as its app then itself, and the path of its page in the dashboard. Pipeline keys can search: a key scoped to some apps finds only what belongs to them, and no key finds a sending domain, which belongs to the whole organization.

## GET /v1/search

Find what an id, a key, a slug or an identifier names

Exact match only. Each hit carries its parents and the path of its dashboard page. A key scoped to some apps finds only what belongs to them, and no key finds a sending domain.

**Auth:** Session token, or an org [pipeline key](/guides/keys/).

**Query parameters**

```json
{
  "q": "string"
}
```

| Field | Type | Required | Constraints |
| --- | --- | --- | --- |
| `q` | string | yes | length 1–200 |

**Response 200**

```json
{
  "data": [
    {
      "kind": "app",
      "id": "string",
      "label": "string",
      "parents": [
        {
          "kind": "app",
          "id": "string",
          "label": "string"
        }
      ],
      "path": "string"
    }
  ],
  "meta": {
    "requestId": "string",
    "nextCursor": "string",
    "hasMore": true,
    "warnings": [
      {
        "code": "string",
        "message": "string",
        "suggestion": "string"
      }
    ]
  }
}
```

| Field | Type | Required | Constraints |
| --- | --- | --- | --- |
| `data` | object[] | yes |  |
| `data[]` | object | yes |  |
| `data[].kind` | "app" \| "source" \| "user" \| "event" \| "segment" \| "automation" \| "template" \| "execution" \| "delivery" \| "domain" | yes |  |
| `data[].id` | string | yes |  |
| `data[].label` | string | yes |  |
| `data[].parents` | object[] | yes |  |
| `data[].parents[]` | object | yes |  |
| `data[].parents[].kind` | "app" \| "source" \| "user" \| "event" \| "segment" \| "automation" \| "template" \| "execution" \| "delivery" \| "domain" | yes |  |
| `data[].parents[].id` | string | yes |  |
| `data[].parents[].label` | string | yes |  |
| `data[].path` | string | yes |  |
| `meta` | object | no |  |
| `meta.requestId` | string | no |  |
| `meta.nextCursor` | string \| null | no |  |
| `meta.hasMore` | boolean | no |  |
| `meta.warnings` | object[] | no |  |
| `meta.warnings[]` | object | no |  |
| `meta.warnings[].code` | string | yes |  |
| `meta.warnings[].message` | string | yes |  |
| `meta.warnings[].suggestion` | string | no |  |

Errors follow the [shared envelope and code table](/api-conventions/#errors).
