Appearance
Basic Targeting
Updated: Jun 30, 2026
Basic targeting includes:
Advertisers running housing, employment, credit ads, issues, election, or political ads who are based in the United States or running ads targeted to the United States have different sets of restrictions.
Demographics and events
Get basic demographic and location-based targeting data to define targeting from Targeting Search, then specify options in the targeting spec, which contains ad set attributes defining who should see the ad.
Note: You must specify at least one country in targeting, unless you use a Custom Audience.
Targeting by demographic
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"]},
"industries": [{"id":6009003307783,"name":"Accounting and finance"}],
"life_events": [{"id":6003054185372,"name":"Recently Moved"}],
"relationship_statuses": [2,4]
}' \
-F 'status=ACTIVE' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsetsFields
| Name | Description |
|---|---|
genders array | Genders to target. Defaults to all. 1 targets males, 2 targets females. |
age_min int | Minimum age. Defaults to 18. If used, must be 13 or higher. If the app has custom settings for age restrictions, the app's age restrictions will be used for ads with APP_INSTALL goals. For example, if you set age_min to 13 but your app's age minimum is set to 18, 18 will be used in ads targeting. |
age_max int | Maximum age. If used, must be 65 or lower. |
user_age_unknown boolean | Includes people on WhatsApp whose age is unknown. Applies only to the WhatsApp Status placement Starting May 2026, if the WhatsApp Status placement is included and this field is not set, it defaults to true. Setting it to false allows businesses to exclude people on WhatsApp whose age is unknown. Businesses will be able to opt out of including people on WhatsApp whose age is unknown at any time. |
Location
Search and retrieve values for location targeting with Targeting Search. This targeting has two parameters: geo_locations to target locations, and optionally, excluded_geo_locations to exclude areas.
Use country_groups for geo_locations to target broader geographic regions such as Europe or North America.
Using radius can cause an error, code: 100, subcode 1815946, when targeting multiple locations. We recommend creating an ad for each location or not using radius in your call.
Fields
| Name | Description |
|---|---|
countries array | Country targeting. Requires array of country codes, see Targeting Search, Countries. Example: 'countries': ['US'] |
regions array | State, province, or region. Available values, see Targeting Search, Regions. Limit: 200. Example: 'regions': [{'key':'3847'}] |
cities array | Specify key, radius, and distance_unit. For key, see Targeting Search, Cities. radius is a distance around cities, from 10 to 50 miles or 17 to 80 kilometers. distance_unit is mile or kilometer. Limit: 250. Example: 'cities': [{'key':'2430536', 'radius':12, 'distance_unit':'mile'}] |
zips array | Target Zip Code, See targeting search API. Limit: 50,000 (formerly 2,500). If you provide more than 2,500, the system creates an array known as location_cluster which represents a set of zip codes. Example: 'zips':[{'key':'US:94304'},{'key':'US:00501'}] To read a location_cluster and see the locations targeted: GET /location_cluster_ID |
places array | Provide a specific place. Limit: 200. Example:"places":[{"key":129672430416115,"name":"SFO", "radius":10, "distance_unit":"mile"}] |
custom_locations array | Available for all objectives. Provide exact location in latitude and longitude or address as the center of an area. Also specify radius for your location from .63 to 50 miles, or 1 to 80 kilometers. distance_unit is miles or kilometers; default is mile. Limit: 200. PO Box alone is not supported in address_string. You must provide at minimum, a street address. Example:'custom_locations':[{'address_string': '1601 Willow Road, Menlo Park, CA', 'radius': 5},{'latitude': 36, 'longitude': -121.0, 'radius': 5, 'distance_unit': 'kilometer'},] |
custom_locations.latitude float | Latitude of location |
custom_locations.longitude float | Longitude of location |
custom_locations.name string | Name for address. You can use with latitude and longitude values for geo location targeting without providing address_string |
custom_locations.radius float | Radius around latitude/longitude, in miles unless otherwise in distance_unit. From 0.63 to 50 miles, or 1 to 80 kilometers. |
custom_locations.distance_unit string | Optional. kilometer or mile; default mile |
custom_locations.address_string string | Address at latitude/longitude, such as 1601 Willow Rd, Menlo Park, CA. Suggested format: street number street name, city, state/province, country. Exclude postal codes. |
geo_markets array | Geomarkets using Comscore Markets. Limit: 2500. Example:'geo_markets':[{'key': 'COMSCORE_MARKET:2001', 'name': 'New York, NY'}, {'key': 'COMSCORE_MARKET:2051', 'name': 'New Orleans, LA'},] |
electoral_district array | Key for electoral districts. Get districts at Targeting Search, Electoral. Example: 'electoral_districts':[{'key':'US:AK00'},{'key':'US:CA01'},{'key':'US:NY14'}] |
location_types array | The array ['home', 'recent'] is the only option available. If no location_types array is provided, it will default to ['home', 'recent']. * recent: People whose recent location is in a selected area, as determined from mobile device data. Not available to exclude locations. * home: People whose stated location in their Facebook profile "current city" is in an area. Facebook validates this by IP and information from their friends' profile locations. |
country_groups array | Global geographical regions and free trade areas. See Targeting Search, Country Groups. Provide array of country group codes: * worldwide: Worldwide. * africa: Africa. * afta: ASEAN Free Trade Area. * android_app_store: paid apps supporting countries in Android app store. * android_free_store: free apps supporting countries in Android app store. * apec: Asia-Pacific Economic Cooperation. * asia: Asia * caribbean: Caribbean. * central_america: Central America. * cisfta: Commonwealth of Independent States Free Trade Area. * eea: European Economic Area. * emerging_markets: countries in Emerging Markets * europe: Europe. * gcc: Gulf Cooperation Council. * itunes_app_store: supported countries for iTunes app store. * mercosur: MERCOSUR. * nafta: North American Free Trade Agreement. * north_america: North America. * oceania: Oceania. * south_america: South America. Example: 'country_groups': ['asia','mercosur'] |
Examples
Target by countries
curl -X POST \
-F 'name="My Reach Ad Set"' \
-F 'optimization_goal="REACH"' \
-F 'billing_event="IMPRESSIONS"' \
-F 'bid_amount=2' \
-F 'daily_budget=1000' \
-F 'campaign_id="<AD_CAMPAIGN_ID>"' \
-F 'targeting={
"geo_locations": {
"countries": [
"US"
]
},
"facebook_positions": [
"feed"
]
}' \
-F 'status="PAUSED"' \
-F 'promoted_object={
"page_id": "<PAGE_ID>"
}' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v24.0/act_<AD_ACCOUNT_ID>/adsetsLocation targeting with exclusions
curl -X POST \
-F 'name="My Reach Ad Set"' \
-F 'optimization_goal="REACH"' \
-F 'billing_event="IMPRESSIONS"' \
-F 'bid_amount=2' \
-F 'daily_budget=1000' \
-F 'campaign_id="<AD_CAMPAIGN_ID>"' \
-F 'targeting={
"excluded_geo_locations": {
"regions": [
{
"key": "3847"
}
]
},
"geo_locations": {
"countries": [
"US"
]
},
"facebook_positions": [
"feed"
]
}' \
-F 'status="PAUSED"' \
-F 'promoted_object={
"page_id": "<PAGE_ID>"
}' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsetsTarget by zip codes
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":{
"zips":[{"key":"US:94304"},{"key":"US:00501"}]}
}' \
-F 'status=ACTIVE' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsetsTarget by custom locations, geomarkets, and location types
The following code sets up targeting for:
- 5 miles around 1601 Willow Road, Menlo Park, CA
- 5 kilometers around latitude: 36, longitude: -121.0
- COMSCORE_MARKETS 2001 and 2051
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": {
"custom_locations": [
{"address_string":"1601 Willow Road, Menlo Park, CA","radius":"5"},
{
"latitude": "36",
"longitude": "-121.0",
"radius": "5",
"distance_unit": "kilometer"
}
],
"geo_markets": [
{"key":"COMSCORE_MARKET:2001","name":"New York, NY"},
{"key":"COMSCORE_MARKET:2051","name":"New Orleans, LA"}
],
"location_types": ["recent","home"]
}
}' \
-F 'status=ACTIVE' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsetsSearch and targeting
To target males age 20-24 within 10 miles of Menlo Park, CA, or living in Texas or in Japan:
Step 1
First, get Japan's country code:
curl -G \
-d 'location_types=["country"]' \
-d 'type=adgeolocation' \
-d 'q=japan' \
-d 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/searchStep 2
Get Texas's region code:
curl -G \
-d 'location_types=["region"]' \
-d 'type=adgeolocation' \
-d 'q=texas' \
-d 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/searchStep 3
Search Menlo Park, CA city code:
curl -G \
-d 'location_types=["city"]' \
-d 'type=adgeolocation' \
-d 'q=menlo' \
-d 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/searchStep 4
Provide genders and age as age_min and age_max.
Step 5
The targeting spec is ready with country, region, and city codes:
curl \
-F 'name=My First AdSet' \
-F 'daily_budget=10000' \
-F 'bid_amount=300' \
-F 'billing_event=IMPRESSIONS' \
-F 'optimization_goal=REACH' \
-F 'campaign_id=<CAMPAIGN_ID>' \
-F 'promoted_object={"page_id":"<PAGE_ID>"}' \
-F 'targeting={
"age_max": 24,
"age_min": 20,
"device_platforms": ["mobile"],
"genders": [1],
"geo_locations": {
"countries": ["JP"],
"regions": [{"key":"3886"}],
"cities": [
{
"key": "2420605",
"radius": 10,
"distance_unit": "mile"
}
]
},
"publisher_platforms": ["facebook","audience_network"]
}' \
-F 'status=PAUSED' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsetsTarget multiple cities
Set custom_type to multi_city and define either country or country_group as described before.
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": {
"custom_locations": [
{
"custom_type": "multi_city",
"min_population": 500000,
"max_population": 1000000,
"country": "BR"
},
{"custom_type":"multi_city","country_group":"Europe"}
],
"location_types": ["recent","home"]
}
}' \
-F 'status=ACTIVE' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsetsParameters
| Name | Description |
|---|---|
min_population int | The minimum population threshold on which the cities are chosen for targeting. |
max_population int | The maximum population threshold on which the cities are chosen for targeting. |
Interest targeting
Target based on interests from someone's timeline, from Pages liked or from keywords associated with Pages or apps someone uses. See Targeting Search, Interests.
To target people interested in soccer, first query:
curl -G \
-d 'type=adinterest' \
-d 'q=soccer' \
-d 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/searchAdd this interest by name and id to a targeting spec, where path is the path of this interest in ads tools.
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="<CAMPAIGN_ID>"' \
-F 'promoted_object={
"page_id": "<PAGE_ID>"
}' \
-F 'targeting={
"facebook_positions": [
"feed"
],
"geo_locations": {
"countries": [
"US"
],
"regions": [
{
"key": "4081"
}
],
"cities": [
{
"key": 777934,
"radius": 10,
"distance_unit": "mile"
}
]
},
"genders": [
1
],
"age_max": 24,
"age_min": 20,
"publisher_platforms": [
"facebook",
"audience_network"
],
"device_platforms": [
"mobile"
],
"flexible_spec": [
{
"interests": [
{
"id": "<INTEREST_ID>",
"name": "<INTEREST_NAME>"
}
]
}
]
}' \
-F 'status="PAUSED"' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsetsHere's another example:
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"]},
"interests": [
{"id":6003139266461,"name":"Movies"},
{"id":6003397425735,"name":"Tennis"},
{"id":6003659420716,"name":"Cooking"}
]
}' \
-F 'status=ACTIVE' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsetsFields
| Name | Description |
|---|---|
interests array | Array with id and optional name fields: 'interests':[{id: 6003139266461, 'name': 'Movies'}, {id: 6003139266462}, 6003139266463] |
Behavioral targeting
Target based on digital activities, devices people use, past or intended purchases, and travel. View options at Browse such as Frequent Travelers. See Targeting Search API.
curl -G \
-d 'type=adTargetingCategory' \
-d 'class=behaviors' \
-d 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/searchAdd the behavior to targeting spec:
curl \
-F 'name=My First AdSet' \
-F 'daily_budget=10000' \
-F 'bid_amount=300' \
-F 'billing_event=IMPRESSIONS' \
-F 'optimization_goal=REACH' \
-F 'campaign_id=<CAMPAIGN_ID>' \
-F 'promoted_object={"page_id":"<PAGE_ID>"}' \
-F 'targeting={
"age_max": 24,
"age_min": 20,
"behaviors": [{"id":6002714895372,"name":"All frequent travelers"}],
"device_platforms": ["mobile"],
"genders": [1],
"geo_locations": {
"countries": ["JP"],
"regions": [{"key":"3886"}],
"cities": [
{
"key": "2420605",
"radius": 10,
"distance_unit": "mile"
}
]
},
"interests": [{"id":6003107902433,"name":"Association football (Soccer)"}],
"publisher_platforms": ["facebook","audience_network"]
}' \
-F 'status=PAUSED' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsetsAnother example:
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={
"facebook_positions": [
"feed"
],
"geo_locations": {
"countries": [
"US"
]
},
"behaviors": [
{
"id": 6007101597783,
"name": "Business Travelers"
},
{
"id": 6004386044572,
"name": "Android Owners (All)"
}
]
}' \
-F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsetsFields
| Name | Description |
|---|---|
behaviors array | Array with id and optional name fields: 'behaviors':[{id: 6004386044572, 'name': 'Android Owners (All)'}, {id: 6004386044573}, 6004386044574] |
Learn more
- Search Targeting - Query for Facebook's native ads targeting options.
- Audience Targeting
- Special Ad Category
Other targeting:
- Audience Network - Run ads on Audience Network and extend the reach of your link or app ads