Skip to content

Advanced targeting

Updated: Jun 30, 2026

Advanced targeting includes:

You can use any combination of these advanced targeting options in your own custom audiences and lookalikes. By default, Facebook ORs combinations together. Learn more about core or basic targeting.

If you use flexible_spec, you must also provide one of the following under targeting:

  • geo_locations (geographical targeting field from country, region, city, zip)
  • custom_audiences
  • product_audience_specs
  • dynamic_audience_ids

Limitations

  • Advertisers running housing, employment, and credit ads, who are based in the United States or running ads targeted to the United States have different sets of restrictions. See Special Ad Category.
  • See our Targeting Restrictions guide for more limitations.

Mobile

Mobile targeting is useful for Mobile App Install ads.

curl -X POST \
  -F 'name=My AdSet' \
  -F 'optimization_goal=REACH' \
  -F 'billing_event=IMPRESSIONS' \
  -F 'bid_amount=2' \
  -F 'daily_budget=1000' \
  -F 'campaign_id=<CAMPAIGN_ID>' \
  -F 'targeting={
    "geo_locations": {"countries":["US"]},
    "user_device": ["Galaxy S6","One m9"],
    "user_os": ["android"]
  }' \
  -F 'status=ACTIVE' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsets

You can combine categories, such as iPod, iPad, or iPhone.

These categories are not mutually exclusive. If you select iOS you target all devices running iOS, including iPhone and iPod, without specifying user_device.

For Brand Awareness Objective ads, you can't target based on mobile device type, such as feature phones or Samsung, or based on iOS version number. You can only choose Android or iOS, or all mobile phones.

Available fields

FieldDescription
user_os type: arrayRequired. One or more values from OS option table below. Possible values are at Targeting Search API with type=adTargetingCategory and class=user_os. You cannot target the minimum version of one platform with the other platform. However you can target both platforms without specifying minimal versions of either. Valid: * ['iOS', 'Android'] * ['iOS'] * ['Android_ver_4.2_and_above'] * ['iOS_ver_8.0_to_9.0'] Invalid: * ['Android', 'iOS_ver_8.0_and_above'] * ['iOS', 'Android_ver_4.0_and_above']
user_device type: arrayOptional. Devices must match the value in user_os. Get possible values at Targeting Search API with type=adTargetingCategory and class=user_device.
excluded_user_device type: arrayOptional. Devices to exclude. Devices must match the value in user_os. Get possible values at Targeting Search API with type=adTargetingCategory and class=user_device.
wireless_carrier type: arrayOptional. Allowed value is Wifi. Target mobile users currently on Wi-Fi networks.

Operating system options

FieldDescription
iOS type: stringiOS devices, including iPhone, iPad, and iPod
iOS_ver_x.x_and_above type: stringiOS devices running OS version x.x and above. Options: 2.0, 3.0, 4.0, 4.3, 5.0, 6.0, 7.0, 8.0, 9.0. Example: iOS_ver_4.0_and_above For Meta App Ads: * SKAdNetwork and Meta's Aggregated Event Measurement ad sets only support version range from iOS_ver_14.0_and_above. * Non-SKAdNetwork or Meta's Aggregated Event Measurement ad set only support iOS version range from iOS_ver_2.0_to_14.4.
iOS_ver_x.x_to_y.y type: stringiOS devices running OS versions x.x to y.y. Options: 2.0, 3.0, 4.0, 4.3, 5.0, 6.0, 7.0, 8.0, 9.0. Example: iOS_ver_8.0_to_9.0, where x.x must be less than y.y
Android type: stringAndroid devices
Android_ver_x.x_and_above type: stringAndroid devices running version x.x and above. Options: 2.0, 2.1, 2.2, 2.3, 3.0, 3.1, 3.2, 4.0, 4.1, 4.2, 4.3, 4.4, 5.0, 5.1, 6.0, 7.0, 7.1, and 8.0. Example: Android_ver_4.0_and_above
Android_ver_x.x_to_y.y type: stringAndroid devices running versions x.x to y.y. Options: 2.0, 2.1, 2.2, 2.3, 3.0, 3.1, 3.2, 4.0, 4.1, 4.2, 4.3, 4.4, 5.0, 5.1, 6.0, 7.0, 7.1, and 8.0. Example: Android_ver_4.2_to_8.0, where x.x must be less than y.y

