# List tags

URL: https://docs.hanzo.ai/docs/openapi/project/get-project-tags

> Returns the client-side pixels the SITE has connected (GA4, Google Ads, LinkedIn, Meta, Pinterest, Reddit, TikTok, X) with their NON-SECRET ids, so the hosted tag injects them first-party and stamps each browser event with the same event_id the server-side Conversions API uses — deduping the two.

`GET /v1/project/tags`

> [Project →](https://docs.hanzo.ai/docs/openapi/project) · [All API references →](https://docs.hanzo.ai/docs/openapi) · [Get started →](https://docs.hanzo.ai/docs/guides)

|               |                                        |
| ------------- | -------------------------------------- |
| **Address**   | `https://api.hanzo.ai/v1/project/tags` |
| **Method**    | `GET`                                  |
| **Operation** | `get_project_tags`                     |
| **Auth**      | `Authorization: Bearer $HANZO_API_KEY` |

Returns the client-side pixels the SITE has connected (GA4, Google Ads, LinkedIn, Meta, Pinterest, Reddit, TikTok, X) with their NON-SECRET ids, so the hosted tag injects them first-party and stamps each browser event with the same event\_id the server-side Conversions API uses — deduping the two. Resolved per site: by the publishable key on ?key= when it names a project, else by the request host, so hanzo.ai and hanzo.chat carry different tags under one org. WITHOUT a resolvable site it answers an empty set at 200 — a page never breaks on its tag config. `audience` says who is asking — `bot` (automation, a crawler, or a cloud provider's published address), `internal` (a member of the site's org, by the IAM bearer the page sends, or an address in the project's internal networks) or `person` — and the set answers for it: nothing for a bot, Google Analytics alone for the team.

## Request

`GET /v1/project/tags` takes no parameters and no body — the credential is the whole request.

## Response

| Status | Body      | Meaning |
| ------ | --------- | ------- |
| `2XX`  | tagConfig | Success |

`2XX` body — 17 fields.

| Field                        | In   | Type             | Always | Description |
| ---------------------------- | ---- | ---------------- | ------ | ----------- |
| `audience`                   | body | string           | —      |             |
| `consent`                    | body | Decision         | —      |             |
| `consent.defaults`           | body | Grants           | —      |             |
| `consent.defaults.ads`       | body | boolean          | —      |             |
| `consent.defaults.analytics` | body | boolean          | —      |             |
| `consent.defaults.marketing` | body | boolean          | —      |             |
| `consent.gpc`                | body | boolean          | —      |             |
| `consent.mode`               | body | string           | —      |             |
| `consent.notice`             | body | string           | —      |             |
| `consent.region`             | body | string           | —      |             |
| `consent.version`            | body | integer          | —      |             |
| `tags`                       | body | browserTagOut\[] | —      |             |
| `tags[].events`              | body | object           | —      |             |
| `tags[].events.*`            | body | string           | —      |             |
| `tags[].id`                  | body | string           | —      |             |
| `tags[].platform`            | body | string           | —      |             |
| `tags[].type`                | body | string           | —      |             |

Failure carries the platform error shape — see [Errors](https://docs.hanzo.ai/docs/errors).

## Examples

**CLI**

```bash
hanzo project tags
```

**SDK**

**.ts**

```ts
import { Configuration, ProjectApi } from 'hanzoai';

const api = new ProjectApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.getProjectTags();
```

**.py**

```python
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import ProjectApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = ProjectApi(client).get_project_tags()
```

**.go**

```go
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.ProjectAPI.GetProjectTags(context.Background()).Execute()
if err != nil {
	return err
}
```

**.rs**

```rust
use hanzo_client::apis::{configuration::Configuration, project_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = project_api::get_project_tags(&cfg, Default::default()).await?;
```

**.java**

```java
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.ProjectApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new ProjectApi(client).getProjectTags();
```

**HTTP**

```bash
curl https://api.hanzo.ai/v1/project/tags \
  -H "Authorization: Bearer $HANZO_API_KEY"
```

**MCP**

MCP reaches **project** through the `project` tool, which names its 52 operations with its own verbs — this one among them, under a name only MCP declares. `describe` explains any of them:

```bash
curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "describe",
         "arguments": {
           "op": "get_project"
         }
       }
     }'
```

---

[Project API](https://docs.hanzo.ai/docs/openapi/project) · [All Hanzo APIs](https://docs.hanzo.ai/docs/openapi) · [Interactive reference](https://docs.hanzo.ai/docs/openapi/reference)
