---
title: "Read a value rule set"
method: GET
path: "/v1/ads/value-rule-sets/{valueRuleSetId}"
tags: ["Ad Accounts"]
---

# Read a value rule set

`GET /v1/ads/value-rule-sets/{valueRuleSetId}`

Reads one value rule set including every nested rule id and criterion id. This is step
one of any edit: `PUT` is a full replace, so you need the ids before you can keep the
objects you are not changing.

Meta's own read returns `GENDER` values lowercase (`"male"`) while writes require
`"MALE"`. Values are passed through untouched, so never case-compare a stored rule
against a fetched one.

## Path parameters

- `valueRuleSetId` string, required

## Query parameters

- `accountId` string, required

## Response `200`

Value rule set

- object
  - `valueRuleSet` ValueRuleSet — A named set of bid-adjustment rules on an ad account. Attach it to an ad set with `valueRuleSetId`. Limits: 6 sets per ad account, 10 rules per set, 4 criteria per rule.
    - `id` string, required — Platform value rule set id.
    - `name` string, required
    - `rules` ValueRule[], required — Evaluated in order; the first matching rule wins.
      - `id` string — Platform rule id. Echo it on `PUT` to KEEP this rule, omit it to CREATE a new one. A rule left out of the array entirely is DELETED.
      - `name` string, required
      - `adjustSign` 'INCREASE' | 'DECREASE', required — Direction of the adjustment. There is no signed value field.
      - `adjustValue` integer, required — Unsigned percentage magnitude. `INCREASE` accepts 1-1000, `DECREASE` accepts 1-90. 0 is out of range on both.
      - `status` string — Meta returns `ACTIVE` here but documents no enum for the field. Treat it as a passthrough: echo whatever the `GET` returned, and do not synthesize values.
      - `criteria` ValueRuleCriterion[], required — All criteria on a rule must match for the rule to fire.
        - `id` string — Platform criterion id. Echo it on `PUT` to KEEP this criterion, omit it to CREATE a new one. A criterion left out of the array entirely is DELETED.
        - `criteriaType` 'AGE' | 'GENDER' | 'OS_TYPE' | 'DEVICE_PLATFORM' | 'LOCATION' | 'PLACEMENT' | 'OMNI_CHANNEL' | 'AUDIENCE_LABEL', required — The dimension being matched. `OMNI_CHANNEL` (conversion location: APP, INSTANT_FORM, PHONE_CALL, WEBSITE) is accepted even though Meta's own enum table omits it.
        - `operator` 'CONTAINS', required — Required on every criterion. `CONTAINS` is currently the only value Meta supports.
        - `criteriaValues` string[], required — The values to match. `AGE` takes ranges such as `18-24`, `18+` or a custom `18-26`; a range whose upper bound is 65 is NOT allowed (use `18+` instead of `18-65`). `LOCATION` takes Targeting-Search keys: a two-letter country code for `LOCATION_COUNTRY`, a numeric key for region / city / comScore market. `AUDIENCE_LABEL` takes labels such as `HIGH_VALUE`, which are applied to a Custom Audience in Ads Manager: there is no API to provision them, so they are passed through unvalidated.
        - `criteriaValueTypes` string[], required — One entry per `criteriaValues` entry, in the same order. The literal `"NONE"` for every criteriaType except `LOCATION`, which uses `LOCATION_COUNTRY`, `LOCATION_REGION`, `LOCATION_CITY` or `LOCATION_COMSCORE_MARKET` and MAY mix them within one criterion. `LOCATION_DMA` was replaced by `LOCATION_COMSCORE_MARKET` on 2026-06-22 and is rejected by this API.

## Other responses

- `400` — Invalid input, or Meta rejected the read. A bad id comes back as GraphMethodException code 100 / subcode 33, which cannot be told apart from a permission problem.
- `401` — Unauthorized
- `501` — Only supported on Meta (facebook/instagram)

---

[API](https://skmtc.net/zernio/apis/zernio-api.md) · [All operations](https://skmtc.net/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/zernio/zernio-api/versions/51932b099b2f/schema)