Advanced demographic targeting

Target based on relationships, education, finances, and life events.

Examples

First query life_events:

curl -G \
  -d 'type=adTargetingCategory' \
  -d 'class=life_events' \
  -d 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v25.0/search

Add these to targeting_spec:

curl -X POST \
  -F 'name="My First AdSet"' \
  -F 'daily_budget=10000' \
  -F 'bid_amount=300' \
  -F 'billing_event="IMPRESSIONS"' \
  -F 'optimization_goal="REACH"' \
  -F 'campaign_id="<AD_CAMPAIGN_ID>"' \
  -F 'promoted_object={
       "page_id": "<PAGE_ID>"
     }' \
  -F 'targeting={
       "facebook_positions": [
         "feed"
       ],
       "age_max": 24,
       "age_min": 20,
       "behaviors": [
         {
           "id": 6002714895372,
           "name": "All travelers"
         }
       ],
       "device_platforms": [
         "mobile"
       ],
       "genders": [
         1
       ],
       "geo_locations": {
         "countries": [
           "US"
         ],
         "regions": [
           {
             "key": "4081"
           }
         ],
         "cities": [
           {
             "key": 777934,
             "radius": 10,
             "distance_unit": "mile"
           }
         ]
       },
       "interests": [
         {
           "id": "<INTEREST_ID>",
           "name": "<INTEREST_NAME>"
         }
       ],
       "life_events": [
         {
           "id": 6002714398172,
           "name": "Newlywed (1 year)"
         }
       ],
       "publisher_platforms": [
         "facebook",
         "audience_network"
       ]
     }' \
  -F 'status="PAUSED"' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsets

This example targets:

  • Location: Japan or United States: Menlo Park (+10 mi) California or United States: Texas
  • Age: 20 - 24
  • Gender: male
  • Interests: Association football (Soccer)
  • Behaviors: All frequent travelers
  • Life Event: Newlywed (1 year)
  • Home Ownership: Renters

Here's another example targeting by location, demographic, relationship status and interests:

curl \
  -F 'name=My AdSet' \
  -F 'optimization_goal=REACH' \
  -F 'billing_event=IMPRESSIONS' \
  -F 'bid_amount=2' \
  -F 'daily_budget=1000' \
  -F 'campaign_id=<CAMPAIGN_ID>' \
  -F 'targeting={
    "age_max": 43,
    "age_min": 18,
    "genders": [1],
    "geo_locations": {
      "regions": [{"key":"3847"}],
      "cities": [
        {
          "key": "2430536",
          "radius": 12,
          "distance_unit": "mile"
        }
      ]
    },
    "interests": [{"id":6003139266461,"name":"Movies"}],
    "relationship_statuses": [
      2,
      3,
      4
    ]
  }' \
  -F 'status=ACTIVE' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsets

Possible options

NameDescription
relationship_statuses type: arrayArray of integers representing relationship status. 1: single 2: in_relationship 3: married 4: engaged 6: not specified Default: ALL, if you specify Null or do not provide a value. Restrictions: Do not use 0.
life_events type: arrayArray of objects with 'id' and optional 'name' fields: [{'id': 123, 'name': 'foo'}, {'id': 456}, 789]
industries type: arrayArray of objects with 'id' and optional 'name' fields
income type: arrayArray of objects with 'id' and optional 'name' fields
family_statuses type: arrayArray of objects with 'id' and (optional) 'name' fields

Education and work

Use Targeting Search API for all options.

NameDescription
education_schools type: arraySchools, colleges, and institutions. Limit: 200 education schools. Example: [{id: 105930651606, 'name': 'Harvard University'}, {id: 105930651607}, 105930651608]
education_statuses type: arrayArray of integers to target based on education level. 1: HIGH_SCHOOL 2: UNDERGRAD 3: ALUM 4: HIGH_SCHOOL_GRAD 5: SOME_COLLEGE 6: ASSOCIATE_DEGREE 7: IN_GRAD_SCHOOL 8: SOME_GRAD_SCHOOL 9: MASTER_DEGREE 10: PROFESSIONAL_DEGREE 11: DOCTORATE_DEGREE 12: UNSPECIFIED 13: SOME_HIGH_SCHOOL
college_years type: arrayArray of integers. College graduation Limit: Earliest year allowed is 1980
education_majors type: arrayMajors. Example: [{'id': 123, 'name': 'Computer Science'}, {'id': 456}, 789] Limit: 200
work_employers type: arrayCompany, organization, or workplace Example: [{'id':'50431654','name':'Microsoft'}, {'id':50431655}, 50431656] Limit: 200
work_positions type: arraySelf-declared work. Example: [{'id':105763692790962, 'name':'Contractor'}, {'id':105763692790963}, 105763692790964] Limit: 200

