Skip to content
Integra Solid Integra Solid
Toggle sidebar

Navigate

Ad Set Malaysia Gagal Dicipta via Meta Ads MCP? Ni Cara Kami Selesaikan Guna Graph API

Lepas 1 Jun 2026, ad set yang target Malaysia ditolak bila dicipta via Meta Ads MCP atau Marketing API. Ni punca dia, apa yang tak jalan, dan cara kami cipta ad set MY terus guna Graph API.

Fathur at Integra Solid

Ad Set Malaysia Gagal Dicipta via Meta Ads MCP? Ni Cara Kami Selesaikan Guna Graph API

Kami guna Claude dengan connector Meta Ads MCP untuk naikkan iklan Integra Solid. Campaign, creative, ad, semua boleh buat terus dari chat. Laju.

Sampai satu hari, ad set yang target Malaysia tiba-tiba tak boleh dicipta. ads_create_ad_set pulang error ni:

Advertiser is missing: Provide a verified advertiser so ads in this ad set
can be delivered to audiences in the selected locations.
(code 100, subcode 3858634)

Pelik sebab campaign, creative dan ad masih boleh dicipta via API macam biasa. Yang gagal cuma ad set yang target MY.

Kalau korang guna Meta Marketing API atau Claude + Meta Ads MCP untuk iklan Malaysia, artikel ni untuk korang.

Kenapa jadi macam ni?

Puncanya undang-undang. Online Safety Act 2025 dan Risk Mitigation Code MCMC mula berkuat kuasa 1 Jun 2026. Bawah peraturan ni, pengiklan wajib disahkan identiti (MyKad atau SSM) sebelum iklan bertaja boleh disiarkan di Malaysia.

Jadi Meta sekarang nak tahu siapa beneficiary (siapa yang diiklankan) dan siapa payer (siapa yang bayar) untuk setiap ad set yang sampai ke audience Malaysia.

Masalahnya, default advertiser dan payer yang kita set dalam Ads Manager > Advertising settings tu hanya terpakai untuk ad set yang dibina di UI. Ad set yang dicipta via API tak warisi setting tu. Sebab tu UI jalan, API kena tolak.

Apa yang kami cuba, dan tak jalan

Sebelum jumpa jalan keluar, kami dah cuba beberapa benda:

  1. Hantar dsa_beneficiary dan dsa_payor (teks). Tak jalan. Meta tetap tolak.
  2. Duplicate guna source_adset_id. Tak jalan juga.
  3. Hantar field regional dari connector. Connector Meta Ads MCP tak kenal field regional_regulated_categories dan regional_regulation_identities. Bila semak dengan ads_get_field_context, dia pulang unknown_fields. Maksudnya memang tak boleh hantar dari connector buat masa ni.

Workaround lama kami: bina ad set pertama di Ads Manager UI, duplicate di UI, baru guna API untuk targeting, creative dan ad. Boleh jalan, tapi leceh. Setiap kali nak ad set baru, kena bukak UI dulu.

Penemuan: baca balik ad set yang dibina di UI

Satu hari kami terfikir, kalau UI boleh, mesti UI hantar sesuatu yang API tak hantar. Jadi kami GET ad set yang dibina di UI melalui Graph API, minta field regional tu.

Rupanya Ads Manager secara senyap isi dua field ni:

"regional_regulated_categories": ["MALAYSIA_UNIVERSAL", "VOLUNTARY_VERIFICATION"],
"regional_regulation_identities": {
  "universal_beneficiary": "<VERIFIED_IDENTITY_ID>",
  "universal_payer": "<VERIFIED_IDENTITY_ID>"
}
Graph API Explorer: GET ad set yang dibina di Ads Manager menunjukkan regional_regulated_categories MALAYSIA_UNIVERSAL dan VOLUNTARY_VERIFICATION, serta universal_beneficiary dan universal_payer
GET ad set yang dibina di Ads Manager. Field regional diisi secara senyap (ID verified identity di-redact).

Dokumentasi rasmi Meta (Ad Set reference) pun sebut kategori MALAYSIA_UNIVERSAL guna key universal_beneficiary dan universal_payer. Tak ada key malaysia_*, jadi jangan cari.

