---
name: declare-special-ad-categories
description: >-
  Declares the correct Special Ad Category (SAC) on any Meta campaign touching Housing, Employment, Credit,
  Social Issues/Elections/Politics, or Financial Products & Services, then locks the ad set's targeting to
  what a SAC permits: no age (18-65 fixed) or gender targeting, no ZIP/postal-code, a reduced
  detailed-targeting list, and a ~15-mile (24km) minimum radius. Declaration goes on special_ad_categories
  at mads_create_campaign and cannot be added afterward; mads_policy_guardrail is the pre-submit chokepoint
  that blocks discriminatory or SAC-violating targeting before the write lands. Also covers the ban on
  protected-attribute targeting, the EU DSA beneficiary/payer disclosure, and misdeclaration costs -
  rejection, account restriction, legal exposure. Reach for it on every campaign whose vertical plausibly
  touches a listed category. It ends at a compliant declared campaign - political specifics are
  set-up-political-ads-authorization, review is pass-ad-review-and-avoid-rejection.
---
# Declare Special Ad Categories and Comply with Restricted Targeting

## Purpose
On Meta, a Special Ad Category is not an optional label, it is a mandatory compliance switch declared
at campaign creation and enforced through the entire targeting stack below it. Housing, Employment,
Credit, Social Issues/Elections/Politics, and Financial Products & Services ads carry real discrimination
exposure (Fair Housing Act, Equal Credit Opportunity Act, and equivalents) if targeted like a normal
campaign. This skill turns "does this ad belong to a listed vertical" into a declared
`special_ad_categories` value plus a targeting spec that `mads_policy_guardrail` will actually pass.

## When to run
- Standing up any new campaign whose product, service, or message touches HOUSING, EMPLOYMENT, CREDIT,
  SOCIAL_ISSUES_ELECTIONS_POLITICS, or FINANCIAL_PRODUCTS_SERVICES, before `mads_create_campaign`.
- An existing campaign's messaging or offer drifted into a listed category (e.g., a retail campaign adds
  a "get approved for financing" angle).
- `mads_policy_guardrail` rejects an ad-set targeting write citing SAC restrictions or discrimination.
- A pre-launch compliance check before scaling spend on a campaign in a gray-area vertical.

## When NOT to run
- The vertical is confirmed political/electoral content → declare the category here, then hand off to
  `set-up-political-ads-authorization` for the authorization, disclaimer, and Ad Library requirements.
- The vertical is restricted but not a SAC (alcohol, gambling, pharma, crypto, dating, etc.) →
  `navigate-restricted-verticals` covers certification/permission gates instead of targeting limits.
- Targeting is already SAC-compliant and the open question is creative/copy/landing-page review →
  `pass-ad-review-and-avoid-rejection`.

## Prerequisites
- The ad's product, service, or message classified against the five SAC verticals, HUMAN STEP to
  confirm genuinely ambiguous cases (e.g., "is a rent-to-own furniture ad Housing or Retail?").
- For EU audiences: beneficiary and payer identity confirmed (who benefits, who paid), HUMAN STEP,
  required for the DSA disclosure fields.
- Business Manager admin access, declaration is account/campaign level and becomes visible in the Ad
  Library once the campaign goes live.

## Procedure
1. **Classify the campaign against the SAC list.** Check the offer against: HOUSING (real estate,
   rentals, mortgages, home/renters insurance), EMPLOYMENT (job ads, internships, employment-linked
   certification), CREDIT (credit cards, loans, credit scores, BNPL, insurance),
   SOCIAL_ISSUES_ELECTIONS_POLITICS (candidates, elections, legislation, social issues),
   FINANCIAL_PRODUCTS_SERVICES (banking, investing, insurance, regional rollout, verify current scope).
   IF classification is ambiguous, THEN
   declare anyway, a false positive costs targeting precision, a false negative risks rejection and
   discrimination exposure. HUMAN STEP for genuinely unclear cases.