Custom audiences

Create a custom audience and add users. You can use the audience in targeting, either for inclusion or exclusion. Include up to 500 custom audiences in custom_audiences and 500 custom audiences in excluded_custom_audiences.

excluded_custom_audiences in targeting_specs is different than excluded_custom_audiences in APP_COMBINATION Custom Audience.

FieldDescription
custom_audiences type: arrayArray of audience IDs or audience objects. 'id' field only: [123, 456], or [{'id': 123}, {'id': 456}]
excluded_custom_audiences type: arrayArray of audience IDs or audience objects. 'id' field only: [123, 456], or [{'id': 123}, {'id': 456}]
targeting:{
     "geo_locations":{
       "countries":["US"],
     },
     "age_min":25,
     "age_max":40,
     "custom_audiences":[{"id":6004192254512}]}
     "excluded_custom_audiences":
       [{"id":6004192252847}],
 }

Locales

Provide granular targeting on locale:

FieldDescription
locales type: arrayLocales, see Targeting Search, Locales. Indices in a sub-array 'locales'. Target Accounts Center accounts with language other than common language for a location. Provide an ID for the language, such as 5 for German. Limit: 50. See mapping of virtual 'locales' to language sets at Targeting Search, Locale with type=adlocale.

Reach people interested in selected cities and regions

This feature expands upon our existing location targeting feature, by enabling advertisers to reach people who have shown intent to travel to, make purchases in, or general interest in the cities and regions you've selected, within the same country.

  • To opt in, set the geo parameter under individual_setting in targeting_automation to 1.
  • To opt out, set the geo parameter under individual_setting in targeting_automation to 0.
"targeting": {  
  "age_range": [25, 35],  
  "geo_locations": {  
    "countries": ["GB"],  
    "cities": [{"key":"2430536", "radius":12, "distance_unit":"mile"}]  
  },  
  "targeting_automation": {  
    "individual_setting": {  
      "geo": 1  
    }  
  }  
}

Limitations

This feature works when you have selected cities or regions in your location targeting (that is, the geo_locations field).

Example request

curl -X POST \
  -F 'name="advantage audience test"' \
  -F 'is_autobid="true"' \
  -F 'daily_budget="100"' \
  -F 'billing_event="IMPRESSIONS"' \
  -F 'campaign_id="<CAMPAIGN_ID>"' \
  -F 'targeting={
    "age_range": [25,35],
    "geo_locations":
      {
        "cities": [{"key":"2430536","radius":12,"distance_unit":"mile"}]
      },
    "targeting_automation": {"individual_setting": {"geo": 1 } }​}' \
  -F 'access_token="<ACCESS_TOKEN>"' \
https://facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsets

For more information about the feature, see How to reach people interested in your selected cities and regions⁠.

Enable age and gender suggestions

Currently, this feature is available to select advertisers but will gradually roll out to all advertisers in the coming months.

To use age or gender as suggestions, simply configure the individual_setting parameter in the targeting_automation field. The API also returns this setting when you retrieve the ad set, if it exists for the ad set.

Limitations

  • This feature is only available for the OUTCOME_SALES and APP_INSTALLS objectives.
  • When using age and gender suggestions, Meta shows ads beyond these settings when doing so is likely to improve ad performance.

Age as a suggestion

Set the age parameter under individual_setting in targeting_automation to 1. Then, include the age_range field in your audience specification.

Example request

{  
  "geo_locations": {  
    "countries": [  
      "US"  
    ]  
  },  
  "age_min": 18,  
  "age_range": [25, 35],  
  "targeting_automation": {  
    "individual_setting": {  
      "age": 1  
    }  
  }  
}

Gender as a suggestion

