Skip to content

Cost Per Action Ads

Updated: Jun 26, 2026

Cost Per Action (CPA) lets you specify conversion events and get charged by the number of conversions. CPA for video views is also called CPV.

An alternative to CPA is oCPM, which charges per impression served.

How it works

Define your bid at the ad set level. These fields must follow the restrictions below:

NameDescription
billing_eventDefines the action you pay on. Set to LINK_CLICKS, PAGE_LIKES, OFFER_CLAIMS, or THRUPLAY.
optimization_goalDefines the action you optimize for. Set to same value as your billing_event, LINK_CLICKS, PAGE_LIKES, POST_ENGAGEMENT, OFFER_CLAIMS, or THRUPLAY.
bid_amountValue you place on the objective, specified in cents, minimum 1 cent. For example, bid_amount=150 means you would like to bid $1.50 on that action. The bid_amount should represent the maximum value you are willing to pay for this action.
targetingFor those ads that optimize for connections including page_like you must use the excluded_connections field in the targeting in order to exclude users who have already performed the one-time conversion for the destination object. See the examples in the section below for how to specify the appropriate excluded connections.

Limitations

  • The offsite link click action only supports links to offsite domains and Facebook hosted app domains.
  • CPA billing for non-video view ads is based on one day click through conversions. For CPV, or CPA for video view, ads, Meta bills you on 10-second video views.
  • Offsite link click billing is additionally restricted to link clicks within the advertisement. These in-ad link clicks are known as inline clicks.

Starting on v9, CPA billing for app ads is deprecated, you cannot set both billing_event and optimization_goal to APP_INSTALLS. Use the impression billing events instead. You can still specify APP_INSTALLS under billing_event or optimization_goal, but not under both billing_event and optimization_goal at the same time.

See ad set document on allowed updates to ad sets.

Examples

Create

The example below creates a CPA bid ad set. For CPA ad sets, you must set a promoted_object.

curl -X POST \
  -F 'name="A CPA Ad Set"' \
  -F 'campaign_id="<AD_CAMPAIGN_ID>"' \
  -F 'daily_budget=5000' \
  -F 'start_time="2025-11-18T14:06:35-0800"' \
  -F 'end_time="2025-11-25T14:06:35-0800"' \
  -F 'billing_event="IMPRESSIONS"' \
  -F 'optimization_goal="REACH"' \
  -F 'bid_amount=1000' \
  -F 'promoted_object={
       "page_id": "<PAGE_ID>"
     }' \
  -F 'targeting={
       "facebook_positions": [
         "feed"
       ],
       "geo_locations": {
         "countries": [
           "US"
         ]
       }
     }' \
  -F 'user_os="iOS"' \
  -F 'publisher_platforms="facebook"' \
  -F 'device_platforms="mobile"' \
  -F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsets

After you create the ad set, you can create ads and put them into this ad set following the creation flow here.

Update

Change the bid to a CPA ad set:

curl -X POST \
  -F 'billing_event="IMPRESSIONS"' \
  -F 'optimization_goal="LINK_CLICKS"' \
  -F 'bid_amount=200' \
  -F 'targeting={
       "geo_locations": {
         "countries": [
           "US"
         ]
       },
       "facebook_positions": [
         "feed"
       ]
     }' \
  -F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/<AD_SET_ID>/

CPV example

To create an ad bidding CPV, or CPA for video views, first create an ad campaign with objective=VIDEO_VIEWS.

curl -X POST \
  -F 'name="Video Views campaign"' \
  -F 'objective="OUTCOME_ENGAGEMENT"' \
  -F 'status="PAUSED"' \
  -F 'special_ad_categories=[]' \
  -F 'is_adset_budget_sharing_enabled=0' \
  -F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/campaigns

Then, set the CPA for video views bid_info at the ad set:

curl \
  -F 'name=A CPV Ad Set' \
  -F 'campaign_id=<CAMPAIGN_ID>' \
  -F 'daily_budget=500' \
  -F 'start_time=2018-02-06T04:45:29+0000' \
  -F 'end_time=2018-02-13T04:45:29+0000' \
  -F 'billing_event=VIDEO_VIEWS' \
  -F 'optimization_goal=VIDEO_VIEWS' \
  -F 'bid_amount=100' \
  -F 'targeting={
    "device_platforms": ["mobile"],
    "geo_locations": {"countries":["US"]},
    "publisher_platforms": ["facebook"]
  }' \
  -F 'status=PAUSED' \
  -F 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/adsets

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