---
title: "Read a Reddit ad group's targeting and schedule"
method: GET
path: "/v1/ads/ad-sets/{adSetId}/targeting"
tags: ["Ad Campaigns"]
---

# Read a Reddit ad group's targeting and schedule

`GET /v1/ads/ad-sets/{adSetId}/targeting`

## Request

- Base URL: `https://zernio.com/api`
- URL: `https://zernio.com/api/v1/ads/ad-sets/{adSetId}/targeting`
- Auth: HTTP bearer

Shows a Reddit ad group's live targeting and schedule in the same shape PUT /v1/ads/ad-sets/{adSetId} takes, so you can prefill an editor.

It is read live from Reddit on every call. Reddit only; every other platform returns 501.

### How fields come back

- Location and interest names are resolved with Reddit's targeting taxonomy. When Reddit cannot resolve them the ids stand in as names, and a location that is not a two-letter country is listed under `regions`.
- Excluded DMAs are listed under `excludedLocations.regions`, since excluded locations have no metro list.
- Languages come back as lowercase ISO 639-1 codes.
- Targeting Zernio cannot edit (devices, platforms, carriers, automated expansion) is left out and kept on every edit.

## Path parameters

- `adSetId` string, required

## Query parameters

- `platform` 'reddit'

## Response `200`

Current ad group targeting and schedule

