# PATCH /v1/projects/:projectId/ads/:platform/adsets/:adsetId/targeting (/docs/api/reference/ads/patch-adset-targeting)



<Endpoint method="PATCH" path="/v1/projects/:projectId/ads/{platform}/adsets/:adsetId/targeting" scope="ads:write:creative" phase="1" />

Updates targeting on an adset. Targeting shapes vary materially per platform — Layers exposes a normalized partial-update view. For platform-native edge cases, use the granular per-platform fields.

{/* AGENT-18-OUTPUT-PENDING: confirm exact normalized targeting schema once Agent 18 ships the route. The normalized fields below are the v1 shipping set. */}

## Body [#body]

<Parameters
  title="Body (all optional — partial update)"
  rows="[
  { name: 'geo', type: 'string[]', description: 'ISO-3166-1 alpha-2 country codes. Example: `[&#x22;US&#x22;, &#x22;CA&#x22;]`.' },
  { name: 'age', type: 'object', description: '`{ min, max }` integer ages. Platform clamping applies (Meta min 18, etc.).' },
  { name: 'genders', type: 'string[]', description: '`male | female | all`.' },
  { name: 'customAudiences', type: 'string[]', description: 'Platform-specific custom-audience ids. Layers does not validate against the platform; passes through.' },
  { name: 'placements', type: 'string[]', description: 'Platform-specific placement strings.' },
]"
/>

Authority: gated by the &#x2A;*`creative`** axis (adset targeting is treated as creative-axis on the bucket-mode model — it's a "what does the customer see" change, not a budget/structural one).

## See also [#see-also]

* [Ads write model](/docs/api/concepts/ads-write-model)
* [`PATCH …/adsets/:id/budget`](/docs/api/reference/ads/patch-adset-budget)
* [`PATCH …/adsets/:id/schedule`](/docs/api/reference/ads/patch-adset-schedule)
