late-sdk 0.0.905 → 0.0.907

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -0
  3. data/docs/AccountWithFollowerStats.md +2 -2
  4. data/docs/AdAccountsApi.md +1 -1
  5. data/docs/AdCampaignsApi.md +71 -1
  6. data/docs/AdCreative.md +4 -0
  7. data/docs/ConnectAds200ResponseOneOf.md +2 -0
  8. data/docs/ConnectApi.md +79 -5
  9. data/docs/CreateStandaloneAdRequest.md +8 -6
  10. data/docs/GooglePmaxAssetGroup.md +28 -0
  11. data/docs/GooglePmaxAssetGroupAssetsInner.md +28 -0
  12. data/docs/GooglePmaxAssetGroupInput.md +32 -0
  13. data/docs/GooglePmaxAssetGroupInputImages.md +22 -0
  14. data/docs/LeadGenApi.md +5 -5
  15. data/docs/ListAdAccounts200ResponseAccountsInner.md +4 -0
  16. data/docs/ListGoogleAssetGroups200Response.md +22 -0
  17. data/docs/SocialAccount.md +2 -2
  18. data/lib/zernio-sdk/api/ad_accounts_api.rb +2 -2
  19. data/lib/zernio-sdk/api/ad_campaigns_api.rb +70 -2
  20. data/lib/zernio-sdk/api/connect_api.rb +91 -6
  21. data/lib/zernio-sdk/api/lead_gen_api.rb +8 -8
  22. data/lib/zernio-sdk/models/account_with_follower_stats.rb +2 -2
  23. data/lib/zernio-sdk/models/ad_creative.rb +21 -1
  24. data/lib/zernio-sdk/models/connect_ads200_response_one_of.rb +45 -1
  25. data/lib/zernio-sdk/models/create_standalone_ad200_response_results_inner.rb +2 -2
  26. data/lib/zernio-sdk/models/create_standalone_ad_request.rb +18 -9
  27. data/lib/zernio-sdk/models/google_pmax_asset_group.rb +299 -0
  28. data/lib/zernio-sdk/models/google_pmax_asset_group_assets_inner.rb +244 -0
  29. data/lib/zernio-sdk/models/google_pmax_asset_group_input.rb +453 -0
  30. data/lib/zernio-sdk/models/google_pmax_asset_group_input_images.rb +280 -0
  31. data/lib/zernio-sdk/models/list_ad_accounts200_response_accounts_inner.rb +21 -1
  32. data/lib/zernio-sdk/models/list_google_asset_groups200_response.rb +204 -0
  33. data/lib/zernio-sdk/models/social_account.rb +2 -2
  34. data/lib/zernio-sdk/version.rb +1 -1
  35. data/lib/zernio-sdk.rb +5 -0
  36. data/openapi.yaml +277 -14
  37. data/spec/api/ad_accounts_api_spec.rb +1 -1
  38. data/spec/api/ad_campaigns_api_spec.rb +13 -1
  39. data/spec/api/connect_api_spec.rb +19 -3
  40. data/spec/api/lead_gen_api_spec.rb +4 -4
  41. data/spec/models/ad_creative_spec.rb +12 -0
  42. data/spec/models/connect_ads200_response_one_of_spec.rb +10 -0
  43. data/spec/models/create_standalone_ad200_response_results_inner_spec.rb +1 -1
  44. data/spec/models/create_standalone_ad_request_spec.rb +7 -1
  45. data/spec/models/google_pmax_asset_group_assets_inner_spec.rb +66 -0
  46. data/spec/models/google_pmax_asset_group_input_images_spec.rb +48 -0
  47. data/spec/models/google_pmax_asset_group_input_spec.rb +78 -0
  48. data/spec/models/google_pmax_asset_group_spec.rb +66 -0
  49. data/spec/models/list_ad_accounts200_response_accounts_inner_spec.rb +12 -0
  50. data/spec/models/list_google_asset_groups200_response_spec.rb +48 -0
  51. data/zernio-sdk-0.0.907.gem +0 -0
  52. metadata +22 -2
  53. data/zernio-sdk-0.0.905.gem +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cc564a09e08a5c4caf2ad2af1da06d6fa117f751b638afd5985bc7e8177acdeb
4
- data.tar.gz: 814d1d115a66d0c6b8ea7b3e74f5e3420eee3821742c4794ee21bd92bd7bab91
3
+ metadata.gz: d5b5b37d4302d16eccf6cfc7d479874400ca3306ea16f10cd3bb2f50d1d75fbd
4
+ data.tar.gz: 502816b46baa400b1e42f1ba0ad2694c4e7328eeb33bb105b34e1de64eff118b
5
5
  SHA512:
