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
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:
- Hantar
dsa_beneficiarydandsa_payor(teks). Tak jalan. Meta tetap tolak. - Duplicate guna
source_adset_id. Tak jalan juga. - Hantar field regional dari connector. Connector Meta Ads MCP tak kenal field
regional_regulated_categoriesdanregional_regulation_identities. Bila semak denganads_get_field_context, dia pulangunknown_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>"
}
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.

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_identitiesdenganuniversal_beneficiarydanuniversal_payerbid_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.
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.
Comments
0 commentsNo comments yet. Start the conversation.
to join the conversation.