late-sdk 0.0.856 → 0.0.858

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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +27 -2
  3. data/docs/AdCampaignsApi.md +364 -6
  4. data/docs/{ListAdKeywords200ResponseKeywordsInner.md → AdKeyword.md} +7 -3
  5. data/docs/AdKeywordMetrics.md +30 -0
  6. data/docs/AddAdKeywords201Response.md +18 -0
  7. data/docs/AddAdKeywordsRequest.md +24 -0
  8. data/docs/AddAdKeywordsRequestKeywordsInner.md +20 -0
  9. data/docs/AddAdKeywordsRequestKeywordsInnerAnyOf.md +20 -0
  10. data/docs/ChannelPicker.md +20 -0
  11. data/docs/ChannelPickerChannelsInner.md +24 -0
  12. data/docs/ChannelPickerTeam.md +22 -0
  13. data/docs/ConnectApi.md +78 -0
  14. data/docs/CreatePost200Response.md +22 -0
  15. data/docs/CreatePost200ResponseTiktokInner.md +24 -0
  16. data/docs/CreatePostRequest.md +2 -0
  17. data/docs/CreateStandaloneAdRequest.md +4 -2
  18. data/docs/KeywordEntry.md +49 -0
  19. data/docs/ListAdKeywords200Response.md +1 -1
  20. data/docs/ListCampaignNegativeKeywords200Response.md +18 -0
  21. data/docs/ListCampaignNegativeKeywords200ResponseKeywordsInner.md +22 -0
  22. data/docs/ListSlackChannels200Response.md +49 -0
  23. data/docs/PlatformTarget.md +1 -1
  24. data/docs/Post.md +1 -1
  25. data/docs/PostsApi.md +4 -4
  26. data/docs/RemoveAdKeyword200Response.md +20 -0
  27. data/docs/ReplaceCampaignNegativeKeywords200Response.md +22 -0
  28. data/docs/ReplaceCampaignNegativeKeywordsRequest.md +20 -0
  29. data/docs/StartOAuth.md +20 -0
  30. data/docs/UpdateAdKeyword200Response.md +18 -0
  31. data/docs/{UpdateAdStatusRequest.md → UpdateAdKeywordRequest.md} +2 -2
  32. data/docs/WebhookLog.md +1 -1
  33. data/lib/zernio-sdk/api/ad_campaigns_api.rb +358 -9
  34. data/lib/zernio-sdk/api/connect_api.rb +77 -0
  35. data/lib/zernio-sdk/api/posts_api.rb +4 -4
  36. data/lib/zernio-sdk/models/{list_ad_keywords200_response_keywords_inner.rb → ad_keyword.rb} +28 -8
  37. data/lib/zernio-sdk/models/ad_keyword_metrics.rb +207 -0
  38. data/lib/zernio-sdk/models/add_ad_keywords201_response.rb +149 -0
  39. data/lib/zernio-sdk/models/add_ad_keywords_request.rb +250 -0
  40. data/lib/zernio-sdk/models/add_ad_keywords_request_keywords_inner.rb +103 -0
  41. data/lib/zernio-sdk/models/add_ad_keywords_request_keywords_inner_any_of.rb +225 -0
  42. data/lib/zernio-sdk/models/channel_picker.rb +192 -0
  43. data/lib/zernio-sdk/models/channel_picker_channels_inner.rb +244 -0
  44. data/lib/zernio-sdk/models/channel_picker_team.rb +169 -0
  45. data/lib/zernio-sdk/models/create_post200_response.rb +221 -0
  46. data/lib/zernio-sdk/models/create_post200_response_tiktok_inner.rb +227 -0
  47. data/lib/zernio-sdk/models/create_post_request.rb +13 -1
  48. data/lib/zernio-sdk/models/create_standalone_ad_request.rb +55 -5
  49. data/lib/zernio-sdk/models/keyword_entry.rb +105 -0
  50. data/lib/zernio-sdk/models/list_ad_keywords200_response.rb +1 -1
  51. data/lib/zernio-sdk/models/list_campaign_negative_keywords200_response.rb +149 -0
  52. data/lib/zernio-sdk/models/list_campaign_negative_keywords200_response_keywords_inner.rb +199 -0
  53. data/lib/zernio-sdk/models/list_slack_channels200_response.rb +104 -0
  54. data/lib/zernio-sdk/models/platform_target.rb +1 -1
  55. data/lib/zernio-sdk/models/post.rb +3 -2
  56. data/lib/zernio-sdk/models/remove_ad_keyword200_response.rb +157 -0
  57. data/lib/zernio-sdk/models/replace_campaign_negative_keywords200_response.rb +170 -0
  58. data/lib/zernio-sdk/models/replace_campaign_negative_keywords_request.rb +219 -0
  59. data/lib/zernio-sdk/models/start_o_auth.rb +190 -0
  60. data/lib/zernio-sdk/models/update_ad_keyword200_response.rb +147 -0
  61. data/lib/zernio-sdk/models/{update_ad_status_request.rb → update_ad_keyword_request.rb} +3 -3
  62. data/lib/zernio-sdk/models/webhook_log.rb +1 -1
  63. data/lib/zernio-sdk/version.rb +1 -1
  64. data/lib/zernio-sdk.rb +21 -2
  65. data/openapi.yaml +390 -27
  66. data/spec/api/ad_campaigns_api_spec.rb +64 -1
  67. data/spec/api/connect_api_spec.rb +15 -0
  68. data/spec/api/posts_api_spec.rb +1 -1
  69. data/spec/models/ad_keyword_metrics_spec.rb +72 -0
  70. data/spec/models/{list_ad_keywords200_response_keywords_inner_spec.rb → ad_keyword_spec.rb} +18 -6
  71. data/spec/models/add_ad_keywords201_response_spec.rb +36 -0
  72. data/spec/models/add_ad_keywords_request_keywords_inner_any_of_spec.rb +46 -0
  73. data/spec/models/add_ad_keywords_request_keywords_inner_spec.rb +21 -0
  74. data/spec/models/add_ad_keywords_request_spec.rb +54 -0
  75. data/spec/models/channel_picker_channels_inner_spec.rb +54 -0
  76. data/spec/models/channel_picker_spec.rb +42 -0
  77. data/spec/models/channel_picker_team_spec.rb +48 -0
  78. data/spec/models/create_post200_response_spec.rb +48 -0
  79. data/spec/models/create_post200_response_tiktok_inner_spec.rb +54 -0
  80. data/spec/models/create_post_request_spec.rb +6 -0
  81. data/spec/models/create_standalone_ad_request_spec.rb +6 -0
  82. data/spec/models/keyword_entry_spec.rb +32 -0
  83. data/spec/models/list_campaign_negative_keywords200_response_keywords_inner_spec.rb +52 -0
  84. data/spec/models/list_campaign_negative_keywords200_response_spec.rb +36 -0
  85. data/spec/models/list_slack_channels200_response_spec.rb +32 -0
  86. data/spec/models/post_spec.rb +1 -1
  87. data/spec/models/remove_ad_keyword200_response_spec.rb +42 -0
  88. data/spec/models/replace_campaign_negative_keywords200_response_spec.rb +48 -0
  89. data/spec/models/replace_campaign_negative_keywords_request_spec.rb +46 -0
  90. data/spec/models/start_o_auth_spec.rb +42 -0
  91. data/spec/models/update_ad_keyword200_response_spec.rb +36 -0
  92. data/spec/models/{update_ad_status_request_spec.rb → update_ad_keyword_request_spec.rb} +6 -6
  93. data/zernio-sdk-0.0.858.gem +0 -0
  94. metadata +86 -10
  95. data/zernio-sdk-0.0.856.gem +0 -0