6
- metadata.gz: 9023ceaf046c1b7d7f457233db11fdb9afb60b464e3b59b818e7afffcdfe0d5f278babf228cc9baedafef6e425b5e977be3a32c4aeffcef778e2e2f4c9885509
7
- data.tar.gz: 5c828499382dc76650229c8e4bac8d29990cddfb5da83d89020f435f0592249867c99ad17d6ebb92ffbd88905ce4e97e1267502d18319cc2537b48a9c8d60fe5
6
+ metadata.gz: 67b3de9c8d3252daa273fefb3201df65bee5afdc2571396bbff6fa09f1b378d1a53b00a196b4855601e7afca08093145a5285a079ed52ce72a782f1549179f52
7
+ data.tar.gz: 516a3931f955fa493ace79903f1ff1ec50e5e30f9edd0e4b0a68985681e41a3bca3f6c6526e529c24533296c42874569c0f6cbc5a53602f6f37ec489304047d7
data/README.md CHANGED
@@ -188,6 +188,7 @@ Class | Method | HTTP request | Description
188
188
  *Zernio::AdCampaignsApi* | [**list_campaign_assets**](docs/AdCampaignsApi.md#list_campaign_assets) | **GET** /v1/ads/campaigns/{campaignId}/assets | List campaign assets
189
189
  *Zernio::AdCampaignsApi* | [**list_campaign_negative_keyword_lists**](docs/AdCampaignsApi.md#list_campaign_negative_keyword_lists) | **GET** /v1/ads/campaigns/{campaignId}/negative-keyword-lists | List campaign negative lists
190
190
  *Zernio::AdCampaignsApi* | [**list_campaign_negative_keywords**](docs/AdCampaignsApi.md#list_campaign_negative_keywords) | **GET** /v1/ads/campaigns/{campaignId}/negative-keywords | List campaign-level negative keywords
191
+ *Zernio::AdCampaignsApi* | [**list_google_asset_groups**](docs/AdCampaignsApi.md#list_google_asset_groups) | **GET** /v1/ads/campaigns/{campaignId}/asset-groups | List Performance Max asset groups
191
192
  *Zernio::AdCampaignsApi* | [**remove_ad_group_assets**](docs/AdCampaignsApi.md#remove_ad_group_assets) | **DELETE** /v1/ads/ad-sets/{adSetId}/assets | Remove ad-group assets
192
193
  *Zernio::AdCampaignsApi* | [**remove_ad_keyword**](docs/AdCampaignsApi.md#remove_ad_keyword) | **DELETE** /v1/ads/keywords/{keywordId} | Remove a Search keyword
193
194
  *Zernio::AdCampaignsApi* | [**remove_campaign_assets**](docs/AdCampaignsApi.md#remove_campaign_assets) | **DELETE** /v1/ads/campaigns/{campaignId}/assets | Remove campaign assets
@@ -359,6 +360,7 @@ Class | Method | HTTP request | Description
359
360
  *Zernio::CommentsApi* | [**unlike_inbox_comment**](docs/CommentsApi.md#unlike_inbox_comment) | **DELETE** /v1/inbox/comments/{postId}/{commentId}/like | Unlike comment
360
361
  *Zernio::CommentsApi* | [**unlike_post**](docs/CommentsApi.md#unlike_post) | **DELETE** /v1/inbox/posts/{postId}/like | Unlike post
361
362
  *Zernio::ConnectApi* | [**assign_google_business_location**](docs/ConnectApi.md#assign_google_business_location) | **POST** /v1/accounts/{accountId}/gmb-locations/assign | Assign Google Business Profile location to another profile
363
+ *Zernio::ConnectApi* | [**complete_meta_ads_business_login**](docs/ConnectApi.md#complete_meta_ads_business_login) | **GET** /v1/connect/meta-ads/callback | Complete Meta business login
362
364
  *Zernio::ConnectApi* | [**complete_telegram_connect**](docs/ConnectApi.md#complete_telegram_connect) | **PATCH** /v1/connect/telegram | Check Telegram status
363
365
  *Zernio::ConnectApi* | [**complete_whats_app_phone_selection**](docs/ConnectApi.md#complete_whats_app_phone_selection) | **POST** /v1/connect/whatsapp/select-phone-number | Complete number selection
364
366
  *Zernio::ConnectApi* | [**configure_tik_tok_ads_brand_identity**](docs/ConnectApi.md#configure_tik_tok_ads_brand_identity) | **PATCH** /v1/connect/tiktok-ads | Set TikTok brand identity
@@ -1699,6 +1701,10 @@ Class | Method | HTTP request | Description
1699
1701
  - [Zernio::GoogleBusinessReview](docs/GoogleBusinessReview.md)
1700
1702
  - [Zernio::GoogleBusinessReviewReviewReply](docs/GoogleBusinessReviewReviewReply.md)
1701
1703
  - [Zernio::GoogleBusinessReviewReviewer](docs/GoogleBusinessReviewReviewer.md)
1704
+ - [Zernio::GooglePmaxAssetGroup](docs/GooglePmaxAssetGroup.md)
1705
+ - [Zernio::GooglePmaxAssetGroupAssetsInner](docs/GooglePmaxAssetGroupAssetsInner.md)
1706
+ - [Zernio::GooglePmaxAssetGroupInput](docs/GooglePmaxAssetGroupInput.md)
1707
+ - [Zernio::GooglePmaxAssetGroupInputImages](docs/GooglePmaxAssetGroupInputImages.md)
1702
1708
  - [Zernio::GoogleRsaDescription](docs/GoogleRsaDescription.md)
1703
1709
  - [Zernio::GoogleRsaHeadline](docs/GoogleRsaHeadline.md)
1704
1710
  - [Zernio::GoogleSitelink](docs/GoogleSitelink.md)
@@ -1871,6 +1877,7 @@ Class | Method | HTTP request | Description
1871
1877
  - [Zernio::ListFacebookPages200ResponsePagesInner](docs/ListFacebookPages200ResponsePagesInner.md)
1872
1878
  - [Zernio::ListFormLeads200Response](docs/ListFormLeads200Response.md)
1873
1879
  - [Zernio::ListFormLeads200ResponseLeadsInner](docs/ListFormLeads200ResponseLeadsInner.md)
1880
+ - [Zernio::ListGoogleAssetGroups200Response](docs/ListGoogleAssetGroups200Response.md)
1874
1881
  - [Zernio::ListGoogleBusinessLocations200Response](docs/ListGoogleBusinessLocations200Response.md)
1875
1882
  - [Zernio::ListGoogleBusinessLocations200ResponseLocationsInner](docs/ListGoogleBusinessLocations200ResponseLocationsInner.md)
1876
1883
  - [Zernio::ListGoogleBusinessMedia200Response](docs/ListGoogleBusinessMedia200Response.md)
@@ -15,9 +15,9 @@
15
15
  | **needs_reconnection** | **Boolean** | The platform definitively reported the stored OAuth token as dead. While true, GET /v1/connect/{platform}/ads returns a fresh authUrl (implicit force=true) instead of alreadyConnected, so re-running the connect flow recovers the account. Cleared automatically when the account is re-authorized. | [optional] |
16
16
  | **followers_count** | **Float** | Follower count (only included if user has analytics add-on) | [optional] |
17
17
  | **followers_last_updated** | **Time** | Last time follower count was updated (only included if user has analytics add-on) | [optional] |
18
- | **parent_account_id** | **String** | Reference to the parent posting SocialAccount. Set for ads accounts that share or derive from a posting account's OAuth token. null for standalone ads (Google Ads) and all posting accounts. | [optional] |
18
+ | **parent_account_id** | **String** | Reference to the parent posting SocialAccount. Set for ads accounts that share or derive from a posting account's OAuth token. null for standalone ads (Google Ads) and all posting accounts. Meta ads business-login accounts also have no parent. | [optional] |
19
19
  | **enabled** | **Boolean** | Whether the user explicitly activated this account. false means the account was created as a side effect (e.g., posting account auto-created when user connected ads first). Such accounts are hidden from this list, cannot be posted to (`ACCOUNT_NOT_ENABLED_FOR_POSTING`), and are not billed as connected accounts. | [optional] |
20
- | **metadata** | **Object** | Platform-specific metadata. Fields vary by platform. For WhatsApp accounts, includes: - qualityRating: Phone number quality rating from Meta (GREEN, YELLOW, RED, or UNKNOWN) - nameStatus: Display name review status (APPROVED, PENDING_REVIEW, DECLINED, or NONE). A declined or pending display name does not by itself block sending; sendability is reported separately via health_status (can_send_message). - messagingLimitTier: Maximum unique business-initiated conversations per 24h rolling window (TIER_250, TIER_1K, TIER_10K, TIER_100K, or TIER_UNLIMITED). Scales automatically as quality rating improves. - verifiedName: Meta-verified business display name - displayPhoneNumber: Formatted phone number (e.g., \"+1 555-123-4567\") - wabaId: WhatsApp Business Account ID - phoneNumberId: Meta phone number ID For LinkedIn accounts, profileData carries the profile details refreshed on each daily snapshot: - profileData.bio: The member's headline for personal accounts, or the organization description for organization accounts. null when the member has not set one. - profileData.extraData.vanityName: The member's profile slug, i.e. the /in/{vanityName} segment of profileUrl. Personal accounts only; an organization's own slug is in metadata.organizationInfo.vanityName. | [optional] |
20
+ | **metadata** | **Object** | Platform-specific metadata. Fields vary by platform. For WhatsApp accounts, includes: - qualityRating: Phone number quality rating from Meta (GREEN, YELLOW, RED, or UNKNOWN) - nameStatus: Display name review status (APPROVED, PENDING_REVIEW, DECLINED, or NONE). A declined or pending display name does not by itself block sending; sendability is reported separately via health_status (can_send_message). - messagingLimitTier: Maximum unique business-initiated conversations per 24h rolling window (TIER_250, TIER_1K, TIER_10K, TIER_100K, or TIER_UNLIMITED). Scales automatically as quality rating improves. - verifiedName: Meta-verified business display name - displayPhoneNumber: Formatted phone number (e.g., \"+1 555-123-4567\") - wabaId: WhatsApp Business Account ID - phoneNumberId: Meta phone number ID For Meta ads business-login accounts: - tokenType: system-user - businessId: The owning Business Manager ID when there is one owner; null for multiple owners. - businessIds: Owning Business Manager IDs discovered from granted ad accounts. - grantedAdAccountIds: Ad-account IDs granted to the token. - adAccountBusinesses: Map from ad-account ID to its owning business ID or null. - availablePages: Granted Page IDs and names. No Page tokens are exposed. - selectedPageId: The Page selected for creatives and lead forms, or null. - scopedAdAccountIds: Existing sync scope preserved on reconnect. Non-expiring tokens have no tokenExpiresAt field. Parent posting reconnects do not replace this token. For LinkedIn accounts, profileData carries the profile details refreshed on each daily snapshot: - profileData.bio: The member's headline for personal accounts, or the organization description for organization accounts. null when the member has not set one. - profileData.extraData.vanityName: The member's profile slug, i.e. the /in/{vanityName} segment of profileUrl. Personal accounts only; an organization's own slug is in metadata.organizationInfo.vanityName. | [optional] |
21
21
  | **current_followers** | **Float** | Current follower count | [optional] |
22
22
  | **last_updated** | **Time** | | [optional] |
23
23
  | **growth** | **Float** | Follower change over period | [optional] |
@@ -1732,7 +1732,7 @@ end
1732
1732
 
1733
1733
  List ad accounts
1734
1734
 
1735
- Returns the platform ad accounts available for the given account (e.g. Meta ad accounts, TikTok advertiser IDs, Google Ads customer IDs). For TikTok agencies: enumerates every advertiser under every Business Center the token can read (paginated server-side), then chunks the lookup against TikTok's `/advertiser/info/` endpoint (which has a per-call cap of ≤100 IDs). Solo advertisers without a BC fall back to the OAuth-time `advertiser_ids` list. Cached for 1h on the SocialAccount; lazy-refreshed on first call after expiry. For Google Ads: responds `429` when Google's API quota is temporarily exhausted (instead of an empty list). Retry after a delay.
1735
+ Returns the platform ad accounts available for the given account (e.g. Meta ad accounts, TikTok advertiser IDs, Google Ads customer IDs). Meta business-login accounts use their own system-user token. Fresh Meta discovery includes businessId and businessName from the owning Business Manager when available; cached entries gain these fields after the next discovery refresh. For TikTok agencies: enumerates every advertiser under every Business Center the token can read (paginated server-side), then chunks the lookup against TikTok's `/advertiser/info/` endpoint (which has a per-call cap of ≤100 IDs). Solo advertisers without a BC fall back to the OAuth-time `advertiser_ids` list. Cached for 1h on the SocialAccount; lazy-refreshed on first call after expiry. For Google Ads: responds `429` when Google's API quota is temporarily exhausted (instead of an empty list). Retry after a delay.
1736
1736
 
1737
1737
  ### Examples
1738
1738
 
@@ -34,6 +34,7 @@ All URIs are relative to *https://zernio.com/api*
34
34
  | [**list_campaign_assets**](AdCampaignsApi.md#list_campaign_assets) | **GET** /v1/ads/campaigns/{campaignId}/assets | List campaign assets |
35
35
  | [**list_campaign_negative_keyword_lists**](AdCampaignsApi.md#list_campaign_negative_keyword_lists) | **GET** /v1/ads/campaigns/{campaignId}/negative-keyword-lists | List campaign negative lists |
36
36
  | [**list_campaign_negative_keywords**](AdCampaignsApi.md#list_campaign_negative_keywords) | **GET** /v1/ads/campaigns/{campaignId}/negative-keywords | List campaign-level negative keywords |
37
+ | [**list_google_asset_groups**](AdCampaignsApi.md#list_google_asset_groups) | **GET** /v1/ads/campaigns/{campaignId}/asset-groups | List Performance Max asset groups |
37
38
  | [**remove_ad_group_assets**](AdCampaignsApi.md#remove_ad_group_assets) | **DELETE** /v1/ads/ad-sets/{adSetId}/assets | Remove ad-group assets |
38
39
  | [**remove_ad_keyword**](AdCampaignsApi.md#remove_ad_keyword) | **DELETE** /v1/ads/keywords/{keywordId} | Remove a Search keyword |
39
40
  | [**remove_campaign_assets**](AdCampaignsApi.md#remove_campaign_assets) | **DELETE** /v1/ads/campaigns/{campaignId}/assets | Remove campaign assets |
@@ -626,7 +627,7 @@ end
626
627
 
627
628
  Create standalone ad
628
629
 
629
- Create a paid ad with custom creative across Meta, Google Ads, Pinterest, TikTok, X, LinkedIn, and OpenAI Ads (ChatGPT Ads). Three mutually-exclusive request shapes are selected by the body: - Legacy single-creative shape (all platforms, the default). - Meta-only multi-creative shape via the creatives array: one ad set with N ads sharing budget and targeting. - Attach shape via adSetId: adds one new ad to an existing ad set, inheriting its budget, targeting, and schedule (Meta, Google Ads, TikTok, and LinkedIn). On LinkedIn adSetId is the existing Campaign id, and the budget, schedule, targeting and bidding fields must be omitted. Meta accepts `promotion` and `creativeFeatures` on the single and attach shapes and as defaults for `creatives[]`. An item replaces the whole feature map; its `promotion` replaces the default offer, and `promotion: null` disables that default for the item. Reusing `existingCreativeId` uses the existing creative settings instead of new settings. Requested settings are persisted for lists, exports, and default ad-detail reads. Only ads supplied a `promotion` receive live readback; multi-create batches those reads in groups of up to 50 IDs without per-ad fallback. Inspect `ad.creative.promotionStatus` (or `ads[].creative.promotionStatus`). `not_returned` means Meta omitted the metadata; successful creation does not by itself prove the offer was applied or will display. Per-platform required fields, budget minimums, and video-ad rules are documented on each property below. LinkedIn creates a Single Image or Single Video Ad backed by a Direct Sponsored Content \"dark post\" authored by a Company Page (see `organizationId`). Supported goals are engagement, traffic, awareness, and video_views (video ads use the `video` field; video_views requires a video), and traffic ads require `linkUrl`. **Idempotency:** this endpoint is not idempotent at the platform level (a blind retry creates a second campaign/ad set/ad). Send an `Idempotency-Key` header to make retries safe: the first request with a given key creates the ad and we store the response; a retry with the same key replays that exact response (with `Idempotent-Replayed: true`) instead of creating duplicates. Reusing a key with a different body returns 422; a key whose first request is still in flight returns 409 (retry after a short backoff). Keys are scoped to your credential and expire after 24h.
630
+ Create a paid ad with custom creative across Meta, Google Ads, Pinterest, TikTok, X, LinkedIn, and OpenAI Ads (ChatGPT Ads). Google Performance Max: set `campaignType: \"pmax\"` and supply `assetGroup` with text, images by role, business name and finalUrl. Creates a daily budget, PAUSED campaign and asset group atomically. `validateOnly: true` validates the complete request with Google without creating or persisting resources. Read assets with `GET /v1/ads/campaigns/{campaignId}/asset-groups`. The logo is required; video is optional via `assetGroup.youtubeVideoId`. Brand guidelines are disabled at creation. PMax rejects ACTIVE creation, portfolio bidding, bid caps, legacy creative fields and attach shapes. Geo and language targeting are supported; omitted geo targets all locations. PMax does not require top-level goal, headline, body or linkUrl. Supported bidding: omitted or LOWEST_COST_WITHOUT_CAP for Maximize Conversions, COST_CAP plus bidAmount for target CPA, LOWEST_COST_WITH_MIN_ROAS plus roasAverageFloor for Maximize Conversion Value with target ROAS. Other mutually-exclusive request shapes are selected by the body: - Legacy single-creative shape (all platforms, the default). - Meta-only multi-creative shape via the creatives array: one ad set with N ads sharing budget and targeting. - Attach shape via adSetId: adds one new ad to an existing ad set, inheriting its budget, targeting, and schedule (Meta, Google Ads, TikTok, and LinkedIn). On LinkedIn adSetId is the existing Campaign id, and the budget, schedule, targeting and bidding fields must be omitted. Meta accepts `promotion` and `creativeFeatures` on the single and attach shapes and as defaults for `creatives[]`. An item replaces the whole feature map; its `promotion` replaces the default offer, and `promotion: null` disables that default for the item. Reusing `existingCreativeId` uses the existing creative settings instead of new settings. Requested settings are persisted for lists, exports, and default ad-detail reads. Only ads supplied a `promotion` receive live readback; multi-create batches those reads in groups of up to 50 IDs without per-ad fallback. Inspect `ad.creative.promotionStatus` (or `ads[].creative.promotionStatus`). `not_returned` means Meta omitted the metadata; successful creation does not by itself prove the offer was applied or will display. Per-platform required fields, budget minimums, and video-ad rules are documented on each property below. LinkedIn creates a Single Image or Single Video Ad backed by a Direct Sponsored Content \"dark post\" authored by a Company Page (see `organizationId`). Supported goals are engagement, traffic, awareness, and video_views (video ads use the `video` field; video_views requires a video), and traffic ads require `linkUrl`. **Idempotency:** this endpoint is not idempotent at the platform level (a blind retry creates a second campaign/ad set/ad). Send an `Idempotency-Key` header to make retries safe: the first request with a given key creates the ad and we store the response; a retry with the same key replays that exact response (with `Idempotent-Replayed: true`) instead of creating duplicates. Reusing a key with a different body returns 422; a key whose first request is still in flight returns 409 (retry after a short backoff). Keys are scoped to your credential and expire after 24h.
630
631
 
631
632
  ### Examples
632
633
 
@@ -2344,6 +2345,75 @@ end
2344
2345
  - **Accept**: application/json
2345
2346
 
2346
2347
 
2348
+ ## list_google_asset_groups
2349
+
2350
+ > <ListGoogleAssetGroups200Response> list_google_asset_groups(campaign_id)
2351
+
2352
+ List Performance Max asset groups
2353
+
2354
+ Read Performance Max asset groups and their linked text, image and YouTube assets. campaignId is the platform campaign id returned by creation or the campaign list. The campaign must be visible to the caller. Uses a 10-minute cache, with the last successful response served as stale when Google quota is exhausted. Removed groups and asset links are excluded. Campaign-level brand assets on campaigns with brand guidelines enabled are not included.
2355
+
2356
+ ### Examples
2357
+
2358
+ ```ruby
2359
+ require 'time'
2360
+ require 'zernio-sdk'
2361
+ # setup authorization
2362
+ Zernio.configure do |config|
2363
+ # Configure Bearer authorization (JWT): bearerAuth
2364
+ config.access_token = 'YOUR_BEARER_TOKEN'
2365
+ end
2366
+
2367
+ api_instance = Zernio::AdCampaignsApi.new
2368
+ campaign_id = 'campaign_id_example' # String | Google Ads campaign id.
2369
+
2370
+ begin
2371
+ # List Performance Max asset groups
2372
+ result = api_instance.list_google_asset_groups(campaign_id)
2373
+ p result
2374
+ rescue Zernio::ApiError => e
2375
+ puts "Error when calling AdCampaignsApi->list_google_asset_groups: #{e}"
2376
+ end
2377
+ ```
2378
+
2379
+ #### Using the list_google_asset_groups_with_http_info variant
2380
+
2381
+ This returns an Array which contains the response data, status code and headers.
2382
+
2383
+ > <Array(<ListGoogleAssetGroups200Response>, Integer, Hash)> list_google_asset_groups_with_http_info(campaign_id)
2384
+
2385
+ ```ruby
2386
+ begin
2387
+ # List Performance Max asset groups
2388
+ data, status_code, headers = api_instance.list_google_asset_groups_with_http_info(campaign_id)
2389
+ p status_code # => 2xx
2390
+ p headers # => { ... }
2391
+ p data # => <ListGoogleAssetGroups200Response>
2392
+ rescue Zernio::ApiError => e
2393
+ puts "Error when calling AdCampaignsApi->list_google_asset_groups_with_http_info: #{e}"
2394
+ end
2395
+ ```
2396
+
2397
+ ### Parameters
2398
+
2399
+ | Name | Type | Description | Notes |
2400
+ | ---- | ---- | ----------- | ----- |
2401
+ | **campaign_id** | **String** | Google Ads campaign id. | |
2402
+
2403
+ ### Return type
2404
+
2405
+ [**ListGoogleAssetGroups200Response**](ListGoogleAssetGroups200Response.md)
2406
+
2407
+ ### Authorization
2408
+
2409
+ [bearerAuth](../README.md#bearerAuth)
2410
+
2411
+ ### HTTP request headers
2412
+
2413
+ - **Content-Type**: Not defined
2414
+ - **Accept**: application/json
2415
+
2416
+
2347
2417
  ## remove_ad_group_assets
2348
2418
 
2349
2419
  > <RemoveCampaignAssets200Response> remove_ad_group_assets(ad_set_id, remove_ad_group_assets_request)
data/docs/AdCreative.md CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
  | Name | Type | Description | Notes |
6
6
  | ---- | ---- | ----------- | ----- |
7
+ | **asset_group** | [**GooglePmaxAssetGroupInput**](GooglePmaxAssetGroupInput.md) | Initial Performance Max asset group input. Use the asset-groups endpoint for current Google assets. | [optional] |
8
+ | **asset_group_resource_name** | **String** | Google resource name of the created Performance Max asset group. | [optional] |
7
9
  | **headlines** | [**Array&lt;GoogleRsaHeadline&gt;**](GoogleRsaHeadline.md) | Google RSA only. Replaces the complete headline list. No padding or truncation on update. | [optional] |
8
10
  | **descriptions** | [**Array&lt;GoogleRsaDescription&gt;**](GoogleRsaDescription.md) | Google RSA only. Replaces the complete description list. No padding or truncation on update. | [optional] |
9
11
  | **final_urls** | **Array&lt;String&gt;** | Google RSA only. Replaces final URLs. Omitted lists stay unchanged. | [optional] |
@@ -39,6 +41,8 @@
39
41
  require 'zernio-sdk'
40
42
 
41
43
  instance = Zernio::AdCreative.new(
44
+ asset_group: null,
45
+ asset_group_resource_name: customers/9122445560/assetGroups/123456789,
42
46
  headlines: null,
43
47
  descriptions: null,
44
48
  final_urls: null,
@@ -9,6 +9,7 @@
9
9
  | **platform** | **String** | | [optional] |
10
10
  | **username** | **String** | | [optional] |
11
11
  | **display_name** | **String** | | [optional] |
12
+ | **token_type** | **String** | Present for an existing business-login connection. | [optional] |
12
13
  | **scoped_ad_account_ids** | **Array&lt;String&gt;** | Echo of the persisted ad-account scope when the caller passed &#x60;adAccountId&#x60; / &#x60;adAccountIds&#x60;. Omitted when no scope is set. | [optional] |
13
14
 
14
15
  ## Example
@@ -22,6 +23,7 @@ instance = Zernio::ConnectAds200ResponseOneOf.new(
22
23
  platform: null,
23
24
  username: null,
24
25
  display_name: null,
26
+ token_type: null,
25
27
  scoped_ad_account_ids: [&quot;act_1330190928038136&quot;]
26
28
  )
27
29
  ```
data/docs/ConnectApi.md CHANGED
@@ -5,6 +5,7 @@ All URIs are relative to *https://zernio.com/api*
5
5
  | Method | HTTP request | Description |
6
6
  | ------ | ------------ | ----------- |
7
7
  | [**assign_google_business_location**](ConnectApi.md#assign_google_business_location) | **POST** /v1/accounts/{accountId}/gmb-locations/assign | Assign Google Business Profile location to another profile |
8
+ | [**complete_meta_ads_business_login**](ConnectApi.md#complete_meta_ads_business_login) | **GET** /v1/connect/meta-ads/callback | Complete Meta business login |
8
9
  | [**complete_telegram_connect**](ConnectApi.md#complete_telegram_connect) | **PATCH** /v1/connect/telegram | Check Telegram status |
9
10
  | [**complete_whats_app_phone_selection**](ConnectApi.md#complete_whats_app_phone_selection) | **POST** /v1/connect/whatsapp/select-phone-number | Complete number selection |
10
11
  | [**configure_tik_tok_ads_brand_identity**](ConnectApi.md#configure_tik_tok_ads_brand_identity) | **PATCH** /v1/connect/tiktok-ads | Set TikTok brand identity |
@@ -128,6 +129,75 @@ end
128
129
  - **Accept**: application/json
129
130
 
130
131
 
132
+ ## complete_meta_ads_business_login
133
+
134
+ > complete_meta_ads_business_login(state, opts)
135
+
136
+ Complete Meta business login
137
+
138
+ Facebook Login for Business redirect target. Meta supplies the single-use authorization code and the authenticated state returned by connectAds. The state expires after 30 minutes and binds the user, profile, Page selection and ad-account scope. No bearer token is sent by the browser. Success reconnects only metaads and redirects to the original redirect_url. Invalid state returns 400; inaccessible profiles or missing ads access cannot connect. No token is returned to the browser.
139
+
140
+ ### Examples
141
+
142
+ ```ruby
143
+ require 'time'
144
+ require 'zernio-sdk'
145
+
146
+ api_instance = Zernio::ConnectApi.new
147
+ state = 'ENCRYPTED_STATE' # String | Authenticated state from the initial connectAds response.
148
+ opts = {
149
+ code: 'code_example', # String | Single-use authorization code returned by Meta.
150
+ error: 'error_example' # String | Meta authorization error when the user declines the dialog.
151
+ }
152
+
153
+ begin
154
+ # Complete Meta business login
155
+ api_instance.complete_meta_ads_business_login(state, opts)
156
+ rescue Zernio::ApiError => e
157
+ puts "Error when calling ConnectApi->complete_meta_ads_business_login: #{e}"
158
+ end
159
+ ```
160
+
161
+ #### Using the complete_meta_ads_business_login_with_http_info variant
162
+
163
+ This returns an Array which contains the response data (`nil` in this case), status code and headers.
164
+
165
+ > <Array(nil, Integer, Hash)> complete_meta_ads_business_login_with_http_info(state, opts)
166
+
167
+ ```ruby
168
+ begin
169
+ # Complete Meta business login
170
+ data, status_code, headers = api_instance.complete_meta_ads_business_login_with_http_info(state, opts)
171
+ p status_code # => 2xx
172
+ p headers # => { ... }
173
+ p data # => nil
174
+ rescue Zernio::ApiError => e
175
+ puts "Error when calling ConnectApi->complete_meta_ads_business_login_with_http_info: #{e}"
176
+ end
177
+ ```
178
+
179
+ ### Parameters
180
+
181
+ | Name | Type | Description | Notes |
182
+ | ---- | ---- | ----------- | ----- |
183
+ | **state** | **String** | Authenticated state from the initial connectAds response. | |
184
+ | **code** | **String** | Single-use authorization code returned by Meta. | [optional] |
185
+ | **error** | **String** | Meta authorization error when the user declines the dialog. | [optional] |
186
+
187
+ ### Return type
188
+
189
+ nil (empty response body)
190
+
191
+ ### Authorization
192
+
193
+ No authorization required
194
+
195
+ ### HTTP request headers
196
+
197
+ - **Content-Type**: Not defined
198
+ - **Accept**: application/json
199
+
200
+
131
201
  ## complete_telegram_connect
132
202
 
133
203
  > <CompleteTelegramConnect200Response> complete_telegram_connect(code)
@@ -345,7 +415,7 @@ end
345
415
 
346
416
  Connect ads for a platform
347
417
 
348
- Unified ads connection endpoint. Creates a dedicated ads SocialAccount for the specified platform. **Same-token platforms (facebook, instagram, linkedin, pinterest).** The ads SocialAccount (metaads, linkedinads, pinterestads) reuses the OAuth token of the parent posting account, but only when an active parent exists and, for facebook and instagram, its stored token carries ads_management and ads_read (linkedin and pinterest need no extra scope). In that case no extra OAuth happens and the response is alreadyConnected: true. When no such parent exists, or the scopes are missing, the endpoint returns an authUrl and a full OAuth round trip is required. When a parent exists but carries no token usable for ad accounts, the call fails with 400 RECONNECT_REQUIRED. Independently of the branch, the call can return 403 ADS_ADDON_REQUIRED without the ads add-on and 402 PAYMENT_REQUIRED when the billing gate is closed. Meta Ads prerequisite: connecting Meta Ads (via facebook or instagram) requires a Facebook Page. Not because the ad account is read through a Page, but because both parent posting accounts are: the facebook flow only offers Pages you manage, and the instagram flow with loginMethod=facebook_login only offers Instagram accounts linked to one of those Pages. Without a Page there is no parent account to inherit a token from. A user who manages no Facebook Page cannot complete this connection, and the facebook flow ends with error=no_facebook_pages. **Separate-token platforms (tiktok, twitter).** Starts the platform-specific marketing API OAuth flow and creates an ads SocialAccount (tiktokads, xads) with its own token. If the ads account already exists, returns alreadyConnected: true. - tiktok: accountId is OPTIONAL. With accountId, the new tiktokads account links to that posting account (parentAccountId set), so Spark Ads + standalone ads using the posting TT_USER identity become available. Without accountId, ads-only mode kicks in: the new tiktokads account has parentAccountId=null and standalone ads use a synthetic CUSTOMIZED_USER (\"Brand Identity\"); Spark Ads are unavailable because TikTok requires a posting account for them. The Brand Identity is configured separately via PATCH /v1/connect/tiktok-ads (or inline on POST /v1/ads/create via the brandIdentity field). - twitter (X Ads): accountId is REQUIRED. There's no ads-only mode, because tweets need to be authored by a real X user. **Standalone platforms (googleads).** Starts the Google Ads OAuth flow and creates a standalone ads SocialAccount (googleads) with no parent. If the account already exists, returns alreadyConnected: true. Ads accounts appear as regular SocialAccount documents with ads platform values (e.g., metaads, tiktokads) in GET /v1/accounts.
418
+ Unified ads connection endpoint. Creates a dedicated ads SocialAccount for the specified platform. **Meta business login (opt-in).** Set `loginMode=business` for `facebook` or `instagram` to use Facebook Login for Business and a Business Integration System User token. No posting account is created or required. This mode always returns an authUrl; it returns 503 when the server has no META_ADS_CONFIG_ID. Complete the dialog in a browser. The callback creates or reconnects only the metaads account, preserving its ID, history and scopedAdAccountIds. Non-empty successful subscription results replace subscribedAdAccountIds to remove stale grants; an empty result leaves routing unchanged. A reconnect must grant every previously scoped ad account (or every previous grant for an unscoped connection). Missing or unverifiable grants return 409 before changing the account. Pass `pageId` to select a granted Page for creatives and lead forms. Otherwise the previous Page or sole granted Page is selected. Multiple Pages without a selection return 400 with available Page IDs; restart with pageId. With no Pages granted the account can manage campaigns and sync insights but cannot create Page-based creatives or list Page forms. Success redirects with connected=metaads, profileId and accountId. Business login reports metadata.tokenType=system-user in GET /v1/accounts. An absent Meta expires_in leaves tokenExpiresAt absent; no personal-token re-exchange occurs. Subsequent classic requests can change the ad-account scope using the business token; force=true requires loginMode=business to reconnect that connection. **Same-token platforms (facebook, instagram, linkedin, pinterest).** The ads SocialAccount (metaads, linkedinads, pinterestads) reuses the OAuth token of the parent posting account, but only when an active parent exists and, for facebook and instagram, its stored token carries ads_management and ads_read (linkedin and pinterest need no extra scope). In that case no extra OAuth happens and the response is alreadyConnected: true. When no such parent exists, or the scopes are missing, the endpoint returns an authUrl and a full OAuth round trip is required. When a parent exists but carries no token usable for ad accounts, the call fails with 400 RECONNECT_REQUIRED. Independently of the branch, the call can return 403 ADS_ADDON_REQUIRED without the ads add-on and 402 PAYMENT_REQUIRED when the billing gate is closed. Meta Ads prerequisite: connecting Meta Ads (via facebook or instagram) requires a Facebook Page. Not because the ad account is read through a Page, but because both parent posting accounts are: the facebook flow only offers Pages you manage, and the instagram flow with loginMethod=facebook_login only offers Instagram accounts linked to one of those Pages. Without a Page there is no parent account to inherit a token from. A user who manages no Facebook Page cannot complete this connection, and the facebook flow ends with error=no_facebook_pages. **Separate-token platforms (tiktok, twitter).** Starts the platform-specific marketing API OAuth flow and creates an ads SocialAccount (tiktokads, xads) with its own token. If the ads account already exists, returns alreadyConnected: true. - tiktok: accountId is OPTIONAL. With accountId, the new tiktokads account links to that posting account (parentAccountId set), so Spark Ads + standalone ads using the posting TT_USER identity become available. Without accountId, ads-only mode kicks in: the new tiktokads account has parentAccountId=null and standalone ads use a synthetic CUSTOMIZED_USER (\"Brand Identity\"); Spark Ads are unavailable because TikTok requires a posting account for them. The Brand Identity is configured separately via PATCH /v1/connect/tiktok-ads (or inline on POST /v1/ads/create via the brandIdentity field). - twitter (X Ads): accountId is REQUIRED. There's no ads-only mode, because tweets need to be authored by a real X user. **Standalone platforms (googleads).** Starts the Google Ads OAuth flow and creates a standalone ads SocialAccount (googleads) with no parent. If the account already exists, returns alreadyConnected: true. Ads accounts appear as regular SocialAccount documents with ads platform values (e.g., metaads, tiktokads) in GET /v1/accounts.
349
419
 
350
420
  ### Examples
351
421
 
@@ -359,14 +429,16 @@ Zernio.configure do |config|
359
429
  end
360
430
 
361
431
  api_instance = Zernio::ConnectApi.new
362
- platform = 'facebook' # String | Platform to connect ads for. Only platforms with ads support are accepted. `instagram` requires an Instagram account connected with loginMethod=facebook_login whose token carries ads_management and ads_read. With an account connected through the default instagram_login flow no ads account can be created; do not use this value for those accounts.
432
+ platform = 'facebook' # String | Platform to connect ads for. Only platforms with ads support are accepted. In classic mode, `instagram` requires an Instagram account connected with loginMethod=facebook_login whose token carries ads_management and ads_read. With an account connected through the default instagram_login flow no ads account can be created; do not use this value for those accounts.
363
433
  profile_id = 'profile_id_example' # String | Your Zernio profile ID
364
434
  opts = {
435
+ login_mode: 'classic', # String | Meta ads authorization mode. Business login is opt-in for Facebook and Instagram; classic preserves the posting-account flow.
436
+ page_id: '811889972008357', # String | Business login only. Facebook Page ID to select from the token grants for ad creatives and lead forms.
365
437
  account_id: 'account_id_example', # String | Existing SocialAccount ID. Required for `twitter` (X Ads). Optional for `tiktok`: omit to enter ads-only mode (no TikTok posting account linked; ad creation uses a Brand Identity instead of a TT_USER). Ignored for same-token (`facebook`, `instagram`, `linkedin`, `pinterest`) and standalone (`googleads`) platforms.
366
438
  redirect_url: 'redirect_url_example', # String | Custom URL the browser is sent to once the OAuth flow finishes. Honored on every ads platform, including the separate-token (`tiktok`, `twitter`) and standalone (`googleads`) flows. MUST be an absolute http(s) URL or a custom app scheme for mobile deeplinks (e.g. myapp://callback); a relative path is rejected with 400 INVALID_REDIRECT_URL. On success `tiktok`, `twitter` and `googleads` land on the URL unchanged, while the same-token platforms (`facebook`, `instagram`, `linkedin`, `pinterest`) append `connected`, `profileId`, `accountId`, `username` and, on API-key calls, `connect_token`. On failure the same error contract applies as on GET /v1/connect/{platform}: `error` and `platform` are always appended, other params are optional, and the value list there is not exhaustive. On the tiktok, twitter and googleads flows `platform` carries the ads platform id (`tiktokads`, `xads`, `googleads`), not the value used in the request path. When omitted, the browser lands on the Zernio dashboard.
367
439
  headless: true, # Boolean | Enable headless mode (same-token platforms only)
368
440
  force: true, # Boolean | Force a fresh OAuth even when an account already exists. Normally the endpoint returns `alreadyConnected: true` whenever a connected account is found, keying off its active state rather than token liveness. Set `force=true` to bypass that and always receivean `authUrl`. Completing the returned OAuth refreshes the stored token on the existing posting and ads accounts in place.
369
- ad_account_id: 'act_1330190928038136', # String | Scope ad sync to a single platform ad account. Without this param, sync covers every ad account the connected token can see. Supported on `facebook`/`instagram` (Meta, `act_<digits>`), `linkedin` (bare numeric sponsored-account id), `googleads` (bare customer id digits) and `twitter` (X Ads, base36 account id). `tiktok` scopes advertisers at OAuth and `pinterest` has no ads discovery, so both ignore it. Meta ids are additionally validated against the connected token; unreachable IDs return 400. Setting a scope also removes already synced ads from de-scoped ad accounts. For multiple accounts use `adAccountIds` instead.
441
+ ad_account_id: 'act_1330190928038136', # String | Scope ad sync to a single platform ad account. Without this param, sync covers every ad account the connected token can see. Business-login reconnects preserve the existing scope; supplied IDs are checked against the new grant. To change that scope after migration, call this endpoint with the IDs and omit loginMode. Supported on `facebook`/`instagram` (Meta, `act_<digits>`), `linkedin` (bare numeric sponsored-account id), `googleads` (bare customer id digits) and `twitter` (X Ads, base36 account id). `tiktok` scopes advertisers at OAuth and `pinterest` has no ads discovery, so both ignore it. Meta ids are additionally validated against the connected token; unreachable IDs return 400. Setting a scope also removes already synced ads from de-scoped ad accounts. For multiple accounts use `adAccountIds` instead.
370
442
  ad_account_ids: ['inner_example'] # Array<String> | Scope ad sync to multiple platform ad accounts (same platform support and id shapes as `adAccountId`). Repeat the param (`?adAccountIds=act_1&adAccountIds=act_2`) or comma-separate (`?adAccountIds=act_1,act_2`). Persisted server-side; latest call wins, and de-scoped ad accounts have their synced ads removed. Omitting both `adAccountId` and `adAccountIds` keeps any previously persisted scope unchanged.
371
443
  }
372
444
 
@@ -401,13 +473,15 @@ end
401
473
 
402
474
  | Name | Type | Description | Notes |
403
475
  | ---- | ---- | ----------- | ----- |
404
- | **platform** | **String** | Platform to connect ads for. Only platforms with ads support are accepted. &#x60;instagram&#x60; requires an Instagram account connected with loginMethod&#x3D;facebook_login whose token carries ads_management and ads_read. With an account connected through the default instagram_login flow no ads account can be created; do not use this value for those accounts. | |
476
+ | **platform** | **String** | Platform to connect ads for. Only platforms with ads support are accepted. In classic mode, &#x60;instagram&#x60; requires an Instagram account connected with loginMethod&#x3D;facebook_login whose token carries ads_management and ads_read. With an account connected through the default instagram_login flow no ads account can be created; do not use this value for those accounts. | |
405
477
  | **profile_id** | **String** | Your Zernio profile ID | |
478
+ | **login_mode** | **String** | Meta ads authorization mode. Business login is opt-in for Facebook and Instagram; classic preserves the posting-account flow. | [optional][default to &#39;classic&#39;] |
479
+ | **page_id** | **String** | Business login only. Facebook Page ID to select from the token grants for ad creatives and lead forms. | [optional] |
406
480
  | **account_id** | **String** | Existing SocialAccount ID. Required for &#x60;twitter&#x60; (X Ads). Optional for &#x60;tiktok&#x60;: omit to enter ads-only mode (no TikTok posting account linked; ad creation uses a Brand Identity instead of a TT_USER). Ignored for same-token (&#x60;facebook&#x60;, &#x60;instagram&#x60;, &#x60;linkedin&#x60;, &#x60;pinterest&#x60;) and standalone (&#x60;googleads&#x60;) platforms. | [optional] |
407
481
  | **redirect_url** | **String** | Custom URL the browser is sent to once the OAuth flow finishes. Honored on every ads platform, including the separate-token (&#x60;tiktok&#x60;, &#x60;twitter&#x60;) and standalone (&#x60;googleads&#x60;) flows. MUST be an absolute http(s) URL or a custom app scheme for mobile deeplinks (e.g. myapp://callback); a relative path is rejected with 400 INVALID_REDIRECT_URL. On success &#x60;tiktok&#x60;, &#x60;twitter&#x60; and &#x60;googleads&#x60; land on the URL unchanged, while the same-token platforms (&#x60;facebook&#x60;, &#x60;instagram&#x60;, &#x60;linkedin&#x60;, &#x60;pinterest&#x60;) append &#x60;connected&#x60;, &#x60;profileId&#x60;, &#x60;accountId&#x60;, &#x60;username&#x60; and, on API-key calls, &#x60;connect_token&#x60;. On failure the same error contract applies as on GET /v1/connect/{platform}: &#x60;error&#x60; and &#x60;platform&#x60; are always appended, other params are optional, and the value list there is not exhaustive. On the tiktok, twitter and googleads flows &#x60;platform&#x60; carries the ads platform id (&#x60;tiktokads&#x60;, &#x60;xads&#x60;, &#x60;googleads&#x60;), not the value used in the request path. When omitted, the browser lands on the Zernio dashboard. | [optional] |
408
482
  | **headless** | **Boolean** | Enable headless mode (same-token platforms only) | [optional][default to false] |
409
483
  | **force** | **Boolean** | Force a fresh OAuth even when an account already exists. Normally the endpoint returns &#x60;alreadyConnected: true&#x60; whenever a connected account is found, keying off its active state rather than token liveness. Set &#x60;force&#x3D;true&#x60; to bypass that and always receivean &#x60;authUrl&#x60;. Completing the returned OAuth refreshes the stored token on the existing posting and ads accounts in place. | [optional][default to false] |
410
- | **ad_account_id** | **String** | Scope ad sync to a single platform ad account. Without this param, sync covers every ad account the connected token can see. Supported on &#x60;facebook&#x60;/&#x60;instagram&#x60; (Meta, &#x60;act_&lt;digits&gt;&#x60;), &#x60;linkedin&#x60; (bare numeric sponsored-account id), &#x60;googleads&#x60; (bare customer id digits) and &#x60;twitter&#x60; (X Ads, base36 account id). &#x60;tiktok&#x60; scopes advertisers at OAuth and &#x60;pinterest&#x60; has no ads discovery, so both ignore it. Meta ids are additionally validated against the connected token; unreachable IDs return 400. Setting a scope also removes already synced ads from de-scoped ad accounts. For multiple accounts use &#x60;adAccountIds&#x60; instead. | [optional] |
484
+ | **ad_account_id** | **String** | Scope ad sync to a single platform ad account. Without this param, sync covers every ad account the connected token can see. Business-login reconnects preserve the existing scope; supplied IDs are checked against the new grant. To change that scope after migration, call this endpoint with the IDs and omit loginMode. Supported on &#x60;facebook&#x60;/&#x60;instagram&#x60; (Meta, &#x60;act_&lt;digits&gt;&#x60;), &#x60;linkedin&#x60; (bare numeric sponsored-account id), &#x60;googleads&#x60; (bare customer id digits) and &#x60;twitter&#x60; (X Ads, base36 account id). &#x60;tiktok&#x60; scopes advertisers at OAuth and &#x60;pinterest&#x60; has no ads discovery, so both ignore it. Meta ids are additionally validated against the connected token; unreachable IDs return 400. Setting a scope also removes already synced ads from de-scoped ad accounts. For multiple accounts use &#x60;adAccountIds&#x60; instead. | [optional] |
411
485
  | **ad_account_ids** | [**Array&lt;String&gt;**](String.md) | Scope ad sync to multiple platform ad accounts (same platform support and id shapes as &#x60;adAccountId&#x60;). Repeat the param (&#x60;?adAccountIds&#x3D;act_1&amp;adAccountIds&#x3D;act_2&#x60;) or comma-separate (&#x60;?adAccountIds&#x3D;act_1,act_2&#x60;). Persisted server-side; latest call wins, and de-scoped ad accounts have their synced ads removed. Omitting both &#x60;adAccountId&#x60; and &#x60;adAccountIds&#x60; keeps any previously persisted scope unchanged. | [optional] |
412
486
 
413
487
  ### Return type
@@ -19,10 +19,10 @@
19
19
  | **promotion** | [**MetaPromotion**](MetaPromotion.md) | | [optional] |
20
20
  | **creative_features** | **Hash&lt;String, String&gt;** | Meta only. Applied to each new creative, including standalone and attach shapes. With creatives[], these are defaults; an item replaces the whole feature map, including an empty map. auto_promotion_tag is an enhancement; an explicit offer uses promotion. | [optional] |
21
21
  | **multi_advertiser** | **String** | Meta only. Multi-advertiser ads: whether Meta may show this ad alongside other advertisers&#39; in one unit. Meta auto-enrols since Aug 2024, so send OPT_OUT to leave. It is a top-level creative field, NOT a &#x60;creativeFeatures&#x60; key, and Meta rejects it there. | [optional] |
22
- | **validate_only** | **Boolean** | Meta only. Validates the complete inline campaign, ad set, creative and ad with execution_options validate_only. Nothing is uploaded or created, and validation bypasses Idempotency-Key storage. Supports a single image, existing video.id or existingCreativeId; media pools, new video uploads, creatives[], adSetId and RESERVED buying return 400. Existing campaign or creative nodes are marked skipped. Success returns 200 with per-node results; Meta rejection returns an error. | [optional] |
23
- | **budget_amount** | **Float** | Budget in WHOLE currency units (USD: 50 &#x3D; $50.00), NOT cents. Meta&#39;s own Marketing API takes this same number in minor units, so it is an easy and expensive mix-up. Required on legacy + multi-creative shapes. Inherited on attach. OpenAI Ads requires a $1 minimum (its budget is lifetime-only, see budgetType). | [optional] |
24
- | **budget_type** | **String** | Required on legacy + multi-creative shapes. Inherited on attach. OpenAI Ads accepts lifetime only (no daily-budget concept on the platform); sending daily returns 422. OpenAI Ads lifetime budgets require &#x60;endDate&#x60; to give the lifetime cap a spend window. | [optional] |
25
- | **status** | **String** | Meta, TikTok, and LinkedIn. Publish state of the created entities. Omitted or ACTIVE publishes live (default, back-compat); PAUSED creates them paused so you can review before they spend. On Meta the pause is held on the campaign this call creates, leaving the ad set and ad switched on, so a single PUT /v1/ads/campaigns/{campaignId}/status with &#x60;active&#x60; brings the whole thing live. It is held at every level instead when the pause cannot rely on the campaign: &#x60;existingCampaignId&#x60; (that campaign may be running and is never touched) or &#x60;campaignStatus: ACTIVE&#x60;. On TikTok the whole campaign &gt; ad group &gt; ad hierarchy stays paused. On LinkedIn the whole campaign group, campaign, and creative hierarchy stays PAUSED (intendedStatus PAUSED on each). | [optional] |
22
+ | **validate_only** | **Boolean** | Google Performance Max validates the complete atomic campaign and asset group with no resource creation or local persistence. Google validation still downloads image URLs and consumes quota. On Meta, validates the complete inline campaign, ad set, creative and ad with execution_options validate_only. Nothing is uploaded or created, and validation bypasses Idempotency-Key storage. Supports a single image, existing video.id or existingCreativeId; media pools, new video uploads, creatives[], adSetId and RESERVED buying return 400. Existing campaign or creative nodes are marked skipped. Success returns 200 with per-node results; Meta rejection returns an error. | [optional] |
23
+ | **budget_amount** | **Float** | Budget in WHOLE currency units (USD: 50 &#x3D; $50.00), NOT cents. Meta&#39;s own Marketing API takes this same number in minor units, so it is an easy and expensive mix-up. Required on legacy, multi-creative and Performance Max shapes. Inherited on attach. OpenAI Ads requires a $1 minimum (its budget is lifetime-only, see budgetType). | [optional] |
24
+ | **budget_type** | **String** | Required on legacy, multi-creative and Performance Max shapes. Inherited on attach. OpenAI Ads accepts lifetime only (no daily-budget concept on the platform); sending daily returns 422. OpenAI Ads lifetime budgets require &#x60;endDate&#x60; to give the lifetime cap a spend window. | [optional] |
25
+ | **status** | **String** | Google Performance Max accepts PAUSED only and always creates a paused campaign. Meta, TikTok, and LinkedIn: publish state of the created entities. Omitted or ACTIVE publishes live (default, back-compat); PAUSED creates them paused so you can review before they spend. On Meta the pause is held on the campaign this call creates, leaving the ad set and ad switched on, so a single PUT /v1/ads/campaigns/{campaignId}/status with &#x60;active&#x60; brings the whole thing live. It is held at every level instead when the pause cannot rely on the campaign: &#x60;existingCampaignId&#x60; (that campaign may be running and is never touched) or &#x60;campaignStatus: ACTIVE&#x60;. On TikTok the whole campaign &gt; ad group &gt; ad hierarchy stays paused. On LinkedIn the whole campaign group, campaign, and creative hierarchy stays PAUSED (intendedStatus PAUSED on each). | [optional] |
26
26
  | **campaign_status** | **String** | Meta only. Overrides &#x60;status&#x60; for the campaign level alone, so you can create a live campaign whose ad set and ad stay paused, or the reverse. Omitted, it follows &#x60;status&#x60;. | [optional] |
27
27
  | **budget_level** | **String** | Meta only. Where the budget lives, which selects the Meta budget model: - &#x60;adset&#x60; (default): ABO (Ad-set Budget Optimization). The budget is set on the ad set. This is the back-compatible behaviour; omit this field to keep it. - &#x60;campaign&#x60;: CBO (Campaign Budget Optimization / Advantage Campaign Budget). The budget AND &#x60;bidStrategy&#x60; are set on the CAMPAIGN, and Meta distributes spend across ad sets automatically. Meta requires the budget at exactly one level, never both. Non-Meta platforms ignore this field. Ignored on the attach shape (&#x60;adSetId&#x60;), which inherits the existing budget. | [optional][default to &#39;adset&#39;] |
28
28
  | **currency** | **String** | ISO 4217 currency code matching the ad account&#39;s currency (e.g. &#x60;USD&#x60;). Meta only. Optional: Zernio resolves it from the ad account when omitted. The value selects the minor-unit exponent Zernio converts budget/bid amounts by before calling Meta (most currencies are cents; zero-decimal currencies like JPY/KRW are sent as-is). | [optional] |
@@ -78,7 +78,8 @@
78
78
  | **translations** | [**Array&lt;CreateStandaloneAdRequestTranslationsInner&gt;**](CreateStandaloneAdRequestTranslationsInner.md) | Meta only. Multi-language ads (Dynamic Language Optimization): ONE ad carrying per-locale copy and, optionally, per-locale media: the \&quot;Languages\&quot; toggle in Ads Manager. Keeps social proof (likes/comments/shares) on a SINGLE post instead of splitting it across one ad per language. The ad&#39;s top-level copy is the DEFAULT shown to every locale you do NOT list, and it counts as one of the language variants. IMPORTANT, and the opposite of what you might expect: text does NOT inherit. Every entry must carry its own &#x60;headline&#x60;, &#x60;body&#x60; AND &#x60;description&#x60;, and all of them must be DISTINCT from each other and from the ad&#39;s top-level copy. Meta deduplicates identical strings inside the asset feed, so two locales sharing a string collapse into one asset and the create fails with a misleading \&quot;Too few ... texts provided in asset creation\&quot; (subcode 1885817) that names a field which is actually present. We validate this before calling Meta and return a 400 naming the offending locale and field. &#x60;description&#x60; is therefore effectively required on the ad whenever &#x60;translations&#x60; is present, even though it is optional otherwise. Do NOT list &#x60;defaultLocale&#x60; inside &#x60;translations&#x60;: Meta rejects the duplicate with \&quot;The language asset feed includes an unsupported targeting field\&quot; (subcode 1885985). Media DOES inherit and is uploaded once when shared, and &#x60;linkUrl&#x60; inherits too: each locale may name its own landing page and unlisted locales fall back to the ad&#39;s top-level &#x60;linkUrl&#x60;. Meta enforces Dynamic Creative image dimensions on language feeds, so an &#x60;imageUrl&#x60; that works on a normal ad may be rejected with \&quot;The following images have invalid dimensions for Dynamic Creative\&quot; (subcode 1885558). Video is not affected. Mutually exclusive with &#x60;dynamicCreative&#x60;, &#x60;placementAssets&#x60;, &#x60;carouselCards&#x60;, &#x60;existingCreativeId&#x60; and &#x60;creatives[]&#x60;. Meta allows one &#x60;asset_feed_spec&#x60; shape per creative. | [optional] |
79
79
  | **placement_assets** | [**CreateStandaloneAdRequestPlacementAssets**](CreateStandaloneAdRequestPlacementAssets.md) | | [optional] |
80
80
  | **audience_id** | **String** | Custom audience ID for targeting | [optional] |
81
- | **campaign_type** | **String** | Google only | [optional][default to &#39;display&#39;] |
81
+ | **campaign_type** | **String** | Google only. Performance Max requires assetGroup and is always created PAUSED. | [optional][default to &#39;display&#39;] |
82
+ | **asset_group** | [**GooglePmaxAssetGroupInput**](GooglePmaxAssetGroupInput.md) | | [optional] |
82
83
  | **keywords** | [**Array&lt;KeywordEntry&gt;**](KeywordEntry.md) | Google Search only. Keywords on the new ad group; entries are strings (BROAD) or { text, matchType }. Editable later via PUT /v1/ads/{adId} targeting.keywords. | [optional] |
83
84
  | **negative_keywords** | [**Array&lt;KeywordEntry&gt;**](KeywordEntry.md) | Google Search only; other platforms return 400. Ad-group-level negative keywords on the new ad group. Editable later via PUT /v1/ads/{adId} targeting.negativeKeywords. | [optional] |
84
85
  | **campaign_negative_keywords** | [**Array&lt;KeywordEntry&gt;**](KeywordEntry.md) | Google Search only; other platforms return 400. Campaign-level negative keywords (campaign_criterion.negative), created alongside the ad group. Editable later via PUT /v1/ads/campaigns/{campaignId}/negative-keywords. | [optional] |
@@ -93,7 +94,7 @@
93
94
  | **bid_strategy** | [**BidStrategy**](BidStrategy.md) | Deprecated: send it inside &#x60;platformSpecificData&#x60; instead (Meta today; TikTok&#39;s nested shape is planned). The flat field keeps working during the deprecation window; sending both shapes returns a 400. Meta bid strategy applied to the ad set. OpenAI Ads: required on every ad group via this flat field, the only channel it supports (&#x60;platformSpecificData&#x60; is Meta/LinkedIn-only and returns 400 for OpenAI). No auto-bid option exists; send &#x60;LOWEST_COST_WITH_BID_CAP&#x60; or &#x60;COST_CAP&#x60; together with &#x60;bidAmount&#x60;, omitting it returns 400. Google (not deprecated there, this shared flat field is Google&#39;s only shape): applied to the campaign this call creates. On Google: LOWEST_COST_WITHOUT_CAP &#x3D; Maximize Conversions, COST_CAP + bidAmount &#x3D; Target CPA, LOWEST_COST_WITH_MIN_ROAS + roasAverageFloor &#x3D; Target ROAS, LOWEST_COST_WITH_BID_CAP + bidAmount &#x3D; Maximize Clicks with a CPC ceiling; portfolioBidStrategyId attaches a portfolio strategy instead. Omitted, the campaign falls back to a goal-based default. | [optional] |
94
95
  | **bid_amount** | **Float** | Deprecated: send it inside &#x60;platformSpecificData&#x60; instead (Meta today; TikTok&#39;s nested shape is planned). The flat field keeps working during the deprecation window; sending both shapes returns a 400. Bid cap in WHOLE currency units (USD: 5 &#x3D; $5.00; JPY: 100 &#x3D; ¥100). Required when &#x60;bidStrategy&#x60; is &#x60;LOWEST_COST_WITH_BID_CAP&#x60; or &#x60;COST_CAP&#x60;. Meta only: sending &#x60;bidAmount&#x60; WITHOUT &#x60;bidStrategy&#x60; requires &#x60;existingCampaignId&#x60; (400 otherwise), and sets the new ad set&#39;s cap under the joined campaign&#39;s COST_CAP / LOWEST_COST_WITH_BID_CAP parent. The strategy itself is inherited from the campaign. Restating bidStrategy here is accepted but has no effect on the ad set. Rejected with 400 in &#x60;adSetId&#x60; attach mode: that shape inherits its cap from the platform. Use &#x60;PUT /v1/ads/ad-sets/{adSetId}&#x60; there instead. | [optional] |
95
96
  | **roas_average_floor** | **Float** | Deprecated: send it inside &#x60;platformSpecificData&#x60; instead (Meta today; TikTok&#39;s nested shape is planned). The flat field keeps working during the deprecation window; sending both shapes returns a 400. Minimum ROAS as a decimal multiplier (e.g. 2.0 &#x3D; 2.0x ROAS). Required when &#x60;bidStrategy&#x60; is &#x60;LOWEST_COST_WITH_MIN_ROAS&#x60;. Sending it without &#x60;bidStrategy&#x60; is a 400. Sent to Meta as &#x60;bid_constraints.roas_average_floor&#x60; × 10000. Known gap: a CBO campaign&#39;s ROAS floor lives on the campaign only (set via &#x60;POST /v1/ads/campaigns&#x60;); there is no supported way to set it while joining a CBO campaign here. | [optional] |
96
- | **portfolio_bid_strategy_id** | **String** | Google only. Attach an existing portfolio bid strategy (numeric id from GET /v1/ads/bid-strategies) to the new campaign instead of a standard one. Exclusive with bidStrategy. | [optional] |
97
+ | **portfolio_bid_strategy_id** | **String** | Google Search and Display only. Performance Max rejects portfolio bidding. Attach an existing portfolio bid strategy (numeric id from GET /v1/ads/bid-strategies) to the new campaign instead of a standard one. Exclusive with bidStrategy. | [optional] |
97
98
  | **value_rule_set_id** | **String** | Meta only (facebook, instagram; other platforms return 400). Value rule set to attach to the new ad set, from &#x60;/v1/ads/value-rule-sets&#x60;. Attachment is driven by this id, so &#x60;valueRulesApplied&#x60; is optional alongside it. Rejected with 400 in &#x60;adSetId&#x60; attach mode: that shape inherits the existing ad set&#39;s attachment, so the field would be silently ignored. Use &#x60;PUT /v1/ads/ad-sets/{adSetId}&#x60; there instead. Ignored (stripped before the ad-set create) when &#x60;buyingType&#x60; is &#x60;RESERVED&#x60;: value rules only apply to auction ad sets on &#x60;LOWEST_COST_WITHOUT_CAP&#x60; or &#x60;COST_CAP&#x60;, and a Reach &amp; Frequency reservation has no auction bid strategy. Read back with &#x60;GET /v1/ads/ad-sets/{adSetId}?fields&#x3D;value_rule_set_id&#x60;; the attachment is not mirrored onto Zernio&#39;s ad documents. | [optional] |
98
99
  | **value_rules_applied** | **Boolean** | Meta only (facebook, instagram; other platforms return 400). Optional when attaching, and requires &#x60;valueRuleSetId&#x60;. &#x60;false&#x60; is REJECTED here with 400: a newly created ad set has nothing to detach, so detaching lives on &#x60;PUT /v1/ads/ad-sets/{adSetId}&#x60;. | [optional] |
99
100
  | **platform_specific_data** | [**CreateStandaloneAdRequestPlatformSpecificData**](CreateStandaloneAdRequestPlatformSpecificData.md) | | [optional] |
@@ -189,6 +190,7 @@ instance = Zernio::CreateStandaloneAdRequest.new(
189
190
  placement_assets: null,
190
191
  audience_id: null,
191
192
  campaign_type: null,
193
+ asset_group: null,
192
194
  keywords: null,
193
195
  negative_keywords: null,
194
196
  campaign_negative_keywords: null,
@@ -0,0 +1,28 @@
1
+ # Zernio::GooglePmaxAssetGroup
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **id** | **String** | | |
8
+ | **resource_name** | **String** | | |
9
+ | **name** | **String** | | |
10
+ | **status** | **String** | Asset-group status on Google. Campaign status independently controls delivery. | |
11
+ | **final_urls** | **Array&lt;String&gt;** | | |
12
+ | **assets** | [**Array&lt;GooglePmaxAssetGroupAssetsInner&gt;**](GooglePmaxAssetGroupAssetsInner.md) | | |
13
+
14
+ ## Example
15
+
16
+ ```ruby
17
+ require 'zernio-sdk'
18
+
19
+ instance = Zernio::GooglePmaxAssetGroup.new(
20
+ id: null,
21
+ resource_name: null,
22
+ name: null,
23
+ status: null,
24
+ final_urls: null,
25
+ assets: null
26
+ )
27
+ ```
28
+
@@ -0,0 +1,28 @@
1
+ # Zernio::GooglePmaxAssetGroupAssetsInner
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **resource_name** | **String** | | |
8
+ | **field_type** | **String** | Google asset role, such as HEADLINE or LOGO. | |
9
+ | **status** | **String** | | |
10
+ | **text** | **String** | | [optional] |
11
+ | **image_url** | **String** | | [optional] |
12
+ | **youtube_video_id** | **String** | | [optional] |
13
+
14
+ ## Example
15
+
16
+ ```ruby
17
+ require 'zernio-sdk'
18
+
19
+ instance = Zernio::GooglePmaxAssetGroupAssetsInner.new(
20
+ resource_name: null,
21
+ field_type: null,
22
+ status: null,
23
+ text: null,
24
+ image_url: null,
25
+ youtube_video_id: null
26
+ )
27
+ ```
28
+
@@ -0,0 +1,32 @@
1
+ # Zernio::GooglePmaxAssetGroupInput
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **name** | **String** | Defaults to the request name. | [optional] |
8
+ | **final_url** | **String** | Required destination URL. | |
9
+ | **headlines** | **Array&lt;String&gt;** | | |
10
+ | **long_headline** | **String** | | |
11
+ | **descriptions** | **Array&lt;String&gt;** | At least one description must be 60 characters or fewer. | |
12
+ | **business_name** | **String** | | |
13
+ | **images** | [**GooglePmaxAssetGroupInputImages**](GooglePmaxAssetGroupInputImages.md) | | |
14
+ | **youtube_video_id** | **String** | Optional existing YouTube video id. Google can generate video when omitted. Video uploads and arbitrary video URLs are not supported. | [optional] |
15
+
16
+ ## Example
17
+
18
+ ```ruby
19
+ require 'zernio-sdk'
20
+
21
+ instance = Zernio::GooglePmaxAssetGroupInput.new(
22
+ name: null,
23
+ final_url: null,
24
+ headlines: null,
25
+ long_headline: null,
26
+ descriptions: null,
27
+ business_name: null,
28
+ images: null,
29
+ youtube_video_id: null
30
+ )
31
+ ```
32
+
@@ -0,0 +1,22 @@
1
+ # Zernio::GooglePmaxAssetGroupInputImages
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **landscape** | **Array&lt;String&gt;** | Landscape marketing images. Aspect ratio 1.91:1, minimum 600 x 314 pixels. | |
8
+ | **square** | **Array&lt;String&gt;** | Square marketing images. Aspect ratio 1:1, minimum 300 x 300 pixels. | |
9
+ | **logo** | **Array&lt;String&gt;** | Required square logos. Aspect ratio 1:1, minimum 128 x 128 pixels. | |
10
+
11
+ ## Example
12
+
13
+ ```ruby
14
+ require 'zernio-sdk'
15
+
16
+ instance = Zernio::GooglePmaxAssetGroupInputImages.new(
17
+ landscape: null,
18
+ square: null,
19
+ logo: null
20
+ )
21
+ ```
22
+
data/docs/LeadGenApi.md CHANGED
@@ -90,7 +90,7 @@ end
90
90
 
91
91
  Create a lead form
92
92
 
93
- Creates a Lead Gen form. The form content goes inside `platformSpecificData` for both platforms (the shape is selected by the accountId's platform). Meta: created on the connected Facebook Page (POST /{page-id}/leadgen_forms); the old top-level Meta fields (questions, thankYou*, contextCard, …) are DEPRECATED but still accepted while platformSpecificData is absent; mixing both shapes is a 400. LinkedIn: created on the ad account's Company Page. NOT idempotent: a retry creates a second form. Meta prefilled question types (EMAIL, PHONE, FULL_NAME, …) must omit label/key; CUSTOM questions require both. LinkedIn exposes only free-text and multiple-choice questions via API (prefilled-from-profile fields are Campaign Manager UI-only). Requires the Ads add-on.
93
+ Creates a Lead Gen form. The form content goes inside `platformSpecificData` for both platforms (the shape is selected by the accountId's platform). Meta: created on the connected Facebook Page (a facebook account or a metaads business-login account with a selected Page) (POST /{page-id}/leadgen_forms); the old top-level Meta fields (questions, thankYou*, contextCard, …) are DEPRECATED but still accepted while platformSpecificData is absent; mixing both shapes is a 400. LinkedIn: created on the ad account's Company Page. NOT idempotent: a retry creates a second form. Meta prefilled question types (EMAIL, PHONE, FULL_NAME, …) must omit label/key; CUSTOM questions require both. LinkedIn exposes only free-text and multiple-choice questions via API (prefilled-from-profile fields are Campaign Manager UI-only). Requires the Ads add-on.
94
94
 
95
95
  ### Examples
96
96
 
@@ -299,7 +299,7 @@ end
299
299
 
300
300
  List leads for a single form
301
301
 
302
- Returns leads for one form. Serves persisted leads (ingested via the leadgen webhook) when available, falling back to a live Graph read.
302
+ Returns leads for one form. Serves persisted leads (ingested via the leadgen webhook) when available, falling back to a live Graph read. Accepts a Facebook account or a metaads business-login account with leads_retrieval access to the form; the latter uses its system-user token without a posting parent.
303
303
 
304
304
  ### Examples
305
305
 
@@ -378,7 +378,7 @@ end
378
378
 
379
379
  List lead forms
380
380
 
381
- Lists the Lead Gen forms owned by the account. Meta: forms on the connected Facebook Page. LinkedIn: forms owned by the ad account's Company Page. Pass `adAccountId` (LinkedIn forms are org-owned). Requires the Ads add-on.
381
+ Lists the Lead Gen forms owned by the account. Meta: forms on the connected Facebook Page, including a Page selected on a metaads business-login connection. LinkedIn: forms owned by the ad account's Company Page. Pass `adAccountId` (LinkedIn forms are org-owned). Requires the Ads add-on.
382
382
 
383
383
  ### Examples
384
384
 
@@ -392,7 +392,7 @@ Zernio.configure do |config|
392
392
  end
393
393
 
394
394
  api_instance = Zernio::LeadGenApi.new
395
- account_id = 'account_id_example' # String | Connected facebook or linkedin ads account id.
395
+ account_id = 'account_id_example' # String | Connected Facebook, Meta ads business-login or LinkedIn ads account ID.
396
396
  opts = {
397
397
  ad_account_id: 'ad_account_id_example', # String | LinkedIn only: the LinkedIn ad account id (used to resolve the owning organization). Required for LinkedIn.
398
398
  limit: 56, # Integer |
@@ -430,7 +430,7 @@ end
430
430
 
431
431
  | Name | Type | Description | Notes |
432
432
  | ---- | ---- | ----------- | ----- |
433
- | **account_id** | **String** | Connected facebook or linkedin ads account id. | |
433
+ | **account_id** | **String** | Connected Facebook, Meta ads business-login or LinkedIn ads account ID. | |
434
434
  | **ad_account_id** | **String** | LinkedIn only: the LinkedIn ad account id (used to resolve the owning organization). Required for LinkedIn. | [optional] |
435
435
  | **limit** | **Integer** | | [optional][default to 25] |
436
436
  | **cursor** | **String** | | [optional] |
@@ -7,6 +7,8 @@
7
7
  | **id** | **String** | Platform ad account ID (e.g. act_123) | [optional] |
8
8
  | **name** | **String** | | [optional] |
9
9
  | **currency** | **String** | | [optional] |
10
+ | **business_id** | **String** | Meta only. Owning Business Manager ID when available on the grant. | [optional] |
11
+ | **business_name** | **String** | Owning business name when supplied by the platform. | [optional] |
10
12
  | **status** | **String** | LinkedIn only. LinkedIn&#39;s own ad account status. In practice always &#x60;ACTIVE&#x60;, because the LinkedIn query filters to active accounts. Meta, Google, TikTok and Pinterest report &#x60;accountStatus&#x60; instead; X reports &#x60;approvalStatus&#x60;. | [optional] |
11
13
  | **account_status** | **Object** | | [optional] |
12
14
  | **approval_status** | **String** | X only. X&#39;s own ad account approval status. Observed values are &#x60;ACCEPTED&#x60;, &#x60;PENDING&#x60; and &#x60;REJECTED&#x60;, but X does not publish the full vocabulary, so treat an unrecognised value as not usable. Other platforms report &#x60;accountStatus&#x60; or &#x60;status&#x60; instead. | [optional] |
@@ -26,6 +28,8 @@ instance = Zernio::ListAdAccounts200ResponseAccountsInner.new(
26
28
  id: null,
27
29
  name: null,
28
30
  currency: null,
31
+ business_id: null,
32
+ business_name: null,
29
33
  status: null,
30
34
  account_status: null,
31
35
  approval_status: null,