---
title: "Browse targeting categories"
method: GET
path: "/v1/ads/targeting/browse"
tags: ["Ad Targeting"]
---

# Browse targeting categories

`GET /v1/ads/targeting/browse`

## Request

- Base URL: `https://zernio.com/api`
- URL: `https://zernio.com/api/v1/ads/targeting/browse`
- Auth: HTTP bearer

Shows Meta's full tree of detailed targeting categories for an ad account, so you can browse options without a keyword.

The whole Meta detailed-targeting category tree of one ad account (Meta's
`GET /act_{ad_account_id}/targetingbrowse`), as one flat list you can render as a
tree. Use it to show what can be targeted without a keyword; use
`GET /v1/ads/targeting/search` to find an entry by name.

Every node is one of two kinds:

- **Selectable entity** (`selectable: true`): an interest, behavior or demographic Meta
  gives an id. `id` plus `type` is what a targeting spec takes. `interests`, `behaviors`
  and `industries` ids go in `TargetingSpec.interests`, `behaviors` and `workIndustries`
  on `POST /v1/ads/create`; every other type goes in `rawTargeting.flexible_spec` under
  its `type` as the key. `life_events`, `family_statuses` and `income` take objects
  (`{ "flexible_spec": [{ "life_events": [{ "id": "6017476616183" }] }] }`), while
  `education_statuses` and `relationship_statuses` take the bare number
  (`{ "flexible_spec": [{ "education_statuses": [3] }] }`): Meta answers an object
  there with a 500.
- **Organizational node** (`selectable: false`, `id: null`): a category such as
  `Demographics > Financial > Income` that only groups other nodes and cannot be targeted.
  A few carry a `type` and have no children (`Schools`, `Employers`, `Job titles`,
  `Fields of study`, `Undergrad years`): those are open-ended categories Meta only exposes
  through search (`dimension=workEmployer` / `workPosition` on the search endpoint).

`nodeId` identifies a node within this response and `parentNodeId` points at its parent
(`null` for the three roots `Demographics`, `Interests`, `Behaviors`). A selectable node's
`nodeId` is `{type}:{id}`, because Meta reuses small ids across types (education status 3
and relationship status 3 are different entities). An organizational node's `nodeId` is
its full path joined with ` > `. Labels are kept exactly as Meta sends them, including
stray leading or trailing spaces, because Meta has sibling nodes that differ only by
whitespace.

The interests branch is Meta's curated browse list (a few hundred entries), not every
interest Meta can target: search finds the long tail.

**No pagination.** Meta returns the whole catalog in one response (about 770 nodes) and
ignores `limit`, so there is no cursor. Narrow it with `type`, `parentNodeId` and
`selectable` instead; they are applied by Zernio. The catalog is cached for an hour per
ad account and connection.

## Query parameters

- `accountId` string, required
- `adAccountId` string, required
- `type` string
- `parentNodeId` string
- `selectable` boolean

## Response `200`

The category tree as a flat list, in Meta's order (parents before their children).

- object
  - `adAccountId` string, required
  - `nodes` object[], required
    - `nodeId` string, required: Identifies the node within this response. Not a Meta id: never put it in a targeting spec.
    - `parentNodeId` string, nullable, required: nodeId of the parent organizational node, null for a root.
    - `id` string, nullable, required: Meta targeting id, null on organizational nodes.
    - `name` string, required
    - `type` string, nullable, required: Meta's targeting spec key (interests, behaviors, industries, life_events, education_statuses, relationship_statuses, family_statuses, income, ...). Null on most organizational nodes.
    - `path` string[], required: Labels of the ancestors, root first. Does not include the node itself.
    - `selectable` boolean, required: True when the node can be targeted (it has a Meta id).
    - `description` string: Meta's description, when it has one.
    - `audienceSizeLowerBound` integer: Meta's estimated audience size, lower bound, when reported.
    - `audienceSizeUpperBound` integer: Meta's estimated audience size, upper bound, when reported.

## Other responses

- `400`: Invalid request
- `401`: Missing or invalid API key. `code` is `missing_credentials` when no Authorization header was sent and `invalid_credentials` when the key is unknown, revoked or expired.
- `403`: Ads access required. Legacy plans need the Ads add-on; included by default on usage-based plans.
- `404`: The account or requested resource was not found or is not accessible. An account ID may have been disconnected and removed. Read GET /v1/accounts for current account IDs.
- `409`: The account exists but is inactive or needs reconnection. Reconnect it, then read GET /v1/accounts for its current account ID before retrying. Code: ads_connection_required.
- `501`: accountId is not a Meta connection (platform_not_supported).

## Changes

- **2026-10-09** `03d976303e39`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/ads/targeting/browse/get.md)

---

[API](https://skmtc.dev/zernio/apis/zernio-api.md) · [All operations](https://skmtc.dev/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zernio/apis/zernio-api/revisions/4e74db179e73?raw)