Yang penting, tak ada endpoint awam untuk senaraikan verified identity ID korang (ada orang tanya pasal ni dalam GitHub facebook-java-business-sdk, issue #493). Sebab tu trik "baca dari ad set UI" ni sangat berguna. Bina satu ad set MY di UI sekali je, baca ID tu, pastu guna untuk semua ad set lepas ni.

Langkah demi langkah

1. Cipta Meta app dengan use case Marketing API

Pergi ke developers.facebook.com, cipta app baru dan pilih use case "Create & manage ads with Marketing API". Sambungkan app tu ke business portfolio korang.

Kenapa app baru? Sebab app lama yang tak ada use case Marketing API sama ada tak ada permission ads langsung, atau keluar mesej "Facebook Login is currently unavailable for this app".

2. Generate access token

Bukak Graph API Explorer. Pilih app yang baru dicipta, pilih User Token, tambah permission ads_management dan ads_read, pastu tekan Generate Access Token.

Panel Graph API Explorer dengan Meta App dipilih, User Token, dan permission ads_management serta ads_read
Graph API Explorer: pilih app baru, User Token, permission ads_management dan ads_read.

Simpan token ni elok-elok. Jangan paste dalam mana-mana tempat awam.

3. GET ad set yang dibina di UI

Ambil ID mana-mana ad set MY yang dibina di Ads Manager UI, pastu:

curl -G "https://graph.facebook.com/v26.0/<ADSET_ID>" \
  -d "fields=name,regional_regulated_categories,regional_regulation_identities" \
  -d "access_token=<ACCESS_TOKEN>"

Salin nilai universal_beneficiary dan universal_payer. Itulah <VERIFIED_IDENTITY_ID> korang.

4. POST ad set baru terus ke Graph API

Sekarang cipta ad set MY terus ke act_<AD_ACCOUNT_ID>/adsets, dengan tiga tambahan penting:

curl -X POST "https://graph.facebook.com/v26.0/act_<AD_ACCOUNT_ID>/adsets" \
  -d "name=Ad set MY via Graph API" \
  -d "campaign_id=<CAMPAIGN_ID>" \
  -d "daily_budget=<DAILY_BUDGET>" \
  -d "billing_event=IMPRESSIONS" \
  -d "optimization_goal=OFFSITE_CONVERSIONS" \
  -d "bid_strategy=LOWEST_COST_WITHOUT_CAP" \
  -d 'promoted_object={"pixel_id":"<PIXEL_ID>","custom_event_type":"PURCHASE"}' \
  -d 'targeting={"geo_locations":{"countries":["MY"]},"publisher_platforms":["facebook"],"facebook_positions":["feed"]}' \
  -d 'attribution_spec=[{"event_type":"CLICK_THROUGH","window_days":7}]' \
  -d 'regional_regulated_categories=["MALAYSIA_UNIVERSAL"]' \
  -d 'regional_regulation_identities={"universal_beneficiary":"<VERIFIED_IDENTITY_ID>","universal_payer":"<VERIFIED_IDENTITY_ID>"}' \
  -d "status=PAUSED" \
  -d "access_token=<ACCESS_TOKEN>"

Tiga baris yang buat beza:

  • regional_regulated_categories=["MALAYSIA_UNIVERSAL"]
  • regional_regulation_identities dengan universal_beneficiary dan universal_payer
  • bid_strategy=LOWEST_COST_WITHOUT_CAP

Field lain (budget, optimization goal, targeting) ikut setting korang sendiri. Contoh atas ni ikut setting yang kami guna.

Hasilnya? Ad set berjaya dicipta, tak ada delivery error. Lega.

Nota dan gotcha

bid_strategy wajib. Bila kami tak letak, Graph API pulang error 2490487: "Bid amount or bid constraints required for bid strategy". Letak LOWEST_COST_WITHOUT_CAP dan error tu hilang.

location_types muncul sendiri. Bila baca balik ad set tu, korang akan nampak location_types (frequently_in, home, recent) walaupun kita tak hantar. Itu Meta auto-isi. Normal, tak perlu risau.

Connector belum sokong. Buat masa ni connector Meta Ads MCP tak kenal field regional tu. Jadi aliran kerja kami sekarang:

  • Ad set MY: cipta via Graph API
  • Campaign, creative, ad: masih via MCP connector dalam Claude

Bila connector dah sokong field ni nanti, semua boleh balik buat dari Claude terus.

Penutup

Error "Advertiser is missing" ni bukan sebab akaun korang bermasalah. Ia sebab peraturan baru Malaysia, dan ad set yang dicipta via API tak warisi setting verified advertiser dari UI.

Cara paling ringkas: bina satu ad set MY di UI, baca verified identity ID dia, pastu hantar MALAYSIA_UNIVERSAL + universal_beneficiary + universal_payer + bid_strategy bila cipta ad set via Graph API. Lepas tu tak payah lagi duplicate di UI setiap kali.

Semoga jimat masa korang macam mana ia jimat masa kami.

Share this article

Comments

0 comments

No comments yet. Start the conversation.

to join the conversation.

Output

Put this to work in your business.

Tell us which task eats your team's week on a free call — or learn to build it yourself in a live class, on Zoom, in Bahasa Melayu.