2. **Declare `special_ad_categories` on `mads_create_campaign`.** Set the array (e.g. `["HOUSING"]`) at
   creation, it cannot be added later; a campaign built without it must be rebuilt, not patched, if a
   SAC turns out to apply. Preview the payload, get user approval, then create with `status=PAUSED`.
3. **Strip targeting to the SAC-permitted set before `mads_create_adset`.** No age targeting (locked
   18-65), no gender targeting, no ZIP/postal-code targeting, no targeting or exclusion by any
   protected-class proxy. Detailed targeting is limited to the reduced SAC-safe list, do not carry over
   a normal campaign's targeting spec.
4. **Set location radius to the SAC minimum.** Any radius/proximity targeting must be ≥~15 miles (24 km);
   tighter radii function as a proxy for protected-class exclusion (e.g., redlining a neighborhood) and
   are not permitted under a SAC.
5. **Validate before submitting the ad set.** Call `mads_policy_guardrail` on the assembled spec before
   `mads_create_adset`/`mads_update_adset`. Treat a block as authoritative, it exists specifically to
   catch discriminatory and SAC-violating targeting before the write lands, not after.
6. **Add EU beneficiary/payer disclosure when EU users are in the audience.** Capture "who benefits" and
   "who paid" (HUMAN STEP to confirm identities) and attach per the DSA disclosure fields, required
   regardless of which SAC applies, and mandatory alongside the political disclaimer for SIEP.
7. **Create the ad set, then the ad, PAUSED.** Preview the full targeting spec and creative, get explicit
   user approval, then commit with `status=PAUSED`. Nothing reaches delivery before a human unpauses.
8. **Record the declaration.** Log which SAC(s) were declared, why, and the resulting targeting
   constraints, so later edits to this campaign don't quietly reintroduce prohibited targeting.

## Decision rules
- IF the ad relates to housing, employment, credit, social issues/elections/politics, or financial
  products/services THEN `special_ad_categories` is mandatory, there is no opt-out once it applies.
- IF `special_ad_categories` is set THEN age is locked 18-65, gender targeting is off, ZIP/postal-code
  targeting is off, detailed targeting is restricted, and any radius targeting is ≥15 miles.
- IF `mads_policy_guardrail` blocks the spec THEN fix the targeting, don't retry the identical spec.
- IF the audience includes EU users THEN attach beneficiary/payer disclosure regardless of SAC status.
- IF the category is specifically political/electoral THEN also complete
  `set-up-political-ads-authorization`, declaring the category here is necessary but not sufficient.
- IF a live campaign is discovered to need a SAC it wasn't built with THEN pause and rebuild it, do not
  retrofit `special_ad_categories` onto a live campaign.
- **Done means:** `special_ad_categories` declared where applicable, ad-set targeting stripped to the
  SAC-permitted set and passing `mads_policy_guardrail`, EU disclosure attached where relevant, and the
  campaign/ad set created PAUSED pending human approval to go live.

## Common failure modes
- Declaring the category correctly but leaving normal-campaign targeting (age ranges, gender, ZIP codes)
  on the ad set, `mads_policy_guardrail` should catch it, but the spec was built wrong to begin with.
- Treating SAC as a one-time checkbox instead of re-checking when campaign messaging drifts mid-flight.
- Assuming a small radius is fine because "the audience is local", under a SAC it's a violation
  regardless of intent.
- Skipping EU beneficiary/payer disclosure because the campaign isn't political, DSA disclosure applies
  more broadly than the political vertical alone.
- Trying to add `special_ad_categories` to an already-created campaign instead of rebuilding, the field
  is fixed at creation.

## Related skills
- Run before: `set-up-political-ads-authorization` (SIEP-specific authorization/disclaimer once
  SOCIAL_ISSUES_ELECTIONS_POLITICS is declared here).
- Run before: `pass-ad-review-and-avoid-rejection` (review-readiness once targeting is compliant).
- Related: `navigate-restricted-verticals` (non-SAC restricted categories with certification/permission
  gates instead of targeting limits).
- Related: `appeal-rejections-and-restrictions` (if a targeting/discrimination rejection already happened).