Set the gender parameter under individual_setting in targeting_automation to 1.

Example request

{  
  "geo_locations": {  
    "countries": [  
      "US"  
    ]  
  },  
  "age_min": 21,  
  "genders":[1],  
  "targeting_automation": {  
    "individual_setting": {  
      "gender": 1  
    }  
  }  
}

Create an ad set with suggestions

Example request

 curl -X POST \
  -F 'name="advantage audience test"' \
  -F 'is_autobid="true"' \
  -F 'daily_budget="100"' \
  -F 'billing_event="IMPRESSIONS"' \
  -F 'campaign_id="<CAMPAIGN_ID>"' \
  -F 'promoted_object={"pixel_id": "<PIXEL_ID>","custom_event_type": "PURCHASE"}' \
  -F 'targeting={
    "age_min": 18,
    "age_range": [25,35],
    "genders":[1],
    "geo_locations": {
      "countries": ["US"]
    },
    "targeting_automation": {"individual_setting": {"age": 1, "gender": 1 } }​}' \
  -F 'access_token="<ACCESS_TOKEN>"' \
https://facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsets

Example response

{  
  "id": "<AD_SET_ID>",  
}

Retrieve an ad set with suggestions

Example request

curl -X GET \
  -d 'fields="targeting"' \
  -d 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/<AD_SET_ID>/

Example response

{  
  "targeting": {  
    "age_max": 65,  
    "age_min": 19,  
    "age_range": [  
      25,  
      35  
    ],  
    "genders": [  
      1  
    ],  
    "geo_locations": {  
      "countries": [  
        "US"  
      ],  
      "location_types": [  
        "home",  
        "recent"  
      ]  
    },  
    "targeting_relaxation_types": {  
      "lookalike": 0,  
      "custom_audience": 0  
    },  
    "targeting_automation": {  
      "advantage_audience": 0,  
      "individual_setting": {  
        "age": 1,  
        "gender": 1  
      }  
    }  
  },  
  "id": "<AD_SET_ID>",  
}

Custom broad category targeting

Use Broad Categories for custom targeting created or permissioned specifically for your account. To include the cooking category and small business owner category:

curl \
  -F 'name=My AdSet' \
  -F 'optimization_goal=REACH' \
  -F 'billing_event=IMPRESSIONS' \
  -F 'bid_amount=2' \
  -F 'daily_budget=1000' \
  -F 'campaign_id=<CAMPAIGN_ID>' \
  -F 'targeting={
    "geo_locations": {"countries":["US"]},
    "user_adclusters": [
      {"id":6002714885172,"name":"Cooking"},
      {"id":6002714898572,"name":"Small Business Owners"}
    ]
  }' \
  -F 'status=ACTIVE' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsets

To target based on BCT plus location and demographics:

curl \
  -F 'name=My AdSet' \
  -F 'optimization_goal=REACH' \
  -F 'billing_event=IMPRESSIONS' \
  -F 'bid_amount=2' \
  -F 'daily_budget=1000' \
  -F 'campaign_id=<CAMPAIGN_ID>' \
  -F 'targeting={
    "geo_locations": {"countries":["US"]},
    "relationship_statuses": [2],
    "user_adclusters": [{"id":6002714886772,"name":"Food & Dining"}]
  }' \
  -F 'status=ACTIVE' \
  -F 'access_token=<ACCESS_TOKEN>' \
  https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsets

You have options:

NameDescription
user_adclusters type: arrayArray of ID-name pairs for BCT clusters. See below for information on retrieving BCTs. Limit: 50 ID-name pairs.

To query this targeting for Ad account, make an HTTP GET:

https://graph.facebook.com/<API_VERSION>/act_<AD_ACCOUNT_ID>/broadtargetingcategories

The response is an array of JSON key-value pairs:

NameDescription
id type: longUse the broad category ID in the ad targeting spec
name type: stringName of broad category
parent_category type: stringParent category of broad category
size_lower_bound type: intLower bound audience size of broad category
size_upper_bound type: intUpper bound audience size of broad category
type type: int6=BCT
type_name type: stringBCT

Resources

Unofficial mirror for reference/search purposes. All content originates from developers.facebook.com — see the source link at the top of each page. Machine-readable indexes: llms.txt · llms-full.txt · About