- object
  - `adSetId` string
  - `targeting` TargetingSpec: Normalized, platform-agnostic ad-targeting spec. Every field is optional; an empty object targets the platform's default broadest audience. Field names are camelCase and identical across `POST /v1/ads/create` (the `targeting` object), `POST /v1/ads/targeting/reach-estimate`, and `saved_targeting` audiences, so a spec resolved once can be reused verbatim. **Entity ids** (`regions[].key`, `cities[].key`, `zips[].key`, `metros[].key`, `interests[].id`, `behaviors[].id`) are the platform's opaque identifiers resolved via `GET /v1/ads/targeting/search`. A spec is therefore meaningful only for the platform it was built against. **Portable fields** carry across platforms: `countries`, `ageMin`/`ageMax`, `gender`, `incomeTier`, `languages`. Fields a platform cannot honour are rejected on create, boost and targeting update with `INVALID_FIELD_VALUE` naming the offending field (never silently dropped).
    - `userOs` string[]: Meta only. Operating systems and version ranges, such as iOS_ver_14.0_and_above or Android. Emitted as user_os. May also be supplied inside targeting.
    - `userDevice` string[]: Meta only. Device models such as iPhone. Emitted as user_device. May also be supplied inside targeting.
    - `countries` string[]: ISO 3166-1 alpha-2 country codes (e.g. ['US']).
    - `regions` union[]: Region/state targeting. `key` is the platform location ID from /v1/ads/targeting/search?dimension=geo&geoType=region. An entry may also be that id as a plain string (`"20321"` is `{ key: "20321" }`).
      - union
        - string
        - object
          - `key` string, required
          - `name` string
    - `cities` union[]: City targeting. Optional `radius` + `distanceUnit` extend beyond the city limits; both must be set together or both omitted. `radius` is only honoured on platforms whose capability map allows city radius (Meta). An entry may also be the city id as a plain string (`"1006410"` is `{ key: "1006410" }`).
      - union
        - string
        - object
          - `key` string, required
          - `name` string
          - `radius` number: Radius around the city. Requires distanceUnit. Meta enforces a minimum city radius (~17 km / 10 mi); smaller values resolve to a 0-size audience and the ad fails at launch. For a tighter catchment use customLocations (lat/lng), which allows a smaller radius.
          - `distanceUnit` 'mile' | 'kilometer': Required if radius is set.
    - `zips` object[]: Postal/ZIP targeting. `key` is the platform's postal location ID (e.g. Meta `US:94304`). Supported on Meta, Google, TikTok, Pinterest, X.
      - `key` string, required
      - `name` string
    - `metros` object[]: DMA / metro-area targeting. `key` is the platform's metro ID (e.g. Meta `DMA:807`).
      - `key` string, required
      - `name` string
    - `countryGroups` string[]: Meta only. Continents and trade blocs (`geo_locations.country_groups`), for targeting a whole region without listing its countries. Combines with `countries` rather than replacing it, and is also accepted under `excludedLocations`. Discoverable via `GET /v1/ads/targeting/search?dimension=geo&geoType=country_group`.
    - `customLocations` object[]: Point-radius (lat/lng) targeting (Meta custom_locations / Google proximity). Honoured on Meta and Google; ignored on platforms without radius support.
      - `latitude` number, required
      - `longitude` number, required
      - `radius` number, required: Positive radius around the point.
      - `distanceUnit` 'mile' | 'kilometer', required
      - `name` string
      - `address` string: Optional label, sent to Meta as `address_string`. latitude/longitude take precedence for the pin location.
    - `excludedLocations` object: Geo to exclude from the audience. Mirrors the inclusion geo shape. - Meta (excluded_geo_locations): excluded cities can carry a radius catchment, and excluded custom (lat/lng) pins are supported. - Google (Search, Display, Performance Max): excludes countries, regions, cities and zips as negative location criteria. countryGroups, places, neighborhoods, customLocations and a city radius return 400. - Google Demand Gen: returns 400 for any exclusion.
      - `countries` string[]
      - `countryGroups` string[]: Meta only. Continents and trade blocs to exclude (`excluded_geo_locations.country_groups`).
      - `regions` object[]
        - `key` string, required
        - `name` string
      - `cities` object[]: Cities to exclude. Optional `radius` + `distanceUnit` exclude a catchment around the city (both must be set together or both omitted); Meta honours the radius on excluded cities.
        - `key` string, required
        - `radius` number: Radius around the excluded city. Requires distanceUnit.
        - `distanceUnit` 'mile' | 'kilometer': Required if radius is set.
      - `zips` object[]
        - `key` string, required
        - `name` string
      - `places` object[]: Named points of interest to exclude. `key` from /v1/ads/targeting/search.
        - `key` string, required
      - `neighborhoods` object[]: Named neighbourhood areas to exclude. `key` from /v1/ads/targeting/search.
        - `key` string, required
      - `customLocations` object[]: Point-radius (lat/lng) pins to exclude (Meta excluded_geo_locations.custom_locations). Mirrors the inclusion customLocations shape.
        - `latitude` number, required
        - `longitude` number, required
        - `radius` number, required: Positive radius around the point.
        - `distanceUnit` 'mile' | 'kilometer', required
        - `name` string
        - `address` string: Optional label, sent to Meta as `address_string`. latitude/longitude take precedence for the pin location.
    - `ageMin` integer: Minimum age. - Applied on Meta, TikTok, Pinterest, LinkedIn, X and Google Search/Display (Google excludes the age ranges outside the request). - Rejected with 400 on OpenAI, Reddit and Google Performance Max / Demand Gen. Each platform clamps to its own range: - Meta and Pinterest: effectively cap at 65 (65 = 65+). - Pinterest: no under-18 bucket, so an ageMin below 18 starts at 18. - TikTok: maps up to 100. - LinkedIn: rounds out to its buckets (18-24, 25-34, 35-54, 55+) and has no under-18 audience. - X: rounds out to the narrowest of its fixed ranges (e.g. 25-34 becomes 25-49, 18-65 becomes 18+).
    - `ageMax` integer: Maximum age. Same per-platform application and clamping as ageMin.
    - `gender` 'all' | 'male' | 'female': Restrict by gender. 'all' (default) targets everyone. Applied on Meta, TikTok, Pinterest, LinkedIn, X, Reddit and Google Search/Display (Google excludes the other gender); rejected with 400 on OpenAI and on Google Performance Max / Demand Gen.
    - `incomeTier` 'top_5' | 'top_10' | 'top_10_25' | 'top_25_50': Normalized household-income tier (ZIP/percentile based). Meta and TikTok express all four. Google maps only `top_10` (its INCOME_RANGE_90_UP); other tiers on Google, and any income tier on LinkedIn / X / Pinterest, are rejected. On Meta, income/zip targeting requires the relevant `specialAdCategories` to be unset (housing/employment/credit ads cannot use it).
    - `languages` string[]: Language codes restricting the audience by language. Applied on Meta, Google, TikTok, LinkedIn, X, Pinterest and Reddit; rejected with 400 on OpenAI. A code the platform cannot target returns 400 listing the ones it can. On Meta: ISO 639-1 codes (e.g. ['en']). A bare code targets all regional variants ("en" = all English); use a region-qualified code ("en_GB", "pt_BR") for a specific one. Unknown codes are rejected.
    - `interests` object[]: Interest entities from /v1/ads/targeting/search?dimension=interest. Each carries the platform's opaque id. - Google: applied as ad-group interest criteria (affinity and in-market categories) on Display and Search ad groups the request creates. Interests are create-only. - Google rejections (400): on Performance Max, on Demand Gen (use the Demand Gen audience `userInterests` there), and when attaching to an existing ad group (`adSetId`). - OpenAI: rejected with 400. - TikTok: bare numeric ids are interest categories (`interest_category_ids`); ids like `keyword:123456` from `dimension=interestKeyword` are additional interests (`interest_keyword_ids`). Any other id returns 422 naming `targeting.interests`. - TikTok matching: people who fit ANY selected interest, additional interest or behavior (one OR'd group). That group is ANDed with location, age, gender and the other dimensions.
      - `id` string, required
      - `name` string
    - `behaviors` object[]: Behaviour entities from /v1/ads/targeting/search?dimension=behavior (Meta, TikTok and LinkedIn). **On TikTok** they target people who, in the picked categories: - interacted with videos (watched to the end, liked, commented or shared, last 15 days); - interacted with creators (followed or viewed the profile); - or viewed videos with a picked hashtag (`hashtag:<id>` ids from `dimension=hashtag`, sent as a `HASHTAG_RELATED` action with `VIEW_HASHTAG`). The ad group then uses the TikTok placement only. Behaviors are OR'd with interests and additional interests.
      - `id` string, required
      - `name` string
    - `workPositions` object[]: Meta only. Job title entities from /v1/ads/targeting/search?dimension=workPosition. Not interchangeable with the LinkedIn `jobTitles` URN fragments.
      - `id` string, required
      - `name` string
    - `workEmployers` object[]: Meta only. Employer entities from /v1/ads/targeting/search?dimension=workEmployer.
      - `id` string, required
      - `name` string
    - `workIndustries` object[]: Meta only. Work-industry entities from /v1/ads/targeting/search?dimension=workIndustry. Not interchangeable with the LinkedIn `industries` URN fragments.
      - `id` string, required
      - `name` string
    - `industries` string[]: LinkedIn B2B only. Industry URN id fragments, or the full urn:li:industry:* URN from /v1/ads/targeting/search?dimension=industry.
    - `companySizes` string[]: LinkedIn B2B only. Single-letter size codes (A to I), or the full urn:li:staffCountRange:* URN from /v1/ads/targeting/search?dimension=companySize.
    - `seniorities` string[]: LinkedIn B2B only. Seniority URN id fragments, or the full urn:li:seniority:* URN from /v1/ads/targeting/search?dimension=seniority.
    - `jobFunctions` string[]: LinkedIn B2B only. Function URN id fragments, or the full urn:li:function:* URN from /v1/ads/targeting/search?dimension=jobFunction.
    - `skills` string[]: LinkedIn B2B only. Member skills (e.g. Python, Recruiting): skill URN id fragments, or the full urn:li:skill:* URN from /v1/ads/targeting/search?dimension=skill. Values are ORed; the facet is ANDed with the other facets. On an ad set update an empty list removes the skills.
    - `audienceInclude` string[]: Platform audience IDs to include, as returned by GET /v1/ads/audiences: - Meta: custom audience ids. - TikTok: audience ids. - Pinterest: customer list ids. - LinkedIn: segment ids (the platformAudienceId from GET /v1/ads/audiences). Zernio resolves it to the targetable LinkedIn ad segment; an unknown id returns 400. - Google: user list ids. - X: custom audience ids. - Reddit: ids of custom audiences built in Reddit Ads Manager (GET /v1/ads/audiences does not list Reddit audiences). - OpenAI: not supported (400).
    - `audienceExclude` string[]: Platform audience IDs to exclude; same ID formats as audienceInclude. Not supported on OpenAI (400).
    - `communities` string[]: Reddit only (400 elsewhere). Subreddits to target, by name, with or without the `r/` prefix (e.g. `['marketing', 'r/startups']`), as returned by /v1/ads/targeting/search?dimension=community.
    - `excludedCommunities` string[]: Reddit only (400 elsewhere). Subreddits to exclude, named like `communities`.
    - `conversationKeywords` string[]: Reddit only (400 elsewhere). Keywords that place the ad in Reddit conversations about them, as returned by /v1/ads/targeting/search?dimension=conversationKeyword.
    - `excludedConversationKeywords` string[]: Reddit only (400 elsewhere). Conversation keywords to keep the ad away from.
  - `startDate` string, nullable: The ad group's start_time, null when it has none.
  - `endDate` string, nullable: The ad group's end_time, null when it runs continuously.

## 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.
- `404`: Ad set not found
- `501`: The platform has no ad set targeting read (every platform but Reddit)

## Changes

- **2026-10-27** `a68973d39286`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/ads/ad-sets/:adSetId/targeting/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/c319eb5d95b6?raw)