@@ -0,0 +1,18 @@
1
+ # Zernio::AddAdKeywords201Response
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **keywords** | [**Array<AdKeyword>**](AdKeyword.md) | | [optional] |
8
+
9
+ ## Example
10
+
11
+ ```ruby
12
+ require 'zernio-sdk'
13
+
14
+ instance = Zernio::AddAdKeywords201Response.new(
15
+ keywords: null
16
+ )
17
+ ```
18
+
@@ -0,0 +1,24 @@
1
+ # Zernio::AddAdKeywordsRequest
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **account_id** | **String** | Social account ID (Google Ads) | |
8
+ | **ad_set_id** | **String** | Google ad group ID to add the keywords to | |
9
+ | **keywords** | [**Array<AddAdKeywordsRequestKeywordsInner>**](AddAdKeywordsRequestKeywordsInner.md) | | |
10
+ | **negative** | **Boolean** | Add as ad-group-level negatives instead of positive keywords | [optional][default to false] |
11
+
12
+ ## Example
13
+
14
+ ```ruby
15
+ require 'zernio-sdk'
16
+
17
+ instance = Zernio::AddAdKeywordsRequest.new(
18
+ account_id: null,
19
+ ad_set_id: null,
20
+ keywords: null,
21
+ negative: null
22
+ )
23
+ ```
24
+
@@ -0,0 +1,20 @@
1
+ # Zernio::AddAdKeywordsRequestKeywordsInner
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **text** | **String** | | |
8
+ | **match_type** | **String** | | [optional] |
9
+
10
+ ## Example
11
+
12
+ ```ruby
13
+ require 'zernio-sdk'
14
+
15
+ instance = Zernio::AddAdKeywordsRequestKeywordsInner.new(
16
+ text: null,
17
+ match_type: null
18
+ )
19
+ ```
20
+
@@ -0,0 +1,20 @@
1
+ # Zernio::AddAdKeywordsRequestKeywordsInnerAnyOf
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **text** | **String** | | |
8
+ | **match_type** | **String** | | [optional] |
9
+
10
+ ## Example
11
+
12
+ ```ruby
13
+ require 'zernio-sdk'
14
+
15
+ instance = Zernio::AddAdKeywordsRequestKeywordsInnerAnyOf.new(
16
+ text: null,
17
+ match_type: null
18
+ )
19
+ ```
20
+
@@ -0,0 +1,20 @@
1
+ # Zernio::ChannelPicker
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **team** | [**ChannelPickerTeam**](ChannelPickerTeam.md) | | |
8
+ | **channels** | [**Array<ChannelPickerChannelsInner>**](ChannelPickerChannelsInner.md) | | |
9
+
10
+ ## Example
11
+
12
+ ```ruby
13
+ require 'zernio-sdk'
14
+
15
+ instance = Zernio::ChannelPicker.new(
16
+ team: null,
17
+ channels: null
18
+ )
19
+ ```
20
+
@@ -0,0 +1,24 @@
1
+ # Zernio::ChannelPickerChannelsInner
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **id** | **String** | Channel id (C... or G...), the value to send as channelId on POST | |
8
+ | **name** | **String** | | |
9
+ | **is_private** | **Boolean** | | |
10
+ | **is_member** | **Boolean** | Whether the Zernio bot is already a member of the channel | |
11
+
12
+ ## Example
13
+
14
+ ```ruby
15
+ require 'zernio-sdk'
16
+
17
+ instance = Zernio::ChannelPickerChannelsInner.new(
18
+ id: null,
19
+ name: null,
20
+ is_private: null,
21
+ is_member: null
22
+ )
23
+ ```
24
+
@@ -0,0 +1,22 @@
1
+ # Zernio::ChannelPickerTeam
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **id** | **String** | Slack workspace (team) id | [optional] |
8
+ | **name** | **String** | | [optional] |
9
+ | **icon** | **String** | Workspace icon URL | [optional] |
10
+
11
+ ## Example
12
+
13
+ ```ruby
14
+ require 'zernio-sdk'
15
+
16
+ instance = Zernio::ChannelPickerTeam.new(
17
+ id: null,
18
+ name: null,
19
+ icon: null
20
+ )
21
+ ```
22
+
data/docs/ConnectApi.md CHANGED
@@ -37,6 +37,7 @@ All URIs are relative to *https://zernio.com/api*
37
37
  | [**list_instagram_pages**](ConnectApi.md#list_instagram_pages) | **GET** /v1/connect/instagram/select-account | List Pages with a linked Instagram account |
38
38
  | [**list_linked_in_organizations**](ConnectApi.md#list_linked_in_organizations) | **GET** /v1/connect/linkedin/organizations | List LinkedIn orgs |
39
39
  | [**list_pinterest_boards_for_selection**](ConnectApi.md#list_pinterest_boards_for_selection) | **GET** /v1/connect/pinterest/select-board | List Pinterest boards |
40
+ | [**list_slack_channels**](ConnectApi.md#list_slack_channels) | **GET** /v1/connect/slack | List Slack channels for the channel picker |
40
41
  | [**list_snapchat_profiles**](ConnectApi.md#list_snapchat_profiles) | **GET** /v1/connect/snapchat/select-profile | List Snapchat profiles |
41
42
  | [**list_whats_app_phone_numbers**](ConnectApi.md#list_whats_app_phone_numbers) | **GET** /v1/connect/whatsapp/select-phone-number | List numbers for selection |
42
43
  | [**select_facebook_page**](ConnectApi.md#select_facebook_page) | **POST** /v1/connect/facebook/select-page | Select Facebook page |
@@ -2433,6 +2434,83 @@ end
2433
2434
  - **Accept**: application/json
2434
2435
 
2435
2436
 
2437
+ ## list_slack_channels
2438
+
2439
+ > <ListSlackChannels200Response> list_slack_channels(profile_id, opts)
2440
+
2441
+ List Slack channels for the channel picker
2442
+
2443
+ Serves the channel picker of the Slack connect flow. Slack's OAuth installs the bot into a workspace, not a channel, so after the redirect the caller lists the workspace's channels here and finalizes one with `POST /v1/connect/slack`. Served by a dedicated route that shadows `GET /v1/connect/{platform}` for `slack`. Send exactly one of `pendingDataToken` (first connect: the nonce from the OAuth redirect, bound to the same `profileId`) or `accountId` (add another channel to a workspace already connected: the existing Slack account's workspace token is reused, no re-OAuth). With neither, the endpoint behaves like `GET /v1/connect/{platform}` and returns `authUrl` and `state` to start the OAuth flow. Channels are read live from Slack (`conversations.list`, public and private, archived excluded, up to 2,000). `isMember` says whether the Zernio bot is already in the channel: a public channel is joined automatically on finalize, a private one must be invited (`/invite @Zernio`) first.
2444
+
2445
+ ### Examples
2446
+
2447
+ ```ruby
2448
+ require 'time'
2449
+ require 'zernio-sdk'
2450
+ # setup authorization
2451
+ Zernio.configure do |config|
2452
+ # Configure Bearer authorization (JWT): bearerAuth
2453
+ config.access_token = 'YOUR_BEARER_TOKEN'
2454
+ end
2455
+
2456
+ api_instance = Zernio::ConnectApi.new
2457
+ profile_id = 'profile_id_example' # String | Zernio profile the channel account will belong to. Must match the profile the OAuth flow was started on when `pendingDataToken` is used.
2458
+ opts = {
2459
+ pending_data_token: 'pending_data_token_example', # String | Nonce from the OAuth redirect (first connect).
2460
+ account_id: 'account_id_example', # String | Existing active Slack account (yours or a team member's) whose workspace token is reused.
2461
+ redirect_url: 'redirect_url_example' # String | Start-OAuth mode only: where to send the user after the connect completes. `redirectUrl` is accepted as an alias.
2462
+ }
2463
+
2464
+ begin
2465
+ # List Slack channels for the channel picker
2466
+ result = api_instance.list_slack_channels(profile_id, opts)
2467
+ p result
2468
+ rescue Zernio::ApiError => e
2469
+ puts "Error when calling ConnectApi->list_slack_channels: #{e}"
2470
+ end
2471
+ ```
2472
+
2473
+ #### Using the list_slack_channels_with_http_info variant
2474
+
2475
+ This returns an Array which contains the response data, status code and headers.
2476
+
2477
+ > <Array(<ListSlackChannels200Response>, Integer, Hash)> list_slack_channels_with_http_info(profile_id, opts)
2478
+
2479
+ ```ruby
2480
+ begin
2481
+ # List Slack channels for the channel picker
2482
+ data, status_code, headers = api_instance.list_slack_channels_with_http_info(profile_id, opts)
2483
+ p status_code # => 2xx
2484
+ p headers # => { ... }
2485
+ p data # => <ListSlackChannels200Response>
2486
+ rescue Zernio::ApiError => e
2487
+ puts "Error when calling ConnectApi->list_slack_channels_with_http_info: #{e}"
2488
+ end
2489
+ ```
2490
+
2491
+ ### Parameters
2492
+
2493
+ | Name | Type | Description | Notes |
2494
+ | ---- | ---- | ----------- | ----- |
2495
+ | **profile_id** | **String** | Zernio profile the channel account will belong to. Must match the profile the OAuth flow was started on when &#x60;pendingDataToken&#x60; is used. | |
2496
+ | **pending_data_token** | **String** | Nonce from the OAuth redirect (first connect). | [optional] |
2497
+ | **account_id** | **String** | Existing active Slack account (yours or a team member&#39;s) whose workspace token is reused. | [optional] |
2498
+ | **redirect_url** | **String** | Start-OAuth mode only: where to send the user after the connect completes. &#x60;redirectUrl&#x60; is accepted as an alias. | [optional] |
2499
+
2500
+ ### Return type
2501
+
2502
+ [**ListSlackChannels200Response**](ListSlackChannels200Response.md)
2503
+
2504
+ ### Authorization
2505
+
2506
+ [bearerAuth](../README.md#bearerAuth)
2507
+
2508
+ ### HTTP request headers
2509
+
2510
+ - **Content-Type**: Not defined
2511
+ - **Accept**: application/json
2512
+
2513
+
2436
2514
  ## list_snapchat_profiles
2437
2515
 
2438
2516
  > <ListSnapchatProfiles200Response> list_snapchat_profiles(x_connect_token, profile_id, temp_token)
@@ -0,0 +1,22 @@
1
+ # Zernio::CreatePost200Response
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **dry_run** | **Boolean** | Always true on this response | |
8
+ | **can_publish** | **Boolean** | True only when every evaluated TikTok account can publish now | |
9
+ | **tiktok** | [**Array&lt;CreatePost200ResponseTiktokInner&gt;**](CreatePost200ResponseTiktokInner.md) | One verdict per &#x60;tiktok&#x60; entry in the request, in request order | |
10
+
11
+ ## Example
12
+
13
+ ```ruby
14
+ require 'zernio-sdk'
15
+
16
+ instance = Zernio::CreatePost200Response.new(
17
+ dry_run: null,
18
+ can_publish: null,
19
+ tiktok: null
20
+ )
21
+ ```
22
+
@@ -0,0 +1,24 @@
1
+ # Zernio::CreatePost200ResponseTiktokInner
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **account_id** | **String** | | |
8
+ | **can_publish** | **Boolean** | | |
9
+ | **already_posted_today** | **Boolean** | Whether this account already published a Direct Post today (an account that did can keep publishing). Absent for Creator Inbox drafts and when no per-user limit applies. | [optional] |
10
+ | **reason** | **String** | Human-readable explanation of the verdict | |
11
+
12
+ ## Example
13
+
14
+ ```ruby
15
+ require 'zernio-sdk'
16
+
17
+ instance = Zernio::CreatePost200ResponseTiktokInner.new(
18
+ account_id: null,
19
+ can_publish: null,
20
+ already_posted_today: null,
21
+ reason: null
22
+ )
23
+ ```
24
+
@@ -11,6 +11,7 @@
11
11
  | **scheduled_for** | **Time** | When to publish. Required unless &#x60;publishNow&#x60; is true, &#x60;queuedFromProfile&#x60; is set, or the post is a draft. An ISO 8601 value with a &#x60;Z&#x60; or offset (&#x60;2026-01-15T10:00:00Z&#x60;, &#x60;2026-01-15T11:00:00+01:00&#x60;) is taken as-is; a value without one (&#x60;2026-01-15T10:00:00&#x60; or &#x60;2026-01-15 10:00&#x60;) is read as local time in &#x60;timezone&#x60;. A value already in the past is published synchronously in the same request. Ignored when &#x60;publishNow&#x60; is true. | [optional] |
12
12
  | **publish_now** | **Boolean** | Publish to every platform synchronously in this request instead of scheduling; the response then carries each platform result and &#x60;platformPostUrl&#x60;, with HTTP 207 when some platforms failed. Takes precedence over &#x60;scheduledFor&#x60;; ignored when &#x60;isDraft&#x60; is true. | [optional][default to false] |
13
13
  | **is_draft** | **Boolean** | When true, saves the post as a draft. When none of scheduledFor, publishNow, or queuedFromProfile are provided, the post defaults to draft automatically. | [optional][default to false] |
14
+ | **dry_run** | **Boolean** | TikTok only. Preview whether each &#x60;tiktok&#x60; entry in &#x60;platforms&#x60; could publish right now under the TikTok Direct Post daily limits, without creating, scheduling or publishing anything: no post is persisted and no upload slot is claimed, so it can be repeated freely. The request still goes through auth, the payment gate and body validation, then returns HTTP 200 with &#x60;{ dryRun: true, canPublish, tiktok: [...] }&#x60; instead of 201. Only &#x60;tiktok&#x60; entries are evaluated; other platforms in the body are ignored, and a body with no &#x60;tiktok&#x60; entry is rejected with 400 &#x60;invalid_field_value&#x60; on &#x60;platforms&#x60;. An entry with &#x60;platformSpecificData.tiktokSettings.draft: true&#x60; (Creator Inbox upload) is not subject to the limit and always reports &#x60;canPublish: true&#x60;. | [optional][default to false] |
14
15
  | **timezone** | **String** | IANA timezone (&#x60;Europe/Madrid&#x60;, &#x60;America/New_York&#x60;) used to interpret a &#x60;scheduledFor&#x60; (root or per-platform) that carries no &#x60;Z&#x60; or offset. Has no effect on values that already carry one. An unknown name returns 400 when &#x60;scheduledFor&#x60; is set. | [optional][default to &#39;UTC&#39;] |
15
16
  | **tags** | **Array&lt;String&gt;** | Tags/keywords. YouTube constraints: each tag max 100 chars, combined max 500 chars, duplicates auto-removed. | [optional] |
16
17
  | **hashtags** | **Array&lt;String&gt;** | Stored for reference only. Hashtags are NOT automatically appended to the caption when publishing. Include hashtags directly in the content field (platforms like Instagram only support hashtags as caption text). For YouTube keywords, use the tags field instead. | [optional] |
@@ -36,6 +37,7 @@ instance = Zernio::CreatePostRequest.new(
36
37
  scheduled_for: null,
37
38
  publish_now: null,
38
39
  is_draft: null,
40
+ dry_run: null,
39
41
  timezone: null,
40
42
  tags: null,
41
43
  hashtags: null,
@@ -78,8 +78,9 @@
78
78
  | **placement_assets** | [**CreateStandaloneAdRequestPlacementAssets**](CreateStandaloneAdRequestPlacementAssets.md) | | [optional] |
79
79
  | **audience_id** | **String** | Custom audience ID for targeting | [optional] |
80
80
  | **campaign_type** | **String** | Google only | [optional][default to &#39;display&#39;] |
81
- | **keywords** | **Array&lt;String&gt;** | Google Search only. BROAD-match keywords on the new ad group. Editable later via PUT /v1/ads/{adId} targeting.keywords, which also sets match types. | [optional] |
82
- | **negative_keywords** | **Array&lt;String&gt;** | Google Search only; other platforms return 400. BROAD-match negative keywords on the new ad group. Editable later via PUT /v1/ads/{adId} targeting.negativeKeywords. | [optional] |
81
+ | **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] |
82
+ | **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] |
83
+ | **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] |
83
84
  | **additional_headlines** | **Array&lt;String&gt;** | Google Search RSA only. Extra headlines. | [optional] |
84
85
  | **additional_descriptions** | **Array&lt;String&gt;** | Google Search RSA only. Extra descriptions. | [optional] |
85
86
  | **sitelinks** | [**Array&lt;CreateStandaloneAdRequestSitelinksInner&gt;**](CreateStandaloneAdRequestSitelinksInner.md) | Google Search only. Sitelink assets to create and attach at the campaign level. Each entry becomes an Asset (with sitelink_asset + Asset.final_urls) plus a CampaignAsset link (field_type SITELINK). Approval is async — Google reviews assets after creation; poll asset.policy_summary later to read the verdict. Google requires at least two sitelinks to surface them on an ad; four or more is Google&#39;s own recommendation for maximum visibility. The response&#39;s creative.sitelinks[] echoes each input plus its Google resourceName. | [optional] |
@@ -183,6 +184,7 @@ instance = Zernio::CreateStandaloneAdRequest.new(
183
184
  campaign_type: null,
184
185
  keywords: null,
185
186
  negative_keywords: null,
187
+ campaign_negative_keywords: null,
186
188
  additional_headlines: null,
187
189
  additional_descriptions: null,
188
190
  sitelinks: null,
@@ -0,0 +1,49 @@
1
+ # Zernio::KeywordEntry
2
+
3
+ ## Class instance methods
4
+
5
+ ### `openapi_one_of`
6
+
7
+ Returns the list of classes defined in oneOf.
8
+
9
+ #### Example
10
+
11
+ ```ruby
12
+ require 'zernio-sdk'
13
+
14
+ Zernio::KeywordEntry.openapi_one_of
15
+ # =>
16
+ # [
17
+ # :'AddAdKeywordsRequestKeywordsInnerAnyOf',
18
+ # :'String'
19
+ # ]
20
+ ```
21
+
22
+ ### build
23
+
24
+ Find the appropriate object from the `openapi_one_of` list and casts the data into it.
25
+
26
+ #### Example
27
+
28
+ ```ruby
29
+ require 'zernio-sdk'
30
+
31
+ Zernio::KeywordEntry.build(data)
32
+ # => #<AddAdKeywordsRequestKeywordsInnerAnyOf:0x00007fdd4aab02a0>
33
+
34
+ Zernio::KeywordEntry.build(data_that_doesnt_match)
35
+ # => nil
36
+ ```
37
+
38
+ #### Parameters
39
+
40
+ | Name | Type | Description |
41
+ | ---- | ---- | ----------- |
42
+ | **data** | **Mixed** | data to be matched against the list of oneOf items |
43
+
44
+ #### Return type
45
+
46
+ - `AddAdKeywordsRequestKeywordsInnerAnyOf`
47
+ - `String`
48
+ - `nil` (if no type matches)
49
+
@@ -4,7 +4,7 @@
4
4
 
5
5
  | Name | Type | Description | Notes |
6
6
  | ---- | ---- | ----------- | ----- |
7
- | **keywords** | [**Array&lt;ListAdKeywords200ResponseKeywordsInner&gt;**](ListAdKeywords200ResponseKeywordsInner.md) | | [optional] |
7
+ | **keywords** | [**Array&lt;AdKeyword&gt;**](AdKeyword.md) | | [optional] |
8
8
  | **pagination** | [**Pagination**](Pagination.md) | | [optional] |
9
9
 
10
10
  ## Example
@@ -0,0 +1,18 @@
1
+ # Zernio::ListCampaignNegativeKeywords200Response
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **keywords** | [**Array&lt;ListCampaignNegativeKeywords200ResponseKeywordsInner&gt;**](ListCampaignNegativeKeywords200ResponseKeywordsInner.md) | | [optional] |
8
+
9
+ ## Example
10
+
11
+ ```ruby
12
+ require 'zernio-sdk'
13
+
14
+ instance = Zernio::ListCampaignNegativeKeywords200Response.new(
15
+ keywords: null
16
+ )
17
+ ```
18
+
@@ -0,0 +1,22 @@
1
+ # Zernio::ListCampaignNegativeKeywords200ResponseKeywordsInner
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **criterion_id** | **String** | | [optional] |
8
+ | **text** | **String** | | [optional] |
9
+ | **match_type** | **String** | | [optional] |
10
+
11
+ ## Example
12
+
13
+ ```ruby
14
+ require 'zernio-sdk'
15
+
16
+ instance = Zernio::ListCampaignNegativeKeywords200ResponseKeywordsInner.new(
17
+ criterion_id: null,
18
+ text: null,
19
+ match_type: null
20
+ )
21
+ ```
22
+
@@ -0,0 +1,49 @@
1
+ # Zernio::ListSlackChannels200Response
2
+
3
+ ## Class instance methods
4
+
5
+ ### `openapi_one_of`
6
+
7
+ Returns the list of classes defined in oneOf.
8
+
9
+ #### Example
10
+
11
+ ```ruby
12
+ require 'zernio-sdk'
13
+
14
+ Zernio::ListSlackChannels200Response.openapi_one_of
15
+ # =>
16
+ # [
17
+ # :'ChannelPicker',
18
+ # :'StartOAuth'
19
+ # ]
20
+ ```
21
+
22
+ ### build
23
+
24
+ Find the appropriate object from the `openapi_one_of` list and casts the data into it.
25
+
26
+ #### Example
27
+
28
+ ```ruby
29
+ require 'zernio-sdk'
30
+
31
+ Zernio::ListSlackChannels200Response.build(data)
32
+ # => #<ChannelPicker:0x00007fdd4aab02a0>
33
+
34
+ Zernio::ListSlackChannels200Response.build(data_that_doesnt_match)
35
+ # => nil
36
+ ```
37
+
38
+ #### Parameters
39
+
40
+ | Name | Type | Description |
41
+ | ---- | ---- | ----------- |
42
+ | **data** | **Mixed** | data to be matched against the list of oneOf items |
43
+
44
+ #### Return type
45
+
46
+ - `ChannelPicker`
47
+ - `StartOAuth`
48
+ - `nil` (if no type matches)
49
+
@@ -10,7 +10,7 @@
10
10
  | **custom_media** | [**Array&lt;MediaItem&gt;**](MediaItem.md) | | [optional] |
11
11
  | **scheduled_for** | **Time** | Optional per-platform scheduled time override (uses post.scheduledFor when omitted) | [optional] |
12
12
  | **platform_specific_data** | **Hash&lt;String, Object&gt;** | The platform-specific options stored on this target, echoed back as they were sent. Typed per platform on the way in (see the *PlatformData schemas on the request body); free-form on the way out, because a response is not guaranteed to match exactly one of those variants and generated clients that pick a variant by structure reject the entire response when it doesn&#39;t. Zernio&#39;s internal publishing state (snapshots, container ids, publish stage) is never returned here, and the key is omitted rather than sent as an empty object. | [optional] |
13
- | **status** | **String** | Platform-specific status: pending, publishing, published, failed | [optional] |
13
+ | **status** | **String** | Platform-specific status: pending, processing, uploading, published, failed, cancelled (removed from the platform via DELETE /v1/posts/{postId}/unpublish) | [optional] |
14
14
  | **platform_post_id** | **String** | The native post ID on the platform (populated after successful publish) | [optional] |
15
15
  | **platform_post_url** | **String** | Public URL of the published post. Included in the response for immediate posts; for scheduled posts, fetch via GET /v1/posts/{postId} after publish time. Empty when the platform confirmed the publish without returning an id a permalink can be built from (TikTok returns a publish id for some uploads); the TikTok reconcile cron backfills it later. | [optional] |
16
16
  | **published_at** | **Time** | Timestamp when the post was published to this platform | [optional] |
data/docs/Post.md CHANGED
@@ -12,7 +12,7 @@
12
12
  | **platforms** | [**Array&lt;PlatformTarget&gt;**](PlatformTarget.md) | | [optional] |
13
13
  | **scheduled_for** | **Time** | | [optional] |
14
14
  | **timezone** | **String** | | [optional] |
15
- | **status** | **String** | | [optional] |
15
+ | **status** | **String** | &#x60;cancelled&#x60; is set by DELETE /v1/posts/{postId}/unpublish once every platform entry has been removed from its platform (a post with published entries left becomes &#x60;partial&#x60;); cancelled posts can be edited and rescheduled like drafts. | [optional] |
16
16
  | **tags** | **Array&lt;String&gt;** | YouTube constraints: each tag max 100 chars, combined max 500 chars, duplicates removed. | [optional] |
17
17
  | **hashtags** | **Array&lt;String&gt;** | Stored for reference only. Hashtags are NOT automatically appended to the caption when publishing. Include hashtags directly in the content field (platforms like Instagram only support hashtags as caption text). For YouTube keywords, use the tags field instead. | [optional] |
18
18
  | **mentions** | **Array&lt;String&gt;** | Stored for reference only. This field does NOT automatically create @mentions when publishing. For LinkedIn @mentions, use the /v1/accounts/{accountId}/linkedin-mentions endpoint to resolve profile URLs to URNs, then embed the returned mentionFormat directly in the post content field. | [optional] |
data/docs/PostsApi.md CHANGED
@@ -91,7 +91,7 @@ end
91
91
 
92
92
  ## create_post
93
93
 
94
- > <PostCreateResponse> create_post(create_post_request, opts)
94
+ > <CreatePost200Response> create_post(create_post_request, opts)
95
95
 
96
96
  Create post
97
97
 
@@ -127,7 +127,7 @@ end
127
127
 
128
128
  This returns an Array which contains the response data, status code and headers.
129
129
 
130
- > <Array(<PostCreateResponse>, Integer, Hash)> create_post_with_http_info(create_post_request, opts)
130
+ > <Array(<CreatePost200Response>, Integer, Hash)> create_post_with_http_info(create_post_request, opts)
131
131
 
132
132
  ```ruby
133
133
  begin
@@ -135,7 +135,7 @@ begin
135
135
  data, status_code, headers = api_instance.create_post_with_http_info(create_post_request, opts)
136
136
  p status_code # => 2xx
137
137
  p headers # => { ... }
138
- p data # => <PostCreateResponse>
138
+ p data # => <CreatePost200Response>
139
139
  rescue Zernio::ApiError => e
140
140
  puts "Error when calling PostsApi->create_post_with_http_info: #{e}"
141
141
  end
@@ -150,7 +150,7 @@ end
150
150
 
151
151
  ### Return type
152
152
 
153
- [**PostCreateResponse**](PostCreateResponse.md)
153
+ [**CreatePost200Response**](CreatePost200Response.md)
154
154
 
155
155
  ### Authorization
156
156
 
@@ -0,0 +1,20 @@
1
+ # Zernio::RemoveAdKeyword200Response
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **removed** | **Boolean** | Always true on success | [optional] |
8
+ | **keyword_id** | **String** | | [optional] |
9
+
10
+ ## Example
11
+
12
+ ```ruby
13
+ require 'zernio-sdk'
14
+
15
+ instance = Zernio::RemoveAdKeyword200Response.new(
16
+ removed: null,
17
+ keyword_id: null
18
+ )
19
+ ```
20
+
@@ -0,0 +1,22 @@
1
+ # Zernio::ReplaceCampaignNegativeKeywords200Response
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **created** | **Integer** | Negative criteria newly created on Google | [optional] |
8
+ | **removed** | **Integer** | Negative criteria removed from Google | [optional] |
9
+ | **keywords** | [**Array&lt;ListCampaignNegativeKeywords200ResponseKeywordsInner&gt;**](ListCampaignNegativeKeywords200ResponseKeywordsInner.md) | The full negative-keyword set after the replace | [optional] |
10
+
11
+ ## Example
12
+
13
+ ```ruby
14
+ require 'zernio-sdk'
15
+
16
+ instance = Zernio::ReplaceCampaignNegativeKeywords200Response.new(
17
+ created: null,
18
+ removed: null,
19
+ keywords: null
20
+ )
21
+ ```
22
+
@@ -0,0 +1,20 @@
1
+ # Zernio::ReplaceCampaignNegativeKeywordsRequest
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **platform** | **String** | Optional and NOT authoritative: the resolved campaign&#39;s own platform decides 200 vs 501, never this hint. | [optional] |
8
+ | **keywords** | [**Array&lt;KeywordEntry&gt;**](KeywordEntry.md) | | |
9
+
10
+ ## Example
11
+
12
+ ```ruby
13
+ require 'zernio-sdk'
14
+
15
+ instance = Zernio::ReplaceCampaignNegativeKeywordsRequest.new(
16
+ platform: null,
17
+ keywords: null
18
+ )
19
+ ```
20
+
@@ -0,0 +1,20 @@
1
+ # Zernio::StartOAuth
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **auth_url** | **String** | | |
8
+ | **state** | **String** | | |
9
+
10
+ ## Example
11
+
12
+ ```ruby
13
+ require 'zernio-sdk'
14
+
15
+ instance = Zernio::StartOAuth.new(
16
+ auth_url: null,
17
+ state: null
18
+ )
19
+ ```
20
+
@@ -0,0 +1,18 @@
1
+ # Zernio::UpdateAdKeyword200Response
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **keyword** | [**AdKeyword**](AdKeyword.md) | | [optional] |
8
+
9
+ ## Example
10
+
11
+ ```ruby
12
+ require 'zernio-sdk'
13
+
14
+ instance = Zernio::UpdateAdKeyword200Response.new(
15
+ keyword: null
16
+ )
17
+ ```
18
+